use cordova, not phonegap
This commit is contained in:
parent
445ddeab85
commit
72c3cd0c06
364 changed files with 55371 additions and 0 deletions
41
fritteliuhr/platforms/ios/CordovaLib/Classes/CDV.h
Normal file
41
fritteliuhr/platforms/ios/CordovaLib/Classes/CDV.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVAvailability.h"
|
||||
|
||||
#import "CDVPlugin.h"
|
||||
#import "CDVViewController.h"
|
||||
#import "CDVCommandDelegate.h"
|
||||
#import "CDVURLProtocol.h"
|
||||
#import "CDVInvokedUrlCommand.h"
|
||||
|
||||
#import "CDVDebug.h"
|
||||
#import "CDVPluginResult.h"
|
||||
#import "CDVWhitelist.h"
|
||||
#import "CDVLocalStorage.h"
|
||||
#import "CDVScreenOrientationDelegate.h"
|
||||
#import "CDVTimer.h"
|
||||
|
||||
#import "NSArray+Comparisons.h"
|
||||
#import "NSData+Base64.h"
|
||||
#import "NSDictionary+Extensions.h"
|
||||
#import "NSMutableArray+QueueAdditions.h"
|
||||
#import "UIDevice+Extensions.h"
|
||||
|
||||
#import "CDVJSON.h"
|
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVAvailabilityDeprecated.h"
|
||||
|
||||
#define __CORDOVA_IOS__
|
||||
|
||||
#define __CORDOVA_0_9_6 906
|
||||
#define __CORDOVA_1_0_0 10000
|
||||
#define __CORDOVA_1_1_0 10100
|
||||
#define __CORDOVA_1_2_0 10200
|
||||
#define __CORDOVA_1_3_0 10300
|
||||
#define __CORDOVA_1_4_0 10400
|
||||
#define __CORDOVA_1_4_1 10401
|
||||
#define __CORDOVA_1_5_0 10500
|
||||
#define __CORDOVA_1_6_0 10600
|
||||
#define __CORDOVA_1_6_1 10601
|
||||
#define __CORDOVA_1_7_0 10700
|
||||
#define __CORDOVA_1_8_0 10800
|
||||
#define __CORDOVA_1_8_1 10801
|
||||
#define __CORDOVA_1_9_0 10900
|
||||
#define __CORDOVA_2_0_0 20000
|
||||
#define __CORDOVA_2_1_0 20100
|
||||
#define __CORDOVA_2_2_0 20200
|
||||
#define __CORDOVA_2_3_0 20300
|
||||
#define __CORDOVA_2_4_0 20400
|
||||
#define __CORDOVA_2_5_0 20500
|
||||
#define __CORDOVA_2_6_0 20600
|
||||
#define __CORDOVA_2_7_0 20700
|
||||
#define __CORDOVA_2_8_0 20800
|
||||
#define __CORDOVA_2_9_0 20900
|
||||
#define __CORDOVA_3_0_0 30000
|
||||
#define __CORDOVA_3_1_0 30100
|
||||
#define __CORDOVA_3_2_0 30200
|
||||
#define __CORDOVA_3_3_0 30300
|
||||
#define __CORDOVA_3_4_0 30400
|
||||
#define __CORDOVA_3_4_1 30401
|
||||
#define __CORDOVA_3_5_0 30500
|
||||
#define __CORDOVA_3_6_0 30600
|
||||
#define __CORDOVA_3_7_0 30700
|
||||
#define __CORDOVA_3_8_0 30800
|
||||
#define __CORDOVA_NA 99999 /* not available */
|
||||
|
||||
/*
|
||||
#if CORDOVA_VERSION_MIN_REQUIRED >= __CORDOVA_1_7_0
|
||||
// do something when its at least 1.7.0
|
||||
#else
|
||||
// do something else (non 1.7.0)
|
||||
#endif
|
||||
*/
|
||||
#ifndef CORDOVA_VERSION_MIN_REQUIRED
|
||||
#define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_3_8_0
|
||||
#endif
|
||||
|
||||
/*
|
||||
Returns YES if it is at least version specified as NSString(X)
|
||||
Usage:
|
||||
if (IsAtLeastiOSVersion(@"5.1")) {
|
||||
// do something for iOS 5.1 or greater
|
||||
}
|
||||
*/
|
||||
#define IsAtLeastiOSVersion(X) ([[[UIDevice currentDevice] systemVersion] compare:X options:NSNumericSearch] != NSOrderedAscending)
|
||||
|
||||
/* Return the string version of the decimal version */
|
||||
#define CDV_VERSION [NSString stringWithFormat:@"%d.%d.%d", \
|
||||
(CORDOVA_VERSION_MIN_REQUIRED / 10000), \
|
||||
(CORDOVA_VERSION_MIN_REQUIRED % 10000) / 100, \
|
||||
(CORDOVA_VERSION_MIN_REQUIRED % 10000) % 100]
|
||||
|
||||
// Enable this to log all exec() calls.
|
||||
#define CDV_ENABLE_EXEC_LOGGING 0
|
||||
#if CDV_ENABLE_EXEC_LOGGING
|
||||
#define CDV_EXEC_LOG NSLog
|
||||
#else
|
||||
#define CDV_EXEC_LOG(...) do {} while (NO)
|
||||
#endif
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#ifdef __clang__
|
||||
#define CDV_DEPRECATED(version, msg) __attribute__((deprecated("Deprecated in Cordova " #version ". " msg)))
|
||||
#else
|
||||
#define CDV_DEPRECATED(version, msg) __attribute__((deprecated()))
|
||||
#endif
|
||||
|
||||
static inline BOOL CDV_IsIPad(void) CDV_DEPRECATED(3.7.0, "This will be removed in 4.0.0");
|
||||
static inline BOOL CDV_IsIPhone5(void) CDV_DEPRECATED(3.7.0, "This will be removed in 4.0.0");
|
||||
|
||||
static inline BOOL CDV_IsIPad(void) {
|
||||
return [[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
|
||||
}
|
||||
|
||||
static inline BOOL CDV_IsIPhone5(void) {
|
||||
return ([[UIScreen mainScreen] bounds].size.width == 568 && [[UIScreen mainScreen] bounds].size.height == 320) || ([[UIScreen mainScreen] bounds].size.height == 568 && [[UIScreen mainScreen] bounds].size.width == 320);
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVAvailability.h"
|
||||
#import "CDVInvokedUrlCommand.h"
|
||||
|
||||
@class CDVPlugin;
|
||||
@class CDVPluginResult;
|
||||
@class CDVWhitelist;
|
||||
|
||||
@protocol CDVCommandDelegate <NSObject>
|
||||
|
||||
@property (nonatomic, readonly) NSDictionary* settings;
|
||||
|
||||
- (NSString*)pathForResource:(NSString*)resourcepath;
|
||||
- (id)getCommandInstance:(NSString*)pluginName;
|
||||
|
||||
// Sends a plugin result to the JS. This is thread-safe.
|
||||
- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId;
|
||||
// Evaluates the given JS. This is thread-safe.
|
||||
- (void)evalJs:(NSString*)js;
|
||||
// Can be used to evaluate JS right away instead of scheduling it on the run-loop.
|
||||
// This is required for dispatch resign and pause events, but should not be used
|
||||
// without reason. Without the run-loop delay, alerts used in JS callbacks may result
|
||||
// in dead-lock. This method must be called from the UI thread.
|
||||
- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop;
|
||||
// Runs the given block on a background thread using a shared thread-pool.
|
||||
- (void)runInBackground:(void (^)())block;
|
||||
// Returns the User-Agent of the associated UIWebView.
|
||||
- (NSString*)userAgent;
|
||||
// Returns whether the given URL passes the white-list.
|
||||
- (BOOL)URLIsWhitelisted:(NSURL*)url;
|
||||
|
||||
@end
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "CDVCommandDelegate.h"
|
||||
|
||||
@class CDVViewController;
|
||||
@class CDVCommandQueue;
|
||||
|
||||
@interface CDVCommandDelegateImpl : NSObject <CDVCommandDelegate>{
|
||||
@private
|
||||
__weak CDVViewController* _viewController;
|
||||
NSRegularExpression* _callbackIdPattern;
|
||||
@protected
|
||||
__weak CDVCommandQueue* _commandQueue;
|
||||
BOOL _delayResponses;
|
||||
}
|
||||
- (id)initWithViewController:(CDVViewController*)viewController;
|
||||
- (void)flushCommandQueueWithDelayedJs;
|
||||
@end
|
|
@ -0,0 +1,180 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVCommandDelegateImpl.h"
|
||||
#import "CDVJSON_private.h"
|
||||
#import "CDVCommandQueue.h"
|
||||
#import "CDVPluginResult.h"
|
||||
#import "CDVViewController.h"
|
||||
|
||||
@implementation CDVCommandDelegateImpl
|
||||
|
||||
- (id)initWithViewController:(CDVViewController*)viewController
|
||||
{
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
_viewController = viewController;
|
||||
_commandQueue = _viewController.commandQueue;
|
||||
|
||||
NSError* err = nil;
|
||||
_callbackIdPattern = [NSRegularExpression regularExpressionWithPattern:@"[^A-Za-z0-9._-]" options:0 error:&err];
|
||||
if (err != nil) {
|
||||
// Couldn't initialize Regex
|
||||
NSLog(@"Error: Couldn't initialize regex");
|
||||
_callbackIdPattern = nil;
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString*)pathForResource:(NSString*)resourcepath
|
||||
{
|
||||
NSBundle* mainBundle = [NSBundle mainBundle];
|
||||
NSMutableArray* directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]];
|
||||
NSString* filename = [directoryParts lastObject];
|
||||
|
||||
[directoryParts removeLastObject];
|
||||
|
||||
NSString* directoryPartsJoined = [directoryParts componentsJoinedByString:@"/"];
|
||||
NSString* directoryStr = _viewController.wwwFolderName;
|
||||
|
||||
if ([directoryPartsJoined length] > 0) {
|
||||
directoryStr = [NSString stringWithFormat:@"%@/%@", _viewController.wwwFolderName, [directoryParts componentsJoinedByString:@"/"]];
|
||||
}
|
||||
|
||||
return [mainBundle pathForResource:filename ofType:@"" inDirectory:directoryStr];
|
||||
}
|
||||
|
||||
- (void)flushCommandQueueWithDelayedJs
|
||||
{
|
||||
_delayResponses = YES;
|
||||
[_commandQueue executePending];
|
||||
_delayResponses = NO;
|
||||
}
|
||||
|
||||
- (void)evalJsHelper2:(NSString*)js
|
||||
{
|
||||
CDV_EXEC_LOG(@"Exec: evalling: %@", [js substringToIndex:MIN([js length], 160)]);
|
||||
NSString* commandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString:js];
|
||||
if ([commandsJSON length] > 0) {
|
||||
CDV_EXEC_LOG(@"Exec: Retrieved new exec messages by chaining.");
|
||||
}
|
||||
|
||||
[_commandQueue enqueueCommandBatch:commandsJSON];
|
||||
[_commandQueue executePending];
|
||||
}
|
||||
|
||||
- (void)evalJsHelper:(NSString*)js
|
||||
{
|
||||
// Cycle the run-loop before executing the JS.
|
||||
// For _delayResponses -
|
||||
// This ensures that we don't eval JS during the middle of an existing JS
|
||||
// function (possible since UIWebViewDelegate callbacks can be synchronous).
|
||||
// For !isMainThread -
|
||||
// It's a hard error to eval on the non-UI thread.
|
||||
// For !_commandQueue.currentlyExecuting -
|
||||
// This works around a bug where sometimes alerts() within callbacks can cause
|
||||
// dead-lock.
|
||||
// If the commandQueue is currently executing, then we know that it is safe to
|
||||
// execute the callback immediately.
|
||||
// Using (dispatch_get_main_queue()) does *not* fix deadlocks for some reason,
|
||||
// but performSelectorOnMainThread: does.
|
||||
if (_delayResponses || ![NSThread isMainThread] || !_commandQueue.currentlyExecuting) {
|
||||
[self performSelectorOnMainThread:@selector(evalJsHelper2:) withObject:js waitUntilDone:NO];
|
||||
} else {
|
||||
[self evalJsHelper2:js];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)isValidCallbackId:(NSString*)callbackId
|
||||
{
|
||||
if ((callbackId == nil) || (_callbackIdPattern == nil)) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
// Disallow if too long or if any invalid characters were found.
|
||||
if (([callbackId length] > 100) || [_callbackIdPattern firstMatchInString:callbackId options:0 range:NSMakeRange(0, [callbackId length])]) {
|
||||
return NO;
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId
|
||||
{
|
||||
CDV_EXEC_LOG(@"Exec(%@): Sending result. Status=%@", callbackId, result.status);
|
||||
// This occurs when there is are no win/fail callbacks for the call.
|
||||
if ([@"INVALID" isEqualToString : callbackId]) {
|
||||
return;
|
||||
}
|
||||
// This occurs when the callback id is malformed.
|
||||
if (![self isValidCallbackId:callbackId]) {
|
||||
NSLog(@"Invalid callback id received by sendPluginResult");
|
||||
return;
|
||||
}
|
||||
int status = [result.status intValue];
|
||||
BOOL keepCallback = [result.keepCallback boolValue];
|
||||
NSString* argumentsAsJSON = [result argumentsAsJSON];
|
||||
|
||||
NSString* js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeCallback('%@',%d,%@,%d)", callbackId, status, argumentsAsJSON, keepCallback];
|
||||
|
||||
[self evalJsHelper:js];
|
||||
}
|
||||
|
||||
- (void)evalJs:(NSString*)js
|
||||
{
|
||||
[self evalJs:js scheduledOnRunLoop:YES];
|
||||
}
|
||||
|
||||
- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop
|
||||
{
|
||||
js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeEvalAndFetch(function(){%@})", js];
|
||||
if (scheduledOnRunLoop) {
|
||||
[self evalJsHelper:js];
|
||||
} else {
|
||||
[self evalJsHelper2:js];
|
||||
}
|
||||
}
|
||||
|
||||
- (id)getCommandInstance:(NSString*)pluginName
|
||||
{
|
||||
return [_viewController getCommandInstance:pluginName];
|
||||
}
|
||||
|
||||
- (void)runInBackground:(void (^)())block
|
||||
{
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block);
|
||||
}
|
||||
|
||||
- (NSString*)userAgent
|
||||
{
|
||||
return [_viewController userAgent];
|
||||
}
|
||||
|
||||
- (BOOL)URLIsWhitelisted:(NSURL*)url
|
||||
{
|
||||
return ![_viewController.whitelist schemeIsAllowed:[url scheme]] ||
|
||||
[_viewController.whitelist URLIsAllowed:url logFailure:NO];
|
||||
}
|
||||
|
||||
- (NSDictionary*)settings
|
||||
{
|
||||
return _viewController.settings;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class CDVInvokedUrlCommand;
|
||||
@class CDVViewController;
|
||||
|
||||
@interface CDVCommandQueue : NSObject
|
||||
|
||||
@property (nonatomic, readonly) BOOL currentlyExecuting;
|
||||
|
||||
- (id)initWithViewController:(CDVViewController*)viewController;
|
||||
- (void)dispose;
|
||||
|
||||
- (void)resetRequestId;
|
||||
- (void)enqueueCommandBatch:(NSString*)batchJSON;
|
||||
|
||||
- (void)processXhrExecBridgePoke:(NSNumber*)requestId;
|
||||
- (void)fetchCommandsFromJs;
|
||||
- (void)executePending;
|
||||
- (BOOL)execute:(CDVInvokedUrlCommand*)command;
|
||||
|
||||
@end
|
211
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVCommandQueue.m
Normal file
211
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVCommandQueue.m
Normal file
|
@ -0,0 +1,211 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#include <objc/message.h>
|
||||
#import "CDV.h"
|
||||
#import "CDVCommandQueue.h"
|
||||
#import "CDVViewController.h"
|
||||
#import "CDVCommandDelegateImpl.h"
|
||||
#import "CDVJSON_private.h"
|
||||
|
||||
// Parse JS on the main thread if it's shorter than this.
|
||||
static const NSInteger JSON_SIZE_FOR_MAIN_THREAD = 4 * 1024; // Chosen arbitrarily.
|
||||
// Execute multiple commands in one go until this many seconds have passed.
|
||||
static const double MAX_EXECUTION_TIME = .008; // Half of a 60fps frame.
|
||||
|
||||
@interface CDVCommandQueue () {
|
||||
NSInteger _lastCommandQueueFlushRequestId;
|
||||
__weak CDVViewController* _viewController;
|
||||
NSMutableArray* _queue;
|
||||
NSTimeInterval _startExecutionTime;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation CDVCommandQueue
|
||||
|
||||
- (BOOL)currentlyExecuting
|
||||
{
|
||||
return _startExecutionTime > 0;
|
||||
}
|
||||
|
||||
- (id)initWithViewController:(CDVViewController*)viewController
|
||||
{
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
_viewController = viewController;
|
||||
_queue = [[NSMutableArray alloc] init];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dispose
|
||||
{
|
||||
// TODO(agrieve): Make this a zeroing weak ref once we drop support for 4.3.
|
||||
_viewController = nil;
|
||||
}
|
||||
|
||||
- (void)resetRequestId
|
||||
{
|
||||
_lastCommandQueueFlushRequestId = 0;
|
||||
}
|
||||
|
||||
- (void)enqueueCommandBatch:(NSString*)batchJSON
|
||||
{
|
||||
if ([batchJSON length] > 0) {
|
||||
NSMutableArray* commandBatchHolder = [[NSMutableArray alloc] init];
|
||||
[_queue addObject:commandBatchHolder];
|
||||
if ([batchJSON length] < JSON_SIZE_FOR_MAIN_THREAD) {
|
||||
[commandBatchHolder addObject:[batchJSON cdv_JSONObject]];
|
||||
} else {
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() {
|
||||
NSMutableArray* result = [batchJSON cdv_JSONObject];
|
||||
@synchronized(commandBatchHolder) {
|
||||
[commandBatchHolder addObject:result];
|
||||
}
|
||||
[self performSelectorOnMainThread:@selector(executePending) withObject:nil waitUntilDone:NO];
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)processXhrExecBridgePoke:(NSNumber*)requestId
|
||||
{
|
||||
NSInteger rid = [requestId integerValue];
|
||||
|
||||
// An ID of 1 is a special case because that signifies the first request of
|
||||
// the page. Since resetRequestId is called from webViewDidStartLoad, and the
|
||||
// JS context at the time of webViewDidStartLoad is still that of the previous
|
||||
// page, it's possible for requests from the previous page to come in after this
|
||||
// point. We ignore these by enforcing that ID=1 be the first ID.
|
||||
if ((_lastCommandQueueFlushRequestId == 0) && (rid != 1)) {
|
||||
CDV_EXEC_LOG(@"Exec: Ignoring exec request from previous page.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Use the request ID to determine if we've already flushed for this request.
|
||||
// This is required only because the NSURLProtocol enqueues the same request
|
||||
// multiple times.
|
||||
if (rid > _lastCommandQueueFlushRequestId) {
|
||||
_lastCommandQueueFlushRequestId = [requestId integerValue];
|
||||
[self fetchCommandsFromJs];
|
||||
[self executePending];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)fetchCommandsFromJs
|
||||
{
|
||||
// Grab all the queued commands from the JS side.
|
||||
NSString* queuedCommandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString:
|
||||
@"cordova.require('cordova/exec').nativeFetchMessages()"];
|
||||
|
||||
CDV_EXEC_LOG(@"Exec: Flushed JS->native queue (hadCommands=%d).", [queuedCommandsJSON length] > 0);
|
||||
[self enqueueCommandBatch:queuedCommandsJSON];
|
||||
}
|
||||
|
||||
- (void)executePending
|
||||
{
|
||||
// Make us re-entrant-safe.
|
||||
if (_startExecutionTime > 0) {
|
||||
return;
|
||||
}
|
||||
@try {
|
||||
_startExecutionTime = [NSDate timeIntervalSinceReferenceDate];
|
||||
|
||||
while ([_queue count] > 0) {
|
||||
NSMutableArray* commandBatchHolder = _queue[0];
|
||||
NSMutableArray* commandBatch = nil;
|
||||
@synchronized(commandBatchHolder) {
|
||||
// If the next-up command is still being decoded, wait for it.
|
||||
if ([commandBatchHolder count] == 0) {
|
||||
break;
|
||||
}
|
||||
commandBatch = commandBatchHolder[0];
|
||||
}
|
||||
|
||||
while ([commandBatch count] > 0) {
|
||||
@autoreleasepool {
|
||||
// Execute the commands one-at-a-time.
|
||||
NSArray* jsonEntry = [commandBatch dequeue];
|
||||
if ([commandBatch count] == 0) {
|
||||
[_queue removeObjectAtIndex:0];
|
||||
}
|
||||
CDVInvokedUrlCommand* command = [CDVInvokedUrlCommand commandFromJson:jsonEntry];
|
||||
CDV_EXEC_LOG(@"Exec(%@): Calling %@.%@", command.callbackId, command.className, command.methodName);
|
||||
|
||||
if (![self execute:command]) {
|
||||
#ifdef DEBUG
|
||||
NSString* commandJson = [jsonEntry cdv_JSONString];
|
||||
static NSUInteger maxLogLength = 1024;
|
||||
NSString* commandString = ([commandJson length] > maxLogLength) ?
|
||||
[NSString stringWithFormat:@"%@[...]", [commandJson substringToIndex:maxLogLength]] :
|
||||
commandJson;
|
||||
|
||||
DLog(@"FAILED pluginJSON = %@", commandString);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// Yield if we're taking too long.
|
||||
if (([_queue count] > 0) && ([NSDate timeIntervalSinceReferenceDate] - _startExecutionTime > MAX_EXECUTION_TIME)) {
|
||||
[self performSelector:@selector(executePending) withObject:nil afterDelay:0];
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
} @finally
|
||||
{
|
||||
_startExecutionTime = 0;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)execute:(CDVInvokedUrlCommand*)command
|
||||
{
|
||||
if ((command.className == nil) || (command.methodName == nil)) {
|
||||
NSLog(@"ERROR: Classname and/or methodName not found for command.");
|
||||
return NO;
|
||||
}
|
||||
|
||||
// Fetch an instance of this class
|
||||
CDVPlugin* obj = [_viewController.commandDelegate getCommandInstance:command.className];
|
||||
|
||||
if (!([obj isKindOfClass:[CDVPlugin class]])) {
|
||||
NSLog(@"ERROR: Plugin '%@' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml.", command.className);
|
||||
return NO;
|
||||
}
|
||||
BOOL retVal = YES;
|
||||
double started = [[NSDate date] timeIntervalSince1970] * 1000.0;
|
||||
// Find the proper selector to call.
|
||||
NSString* methodName = [NSString stringWithFormat:@"%@:", command.methodName];
|
||||
SEL normalSelector = NSSelectorFromString(methodName);
|
||||
if ([obj respondsToSelector:normalSelector]) {
|
||||
// [obj performSelector:normalSelector withObject:command];
|
||||
((void (*)(id, SEL, id))objc_msgSend)(obj, normalSelector, command);
|
||||
} else {
|
||||
// There's no method to call, so throw an error.
|
||||
NSLog(@"ERROR: Method '%@' not defined in Plugin '%@'", methodName, command.className);
|
||||
retVal = NO;
|
||||
}
|
||||
double elapsed = [[NSDate date] timeIntervalSince1970] * 1000.0 - started;
|
||||
if (elapsed > 10) {
|
||||
NSLog(@"THREAD WARNING: ['%@'] took '%f' ms. Plugin should use a background thread.", command.className, elapsed);
|
||||
}
|
||||
return retVal;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
@interface CDVConfigParser : NSObject <NSXMLParserDelegate>
|
||||
{
|
||||
NSString* featureName;
|
||||
}
|
||||
|
||||
@property (nonatomic, readonly, strong) NSMutableDictionary* pluginsDict;
|
||||
@property (nonatomic, readonly, strong) NSMutableDictionary* settings;
|
||||
@property (nonatomic, readonly, strong) NSMutableArray* whitelistHosts;
|
||||
@property (nonatomic, readonly, strong) NSMutableArray* startupPluginNames;
|
||||
@property (nonatomic, readonly, strong) NSString* startPage;
|
||||
|
||||
@end
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVConfigParser.h"
|
||||
|
||||
@interface CDVConfigParser ()
|
||||
|
||||
@property (nonatomic, readwrite, strong) NSMutableDictionary* pluginsDict;
|
||||
@property (nonatomic, readwrite, strong) NSMutableDictionary* settings;
|
||||
@property (nonatomic, readwrite, strong) NSMutableArray* whitelistHosts;
|
||||
@property (nonatomic, readwrite, strong) NSMutableArray* startupPluginNames;
|
||||
@property (nonatomic, readwrite, strong) NSString* startPage;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVConfigParser
|
||||
|
||||
@synthesize pluginsDict, settings, whitelistHosts, startPage, startupPluginNames;
|
||||
|
||||
- (id)init
|
||||
{
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
self.pluginsDict = [[NSMutableDictionary alloc] initWithCapacity:30];
|
||||
self.settings = [[NSMutableDictionary alloc] initWithCapacity:30];
|
||||
self.whitelistHosts = [[NSMutableArray alloc] initWithCapacity:30];
|
||||
[self.whitelistHosts addObject:@"file:///*"];
|
||||
[self.whitelistHosts addObject:@"content:///*"];
|
||||
[self.whitelistHosts addObject:@"data:///*"];
|
||||
self.startupPluginNames = [[NSMutableArray alloc] initWithCapacity:8];
|
||||
featureName = nil;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict
|
||||
{
|
||||
if ([elementName isEqualToString:@"preference"]) {
|
||||
settings[[attributeDict[@"name"] lowercaseString]] = attributeDict[@"value"];
|
||||
} else if ([elementName isEqualToString:@"feature"]) { // store feature name to use with correct parameter set
|
||||
featureName = [attributeDict[@"name"] lowercaseString];
|
||||
} else if ((featureName != nil) && [elementName isEqualToString:@"param"]) {
|
||||
NSString* paramName = [attributeDict[@"name"] lowercaseString];
|
||||
id value = attributeDict[@"value"];
|
||||
if ([paramName isEqualToString:@"ios-package"]) {
|
||||
pluginsDict[featureName] = value;
|
||||
}
|
||||
BOOL paramIsOnload = ([paramName isEqualToString:@"onload"] && [@"true" isEqualToString : value]);
|
||||
BOOL attribIsOnload = [@"true" isEqualToString :[attributeDict[@"onload"] lowercaseString]];
|
||||
if (paramIsOnload || attribIsOnload) {
|
||||
[self.startupPluginNames addObject:featureName];
|
||||
}
|
||||
} else if ([elementName isEqualToString:@"access"]) {
|
||||
[whitelistHosts addObject:attributeDict[@"origin"]];
|
||||
} else if ([elementName isEqualToString:@"content"]) {
|
||||
self.startPage = attributeDict[@"src"];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName
|
||||
{
|
||||
if ([elementName isEqualToString:@"feature"]) { // no longer handling a feature so release
|
||||
featureName = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError
|
||||
{
|
||||
NSAssert(NO, @"config.xml parse error line %ld col %ld", (long)[parser lineNumber], (long)[parser columnNumber]);
|
||||
}
|
||||
|
||||
@end
|
25
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVDebug.h
Normal file
25
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVDebug.h
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||
#else
|
||||
#define DLog(...)
|
||||
#endif
|
||||
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVPlugin.h"
|
||||
|
||||
@interface CDVHandleOpenURL : CDVPlugin
|
||||
|
||||
@property (nonatomic, strong) NSURL* url;
|
||||
@property (nonatomic, assign) BOOL pageLoaded;
|
||||
|
||||
@end
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVHandleOpenURL.h"
|
||||
#import "CDV.h"
|
||||
|
||||
@implementation CDVHandleOpenURL
|
||||
|
||||
- (void)pluginInitialize
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationLaunchedWithUrl:) name:CDVPluginHandleOpenURLNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationPageDidLoad:) name:CDVPageDidLoadNotification object:nil];
|
||||
}
|
||||
|
||||
- (void)applicationLaunchedWithUrl:(NSNotification*)notification
|
||||
{
|
||||
NSURL *url = [notification object];
|
||||
self.url = url;
|
||||
|
||||
// warm-start handler
|
||||
if (self.pageLoaded) {
|
||||
[self processOpenUrl:self.url pageLoaded:YES];
|
||||
self.url = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)applicationPageDidLoad:(NSNotification*)notification
|
||||
{
|
||||
// cold-start handler
|
||||
|
||||
self.pageLoaded = YES;
|
||||
|
||||
if (self.url) {
|
||||
[self processOpenUrl:self.url pageLoaded:YES];
|
||||
self.url = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)processOpenUrl:(NSURL*)url pageLoaded:(BOOL)pageLoaded
|
||||
{
|
||||
if (!pageLoaded) {
|
||||
// query the webview for readystate
|
||||
NSString* readyState = [self.webView stringByEvaluatingJavaScriptFromString:@"document.readyState"];
|
||||
pageLoaded = [readyState isEqualToString:@"loaded"] || [readyState isEqualToString:@"complete"];
|
||||
}
|
||||
|
||||
if (pageLoaded) {
|
||||
// calls into javascript global function 'handleOpenURL'
|
||||
NSString* jsString = [NSString stringWithFormat:@"document.addEventListener('deviceready',function(){if (typeof handleOpenURL === 'function') { handleOpenURL(\"%@\");}});", url];
|
||||
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
||||
} else {
|
||||
// save for when page has loaded
|
||||
self.url = url;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@end
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface CDVInvokedUrlCommand : NSObject {
|
||||
NSString* _callbackId;
|
||||
NSString* _className;
|
||||
NSString* _methodName;
|
||||
NSArray* _arguments;
|
||||
}
|
||||
|
||||
@property (nonatomic, readonly) NSArray* arguments;
|
||||
@property (nonatomic, readonly) NSString* callbackId;
|
||||
@property (nonatomic, readonly) NSString* className;
|
||||
@property (nonatomic, readonly) NSString* methodName;
|
||||
|
||||
+ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry;
|
||||
|
||||
- (id)initWithArguments:(NSArray*)arguments
|
||||
callbackId:(NSString*)callbackId
|
||||
className:(NSString*)className
|
||||
methodName:(NSString*)methodName;
|
||||
|
||||
- (id)initFromJson:(NSArray*)jsonEntry;
|
||||
|
||||
// Returns the argument at the given index.
|
||||
// If index >= the number of arguments, returns nil.
|
||||
// If the argument at the given index is NSNull, returns nil.
|
||||
- (id)argumentAtIndex:(NSUInteger)index;
|
||||
// Same as above, but returns defaultValue instead of nil.
|
||||
- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue;
|
||||
// Same as above, but returns defaultValue instead of nil, and if the argument is not of the expected class, returns defaultValue
|
||||
- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass;
|
||||
|
||||
@end
|
|
@ -0,0 +1,117 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVInvokedUrlCommand.h"
|
||||
#import "CDVJSON_private.h"
|
||||
#import "NSData+Base64.h"
|
||||
|
||||
@implementation CDVInvokedUrlCommand
|
||||
|
||||
@synthesize arguments = _arguments;
|
||||
@synthesize callbackId = _callbackId;
|
||||
@synthesize className = _className;
|
||||
@synthesize methodName = _methodName;
|
||||
|
||||
+ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry
|
||||
{
|
||||
return [[CDVInvokedUrlCommand alloc] initFromJson:jsonEntry];
|
||||
}
|
||||
|
||||
- (id)initFromJson:(NSArray*)jsonEntry
|
||||
{
|
||||
id tmp = [jsonEntry objectAtIndex:0];
|
||||
NSString* callbackId = tmp == [NSNull null] ? nil : tmp;
|
||||
NSString* className = [jsonEntry objectAtIndex:1];
|
||||
NSString* methodName = [jsonEntry objectAtIndex:2];
|
||||
NSMutableArray* arguments = [jsonEntry objectAtIndex:3];
|
||||
|
||||
return [self initWithArguments:arguments
|
||||
callbackId:callbackId
|
||||
className:className
|
||||
methodName:methodName];
|
||||
}
|
||||
|
||||
- (id)initWithArguments:(NSArray*)arguments
|
||||
callbackId:(NSString*)callbackId
|
||||
className:(NSString*)className
|
||||
methodName:(NSString*)methodName
|
||||
{
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
_arguments = arguments;
|
||||
_callbackId = callbackId;
|
||||
_className = className;
|
||||
_methodName = methodName;
|
||||
}
|
||||
[self massageArguments];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)massageArguments
|
||||
{
|
||||
NSMutableArray* newArgs = nil;
|
||||
|
||||
for (NSUInteger i = 0, count = [_arguments count]; i < count; ++i) {
|
||||
id arg = [_arguments objectAtIndex:i];
|
||||
if (![arg isKindOfClass:[NSDictionary class]]) {
|
||||
continue;
|
||||
}
|
||||
NSDictionary* dict = arg;
|
||||
NSString* type = [dict objectForKey:@"CDVType"];
|
||||
if (!type || ![type isEqualToString:@"ArrayBuffer"]) {
|
||||
continue;
|
||||
}
|
||||
NSString* data = [dict objectForKey:@"data"];
|
||||
if (!data) {
|
||||
continue;
|
||||
}
|
||||
if (newArgs == nil) {
|
||||
newArgs = [NSMutableArray arrayWithArray:_arguments];
|
||||
_arguments = newArgs;
|
||||
}
|
||||
[newArgs replaceObjectAtIndex:i withObject:[NSData cdv_dataFromBase64String:data]];
|
||||
}
|
||||
}
|
||||
|
||||
- (id)argumentAtIndex:(NSUInteger)index
|
||||
{
|
||||
return [self argumentAtIndex:index withDefault:nil];
|
||||
}
|
||||
|
||||
- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue
|
||||
{
|
||||
return [self argumentAtIndex:index withDefault:defaultValue andClass:nil];
|
||||
}
|
||||
|
||||
- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass
|
||||
{
|
||||
if (index >= [_arguments count]) {
|
||||
return defaultValue;
|
||||
}
|
||||
id ret = [_arguments objectAtIndex:index];
|
||||
if (ret == [NSNull null]) {
|
||||
ret = defaultValue;
|
||||
}
|
||||
if ((aClass != nil) && ![ret isKindOfClass:aClass]) {
|
||||
ret = defaultValue;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@end
|
37
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON.h
Normal file
37
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVAvailabilityDeprecated.h"
|
||||
|
||||
@interface NSArray (CDVJSONSerializing)
|
||||
- (NSString*)JSONString CDV_DEPRECATED(3.8 .0, "Use NSJSONSerialization instead.");
|
||||
|
||||
@end
|
||||
|
||||
@interface NSDictionary (CDVJSONSerializing)
|
||||
- (NSString*)JSONString CDV_DEPRECATED(3.8 .0, "Use NSJSONSerialization instead.");
|
||||
|
||||
@end
|
||||
|
||||
@interface NSString (CDVJSONSerializing)
|
||||
- (id)JSONObject CDV_DEPRECATED(3.8 .0, "Use NSJSONSerialization instead.");
|
||||
|
||||
- (id)JSONFragment CDV_DEPRECATED(3.8 .0, "Use NSJSONSerialization instead.");
|
||||
|
||||
@end
|
52
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON.m
Normal file
52
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVJSON.m
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVJSON_private.h"
|
||||
|
||||
@implementation NSArray (CDVJSONSerializing)
|
||||
|
||||
- (NSString*)JSONString
|
||||
{
|
||||
return [self cdv_JSONString];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSDictionary (CDVJSONSerializing)
|
||||
|
||||
- (NSString*)JSONString
|
||||
{
|
||||
return [self cdv_JSONString];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (CDVJSONSerializing)
|
||||
|
||||
- (id)JSONObject
|
||||
{
|
||||
return [self cdv_JSONObject];
|
||||
}
|
||||
|
||||
- (id)JSONFragment
|
||||
{
|
||||
return [self cdv_JSONFragment];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
@interface NSArray (CDVJSONSerializingPrivate)
|
||||
- (NSString*)cdv_JSONString;
|
||||
@end
|
||||
|
||||
@interface NSDictionary (CDVJSONSerializingPrivate)
|
||||
- (NSString*)cdv_JSONString;
|
||||
@end
|
||||
|
||||
@interface NSString (CDVJSONSerializingPrivate)
|
||||
- (id)cdv_JSONObject;
|
||||
- (id)cdv_JSONFragment;
|
||||
@end
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVJSON_private.h"
|
||||
#import <Foundation/NSJSONSerialization.h>
|
||||
|
||||
@implementation NSArray (CDVJSONSerializingPrivate)
|
||||
|
||||
- (NSString*)cdv_JSONString
|
||||
{
|
||||
NSError* error = nil;
|
||||
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self
|
||||
options:0
|
||||
error:&error];
|
||||
|
||||
if (error != nil) {
|
||||
NSLog(@"NSArray JSONString error: %@", [error localizedDescription]);
|
||||
return nil;
|
||||
} else {
|
||||
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSDictionary (CDVJSONSerializingPrivate)
|
||||
|
||||
- (NSString*)cdv_JSONString
|
||||
{
|
||||
NSError* error = nil;
|
||||
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self
|
||||
options:NSJSONWritingPrettyPrinted
|
||||
error:&error];
|
||||
|
||||
if (error != nil) {
|
||||
NSLog(@"NSDictionary JSONString error: %@", [error localizedDescription]);
|
||||
return nil;
|
||||
} else {
|
||||
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@implementation NSString (CDVJSONSerializingPrivate)
|
||||
|
||||
- (id)cdv_JSONObject
|
||||
{
|
||||
NSError* error = nil;
|
||||
id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding]
|
||||
options:NSJSONReadingMutableContainers
|
||||
error:&error];
|
||||
|
||||
if (error != nil) {
|
||||
NSLog(@"NSString JSONObject error: %@", [error localizedDescription]);
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
- (id)cdv_JSONFragment
|
||||
{
|
||||
NSError* error = nil;
|
||||
id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding]
|
||||
options:NSJSONReadingAllowFragments
|
||||
error:&error];
|
||||
|
||||
if (error != nil) {
|
||||
NSLog(@"NSString JSONObject error: %@", [error localizedDescription]);
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVPlugin.h"
|
||||
|
||||
#define kCDVLocalStorageErrorDomain @"kCDVLocalStorageErrorDomain"
|
||||
#define kCDVLocalStorageFileOperationError 1
|
||||
|
||||
@interface CDVLocalStorage : CDVPlugin
|
||||
|
||||
@property (nonatomic, readonly, strong) NSMutableArray* backupInfo;
|
||||
|
||||
- (BOOL)shouldBackup;
|
||||
- (BOOL)shouldRestore;
|
||||
- (void)backup:(CDVInvokedUrlCommand*)command;
|
||||
- (void)restore:(CDVInvokedUrlCommand*)command;
|
||||
|
||||
+ (void)__fixupDatabaseLocationsWithBackupType:(NSString*)backupType;
|
||||
// Visible for testing.
|
||||
+ (BOOL)__verifyAndFixDatabaseLocationsWithAppPlistDict:(NSMutableDictionary*)appPlistDict
|
||||
bundlePath:(NSString*)bundlePath
|
||||
fileManager:(NSFileManager*)fileManager;
|
||||
@end
|
||||
|
||||
@interface CDVBackupInfo : NSObject
|
||||
|
||||
@property (nonatomic, copy) NSString* original;
|
||||
@property (nonatomic, copy) NSString* backup;
|
||||
@property (nonatomic, copy) NSString* label;
|
||||
|
||||
- (BOOL)shouldBackup;
|
||||
- (BOOL)shouldRestore;
|
||||
|
||||
@end
|
492
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVLocalStorage.m
Normal file
492
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVLocalStorage.m
Normal file
|
@ -0,0 +1,492 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVLocalStorage.h"
|
||||
#import "CDV.h"
|
||||
|
||||
@interface CDVLocalStorage ()
|
||||
|
||||
@property (nonatomic, readwrite, strong) NSMutableArray* backupInfo; // array of CDVBackupInfo objects
|
||||
@property (nonatomic, readwrite, weak) id <UIWebViewDelegate> webviewDelegate;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVLocalStorage
|
||||
|
||||
@synthesize backupInfo, webviewDelegate;
|
||||
|
||||
- (void)pluginInitialize
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResignActive)
|
||||
name:UIApplicationWillResignActiveNotification object:nil];
|
||||
BOOL cloudBackup = [@"cloud" isEqualToString : self.commandDelegate.settings[[@"BackupWebStorage" lowercaseString]]];
|
||||
|
||||
self.backupInfo = [[self class] createBackupInfoWithCloudBackup:cloudBackup];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Plugin interface methods
|
||||
|
||||
+ (NSMutableArray*)createBackupInfoWithTargetDir:(NSString*)targetDir backupDir:(NSString*)backupDir targetDirNests:(BOOL)targetDirNests backupDirNests:(BOOL)backupDirNests rename:(BOOL)rename
|
||||
{
|
||||
/*
|
||||
This "helper" does so much work and has so many options it would probably be clearer to refactor the whole thing.
|
||||
Basically, there are three database locations:
|
||||
|
||||
1. "Normal" dir -- LIB/<nested dires WebKit/LocalStorage etc>/<normal filenames>
|
||||
2. "Caches" dir -- LIB/Caches/<normal filenames>
|
||||
3. "Backup" dir -- DOC/Backups/<renamed filenames>
|
||||
|
||||
And between these three, there are various migration paths, most of which only consider 2 of the 3, which is why this helper is based on 2 locations and has a notion of "direction".
|
||||
*/
|
||||
NSMutableArray* backupInfo = [NSMutableArray arrayWithCapacity:3];
|
||||
|
||||
NSString* original;
|
||||
NSString* backup;
|
||||
CDVBackupInfo* backupItem;
|
||||
|
||||
// ////////// LOCALSTORAGE
|
||||
|
||||
original = [targetDir stringByAppendingPathComponent:targetDirNests ? @"WebKit/LocalStorage/file__0.localstorage":@"file__0.localstorage"];
|
||||
backup = [backupDir stringByAppendingPathComponent:(backupDirNests ? @"WebKit/LocalStorage" : @"")];
|
||||
backup = [backup stringByAppendingPathComponent:(rename ? @"localstorage.appdata.db" : @"file__0.localstorage")];
|
||||
|
||||
backupItem = [[CDVBackupInfo alloc] init];
|
||||
backupItem.backup = backup;
|
||||
backupItem.original = original;
|
||||
backupItem.label = @"localStorage database";
|
||||
|
||||
[backupInfo addObject:backupItem];
|
||||
|
||||
// ////////// WEBSQL MAIN DB
|
||||
|
||||
original = [targetDir stringByAppendingPathComponent:targetDirNests ? @"WebKit/LocalStorage/Databases.db":@"Databases.db"];
|
||||
backup = [backupDir stringByAppendingPathComponent:(backupDirNests ? @"WebKit/LocalStorage" : @"")];
|
||||
backup = [backup stringByAppendingPathComponent:(rename ? @"websqlmain.appdata.db" : @"Databases.db")];
|
||||
|
||||
backupItem = [[CDVBackupInfo alloc] init];
|
||||
backupItem.backup = backup;
|
||||
backupItem.original = original;
|
||||
backupItem.label = @"websql main database";
|
||||
|
||||
[backupInfo addObject:backupItem];
|
||||
|
||||
// ////////// WEBSQL DATABASES
|
||||
|
||||
original = [targetDir stringByAppendingPathComponent:targetDirNests ? @"WebKit/LocalStorage/file__0":@"file__0"];
|
||||
backup = [backupDir stringByAppendingPathComponent:(backupDirNests ? @"WebKit/LocalStorage" : @"")];
|
||||
backup = [backup stringByAppendingPathComponent:(rename ? @"websqldbs.appdata.db" : @"file__0")];
|
||||
|
||||
backupItem = [[CDVBackupInfo alloc] init];
|
||||
backupItem.backup = backup;
|
||||
backupItem.original = original;
|
||||
backupItem.label = @"websql databases";
|
||||
|
||||
[backupInfo addObject:backupItem];
|
||||
|
||||
return backupInfo;
|
||||
}
|
||||
|
||||
+ (NSMutableArray*)createBackupInfoWithCloudBackup:(BOOL)cloudBackup
|
||||
{
|
||||
// create backup info from backup folder to caches folder
|
||||
NSString* appLibraryFolder = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
|
||||
NSString* appDocumentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
|
||||
NSString* cacheFolder = [appLibraryFolder stringByAppendingPathComponent:@"Caches"];
|
||||
NSString* backupsFolder = [appDocumentsFolder stringByAppendingPathComponent:@"Backups"];
|
||||
|
||||
// create the backups folder, if needed
|
||||
[[NSFileManager defaultManager] createDirectoryAtPath:backupsFolder withIntermediateDirectories:YES attributes:nil error:nil];
|
||||
|
||||
[self addSkipBackupAttributeToItemAtURL:[NSURL fileURLWithPath:backupsFolder] skip:!cloudBackup];
|
||||
|
||||
return [self createBackupInfoWithTargetDir:cacheFolder backupDir:backupsFolder targetDirNests:NO backupDirNests:NO rename:YES];
|
||||
}
|
||||
|
||||
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL*)URL skip:(BOOL)skip
|
||||
{
|
||||
NSAssert(IsAtLeastiOSVersion(@"5.1"), @"Cannot mark files for NSURLIsExcludedFromBackupKey on iOS less than 5.1");
|
||||
|
||||
NSError* error = nil;
|
||||
BOOL success = [URL setResourceValue:[NSNumber numberWithBool:skip] forKey:NSURLIsExcludedFromBackupKey error:&error];
|
||||
if (!success) {
|
||||
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
+ (BOOL)copyFrom:(NSString*)src to:(NSString*)dest error:(NSError* __autoreleasing*)error
|
||||
{
|
||||
NSFileManager* fileManager = [NSFileManager defaultManager];
|
||||
|
||||
if (![fileManager fileExistsAtPath:src]) {
|
||||
NSString* errorString = [NSString stringWithFormat:@"%@ file does not exist.", src];
|
||||
if (error != NULL) {
|
||||
(*error) = [NSError errorWithDomain:kCDVLocalStorageErrorDomain
|
||||
code:kCDVLocalStorageFileOperationError
|
||||
userInfo:[NSDictionary dictionaryWithObject:errorString
|
||||
forKey:NSLocalizedDescriptionKey]];
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
// generate unique filepath in temp directory
|
||||
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
|
||||
CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
|
||||
NSString* tempBackup = [[NSTemporaryDirectory() stringByAppendingPathComponent:(__bridge NSString*)uuidString] stringByAppendingPathExtension:@"bak"];
|
||||
CFRelease(uuidString);
|
||||
CFRelease(uuidRef);
|
||||
|
||||
BOOL destExists = [fileManager fileExistsAtPath:dest];
|
||||
|
||||
// backup the dest
|
||||
if (destExists && ![fileManager copyItemAtPath:dest toPath:tempBackup error:error]) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
// remove the dest
|
||||
if (destExists && ![fileManager removeItemAtPath:dest error:error]) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
// create path to dest
|
||||
if (!destExists && ![fileManager createDirectoryAtPath:[dest stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:error]) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
// copy src to dest
|
||||
if ([fileManager copyItemAtPath:src toPath:dest error:error]) {
|
||||
// success - cleanup - delete the backup to the dest
|
||||
if ([fileManager fileExistsAtPath:tempBackup]) {
|
||||
[fileManager removeItemAtPath:tempBackup error:error];
|
||||
}
|
||||
return YES;
|
||||
} else {
|
||||
// failure - we restore the temp backup file to dest
|
||||
[fileManager copyItemAtPath:tempBackup toPath:dest error:error];
|
||||
// cleanup - delete the backup to the dest
|
||||
if ([fileManager fileExistsAtPath:tempBackup]) {
|
||||
[fileManager removeItemAtPath:tempBackup error:error];
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)shouldBackup
|
||||
{
|
||||
for (CDVBackupInfo* info in self.backupInfo) {
|
||||
if ([info shouldBackup]) {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)shouldRestore
|
||||
{
|
||||
for (CDVBackupInfo* info in self.backupInfo) {
|
||||
if ([info shouldRestore]) {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
/* copy from webkitDbLocation to persistentDbLocation */
|
||||
- (void)backup:(CDVInvokedUrlCommand*)command
|
||||
{
|
||||
NSString* callbackId = command.callbackId;
|
||||
|
||||
NSError* __autoreleasing error = nil;
|
||||
CDVPluginResult* result = nil;
|
||||
NSString* message = nil;
|
||||
|
||||
for (CDVBackupInfo* info in self.backupInfo) {
|
||||
if ([info shouldBackup]) {
|
||||
[[self class] copyFrom:info.original to:info.backup error:&error];
|
||||
|
||||
if (callbackId) {
|
||||
if (error == nil) {
|
||||
message = [NSString stringWithFormat:@"Backed up: %@", info.label];
|
||||
NSLog(@"%@", message);
|
||||
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message];
|
||||
[self.commandDelegate sendPluginResult:result callbackId:callbackId];
|
||||
} else {
|
||||
message = [NSString stringWithFormat:@"Error in CDVLocalStorage (%@) backup: %@", info.label, [error localizedDescription]];
|
||||
NSLog(@"%@", message);
|
||||
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:message];
|
||||
[self.commandDelegate sendPluginResult:result callbackId:callbackId];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* copy from persistentDbLocation to webkitDbLocation */
|
||||
- (void)restore:(CDVInvokedUrlCommand*)command
|
||||
{
|
||||
NSError* __autoreleasing error = nil;
|
||||
CDVPluginResult* result = nil;
|
||||
NSString* message = nil;
|
||||
|
||||
for (CDVBackupInfo* info in self.backupInfo) {
|
||||
if ([info shouldRestore]) {
|
||||
[[self class] copyFrom:info.backup to:info.original error:&error];
|
||||
|
||||
if (error == nil) {
|
||||
message = [NSString stringWithFormat:@"Restored: %@", info.label];
|
||||
NSLog(@"%@", message);
|
||||
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message];
|
||||
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
|
||||
} else {
|
||||
message = [NSString stringWithFormat:@"Error in CDVLocalStorage (%@) restore: %@", info.label, [error localizedDescription]];
|
||||
NSLog(@"%@", message);
|
||||
|
||||
result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:message];
|
||||
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)__fixupDatabaseLocationsWithBackupType:(NSString*)backupType
|
||||
{
|
||||
[self __verifyAndFixDatabaseLocations];
|
||||
[self __restoreLegacyDatabaseLocationsWithBackupType:backupType];
|
||||
}
|
||||
|
||||
+ (void)__verifyAndFixDatabaseLocations
|
||||
{
|
||||
NSBundle* mainBundle = [NSBundle mainBundle];
|
||||
NSString* bundlePath = [[mainBundle bundlePath] stringByDeletingLastPathComponent];
|
||||
NSString* bundleIdentifier = [[mainBundle infoDictionary] objectForKey:@"CFBundleIdentifier"];
|
||||
NSString* appPlistPath = [bundlePath stringByAppendingPathComponent:[NSString stringWithFormat:@"Library/Preferences/%@.plist", bundleIdentifier]];
|
||||
|
||||
NSMutableDictionary* appPlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:appPlistPath];
|
||||
BOOL modified = [[self class] __verifyAndFixDatabaseLocationsWithAppPlistDict:appPlistDict
|
||||
bundlePath:bundlePath
|
||||
fileManager:[NSFileManager defaultManager]];
|
||||
|
||||
if (modified) {
|
||||
BOOL ok = [appPlistDict writeToFile:appPlistPath atomically:YES];
|
||||
[[NSUserDefaults standardUserDefaults] synchronize];
|
||||
NSLog(@"Fix applied for database locations?: %@", ok ? @"YES" : @"NO");
|
||||
}
|
||||
}
|
||||
|
||||
+ (BOOL)__verifyAndFixDatabaseLocationsWithAppPlistDict:(NSMutableDictionary*)appPlistDict
|
||||
bundlePath:(NSString*)bundlePath
|
||||
fileManager:(NSFileManager*)fileManager
|
||||
{
|
||||
NSString* libraryCaches = @"Library/Caches";
|
||||
NSString* libraryWebKit = @"Library/WebKit";
|
||||
|
||||
NSArray* keysToCheck = [NSArray arrayWithObjects:
|
||||
@"WebKitLocalStorageDatabasePathPreferenceKey",
|
||||
@"WebDatabaseDirectory",
|
||||
nil];
|
||||
|
||||
BOOL dirty = NO;
|
||||
|
||||
for (NSString* key in keysToCheck) {
|
||||
NSString* value = [appPlistDict objectForKey:key];
|
||||
// verify key exists, and path is in app bundle, if not - fix
|
||||
if ((value != nil) && ![value hasPrefix:bundlePath]) {
|
||||
// the pathSuffix to use may be wrong - OTA upgrades from < 5.1 to 5.1 do keep the old path Library/WebKit,
|
||||
// while Xcode synced ones do change the storage location to Library/Caches
|
||||
NSString* newBundlePath = [bundlePath stringByAppendingPathComponent:libraryCaches];
|
||||
if (![fileManager fileExistsAtPath:newBundlePath]) {
|
||||
newBundlePath = [bundlePath stringByAppendingPathComponent:libraryWebKit];
|
||||
}
|
||||
[appPlistDict setValue:newBundlePath forKey:key];
|
||||
dirty = YES;
|
||||
}
|
||||
}
|
||||
|
||||
return dirty;
|
||||
}
|
||||
|
||||
+ (void)__restoreLegacyDatabaseLocationsWithBackupType:(NSString*)backupType
|
||||
{
|
||||
// on iOS 6, if you toggle between cloud/local backup, you must move database locations. Default upgrade from iOS5.1 to iOS6 is like a toggle from local to cloud.
|
||||
if (!IsAtLeastiOSVersion(@"6.0")) {
|
||||
return;
|
||||
}
|
||||
|
||||
NSString* appLibraryFolder = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
|
||||
NSString* appDocumentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
|
||||
|
||||
NSMutableArray* backupInfo = [NSMutableArray arrayWithCapacity:0];
|
||||
|
||||
if ([backupType isEqualToString:@"cloud"]) {
|
||||
#ifdef DEBUG
|
||||
NSLog(@"\n\nStarted backup to iCloud! Please be careful."
|
||||
"\nYour application might be rejected by Apple if you store too much data."
|
||||
"\nFor more information please read \"iOS Data Storage Guidelines\" at:"
|
||||
"\nhttps://developer.apple.com/icloud/documentation/data-storage/"
|
||||
"\nTo disable web storage backup to iCloud, set the BackupWebStorage preference to \"local\" in the Cordova config.xml file\n\n");
|
||||
#endif
|
||||
// We would like to restore old backups/caches databases to the new destination (nested in lib folder)
|
||||
[backupInfo addObjectsFromArray:[self createBackupInfoWithTargetDir:appLibraryFolder backupDir:[appDocumentsFolder stringByAppendingPathComponent:@"Backups"] targetDirNests:YES backupDirNests:NO rename:YES]];
|
||||
[backupInfo addObjectsFromArray:[self createBackupInfoWithTargetDir:appLibraryFolder backupDir:[appLibraryFolder stringByAppendingPathComponent:@"Caches"] targetDirNests:YES backupDirNests:NO rename:NO]];
|
||||
} else {
|
||||
// For ios6 local backups we also want to restore from Backups dir -- but we don't need to do that here, since the plugin will do that itself.
|
||||
[backupInfo addObjectsFromArray:[self createBackupInfoWithTargetDir:[appLibraryFolder stringByAppendingPathComponent:@"Caches"] backupDir:appLibraryFolder targetDirNests:NO backupDirNests:YES rename:NO]];
|
||||
}
|
||||
|
||||
NSFileManager* manager = [NSFileManager defaultManager];
|
||||
|
||||
for (CDVBackupInfo* info in backupInfo) {
|
||||
if ([manager fileExistsAtPath:info.backup]) {
|
||||
if ([info shouldRestore]) {
|
||||
NSLog(@"Restoring old webstorage backup. From: '%@' To: '%@'.", info.backup, info.original);
|
||||
[self copyFrom:info.backup to:info.original error:nil];
|
||||
}
|
||||
NSLog(@"Removing old webstorage backup: '%@'.", info.backup);
|
||||
[manager removeItemAtPath:info.backup error:nil];
|
||||
}
|
||||
}
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] setBool:[backupType isEqualToString:@"cloud"] forKey:@"WebKitStoreWebDataForBackup"];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark Notification handlers
|
||||
|
||||
- (void)onResignActive
|
||||
{
|
||||
UIDevice* device = [UIDevice currentDevice];
|
||||
NSNumber* exitsOnSuspend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIApplicationExitsOnSuspend"];
|
||||
|
||||
BOOL isMultitaskingSupported = [device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported];
|
||||
|
||||
if (exitsOnSuspend == nil) { // if it's missing, it should be NO (i.e. multi-tasking on by default)
|
||||
exitsOnSuspend = [NSNumber numberWithBool:NO];
|
||||
}
|
||||
|
||||
if (exitsOnSuspend) {
|
||||
[self backup:nil];
|
||||
} else if (isMultitaskingSupported) {
|
||||
__block UIBackgroundTaskIdentifier backgroundTaskID = UIBackgroundTaskInvalid;
|
||||
|
||||
backgroundTaskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
|
||||
[[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
|
||||
backgroundTaskID = UIBackgroundTaskInvalid;
|
||||
NSLog(@"Background task to backup WebSQL/LocalStorage expired.");
|
||||
}];
|
||||
CDVLocalStorage __weak* weakSelf = self;
|
||||
[self.commandDelegate runInBackground:^{
|
||||
[weakSelf backup:nil];
|
||||
|
||||
[[UIApplication sharedApplication] endBackgroundTask:backgroundTaskID];
|
||||
backgroundTaskID = UIBackgroundTaskInvalid;
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)onAppTerminate
|
||||
{
|
||||
[self onResignActive];
|
||||
}
|
||||
|
||||
- (void)onReset
|
||||
{
|
||||
[self restore:nil];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark CDVBackupInfo implementation
|
||||
|
||||
@implementation CDVBackupInfo
|
||||
|
||||
@synthesize original, backup, label;
|
||||
|
||||
- (BOOL)file:(NSString*)aPath isNewerThanFile:(NSString*)bPath
|
||||
{
|
||||
NSFileManager* fileManager = [NSFileManager defaultManager];
|
||||
NSError* __autoreleasing error = nil;
|
||||
|
||||
NSDictionary* aPathAttribs = [fileManager attributesOfItemAtPath:aPath error:&error];
|
||||
NSDictionary* bPathAttribs = [fileManager attributesOfItemAtPath:bPath error:&error];
|
||||
|
||||
NSDate* aPathModDate = [aPathAttribs objectForKey:NSFileModificationDate];
|
||||
NSDate* bPathModDate = [bPathAttribs objectForKey:NSFileModificationDate];
|
||||
|
||||
if ((nil == aPathModDate) && (nil == bPathModDate)) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
return [aPathModDate compare:bPathModDate] == NSOrderedDescending || bPathModDate == nil;
|
||||
}
|
||||
|
||||
- (BOOL)item:(NSString*)aPath isNewerThanItem:(NSString*)bPath
|
||||
{
|
||||
NSFileManager* fileManager = [NSFileManager defaultManager];
|
||||
|
||||
BOOL aPathIsDir = NO, bPathIsDir = NO;
|
||||
BOOL aPathExists = [fileManager fileExistsAtPath:aPath isDirectory:&aPathIsDir];
|
||||
|
||||
[fileManager fileExistsAtPath:bPath isDirectory:&bPathIsDir];
|
||||
|
||||
if (!aPathExists) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
if (!(aPathIsDir && bPathIsDir)) { // just a file
|
||||
return [self file:aPath isNewerThanFile:bPath];
|
||||
}
|
||||
|
||||
// essentially we want rsync here, but have to settle for our poor man's implementation
|
||||
// we get the files in aPath, and see if it is newer than the file in bPath
|
||||
// (it is newer if it doesn't exist in bPath) if we encounter the FIRST file that is newer,
|
||||
// we return YES
|
||||
NSDirectoryEnumerator* directoryEnumerator = [fileManager enumeratorAtPath:aPath];
|
||||
NSString* path;
|
||||
|
||||
while ((path = [directoryEnumerator nextObject])) {
|
||||
NSString* aPathFile = [aPath stringByAppendingPathComponent:path];
|
||||
NSString* bPathFile = [bPath stringByAppendingPathComponent:path];
|
||||
|
||||
BOOL isNewer = [self file:aPathFile isNewerThanFile:bPathFile];
|
||||
if (isNewer) {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)shouldBackup
|
||||
{
|
||||
return [self item:self.original isNewerThanItem:self.backup];
|
||||
}
|
||||
|
||||
- (BOOL)shouldRestore
|
||||
{
|
||||
return [self item:self.backup isNewerThanItem:self.original];
|
||||
}
|
||||
|
||||
@end
|
67
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPlugin.h
Normal file
67
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPlugin.h
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "CDVPluginResult.h"
|
||||
#import "NSMutableArray+QueueAdditions.h"
|
||||
#import "CDVCommandDelegate.h"
|
||||
|
||||
extern NSString* const CDVPageDidLoadNotification;
|
||||
extern NSString* const CDVPluginHandleOpenURLNotification;
|
||||
extern NSString* const CDVPluginResetNotification;
|
||||
extern NSString* const CDVLocalNotification;
|
||||
extern NSString* const CDVRemoteNotification;
|
||||
extern NSString* const CDVRemoteNotificationError;
|
||||
|
||||
@interface CDVPlugin : NSObject {}
|
||||
|
||||
@property (nonatomic, weak) UIWebView* webView;
|
||||
@property (nonatomic, weak) UIViewController* viewController;
|
||||
@property (nonatomic, weak) id <CDVCommandDelegate> commandDelegate;
|
||||
|
||||
@property (readonly, assign) BOOL hasPendingOperation;
|
||||
|
||||
- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView;
|
||||
- (void)pluginInitialize;
|
||||
|
||||
- (void)handleOpenURL:(NSNotification*)notification;
|
||||
- (void)onAppTerminate;
|
||||
- (void)onMemoryWarning;
|
||||
- (void)onReset;
|
||||
- (void)dispose;
|
||||
|
||||
/*
|
||||
// see initWithWebView implementation
|
||||
- (void) onPause {}
|
||||
- (void) onResume {}
|
||||
- (void) onOrientationWillChange {}
|
||||
- (void) onOrientationDidChange {}
|
||||
- (void)didReceiveLocalNotification:(NSNotification *)notification;
|
||||
*/
|
||||
|
||||
- (id)appDelegate;
|
||||
|
||||
- (NSString*)writeJavascript:(NSString*)javascript CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate equivalent of evalJs:. This will be removed in 4.0.0");
|
||||
|
||||
- (NSString*)success:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate equivalent of sendPluginResult:callbackId. This will be removed in 4.0.0");
|
||||
|
||||
- (NSString*)error:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate equivalent of sendPluginResult:callbackId. This will be removed in 4.0.0");
|
||||
|
||||
@end
|
154
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPlugin.m
Normal file
154
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPlugin.m
Normal file
|
@ -0,0 +1,154 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVPlugin.h"
|
||||
|
||||
NSString* const CDVPageDidLoadNotification = @"CDVPageDidLoadNotification";
|
||||
NSString* const CDVPluginHandleOpenURLNotification = @"CDVPluginHandleOpenURLNotification";
|
||||
NSString* const CDVPluginResetNotification = @"CDVPluginResetNotification";
|
||||
NSString* const CDVLocalNotification = @"CDVLocalNotification";
|
||||
NSString* const CDVRemoteNotification = @"CDVRemoteNotification";
|
||||
NSString* const CDVRemoteNotificationError = @"CDVRemoteNotificationError";
|
||||
|
||||
@interface CDVPlugin ()
|
||||
|
||||
@property (readwrite, assign) BOOL hasPendingOperation;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVPlugin
|
||||
@synthesize webView, viewController, commandDelegate, hasPendingOperation;
|
||||
|
||||
// Do not override these methods. Use pluginInitialize instead.
|
||||
- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView settings:(NSDictionary*)classSettings
|
||||
{
|
||||
return [self initWithWebView:theWebView];
|
||||
}
|
||||
|
||||
- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppTerminate) name:UIApplicationWillTerminateNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:CDVPluginHandleOpenURLNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReset) name:CDVPluginResetNotification object:theWebView];
|
||||
|
||||
self.webView = theWebView;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)pluginInitialize
|
||||
{
|
||||
// You can listen to more app notifications, see:
|
||||
// http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-DontLinkElementID_4
|
||||
|
||||
// NOTE: if you want to use these, make sure you uncomment the corresponding notification handler
|
||||
|
||||
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil];
|
||||
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil];
|
||||
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationWillChange) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
|
||||
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationDidChange) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
|
||||
|
||||
// Added in 2.3.0
|
||||
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveLocalNotification:) name:CDVLocalNotification object:nil];
|
||||
|
||||
// Added in 2.5.0
|
||||
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pageDidLoad:) name:CDVPageDidLoadNotification object:self.webView];
|
||||
}
|
||||
|
||||
- (void)dispose
|
||||
{
|
||||
viewController = nil;
|
||||
commandDelegate = nil;
|
||||
webView = nil;
|
||||
}
|
||||
|
||||
/*
|
||||
// NOTE: for onPause and onResume, calls into JavaScript must not call or trigger any blocking UI, like alerts
|
||||
- (void) onPause {}
|
||||
- (void) onResume {}
|
||||
- (void) onOrientationWillChange {}
|
||||
- (void) onOrientationDidChange {}
|
||||
*/
|
||||
|
||||
/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */
|
||||
- (void)handleOpenURL:(NSNotification*)notification
|
||||
{
|
||||
// override to handle urls sent to your app
|
||||
// register your url schemes in your App-Info.plist
|
||||
|
||||
NSURL* url = [notification object];
|
||||
|
||||
if ([url isKindOfClass:[NSURL class]]) {
|
||||
/* Do your thing! */
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */
|
||||
- (void)onAppTerminate
|
||||
{
|
||||
// override this if you need to do any cleanup on app exit
|
||||
}
|
||||
|
||||
- (void)onMemoryWarning
|
||||
{
|
||||
// override to remove caches, etc
|
||||
}
|
||||
|
||||
- (void)onReset
|
||||
{
|
||||
// Override to cancel any long-running requests when the WebView navigates or refreshes.
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self]; // this will remove all notification unless added using addObserverForName:object:queue:usingBlock:
|
||||
}
|
||||
|
||||
- (id)appDelegate
|
||||
{
|
||||
return [[UIApplication sharedApplication] delegate];
|
||||
}
|
||||
|
||||
- (NSString*)writeJavascript:(NSString*)javascript
|
||||
{
|
||||
return [self.webView stringByEvaluatingJavaScriptFromString:javascript];
|
||||
}
|
||||
|
||||
- (NSString*)success:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId
|
||||
{
|
||||
[self.commandDelegate evalJs:[pluginResult toSuccessCallbackString:callbackId]];
|
||||
return @"";
|
||||
}
|
||||
|
||||
- (NSString*)error:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId
|
||||
{
|
||||
[self.commandDelegate evalJs:[pluginResult toErrorCallbackString:callbackId]];
|
||||
return @"";
|
||||
}
|
||||
|
||||
// default implementation does nothing, ideally, we are not registered for notification if we aren't going to do anything.
|
||||
// - (void)didReceiveLocalNotification:(NSNotification *)notification
|
||||
// {
|
||||
// // UILocalNotification* localNotification = [notification object]; // get the payload as a LocalNotification
|
||||
// }
|
||||
|
||||
@end
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "CDVAvailability.h"
|
||||
|
||||
typedef enum {
|
||||
CDVCommandStatus_NO_RESULT = 0,
|
||||
CDVCommandStatus_OK,
|
||||
CDVCommandStatus_CLASS_NOT_FOUND_EXCEPTION,
|
||||
CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION,
|
||||
CDVCommandStatus_INSTANTIATION_EXCEPTION,
|
||||
CDVCommandStatus_MALFORMED_URL_EXCEPTION,
|
||||
CDVCommandStatus_IO_EXCEPTION,
|
||||
CDVCommandStatus_INVALID_ACTION,
|
||||
CDVCommandStatus_JSON_EXCEPTION,
|
||||
CDVCommandStatus_ERROR
|
||||
} CDVCommandStatus;
|
||||
|
||||
@interface CDVPluginResult : NSObject {}
|
||||
|
||||
@property (nonatomic, strong, readonly) NSNumber* status;
|
||||
@property (nonatomic, strong, readonly) id message;
|
||||
@property (nonatomic, strong) NSNumber* keepCallback;
|
||||
// This property can be used to scope the lifetime of another object. For example,
|
||||
// Use it to store the associated NSData when `message` is created using initWithBytesNoCopy.
|
||||
@property (nonatomic, strong) id associatedObject;
|
||||
|
||||
- (CDVPluginResult*)init;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages;
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode;
|
||||
|
||||
+ (void)setVerbose:(BOOL)verbose;
|
||||
+ (BOOL)isVerbose;
|
||||
|
||||
- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback;
|
||||
|
||||
- (NSString*)argumentsAsJSON;
|
||||
|
||||
// These methods are used by the legacy plugin return result method
|
||||
- (NSString*)toJSONString CDV_DEPRECATED(3.6, "Only used by toSuccessCallbackString and toErrorCallbackString which are deprecated. This will be removed in 4.0.0");
|
||||
|
||||
- (NSString*)toSuccessCallbackString:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate method sendPluginResult:callbackId instead. This will be removed in 4.0.0");
|
||||
|
||||
- (NSString*)toErrorCallbackString:(NSString*)callbackId CDV_DEPRECATED(3.6, "Use the CDVCommandDelegate method sendPluginResult:callbackId instead. This will be removed in 4.0.0");
|
||||
|
||||
@end
|
224
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPluginResult.m
Normal file
224
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVPluginResult.m
Normal file
|
@ -0,0 +1,224 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVPluginResult.h"
|
||||
#import "CDVJSON_private.h"
|
||||
#import "CDVDebug.h"
|
||||
#import "NSData+Base64.h"
|
||||
|
||||
@interface CDVPluginResult ()
|
||||
|
||||
- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVPluginResult
|
||||
@synthesize status, message, keepCallback, associatedObject;
|
||||
|
||||
static NSArray* org_apache_cordova_CommandStatusMsgs;
|
||||
|
||||
id messageFromArrayBuffer(NSData* data)
|
||||
{
|
||||
return @{
|
||||
@"CDVType" : @"ArrayBuffer",
|
||||
@"data" :[data cdv_base64EncodedString]
|
||||
};
|
||||
}
|
||||
|
||||
id massageMessage(id message)
|
||||
{
|
||||
if ([message isKindOfClass:[NSData class]]) {
|
||||
return messageFromArrayBuffer(message);
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
id messageFromMultipart(NSArray* theMessages)
|
||||
{
|
||||
NSMutableArray* messages = [NSMutableArray arrayWithArray:theMessages];
|
||||
|
||||
for (NSUInteger i = 0; i < messages.count; ++i) {
|
||||
[messages replaceObjectAtIndex:i withObject:massageMessage([messages objectAtIndex:i])];
|
||||
}
|
||||
|
||||
return @{
|
||||
@"CDVType" : @"MultiPart",
|
||||
@"messages" : messages
|
||||
};
|
||||
}
|
||||
|
||||
+ (void)initialize
|
||||
{
|
||||
org_apache_cordova_CommandStatusMsgs = [[NSArray alloc] initWithObjects:@"No result",
|
||||
@"OK",
|
||||
@"Class not found",
|
||||
@"Illegal access",
|
||||
@"Instantiation error",
|
||||
@"Malformed url",
|
||||
@"IO error",
|
||||
@"Invalid action",
|
||||
@"JSON error",
|
||||
@"Error",
|
||||
nil];
|
||||
}
|
||||
|
||||
- (CDVPluginResult*)init
|
||||
{
|
||||
return [self initWithStatus:CDVCommandStatus_NO_RESULT message:nil];
|
||||
}
|
||||
|
||||
- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
status = [NSNumber numberWithInt:statusOrdinal];
|
||||
message = theMessage;
|
||||
keepCallback = [NSNumber numberWithBool:NO];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:nil];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:theMessage];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:theMessage];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithInt:theMessage]];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithDouble:theMessage]];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithBool:theMessage]];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:theMessage];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:messageFromArrayBuffer(theMessage)];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages
|
||||
{
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:messageFromMultipart(theMessages)];
|
||||
}
|
||||
|
||||
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode
|
||||
{
|
||||
NSDictionary* errDict = @{@"code" :[NSNumber numberWithInt:errorCode]};
|
||||
|
||||
return [[self alloc] initWithStatus:statusOrdinal message:errDict];
|
||||
}
|
||||
|
||||
- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback
|
||||
{
|
||||
[self setKeepCallback:[NSNumber numberWithBool:bKeepCallback]];
|
||||
}
|
||||
|
||||
- (NSString*)argumentsAsJSON
|
||||
{
|
||||
id arguments = (self.message == nil ? [NSNull null] : self.message);
|
||||
NSArray* argumentsWrappedInArray = [NSArray arrayWithObject:arguments];
|
||||
|
||||
NSString* argumentsJSON = [argumentsWrappedInArray cdv_JSONString];
|
||||
|
||||
argumentsJSON = [argumentsJSON substringWithRange:NSMakeRange(1, [argumentsJSON length] - 2)];
|
||||
|
||||
return argumentsJSON;
|
||||
}
|
||||
|
||||
// These methods are used by the legacy plugin return result method
|
||||
- (NSString*)toJSONString
|
||||
{
|
||||
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
self.status, @"status",
|
||||
self.message ? self. message:[NSNull null], @"message",
|
||||
self.keepCallback, @"keepCallback",
|
||||
nil];
|
||||
|
||||
NSError* error = nil;
|
||||
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dict
|
||||
options:NSJSONWritingPrettyPrinted
|
||||
error:&error];
|
||||
NSString* resultString = nil;
|
||||
|
||||
if (error != nil) {
|
||||
NSLog(@"toJSONString error: %@", [error localizedDescription]);
|
||||
} else {
|
||||
resultString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
|
||||
if ([[self class] isVerbose]) {
|
||||
NSLog(@"PluginResult:toJSONString - %@", resultString);
|
||||
}
|
||||
return resultString;
|
||||
}
|
||||
|
||||
- (NSString*)toSuccessCallbackString:(NSString*)callbackId
|
||||
{
|
||||
NSString* successCB = [NSString stringWithFormat:@"cordova.callbackSuccess('%@',%@);", callbackId, [self toJSONString]];
|
||||
|
||||
if ([[self class] isVerbose]) {
|
||||
NSLog(@"PluginResult toSuccessCallbackString: %@", successCB);
|
||||
}
|
||||
return successCB;
|
||||
}
|
||||
|
||||
- (NSString*)toErrorCallbackString:(NSString*)callbackId
|
||||
{
|
||||
NSString* errorCB = [NSString stringWithFormat:@"cordova.callbackError('%@',%@);", callbackId, [self toJSONString]];
|
||||
|
||||
if ([[self class] isVerbose]) {
|
||||
NSLog(@"PluginResult toErrorCallbackString: %@", errorCB);
|
||||
}
|
||||
return errorCB;
|
||||
}
|
||||
|
||||
static BOOL gIsVerbose = NO;
|
||||
+ (void)setVerbose:(BOOL)verbose
|
||||
{
|
||||
gIsVerbose = verbose;
|
||||
}
|
||||
|
||||
+ (BOOL)isVerbose
|
||||
{
|
||||
return gIsVerbose;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@protocol CDVScreenOrientationDelegate <NSObject>
|
||||
|
||||
- (NSUInteger)supportedInterfaceOrientations;
|
||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
|
||||
- (BOOL)shouldAutorotate;
|
||||
|
||||
@end
|
22
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVShared.h
Normal file
22
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVShared.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
// This file was emptied out in 3.6.0 release (July 2014).
|
||||
// It will be deleted in a future release.
|
||||
#import <CoreLocation/CoreLocation.h>
|
27
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVTimer.h
Normal file
27
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVTimer.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface CDVTimer : NSObject
|
||||
|
||||
+ (void)start:(NSString*)name;
|
||||
+ (void)stop:(NSString*)name;
|
||||
|
||||
@end
|
123
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVTimer.m
Normal file
123
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVTimer.m
Normal file
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVTimer.h"
|
||||
|
||||
#pragma mark CDVTimerItem
|
||||
|
||||
@interface CDVTimerItem : NSObject
|
||||
|
||||
@property (nonatomic, strong) NSString* name;
|
||||
@property (nonatomic, strong) NSDate* started;
|
||||
@property (nonatomic, strong) NSDate* ended;
|
||||
|
||||
- (void)log;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVTimerItem
|
||||
|
||||
- (void)log
|
||||
{
|
||||
NSLog(@"[CDVTimer][%@] %fms", self.name, [self.ended timeIntervalSinceDate:self.started] * 1000.0);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
#pragma mark CDVTimer
|
||||
|
||||
@interface CDVTimer ()
|
||||
|
||||
@property (nonatomic, strong) NSMutableDictionary* items;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVTimer
|
||||
|
||||
#pragma mark object methods
|
||||
|
||||
- (id)init
|
||||
{
|
||||
if (self = [super init]) {
|
||||
self.items = [NSMutableDictionary dictionaryWithCapacity:6];
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)add:(NSString*)name
|
||||
{
|
||||
if ([self.items objectForKey:[name lowercaseString]] == nil) {
|
||||
CDVTimerItem* item = [CDVTimerItem new];
|
||||
item.name = name;
|
||||
item.started = [NSDate new];
|
||||
[self.items setObject:item forKey:[name lowercaseString]];
|
||||
} else {
|
||||
NSLog(@"Timer called '%@' already exists.", name);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)remove:(NSString*)name
|
||||
{
|
||||
CDVTimerItem* item = [self.items objectForKey:[name lowercaseString]];
|
||||
|
||||
if (item != nil) {
|
||||
item.ended = [NSDate new];
|
||||
[item log];
|
||||
[self.items removeObjectForKey:[name lowercaseString]];
|
||||
} else {
|
||||
NSLog(@"Timer called '%@' does not exist.", name);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)removeAll
|
||||
{
|
||||
[self.items removeAllObjects];
|
||||
}
|
||||
|
||||
#pragma mark class methods
|
||||
|
||||
+ (void)start:(NSString*)name
|
||||
{
|
||||
[[CDVTimer sharedInstance] add:name];
|
||||
}
|
||||
|
||||
+ (void)stop:(NSString*)name
|
||||
{
|
||||
[[CDVTimer sharedInstance] remove:name];
|
||||
}
|
||||
|
||||
+ (void)clearAll
|
||||
{
|
||||
[[CDVTimer sharedInstance] removeAll];
|
||||
}
|
||||
|
||||
+ (CDVTimer*)sharedInstance
|
||||
{
|
||||
static dispatch_once_t pred = 0;
|
||||
__strong static CDVTimer* _sharedObject = nil;
|
||||
|
||||
dispatch_once(&pred, ^{
|
||||
_sharedObject = [[self alloc] init];
|
||||
});
|
||||
|
||||
return _sharedObject;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "CDVAvailability.h"
|
||||
|
||||
@class CDVViewController;
|
||||
|
||||
@interface CDVURLProtocol : NSURLProtocol {}
|
||||
|
||||
+ (void)registerViewController:(CDVViewController*)viewController;
|
||||
+ (void)unregisterViewController:(CDVViewController*)viewController;
|
||||
@end
|
213
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVURLProtocol.m
Normal file
213
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVURLProtocol.m
Normal file
|
@ -0,0 +1,213 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <AssetsLibrary/ALAsset.h>
|
||||
#import <AssetsLibrary/ALAssetRepresentation.h>
|
||||
#import <AssetsLibrary/ALAssetsLibrary.h>
|
||||
#import <MobileCoreServices/MobileCoreServices.h>
|
||||
#import "CDVURLProtocol.h"
|
||||
#import "CDVCommandQueue.h"
|
||||
#import "CDVWhitelist.h"
|
||||
#import "CDVViewController.h"
|
||||
|
||||
static CDVWhitelist* gWhitelist = nil;
|
||||
// Contains a set of NSNumbers of addresses of controllers. It doesn't store
|
||||
// the actual pointer to avoid retaining.
|
||||
static NSMutableSet* gRegisteredControllers = nil;
|
||||
|
||||
NSString* const kCDVAssetsLibraryPrefixes = @"assets-library://";
|
||||
|
||||
// Returns the registered view controller that sent the given request.
|
||||
// If the user-agent is not from a UIWebView, or if it's from an unregistered one,
|
||||
// then nil is returned.
|
||||
static CDVViewController *viewControllerForRequest(NSURLRequest* request)
|
||||
{
|
||||
// The exec bridge explicitly sets the VC address in a header.
|
||||
// This works around the User-Agent not being set for file: URLs.
|
||||
NSString* addrString = [request valueForHTTPHeaderField:@"vc"];
|
||||
|
||||
if (addrString == nil) {
|
||||
NSString* userAgent = [request valueForHTTPHeaderField:@"User-Agent"];
|
||||
if (userAgent == nil) {
|
||||
return nil;
|
||||
}
|
||||
NSUInteger bracketLocation = [userAgent rangeOfString:@"(" options:NSBackwardsSearch].location;
|
||||
if (bracketLocation == NSNotFound) {
|
||||
return nil;
|
||||
}
|
||||
addrString = [userAgent substringFromIndex:bracketLocation + 1];
|
||||
}
|
||||
|
||||
long long viewControllerAddress = [addrString longLongValue];
|
||||
@synchronized(gRegisteredControllers) {
|
||||
if (![gRegisteredControllers containsObject:[NSNumber numberWithLongLong:viewControllerAddress]]) {
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
|
||||
return (__bridge CDVViewController*)(void*)viewControllerAddress;
|
||||
}
|
||||
|
||||
@implementation CDVURLProtocol
|
||||
|
||||
+ (void)registerPGHttpURLProtocol {}
|
||||
|
||||
+ (void)registerURLProtocol {}
|
||||
|
||||
// Called to register the URLProtocol, and to make it away of an instance of
|
||||
// a ViewController.
|
||||
+ (void)registerViewController:(CDVViewController*)viewController
|
||||
{
|
||||
if (gRegisteredControllers == nil) {
|
||||
[NSURLProtocol registerClass:[CDVURLProtocol class]];
|
||||
gRegisteredControllers = [[NSMutableSet alloc] initWithCapacity:8];
|
||||
// The whitelist doesn't change, so grab the first one and store it.
|
||||
gWhitelist = viewController.whitelist;
|
||||
|
||||
// Note that we grab the whitelist from the first viewcontroller for now - but this will change
|
||||
// when we allow a registered viewcontroller to have its own whitelist (e.g InAppBrowser)
|
||||
// Differentiating the requests will be through the 'vc' http header below as used for the js->objc bridge.
|
||||
// The 'vc' value is generated by casting the viewcontroller object to a (long long) value (see CDVViewController::webViewDidFinishLoad)
|
||||
if (gWhitelist == nil) {
|
||||
NSLog(@"WARNING: NO whitelist has been set in CDVURLProtocol.");
|
||||
}
|
||||
}
|
||||
|
||||
@synchronized(gRegisteredControllers) {
|
||||
[gRegisteredControllers addObject:[NSNumber numberWithLongLong:(long long)viewController]];
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)unregisterViewController:(CDVViewController*)viewController
|
||||
{
|
||||
@synchronized(gRegisteredControllers) {
|
||||
[gRegisteredControllers removeObject:[NSNumber numberWithLongLong:(long long)viewController]];
|
||||
}
|
||||
}
|
||||
|
||||
+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest
|
||||
{
|
||||
NSURL* theUrl = [theRequest URL];
|
||||
CDVViewController* viewController = viewControllerForRequest(theRequest);
|
||||
|
||||
if ([[theUrl absoluteString] hasPrefix:kCDVAssetsLibraryPrefixes]) {
|
||||
return YES;
|
||||
} else if (viewController != nil) {
|
||||
if ([[theUrl path] isEqualToString:@"/!gap_exec"]) {
|
||||
NSString* queuedCommandsJSON = [theRequest valueForHTTPHeaderField:@"cmds"];
|
||||
NSString* requestId = [theRequest valueForHTTPHeaderField:@"rc"];
|
||||
if (requestId == nil) {
|
||||
NSLog(@"!cordova request missing rc header");
|
||||
return NO;
|
||||
}
|
||||
BOOL hasCmds = [queuedCommandsJSON length] > 0;
|
||||
if (hasCmds) {
|
||||
SEL sel = @selector(enqueueCommandBatch:);
|
||||
[viewController.commandQueue performSelectorOnMainThread:sel withObject:queuedCommandsJSON waitUntilDone:NO];
|
||||
[viewController.commandQueue performSelectorOnMainThread:@selector(executePending) withObject:nil waitUntilDone:NO];
|
||||
} else {
|
||||
SEL sel = @selector(processXhrExecBridgePoke:);
|
||||
[viewController.commandQueue performSelectorOnMainThread:sel withObject:[NSNumber numberWithInteger:[requestId integerValue]] waitUntilDone:NO];
|
||||
}
|
||||
// Returning NO here would be 20% faster, but it spams WebInspector's console with failure messages.
|
||||
// If JS->Native bridge speed is really important for an app, they should use the iframe bridge.
|
||||
// Returning YES here causes the request to come through canInitWithRequest two more times.
|
||||
// For this reason, we return NO when cmds exist.
|
||||
return !hasCmds;
|
||||
}
|
||||
// we only care about http and https connections.
|
||||
// CORS takes care of http: trying to access file: URLs.
|
||||
if ([gWhitelist schemeIsAllowed:[theUrl scheme]]) {
|
||||
// if it FAILS the whitelist, we return TRUE, so we can fail the connection later
|
||||
return ![gWhitelist URLIsAllowed:theUrl];
|
||||
}
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)request
|
||||
{
|
||||
// NSLog(@"%@ received %@", self, NSStringFromSelector(_cmd));
|
||||
return request;
|
||||
}
|
||||
|
||||
- (void)startLoading
|
||||
{
|
||||
// NSLog(@"%@ received %@ - start", self, NSStringFromSelector(_cmd));
|
||||
NSURL* url = [[self request] URL];
|
||||
|
||||
if ([[url path] isEqualToString:@"/!gap_exec"]) {
|
||||
[self sendResponseWithResponseCode:200 data:nil mimeType:nil];
|
||||
return;
|
||||
} else if ([[url absoluteString] hasPrefix:kCDVAssetsLibraryPrefixes]) {
|
||||
ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset* asset) {
|
||||
if (asset) {
|
||||
// We have the asset! Get the data and send it along.
|
||||
ALAssetRepresentation* assetRepresentation = [asset defaultRepresentation];
|
||||
NSString* MIMEType = (__bridge_transfer NSString*)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)[assetRepresentation UTI], kUTTagClassMIMEType);
|
||||
Byte* buffer = (Byte*)malloc((unsigned long)[assetRepresentation size]);
|
||||
NSUInteger bufferSize = [assetRepresentation getBytes:buffer fromOffset:0.0 length:(NSUInteger)[assetRepresentation size] error:nil];
|
||||
NSData* data = [NSData dataWithBytesNoCopy:buffer length:bufferSize freeWhenDone:YES];
|
||||
[self sendResponseWithResponseCode:200 data:data mimeType:MIMEType];
|
||||
} else {
|
||||
// Retrieving the asset failed for some reason. Send an error.
|
||||
[self sendResponseWithResponseCode:404 data:nil mimeType:nil];
|
||||
}
|
||||
};
|
||||
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError* error) {
|
||||
// Retrieving the asset failed for some reason. Send an error.
|
||||
[self sendResponseWithResponseCode:401 data:nil mimeType:nil];
|
||||
};
|
||||
|
||||
ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
|
||||
[assetsLibrary assetForURL:url resultBlock:resultBlock failureBlock:failureBlock];
|
||||
return;
|
||||
}
|
||||
|
||||
NSString* body = [gWhitelist errorStringForURL:url];
|
||||
[self sendResponseWithResponseCode:401 data:[body dataUsingEncoding:NSASCIIStringEncoding] mimeType:nil];
|
||||
}
|
||||
|
||||
- (void)stopLoading
|
||||
{
|
||||
// do any cleanup here
|
||||
}
|
||||
|
||||
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest*)requestA toRequest:(NSURLRequest*)requestB
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)sendResponseWithResponseCode:(NSInteger)statusCode data:(NSData*)data mimeType:(NSString*)mimeType
|
||||
{
|
||||
if (mimeType == nil) {
|
||||
mimeType = @"text/plain";
|
||||
}
|
||||
|
||||
NSHTTPURLResponse* response = [[NSHTTPURLResponse alloc] initWithURL:[[self request] URL] statusCode:statusCode HTTPVersion:@"HTTP/1.1" headerFields:@{@"Content-Type" : mimeType}];
|
||||
|
||||
[[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
|
||||
if (data != nil) {
|
||||
[[self client] URLProtocol:self didLoadData:data];
|
||||
}
|
||||
[[self client] URLProtocolDidFinishLoading:self];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface CDVUserAgentUtil : NSObject
|
||||
+ (NSString*)originalUserAgent;
|
||||
+ (void)acquireLock:(void (^)(NSInteger lockToken))block;
|
||||
+ (void)releaseLock:(NSInteger*)lockToken;
|
||||
+ (void)setUserAgent:(NSString*)value lockToken:(NSInteger)lockToken;
|
||||
@end
|
122
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVUserAgentUtil.m
Normal file
122
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVUserAgentUtil.m
Normal file
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVUserAgentUtil.h"
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
// #define VerboseLog NSLog
|
||||
#define VerboseLog(...) do {} while (0)
|
||||
|
||||
static NSString* const kCdvUserAgentKey = @"Cordova-User-Agent";
|
||||
static NSString* const kCdvUserAgentVersionKey = @"Cordova-User-Agent-Version";
|
||||
|
||||
static NSString* gOriginalUserAgent = nil;
|
||||
static NSInteger gNextLockToken = 0;
|
||||
static NSInteger gCurrentLockToken = 0;
|
||||
static NSMutableArray* gPendingSetUserAgentBlocks = nil;
|
||||
|
||||
@implementation CDVUserAgentUtil
|
||||
|
||||
+ (NSString*)originalUserAgent
|
||||
{
|
||||
if (gOriginalUserAgent == nil) {
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppLocaleDidChange:)
|
||||
name:NSCurrentLocaleDidChangeNotification object:nil];
|
||||
|
||||
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
NSString* systemVersion = [[UIDevice currentDevice] systemVersion];
|
||||
NSString* localeStr = [[NSLocale currentLocale] localeIdentifier];
|
||||
// Record the model since simulator can change it without re-install (CB-5420).
|
||||
NSString* model = [UIDevice currentDevice].model;
|
||||
NSString* systemAndLocale = [NSString stringWithFormat:@"%@ %@ %@", model, systemVersion, localeStr];
|
||||
|
||||
NSString* cordovaUserAgentVersion = [userDefaults stringForKey:kCdvUserAgentVersionKey];
|
||||
gOriginalUserAgent = [userDefaults stringForKey:kCdvUserAgentKey];
|
||||
BOOL cachedValueIsOld = ![systemAndLocale isEqualToString:cordovaUserAgentVersion];
|
||||
|
||||
if ((gOriginalUserAgent == nil) || cachedValueIsOld) {
|
||||
UIWebView* sampleWebView = [[UIWebView alloc] initWithFrame:CGRectZero];
|
||||
gOriginalUserAgent = [sampleWebView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
|
||||
|
||||
[userDefaults setObject:gOriginalUserAgent forKey:kCdvUserAgentKey];
|
||||
[userDefaults setObject:systemAndLocale forKey:kCdvUserAgentVersionKey];
|
||||
|
||||
[userDefaults synchronize];
|
||||
}
|
||||
}
|
||||
return gOriginalUserAgent;
|
||||
}
|
||||
|
||||
+ (void)onAppLocaleDidChange:(NSNotification*)notification
|
||||
{
|
||||
// TODO: We should figure out how to update the user-agent of existing UIWebViews when this happens.
|
||||
// Maybe use the PDF bug (noted in setUserAgent:).
|
||||
gOriginalUserAgent = nil;
|
||||
}
|
||||
|
||||
+ (void)acquireLock:(void (^)(NSInteger lockToken))block
|
||||
{
|
||||
if (gCurrentLockToken == 0) {
|
||||
gCurrentLockToken = ++gNextLockToken;
|
||||
VerboseLog(@"Gave lock %d", gCurrentLockToken);
|
||||
block(gCurrentLockToken);
|
||||
} else {
|
||||
if (gPendingSetUserAgentBlocks == nil) {
|
||||
gPendingSetUserAgentBlocks = [[NSMutableArray alloc] initWithCapacity:4];
|
||||
}
|
||||
VerboseLog(@"Waiting for lock");
|
||||
[gPendingSetUserAgentBlocks addObject:block];
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)releaseLock:(NSInteger*)lockToken
|
||||
{
|
||||
if (*lockToken == 0) {
|
||||
return;
|
||||
}
|
||||
NSAssert(gCurrentLockToken == *lockToken, @"Got token %ld, expected %ld", (long)*lockToken, (long)gCurrentLockToken);
|
||||
|
||||
VerboseLog(@"Released lock %d", *lockToken);
|
||||
if ([gPendingSetUserAgentBlocks count] > 0) {
|
||||
void (^block)() = [gPendingSetUserAgentBlocks objectAtIndex:0];
|
||||
[gPendingSetUserAgentBlocks removeObjectAtIndex:0];
|
||||
gCurrentLockToken = ++gNextLockToken;
|
||||
NSLog(@"Gave lock %ld", (long)gCurrentLockToken);
|
||||
block(gCurrentLockToken);
|
||||
} else {
|
||||
gCurrentLockToken = 0;
|
||||
}
|
||||
*lockToken = 0;
|
||||
}
|
||||
|
||||
+ (void)setUserAgent:(NSString*)value lockToken:(NSInteger)lockToken
|
||||
{
|
||||
NSAssert(gCurrentLockToken == lockToken, @"Got token %ld, expected %ld", (long)lockToken, (long)gCurrentLockToken);
|
||||
VerboseLog(@"User-Agent set to: %@", value);
|
||||
|
||||
// Setting the UserAgent must occur before a UIWebView is instantiated.
|
||||
// It is read per instantiation, so it does not affect previously created views.
|
||||
// Except! When a PDF is loaded, all currently active UIWebViews reload their
|
||||
// User-Agent from the NSUserDefaults some time after the DidFinishLoad of the PDF bah!
|
||||
NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:value, @"UserAgent", nil];
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:dict];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <Foundation/NSJSONSerialization.h>
|
||||
#import "CDVAvailability.h"
|
||||
#import "CDVInvokedUrlCommand.h"
|
||||
#import "CDVCommandDelegate.h"
|
||||
#import "CDVCommandQueue.h"
|
||||
#import "CDVWhitelist.h"
|
||||
#import "CDVScreenOrientationDelegate.h"
|
||||
#import "CDVPlugin.h"
|
||||
|
||||
@interface CDVViewController : UIViewController <UIWebViewDelegate, CDVScreenOrientationDelegate>{
|
||||
@protected
|
||||
id <CDVCommandDelegate> _commandDelegate;
|
||||
@protected
|
||||
CDVCommandQueue* _commandQueue;
|
||||
NSString* _userAgent;
|
||||
}
|
||||
|
||||
@property (nonatomic, strong) IBOutlet UIWebView* webView;
|
||||
|
||||
@property (nonatomic, readonly, strong) NSMutableDictionary* pluginObjects;
|
||||
@property (nonatomic, readonly, strong) NSDictionary* pluginsMap;
|
||||
@property (nonatomic, readonly, strong) NSMutableDictionary* settings;
|
||||
@property (nonatomic, readonly, strong) NSXMLParser* configParser;
|
||||
@property (nonatomic, readonly, strong) CDVWhitelist* whitelist; // readonly for public
|
||||
@property (nonatomic, readonly, assign) BOOL loadFromString;
|
||||
|
||||
@property (nonatomic, readwrite, copy) NSString* wwwFolderName;
|
||||
@property (nonatomic, readwrite, copy) NSString* startPage;
|
||||
@property (nonatomic, readonly, strong) CDVCommandQueue* commandQueue;
|
||||
@property (nonatomic, readonly, strong) id <CDVCommandDelegate> commandDelegate;
|
||||
|
||||
/**
|
||||
The complete user agent that Cordova will use when sending web requests.
|
||||
*/
|
||||
@property (nonatomic, readonly) NSString* userAgent;
|
||||
|
||||
/**
|
||||
The base user agent data that Cordova will use to build its user agent. If this
|
||||
property isn't set, Cordova will use the standard web view user agent as its
|
||||
base.
|
||||
*/
|
||||
@property (nonatomic, readwrite, copy) NSString* baseUserAgent;
|
||||
|
||||
+ (NSDictionary*)getBundlePlist:(NSString*)plistName;
|
||||
+ (NSString*)applicationDocumentsDirectory;
|
||||
|
||||
- (void)printMultitaskingInfo;
|
||||
- (void)createGapView;
|
||||
- (UIWebView*)newCordovaViewWithFrame:(CGRect)bounds;
|
||||
|
||||
- (void)javascriptAlert:(NSString*)text;
|
||||
- (NSString*)appURLScheme;
|
||||
|
||||
- (NSArray*)parseInterfaceOrientations:(NSArray*)orientations;
|
||||
- (BOOL)supportsOrientation:(UIInterfaceOrientation)orientation;
|
||||
|
||||
- (id)getCommandInstance:(NSString*)pluginName;
|
||||
- (void)registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className;
|
||||
- (void)registerPlugin:(CDVPlugin*)plugin withPluginName:(NSString*)pluginName;
|
||||
|
||||
- (BOOL)URLisAllowed:(NSURL*)url;
|
||||
- (void)processOpenUrl:(NSURL*)url;
|
||||
|
||||
@end
|
1049
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVViewController.m
Normal file
1049
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVViewController.m
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "CDVAvailability.h"
|
||||
|
||||
/**
|
||||
* Distinguishes top-level navigations from sub-frame navigations.
|
||||
* shouldStartLoadWithRequest is called for every request, but didStartLoad
|
||||
* and didFinishLoad is called only for top-level navigations.
|
||||
* Relevant bug: CB-2389
|
||||
*/
|
||||
@interface CDVWebViewDelegate : NSObject <UIWebViewDelegate>{
|
||||
__weak NSObject <UIWebViewDelegate>* _delegate;
|
||||
NSInteger _loadCount;
|
||||
NSInteger _state;
|
||||
NSInteger _curLoadToken;
|
||||
NSInteger _loadStartPollCount;
|
||||
}
|
||||
|
||||
- (id)initWithDelegate:(NSObject <UIWebViewDelegate>*)delegate;
|
||||
|
||||
- (BOOL)request:(NSURLRequest*)newRequest isEqualToRequestAfterStrippingFragments:(NSURLRequest*)originalRequest;
|
||||
|
||||
@end
|
|
@ -0,0 +1,412 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
//
|
||||
// Testing shows:
|
||||
//
|
||||
// In all cases, webView.request.URL is the previous page's URL (or empty) during the didStartLoad callback.
|
||||
// When loading a page with a redirect:
|
||||
// 1. shouldStartLoading (requestURL is target page)
|
||||
// 2. didStartLoading
|
||||
// 3. shouldStartLoading (requestURL is redirect target)
|
||||
// 4. didFinishLoad (request.URL is redirect target)
|
||||
//
|
||||
// Note the lack of a second didStartLoading **
|
||||
//
|
||||
// When loading a page with iframes:
|
||||
// 1. shouldStartLoading (requestURL is main page)
|
||||
// 2. didStartLoading
|
||||
// 3. shouldStartLoading (requestURL is one of the iframes)
|
||||
// 4. didStartLoading
|
||||
// 5. didFinishLoad
|
||||
// 6. didFinishLoad
|
||||
//
|
||||
// Note there is no way to distinguish which didFinishLoad maps to which didStartLoad **
|
||||
//
|
||||
// Loading a page by calling window.history.go(-1):
|
||||
// 1. didStartLoading
|
||||
// 2. didFinishLoad
|
||||
//
|
||||
// Note the lack of a shouldStartLoading call **
|
||||
// Actually - this is fixed on iOS6. iOS6 has a shouldStart. **
|
||||
//
|
||||
// Loading a page by calling location.reload()
|
||||
// 1. shouldStartLoading
|
||||
// 2. didStartLoading
|
||||
// 3. didFinishLoad
|
||||
//
|
||||
// Loading a page with an iframe that fails to load:
|
||||
// 1. shouldStart (main page)
|
||||
// 2. didStart
|
||||
// 3. shouldStart (iframe)
|
||||
// 4. didStart
|
||||
// 5. didFailWithError
|
||||
// 6. didFinish
|
||||
//
|
||||
// Loading a page with an iframe that fails to load due to an invalid URL:
|
||||
// 1. shouldStart (main page)
|
||||
// 2. didStart
|
||||
// 3. shouldStart (iframe)
|
||||
// 5. didFailWithError
|
||||
// 6. didFinish
|
||||
//
|
||||
// This case breaks our logic since there is a missing didStart. To prevent this,
|
||||
// we check URLs in shouldStart and return NO if they are invalid.
|
||||
//
|
||||
// Loading a page with an invalid URL
|
||||
// 1. shouldStart (main page)
|
||||
// 2. didFailWithError
|
||||
//
|
||||
// TODO: Record order when page is re-navigated before the first navigation finishes.
|
||||
//
|
||||
|
||||
#import "CDVWebViewDelegate.h"
|
||||
#import "CDVAvailability.h"
|
||||
|
||||
// #define VerboseLog NSLog
|
||||
#define VerboseLog(...) do {} while (0)
|
||||
|
||||
typedef enum {
|
||||
STATE_IDLE = 0,
|
||||
STATE_WAITING_FOR_LOAD_START = 1,
|
||||
STATE_WAITING_FOR_LOAD_FINISH = 2,
|
||||
STATE_IOS5_POLLING_FOR_LOAD_START = 3,
|
||||
STATE_IOS5_POLLING_FOR_LOAD_FINISH = 4,
|
||||
STATE_CANCELLED = 5
|
||||
} State;
|
||||
|
||||
static NSString *stripFragment(NSString* url)
|
||||
{
|
||||
NSRange r = [url rangeOfString:@"#"];
|
||||
|
||||
if (r.location == NSNotFound) {
|
||||
return url;
|
||||
}
|
||||
return [url substringToIndex:r.location];
|
||||
}
|
||||
|
||||
@implementation CDVWebViewDelegate
|
||||
|
||||
- (id)initWithDelegate:(NSObject <UIWebViewDelegate>*)delegate
|
||||
{
|
||||
self = [super init];
|
||||
if (self != nil) {
|
||||
_delegate = delegate;
|
||||
_loadCount = -1;
|
||||
_state = STATE_IDLE;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)request:(NSURLRequest*)newRequest isEqualToRequestAfterStrippingFragments:(NSURLRequest*)originalRequest
|
||||
{
|
||||
if (originalRequest.URL && newRequest.URL) {
|
||||
NSString* originalRequestUrl = [originalRequest.URL absoluteString];
|
||||
NSString* newRequestUrl = [newRequest.URL absoluteString];
|
||||
|
||||
NSString* baseOriginalRequestUrl = stripFragment(originalRequestUrl);
|
||||
NSString* baseNewRequestUrl = stripFragment(newRequestUrl);
|
||||
return [baseOriginalRequestUrl isEqualToString:baseNewRequestUrl];
|
||||
}
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)isPageLoaded:(UIWebView*)webView
|
||||
{
|
||||
NSString* readyState = [webView stringByEvaluatingJavaScriptFromString:@"document.readyState"];
|
||||
|
||||
return [readyState isEqualToString:@"loaded"] || [readyState isEqualToString:@"complete"];
|
||||
}
|
||||
|
||||
- (BOOL)isJsLoadTokenSet:(UIWebView*)webView
|
||||
{
|
||||
NSString* loadToken = [webView stringByEvaluatingJavaScriptFromString:@"window.__cordovaLoadToken"];
|
||||
|
||||
return [[NSString stringWithFormat:@"%ld", (long)_curLoadToken] isEqualToString:loadToken];
|
||||
}
|
||||
|
||||
- (void)setLoadToken:(UIWebView*)webView
|
||||
{
|
||||
_curLoadToken += 1;
|
||||
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.__cordovaLoadToken=%ld", (long)_curLoadToken]];
|
||||
}
|
||||
|
||||
- (NSString*)evalForCurrentURL:(UIWebView*)webView
|
||||
{
|
||||
return [webView stringByEvaluatingJavaScriptFromString:@"location.href"];
|
||||
}
|
||||
|
||||
- (void)pollForPageLoadStart:(UIWebView*)webView
|
||||
{
|
||||
if (_state != STATE_IOS5_POLLING_FOR_LOAD_START) {
|
||||
return;
|
||||
}
|
||||
if (![self isJsLoadTokenSet:webView]) {
|
||||
VerboseLog(@"Polled for page load start. result = YES!");
|
||||
_state = STATE_IOS5_POLLING_FOR_LOAD_FINISH;
|
||||
[self setLoadToken:webView];
|
||||
if ([_delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
|
||||
[_delegate webViewDidStartLoad:webView];
|
||||
}
|
||||
[self pollForPageLoadFinish:webView];
|
||||
} else {
|
||||
VerboseLog(@"Polled for page load start. result = NO");
|
||||
// Poll only for 1 second, and then fall back on checking only when delegate methods are called.
|
||||
++_loadStartPollCount;
|
||||
if (_loadStartPollCount < (1000 * .05)) {
|
||||
[self performSelector:@selector(pollForPageLoadStart:) withObject:webView afterDelay:.05];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)pollForPageLoadFinish:(UIWebView*)webView
|
||||
{
|
||||
if (_state != STATE_IOS5_POLLING_FOR_LOAD_FINISH) {
|
||||
return;
|
||||
}
|
||||
if ([self isPageLoaded:webView]) {
|
||||
VerboseLog(@"Polled for page load finish. result = YES!");
|
||||
_state = STATE_IDLE;
|
||||
if ([_delegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
|
||||
[_delegate webViewDidFinishLoad:webView];
|
||||
}
|
||||
} else {
|
||||
VerboseLog(@"Polled for page load finish. result = NO");
|
||||
[self performSelector:@selector(pollForPageLoadFinish:) withObject:webView afterDelay:.05];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)shouldLoadRequest:(NSURLRequest*)request
|
||||
{
|
||||
NSString* scheme = [[request URL] scheme];
|
||||
|
||||
if ([scheme isEqualToString:@"mailto"] || [scheme isEqualToString:@"tel"]) {
|
||||
return YES;
|
||||
}
|
||||
|
||||
return [NSURLConnection canHandleRequest:request];
|
||||
}
|
||||
|
||||
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
|
||||
{
|
||||
BOOL shouldLoad = YES;
|
||||
|
||||
if ([_delegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
|
||||
shouldLoad = [_delegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
|
||||
}
|
||||
|
||||
VerboseLog(@"webView shouldLoad=%d (before) state=%d loadCount=%d URL=%@", shouldLoad, _state, _loadCount, request.URL);
|
||||
|
||||
if (shouldLoad) {
|
||||
// When devtools refresh occurs, it blindly uses the same request object. If a history.replaceState() has occured, then
|
||||
// mainDocumentURL != URL even though it's a top-level navigation.
|
||||
BOOL isDevToolsRefresh = (request == webView.request);
|
||||
BOOL isTopLevelNavigation = isDevToolsRefresh || [request.URL isEqual:[request mainDocumentURL]];
|
||||
if (isTopLevelNavigation) {
|
||||
// Ignore hash changes that don't navigate to a different page.
|
||||
// webView.request does actually update when history.replaceState() gets called.
|
||||
if ([self request:request isEqualToRequestAfterStrippingFragments:webView.request]) {
|
||||
NSString* prevURL = [self evalForCurrentURL:webView];
|
||||
if ([prevURL isEqualToString:[request.URL absoluteString]]) {
|
||||
VerboseLog(@"Page reload detected.");
|
||||
} else {
|
||||
VerboseLog(@"Detected hash change shouldLoad");
|
||||
return shouldLoad;
|
||||
}
|
||||
}
|
||||
|
||||
switch (_state) {
|
||||
case STATE_WAITING_FOR_LOAD_FINISH:
|
||||
// Redirect case.
|
||||
// We expect loadCount == 1.
|
||||
if (_loadCount != 1) {
|
||||
NSLog(@"CDVWebViewDelegate: Detected redirect when loadCount=%ld", (long)_loadCount);
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_IDLE:
|
||||
case STATE_IOS5_POLLING_FOR_LOAD_START:
|
||||
case STATE_CANCELLED:
|
||||
// Page navigation start.
|
||||
_loadCount = 0;
|
||||
_state = STATE_WAITING_FOR_LOAD_START;
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
_loadCount = 0;
|
||||
_state = STATE_WAITING_FOR_LOAD_START;
|
||||
NSString* description = [NSString stringWithFormat:@"CDVWebViewDelegate: Navigation started when state=%ld", (long)_state];
|
||||
NSLog(@"%@", description);
|
||||
if ([_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
|
||||
NSDictionary* errorDictionary = @{NSLocalizedDescriptionKey : description};
|
||||
NSError* error = [[NSError alloc] initWithDomain:@"CDVWebViewDelegate" code:1 userInfo:errorDictionary];
|
||||
[_delegate webView:webView didFailLoadWithError:error];
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Deny invalid URLs so that we don't get the case where we go straight from
|
||||
// webViewShouldLoad -> webViewDidFailLoad (messes up _loadCount).
|
||||
shouldLoad = shouldLoad && [self shouldLoadRequest:request];
|
||||
}
|
||||
VerboseLog(@"webView shouldLoad=%d (after) isTopLevelNavigation=%d state=%d loadCount=%d", shouldLoad, isTopLevelNavigation, _state, _loadCount);
|
||||
}
|
||||
return shouldLoad;
|
||||
}
|
||||
|
||||
- (void)webViewDidStartLoad:(UIWebView*)webView
|
||||
{
|
||||
VerboseLog(@"webView didStartLoad (before). state=%d loadCount=%d", _state, _loadCount);
|
||||
BOOL fireCallback = NO;
|
||||
switch (_state) {
|
||||
case STATE_IDLE:
|
||||
if (IsAtLeastiOSVersion(@"6.0")) {
|
||||
break;
|
||||
}
|
||||
// If history.go(-1) is used pre-iOS6, the shouldStartLoadWithRequest function is not called.
|
||||
// Without shouldLoad, we can't distinguish an iframe from a top-level navigation.
|
||||
// We could try to distinguish using [UIWebView canGoForward], but that's too much complexity,
|
||||
// and would work only on the first time it was used.
|
||||
|
||||
// Our work-around is to set a JS variable and poll until it disappears (from a navigation).
|
||||
_state = STATE_IOS5_POLLING_FOR_LOAD_START;
|
||||
_loadStartPollCount = 0;
|
||||
[self setLoadToken:webView];
|
||||
[self pollForPageLoadStart:webView];
|
||||
break;
|
||||
|
||||
case STATE_CANCELLED:
|
||||
fireCallback = YES;
|
||||
_state = STATE_WAITING_FOR_LOAD_FINISH;
|
||||
_loadCount += 1;
|
||||
break;
|
||||
|
||||
case STATE_WAITING_FOR_LOAD_START:
|
||||
if (_loadCount != 0) {
|
||||
NSLog(@"CDVWebViewDelegate: Unexpected loadCount in didStart. count=%ld", (long)_loadCount);
|
||||
}
|
||||
fireCallback = YES;
|
||||
_state = STATE_WAITING_FOR_LOAD_FINISH;
|
||||
_loadCount = 1;
|
||||
break;
|
||||
|
||||
case STATE_WAITING_FOR_LOAD_FINISH:
|
||||
_loadCount += 1;
|
||||
break;
|
||||
|
||||
case STATE_IOS5_POLLING_FOR_LOAD_START:
|
||||
[self pollForPageLoadStart:webView];
|
||||
break;
|
||||
|
||||
case STATE_IOS5_POLLING_FOR_LOAD_FINISH:
|
||||
[self pollForPageLoadFinish:webView];
|
||||
break;
|
||||
|
||||
default:
|
||||
NSLog(@"CDVWebViewDelegate: Unexpected didStart with state=%ld loadCount=%ld", (long)_state, (long)_loadCount);
|
||||
}
|
||||
VerboseLog(@"webView didStartLoad (after). state=%d loadCount=%d fireCallback=%d", _state, _loadCount, fireCallback);
|
||||
if (fireCallback && [_delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
|
||||
[_delegate webViewDidStartLoad:webView];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)webViewDidFinishLoad:(UIWebView*)webView
|
||||
{
|
||||
VerboseLog(@"webView didFinishLoad (before). state=%d loadCount=%d", _state, _loadCount);
|
||||
BOOL fireCallback = NO;
|
||||
switch (_state) {
|
||||
case STATE_IDLE:
|
||||
break;
|
||||
|
||||
case STATE_WAITING_FOR_LOAD_START:
|
||||
NSLog(@"CDVWebViewDelegate: Unexpected didFinish while waiting for load start.");
|
||||
break;
|
||||
|
||||
case STATE_WAITING_FOR_LOAD_FINISH:
|
||||
if (_loadCount == 1) {
|
||||
fireCallback = YES;
|
||||
_state = STATE_IDLE;
|
||||
}
|
||||
_loadCount -= 1;
|
||||
break;
|
||||
|
||||
case STATE_IOS5_POLLING_FOR_LOAD_START:
|
||||
[self pollForPageLoadStart:webView];
|
||||
break;
|
||||
|
||||
case STATE_IOS5_POLLING_FOR_LOAD_FINISH:
|
||||
[self pollForPageLoadFinish:webView];
|
||||
break;
|
||||
}
|
||||
VerboseLog(@"webView didFinishLoad (after). state=%d loadCount=%d fireCallback=%d", _state, _loadCount, fireCallback);
|
||||
if (fireCallback && [_delegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
|
||||
[_delegate webViewDidFinishLoad:webView];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error
|
||||
{
|
||||
VerboseLog(@"webView didFailLoad (before). state=%d loadCount=%d", _state, _loadCount);
|
||||
BOOL fireCallback = NO;
|
||||
|
||||
switch (_state) {
|
||||
case STATE_IDLE:
|
||||
break;
|
||||
|
||||
case STATE_WAITING_FOR_LOAD_START:
|
||||
if ([error code] == NSURLErrorCancelled) {
|
||||
_state = STATE_CANCELLED;
|
||||
} else {
|
||||
_state = STATE_IDLE;
|
||||
}
|
||||
fireCallback = YES;
|
||||
break;
|
||||
|
||||
case STATE_WAITING_FOR_LOAD_FINISH:
|
||||
if ([error code] != NSURLErrorCancelled) {
|
||||
if (_loadCount == 1) {
|
||||
_state = STATE_IDLE;
|
||||
fireCallback = YES;
|
||||
}
|
||||
_loadCount = -1;
|
||||
} else {
|
||||
fireCallback = YES;
|
||||
_state = STATE_CANCELLED;
|
||||
_loadCount -= 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case STATE_IOS5_POLLING_FOR_LOAD_START:
|
||||
[self pollForPageLoadStart:webView];
|
||||
break;
|
||||
|
||||
case STATE_IOS5_POLLING_FOR_LOAD_FINISH:
|
||||
[self pollForPageLoadFinish:webView];
|
||||
break;
|
||||
}
|
||||
VerboseLog(@"webView didFailLoad (after). state=%d loadCount=%d, fireCallback=%d", _state, _loadCount, fireCallback);
|
||||
if (fireCallback && [_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
|
||||
[_delegate webView:webView didFailLoadWithError:error];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
34
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWhitelist.h
Normal file
34
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWhitelist.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
extern NSString* const kCDVDefaultWhitelistRejectionString;
|
||||
|
||||
@interface CDVWhitelist : NSObject
|
||||
|
||||
@property (nonatomic, copy) NSString* whitelistRejectionFormatString;
|
||||
|
||||
- (id)initWithArray:(NSArray*)array;
|
||||
- (BOOL)schemeIsAllowed:(NSString*)scheme;
|
||||
- (BOOL)URLIsAllowed:(NSURL*)url;
|
||||
- (BOOL)URLIsAllowed:(NSURL*)url logFailure:(BOOL)logFailure;
|
||||
- (NSString*)errorStringForURL:(NSURL*)url;
|
||||
|
||||
@end
|
285
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWhitelist.m
Normal file
285
fritteliuhr/platforms/ios/CordovaLib/Classes/CDVWhitelist.m
Normal file
|
@ -0,0 +1,285 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "CDVWhitelist.h"
|
||||
|
||||
NSString* const kCDVDefaultWhitelistRejectionString = @"ERROR whitelist rejection: url='%@'";
|
||||
NSString* const kCDVDefaultSchemeName = @"cdv-default-scheme";
|
||||
|
||||
@interface CDVWhitelistPattern : NSObject {
|
||||
@private
|
||||
NSRegularExpression* _scheme;
|
||||
NSRegularExpression* _host;
|
||||
NSNumber* _port;
|
||||
NSRegularExpression* _path;
|
||||
}
|
||||
|
||||
+ (NSString*)regexFromPattern:(NSString*)pattern allowWildcards:(bool)allowWildcards;
|
||||
- (id)initWithScheme:(NSString*)scheme host:(NSString*)host port:(NSString*)port path:(NSString*)path;
|
||||
- (bool)matches:(NSURL*)url;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVWhitelistPattern
|
||||
|
||||
+ (NSString*)regexFromPattern:(NSString*)pattern allowWildcards:(bool)allowWildcards
|
||||
{
|
||||
NSString* regex = [NSRegularExpression escapedPatternForString:pattern];
|
||||
|
||||
if (allowWildcards) {
|
||||
regex = [regex stringByReplacingOccurrencesOfString:@"\\*" withString:@".*"];
|
||||
|
||||
/* [NSURL path] has the peculiarity that a trailing slash at the end of a path
|
||||
* will be omitted. This regex tweak compensates for that.
|
||||
*/
|
||||
if ([regex hasSuffix:@"\\/.*"]) {
|
||||
regex = [NSString stringWithFormat:@"%@(\\/.*)?", [regex substringToIndex:([regex length] - 4)]];
|
||||
}
|
||||
}
|
||||
return [NSString stringWithFormat:@"%@$", regex];
|
||||
}
|
||||
|
||||
- (id)initWithScheme:(NSString*)scheme host:(NSString*)host port:(NSString*)port path:(NSString*)path
|
||||
{
|
||||
self = [super init]; // Potentially change "self"
|
||||
if (self) {
|
||||
if ((scheme == nil) || [scheme isEqualToString:@"*"]) {
|
||||
_scheme = nil;
|
||||
} else {
|
||||
_scheme = [NSRegularExpression regularExpressionWithPattern:[CDVWhitelistPattern regexFromPattern:scheme allowWildcards:NO] options:NSRegularExpressionCaseInsensitive error:nil];
|
||||
}
|
||||
if ([host isEqualToString:@"*"]) {
|
||||
_host = nil;
|
||||
} else if ([host hasPrefix:@"*."]) {
|
||||
_host = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"([a-z0-9.-]*\\.)?%@", [CDVWhitelistPattern regexFromPattern:[host substringFromIndex:2] allowWildcards:false]] options:NSRegularExpressionCaseInsensitive error:nil];
|
||||
} else {
|
||||
_host = [NSRegularExpression regularExpressionWithPattern:[CDVWhitelistPattern regexFromPattern:host allowWildcards:NO] options:NSRegularExpressionCaseInsensitive error:nil];
|
||||
}
|
||||
if ((port == nil) || [port isEqualToString:@"*"]) {
|
||||
_port = nil;
|
||||
} else {
|
||||
_port = [[NSNumber alloc] initWithInteger:[port integerValue]];
|
||||
}
|
||||
if ((path == nil) || [path isEqualToString:@"/*"]) {
|
||||
_path = nil;
|
||||
} else {
|
||||
_path = [NSRegularExpression regularExpressionWithPattern:[CDVWhitelistPattern regexFromPattern:path allowWildcards:YES] options:0 error:nil];
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (bool)matches:(NSURL*)url
|
||||
{
|
||||
return (_scheme == nil || [_scheme numberOfMatchesInString:[url scheme] options:NSMatchingAnchored range:NSMakeRange(0, [[url scheme] length])]) &&
|
||||
(_host == nil || [_host numberOfMatchesInString:[url host] options:NSMatchingAnchored range:NSMakeRange(0, [[url host] length])]) &&
|
||||
(_port == nil || [[url port] isEqualToNumber:_port]) &&
|
||||
(_path == nil || [_path numberOfMatchesInString:[url path] options:NSMatchingAnchored range:NSMakeRange(0, [[url path] length])])
|
||||
;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@interface CDVWhitelist ()
|
||||
|
||||
@property (nonatomic, readwrite, strong) NSMutableArray* whitelist;
|
||||
@property (nonatomic, readwrite, strong) NSMutableSet* permittedSchemes;
|
||||
|
||||
- (void)addWhiteListEntry:(NSString*)pattern;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CDVWhitelist
|
||||
|
||||
@synthesize whitelist, permittedSchemes, whitelistRejectionFormatString;
|
||||
|
||||
- (id)initWithArray:(NSArray*)array
|
||||
{
|
||||
self = [super init];
|
||||
if (self) {
|
||||
self.whitelist = [[NSMutableArray alloc] init];
|
||||
self.permittedSchemes = [[NSMutableSet alloc] init];
|
||||
self.whitelistRejectionFormatString = kCDVDefaultWhitelistRejectionString;
|
||||
|
||||
for (NSString* pattern in array) {
|
||||
[self addWhiteListEntry:pattern];
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)isIPv4Address:(NSString*)externalHost
|
||||
{
|
||||
// an IPv4 address has 4 octets b.b.b.b where b is a number between 0 and 255.
|
||||
// for our purposes, b can also be the wildcard character '*'
|
||||
|
||||
// we could use a regex to solve this problem but then I would have two problems
|
||||
// anyways, this is much clearer and maintainable
|
||||
NSArray* octets = [externalHost componentsSeparatedByString:@"."];
|
||||
NSUInteger num_octets = [octets count];
|
||||
|
||||
// quick check
|
||||
if (num_octets != 4) {
|
||||
return NO;
|
||||
}
|
||||
|
||||
// restrict number parsing to 0-255
|
||||
NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
|
||||
[numberFormatter setMinimum:[NSNumber numberWithUnsignedInteger:0]];
|
||||
[numberFormatter setMaximum:[NSNumber numberWithUnsignedInteger:255]];
|
||||
|
||||
// iterate through each octet, and test for a number between 0-255 or if it equals '*'
|
||||
for (NSUInteger i = 0; i < num_octets; ++i) {
|
||||
NSString* octet = [octets objectAtIndex:i];
|
||||
|
||||
if ([octet isEqualToString:@"*"]) { // passes - check next octet
|
||||
continue;
|
||||
} else if ([numberFormatter numberFromString:octet] == nil) { // fails - not a number and not within our range, return
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)addWhiteListEntry:(NSString*)origin
|
||||
{
|
||||
if (self.whitelist == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ([origin isEqualToString:@"*"]) {
|
||||
NSLog(@"Unlimited access to network resources");
|
||||
self.whitelist = nil;
|
||||
self.permittedSchemes = nil;
|
||||
} else { // specific access
|
||||
NSRegularExpression* parts = [NSRegularExpression regularExpressionWithPattern:@"^((\\*|[A-Za-z-]+)://)?(((\\*\\.)?[^*/:]+)|\\*)?(:(\\d+))?(/.*)?" options:0 error:nil];
|
||||
NSTextCheckingResult* m = [parts firstMatchInString:origin options:NSMatchingAnchored range:NSMakeRange(0, [origin length])];
|
||||
if (m != nil) {
|
||||
NSRange r;
|
||||
NSString* scheme = nil;
|
||||
r = [m rangeAtIndex:2];
|
||||
if (r.location != NSNotFound) {
|
||||
scheme = [origin substringWithRange:r];
|
||||
}
|
||||
|
||||
NSString* host = nil;
|
||||
r = [m rangeAtIndex:3];
|
||||
if (r.location != NSNotFound) {
|
||||
host = [origin substringWithRange:r];
|
||||
}
|
||||
|
||||
// Special case for two urls which are allowed to have empty hosts
|
||||
if (([scheme isEqualToString:@"file"] || [scheme isEqualToString:@"content"]) && (host == nil)) {
|
||||
host = @"*";
|
||||
}
|
||||
|
||||
NSString* port = nil;
|
||||
r = [m rangeAtIndex:7];
|
||||
if (r.location != NSNotFound) {
|
||||
port = [origin substringWithRange:r];
|
||||
}
|
||||
|
||||
NSString* path = nil;
|
||||
r = [m rangeAtIndex:8];
|
||||
if (r.location != NSNotFound) {
|
||||
path = [origin substringWithRange:r];
|
||||
}
|
||||
|
||||
if (scheme == nil) {
|
||||
// XXX making it stupid friendly for people who forget to include protocol/SSL
|
||||
[self.whitelist addObject:[[CDVWhitelistPattern alloc] initWithScheme:@"http" host:host port:port path:path]];
|
||||
[self.whitelist addObject:[[CDVWhitelistPattern alloc] initWithScheme:@"https" host:host port:port path:path]];
|
||||
} else {
|
||||
[self.whitelist addObject:[[CDVWhitelistPattern alloc] initWithScheme:scheme host:host port:port path:path]];
|
||||
}
|
||||
|
||||
if (self.permittedSchemes != nil) {
|
||||
if ([scheme isEqualToString:@"*"]) {
|
||||
self.permittedSchemes = nil;
|
||||
} else if (scheme != nil) {
|
||||
[self.permittedSchemes addObject:scheme];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)schemeIsAllowed:(NSString*)scheme
|
||||
{
|
||||
if ([scheme isEqualToString:@"http"] ||
|
||||
[scheme isEqualToString:@"https"] ||
|
||||
[scheme isEqualToString:@"ftp"] ||
|
||||
[scheme isEqualToString:@"ftps"]) {
|
||||
return YES;
|
||||
}
|
||||
|
||||
return (self.permittedSchemes == nil) || [self.permittedSchemes containsObject:scheme];
|
||||
}
|
||||
|
||||
- (BOOL)URLIsAllowed:(NSURL*)url
|
||||
{
|
||||
return [self URLIsAllowed:url logFailure:YES];
|
||||
}
|
||||
|
||||
- (BOOL)URLIsAllowed:(NSURL*)url logFailure:(BOOL)logFailure
|
||||
{
|
||||
// Shortcut acceptance: Are all urls whitelisted ("*" in whitelist)?
|
||||
if (whitelist == nil) {
|
||||
return YES;
|
||||
}
|
||||
|
||||
// Shortcut rejection: Check that the scheme is supported
|
||||
NSString* scheme = [[url scheme] lowercaseString];
|
||||
if (![self schemeIsAllowed:scheme]) {
|
||||
if (logFailure) {
|
||||
NSLog(@"%@", [self errorStringForURL:url]);
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
||||
// http[s] and ftp[s] should also validate against the common set in the kCDVDefaultSchemeName list
|
||||
if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"] || [scheme isEqualToString:@"ftp"] || [scheme isEqualToString:@"ftps"]) {
|
||||
NSURL* newUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@%@", kCDVDefaultSchemeName, [url host], [[url path] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
|
||||
// If it is allowed, we are done. If not, continue to check for the actual scheme-specific list
|
||||
if ([self URLIsAllowed:newUrl logFailure:NO]) {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
// Check the url against patterns in the whitelist
|
||||
for (CDVWhitelistPattern* p in self.whitelist) {
|
||||
if ([p matches:url]) {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
if (logFailure) {
|
||||
NSLog(@"%@", [self errorStringForURL:url]);
|
||||
}
|
||||
// if we got here, the url host is not in the white-list, do nothing
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSString*)errorStringForURL:(NSURL*)url
|
||||
{
|
||||
return [NSString stringWithFormat:self.whitelistRejectionFormatString, [url absoluteString]];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "CDVAvailabilityDeprecated.h"
|
||||
|
||||
@interface NSArray (Comparisons)
|
||||
|
||||
- (id)objectAtIndex:(NSUInteger)index withDefault:(id)aDefault CDV_DEPRECATED(3.8 .0, "Use [command argumentAtIndex] instead.");
|
||||
|
||||
@end
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "NSArray+Comparisons.h"
|
||||
|
||||
@implementation NSArray (Comparisons)
|
||||
|
||||
- (id)objectAtIndex:(NSUInteger)index withDefault:(id)aDefault
|
||||
{
|
||||
id obj = nil;
|
||||
|
||||
@try {
|
||||
if (index < [self count]) {
|
||||
obj = [self objectAtIndex:index];
|
||||
}
|
||||
if ((obj == [NSNull null]) || (obj == nil)) {
|
||||
return aDefault;
|
||||
}
|
||||
}
|
||||
@catch(NSException* exception) {
|
||||
NSLog(@"Exception - Name: %@ Reason: %@", [exception name], [exception reason]);
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
@end
|
47
fritteliuhr/platforms/ios/CordovaLib/Classes/NSData+Base64.h
Normal file
47
fritteliuhr/platforms/ios/CordovaLib/Classes/NSData+Base64.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
//
|
||||
// NSData+Base64.h
|
||||
// base64
|
||||
//
|
||||
// Created by Matt Gallagher on 2009/06/03.
|
||||
// Copyright 2009 Matt Gallagher. All rights reserved.
|
||||
//
|
||||
// This software is provided 'as-is', without any express or implied
|
||||
// warranty. In no event will the authors be held liable for any damages
|
||||
// arising from the use of this software. Permission is granted to anyone to
|
||||
// use this software for any purpose, including commercial applications, and to
|
||||
// alter it and redistribute it freely, subject to the following restrictions:
|
||||
//
|
||||
// 1. The origin of this software must not be misrepresented; you must not
|
||||
// claim that you wrote the original software. If you use this software
|
||||
// in a product, an acknowledgment in the product documentation would be
|
||||
// appreciated but is not required.
|
||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||
// misrepresented as being the original software.
|
||||
// 3. This notice may not be removed or altered from any source
|
||||
// distribution.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "CDVAvailabilityDeprecated.h"
|
||||
|
||||
void *CDVNewBase64Decode(
|
||||
const char* inputBuffer,
|
||||
size_t length,
|
||||
size_t * outputLength);
|
||||
|
||||
char *CDVNewBase64Encode(
|
||||
const void* inputBuffer,
|
||||
size_t length,
|
||||
bool separateLines,
|
||||
size_t * outputLength);
|
||||
|
||||
@interface NSData (CDVBase64)
|
||||
|
||||
+ (NSData*)dataFromBase64String:(NSString*)aString CDV_DEPRECATED(3.8 .0, "Use cdv_dataFromBase64String");
|
||||
|
||||
- (NSString*)base64EncodedString CDV_DEPRECATED(3.8 .0, "Use [NSData cdv_base64EncodedString]");
|
||||
|
||||
+ (NSData*)cdv_dataFromBase64String:(NSString*)aString;
|
||||
- (NSString*)cdv_base64EncodedString;
|
||||
|
||||
@end
|
308
fritteliuhr/platforms/ios/CordovaLib/Classes/NSData+Base64.m
Normal file
308
fritteliuhr/platforms/ios/CordovaLib/Classes/NSData+Base64.m
Normal file
|
@ -0,0 +1,308 @@
|
|||
//
|
||||
// NSData+Base64.m
|
||||
// base64
|
||||
//
|
||||
// Created by Matt Gallagher on 2009/06/03.
|
||||
// Copyright 2009 Matt Gallagher. All rights reserved.
|
||||
//
|
||||
// This software is provided 'as-is', without any express or implied
|
||||
// warranty. In no event will the authors be held liable for any damages
|
||||
// arising from the use of this software. Permission is granted to anyone to
|
||||
// use this software for any purpose, including commercial applications, and to
|
||||
// alter it and redistribute it freely, subject to the following restrictions:
|
||||
//
|
||||
// 1. The origin of this software must not be misrepresented; you must not
|
||||
// claim that you wrote the original software. If you use this software
|
||||
// in a product, an acknowledgment in the product documentation would be
|
||||
// appreciated but is not required.
|
||||
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||
// misrepresented as being the original software.
|
||||
// 3. This notice may not be removed or altered from any source
|
||||
// distribution.
|
||||
//
|
||||
|
||||
#import "NSData+Base64.h"
|
||||
|
||||
//
|
||||
// Mapping from 6 bit pattern to ASCII character.
|
||||
//
|
||||
static unsigned char base64EncodeLookup[65] =
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
//
|
||||
// Definition for "masked-out" areas of the base64DecodeLookup mapping
|
||||
//
|
||||
#define xx 65
|
||||
|
||||
//
|
||||
// Mapping from ASCII character to 6 bit pattern.
|
||||
//
|
||||
static unsigned char base64DecodeLookup[256] =
|
||||
{
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63,
|
||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx,
|
||||
xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx,
|
||||
xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
|
||||
};
|
||||
|
||||
//
|
||||
// Fundamental sizes of the binary and base64 encode/decode units in bytes
|
||||
//
|
||||
#define BINARY_UNIT_SIZE 3
|
||||
#define BASE64_UNIT_SIZE 4
|
||||
|
||||
//
|
||||
// NewBase64Decode
|
||||
//
|
||||
// Decodes the base64 ASCII string in the inputBuffer to a newly malloced
|
||||
// output buffer.
|
||||
//
|
||||
// inputBuffer - the source ASCII string for the decode
|
||||
// length - the length of the string or -1 (to specify strlen should be used)
|
||||
// outputLength - if not-NULL, on output will contain the decoded length
|
||||
//
|
||||
// returns the decoded buffer. Must be free'd by caller. Length is given by
|
||||
// outputLength.
|
||||
//
|
||||
void *CDVNewBase64Decode(
|
||||
const char* inputBuffer,
|
||||
size_t length,
|
||||
size_t * outputLength)
|
||||
{
|
||||
if (length == -1) {
|
||||
length = strlen(inputBuffer);
|
||||
}
|
||||
|
||||
size_t outputBufferSize =
|
||||
((length + BASE64_UNIT_SIZE - 1) / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE;
|
||||
unsigned char* outputBuffer = (unsigned char*)malloc(outputBufferSize);
|
||||
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
|
||||
while (i < length) {
|
||||
//
|
||||
// Accumulate 4 valid characters (ignore everything else)
|
||||
//
|
||||
unsigned char accumulated[BASE64_UNIT_SIZE];
|
||||
size_t accumulateIndex = 0;
|
||||
|
||||
while (i < length) {
|
||||
unsigned char decode = base64DecodeLookup[inputBuffer[i++]];
|
||||
if (decode != xx) {
|
||||
accumulated[accumulateIndex] = decode;
|
||||
accumulateIndex++;
|
||||
|
||||
if (accumulateIndex == BASE64_UNIT_SIZE) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Store the 6 bits from each of the 4 characters as 3 bytes
|
||||
//
|
||||
// (Uses improved bounds checking suggested by Alexandre Colucci)
|
||||
//
|
||||
if (accumulateIndex >= 2) {
|
||||
outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4);
|
||||
}
|
||||
if (accumulateIndex >= 3) {
|
||||
outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2);
|
||||
}
|
||||
if (accumulateIndex >= 4) {
|
||||
outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3];
|
||||
}
|
||||
j += accumulateIndex - 1;
|
||||
}
|
||||
|
||||
if (outputLength) {
|
||||
*outputLength = j;
|
||||
}
|
||||
return outputBuffer;
|
||||
}
|
||||
|
||||
//
|
||||
// NewBase64Encode
|
||||
//
|
||||
// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced
|
||||
// output buffer.
|
||||
//
|
||||
// inputBuffer - the source data for the encode
|
||||
// length - the length of the input in bytes
|
||||
// separateLines - if zero, no CR/LF characters will be added. Otherwise
|
||||
// a CR/LF pair will be added every 64 encoded chars.
|
||||
// outputLength - if not-NULL, on output will contain the encoded length
|
||||
// (not including terminating 0 char)
|
||||
//
|
||||
// returns the encoded buffer. Must be free'd by caller. Length is given by
|
||||
// outputLength.
|
||||
//
|
||||
char *CDVNewBase64Encode(
|
||||
const void* buffer,
|
||||
size_t length,
|
||||
bool separateLines,
|
||||
size_t * outputLength)
|
||||
{
|
||||
const unsigned char* inputBuffer = (const unsigned char*)buffer;
|
||||
|
||||
#define MAX_NUM_PADDING_CHARS 2
|
||||
#define OUTPUT_LINE_LENGTH 64
|
||||
#define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE)
|
||||
#define CR_LF_SIZE 2
|
||||
|
||||
//
|
||||
// Byte accurate calculation of final buffer size
|
||||
//
|
||||
size_t outputBufferSize =
|
||||
((length / BINARY_UNIT_SIZE)
|
||||
+ ((length % BINARY_UNIT_SIZE) ? 1 : 0))
|
||||
* BASE64_UNIT_SIZE;
|
||||
if (separateLines) {
|
||||
outputBufferSize +=
|
||||
(outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE;
|
||||
}
|
||||
|
||||
//
|
||||
// Include space for a terminating zero
|
||||
//
|
||||
outputBufferSize += 1;
|
||||
|
||||
//
|
||||
// Allocate the output buffer
|
||||
//
|
||||
char* outputBuffer = (char*)malloc(outputBufferSize);
|
||||
if (!outputBuffer) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t i = 0;
|
||||
size_t j = 0;
|
||||
const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length;
|
||||
size_t lineEnd = lineLength;
|
||||
|
||||
while (true) {
|
||||
if (lineEnd > length) {
|
||||
lineEnd = length;
|
||||
}
|
||||
|
||||
for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE) {
|
||||
//
|
||||
// Inner loop: turn 48 bytes into 64 base64 characters
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
|
||||
| ((inputBuffer[i + 1] & 0xF0) >> 4)];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2)
|
||||
| ((inputBuffer[i + 2] & 0xC0) >> 6)];
|
||||
outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F];
|
||||
}
|
||||
|
||||
if (lineEnd == length) {
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// Add the newline
|
||||
//
|
||||
// outputBuffer[j++] = '\r';
|
||||
// outputBuffer[j++] = '\n';
|
||||
lineEnd += lineLength;
|
||||
}
|
||||
|
||||
if (i + 1 < length) {
|
||||
//
|
||||
// Handle the single '=' case
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
|
||||
| ((inputBuffer[i + 1] & 0xF0) >> 4)];
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2];
|
||||
outputBuffer[j++] = '=';
|
||||
} else if (i < length) {
|
||||
//
|
||||
// Handle the double '=' case
|
||||
//
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
|
||||
outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4];
|
||||
outputBuffer[j++] = '=';
|
||||
outputBuffer[j++] = '=';
|
||||
}
|
||||
outputBuffer[j] = 0;
|
||||
|
||||
//
|
||||
// Set the output length and return the buffer
|
||||
//
|
||||
if (outputLength) {
|
||||
*outputLength = j;
|
||||
}
|
||||
return outputBuffer;
|
||||
}
|
||||
|
||||
@implementation NSData (CDVBase64)
|
||||
|
||||
//
|
||||
// dataFromBase64String:
|
||||
//
|
||||
// Creates an NSData object containing the base64 decoded representation of
|
||||
// the base64 string 'aString'
|
||||
//
|
||||
// Parameters:
|
||||
// aString - the base64 string to decode
|
||||
//
|
||||
// returns the autoreleased NSData representation of the base64 string
|
||||
//
|
||||
+ (NSData*)cdv_dataFromBase64String:(NSString*)aString
|
||||
{
|
||||
size_t outputLength = 0;
|
||||
void* outputBuffer = CDVNewBase64Decode([aString UTF8String], [aString length], &outputLength);
|
||||
|
||||
return [NSData dataWithBytesNoCopy:outputBuffer length:outputLength freeWhenDone:YES];
|
||||
}
|
||||
|
||||
//
|
||||
// base64EncodedString
|
||||
//
|
||||
// Creates an NSString object that contains the base 64 encoding of the
|
||||
// receiver's data. Lines are broken at 64 characters long.
|
||||
//
|
||||
// returns an autoreleased NSString being the base 64 representation of the
|
||||
// receiver.
|
||||
//
|
||||
- (NSString*)cdv_base64EncodedString
|
||||
{
|
||||
size_t outputLength = 0;
|
||||
char* outputBuffer =
|
||||
CDVNewBase64Encode([self bytes], [self length], true, &outputLength);
|
||||
|
||||
NSString* result = [[NSString alloc] initWithBytesNoCopy:outputBuffer
|
||||
length:outputLength
|
||||
encoding:NSASCIIStringEncoding
|
||||
freeWhenDone:YES];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
+ (NSData*)dataFromBase64String:(NSString*)aString
|
||||
{
|
||||
return [self cdv_dataFromBase64String:aString];
|
||||
}
|
||||
|
||||
- (NSString*)base64EncodedString
|
||||
{
|
||||
return [self cdv_base64EncodedString];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "CDVAvailabilityDeprecated.h"
|
||||
|
||||
@interface NSDictionary (org_apache_cordova_NSDictionary_Extension)
|
||||
|
||||
- (bool)existsValue:(NSString*)expectedValue forKey:(NSString*)key CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue withRange:(NSRange)range CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (BOOL)typeValueForKey:(NSString*)key isArray:(BOOL*)bArray isNull:(BOOL*)bNull isNumber:(BOOL*)bNumber isString:(BOOL*)bString CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (BOOL)valueForKeyIsArray:(NSString*)key CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (BOOL)valueForKeyIsNull:(NSString*)key CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (BOOL)valueForKeyIsString:(NSString*)key CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (BOOL)valueForKeyIsNumber:(NSString*)key CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
- (NSDictionary*)dictionaryWithLowercaseKeys CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
@end
|
|
@ -0,0 +1,159 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "NSDictionary+Extensions.h"
|
||||
#import <math.h>
|
||||
|
||||
@implementation NSDictionary (org_apache_cordova_NSDictionary_Extension)
|
||||
|
||||
- (bool)existsValue:(NSString*)expectedValue forKey:(NSString*)key
|
||||
{
|
||||
id val = [self valueForKey:key];
|
||||
bool exists = false;
|
||||
|
||||
if (val != nil) {
|
||||
exists = [(NSString*)val compare : expectedValue options : NSCaseInsensitiveSearch] == 0;
|
||||
}
|
||||
|
||||
return exists;
|
||||
}
|
||||
|
||||
- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue withRange:(NSRange)range
|
||||
{
|
||||
NSInteger value = defaultValue;
|
||||
|
||||
NSNumber* val = [self valueForKey:key]; // value is an NSNumber
|
||||
|
||||
if (val != nil) {
|
||||
value = [val integerValue];
|
||||
}
|
||||
|
||||
// min, max checks
|
||||
value = MAX(range.location, value);
|
||||
value = MIN(range.length, value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
- (NSInteger)integerValueForKey:(NSString*)key defaultValue:(NSInteger)defaultValue
|
||||
{
|
||||
NSInteger value = defaultValue;
|
||||
|
||||
NSNumber* val = [self valueForKey:key]; // value is an NSNumber
|
||||
|
||||
if (val != nil) {
|
||||
value = [val integerValue];
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the type of object stored in a dictionary
|
||||
* IN:
|
||||
* (BOOL*) bString - if exists will be set to YES if object is an NSString, NO if not
|
||||
* (BOOL*) bNull - if exists will be set to YES if object is an NSNull, NO if not
|
||||
* (BOOL*) bArray - if exists will be set to YES if object is an NSArray, NO if not
|
||||
* (BOOL*) bNumber - if exists will be set to YES if object is an NSNumber, NO if not
|
||||
*
|
||||
* OUT:
|
||||
* YES if key exists
|
||||
* NO if key does not exist. Input parameters remain untouched
|
||||
*
|
||||
*/
|
||||
|
||||
- (BOOL)typeValueForKey:(NSString*)key isArray:(BOOL*)bArray isNull:(BOOL*)bNull isNumber:(BOOL*)bNumber isString:(BOOL*)bString
|
||||
{
|
||||
BOOL bExists = YES;
|
||||
NSObject* value = [self objectForKey:key];
|
||||
|
||||
if (value) {
|
||||
bExists = YES;
|
||||
if (bString) {
|
||||
*bString = [value isKindOfClass:[NSString class]];
|
||||
}
|
||||
if (bNull) {
|
||||
*bNull = [value isKindOfClass:[NSNull class]];
|
||||
}
|
||||
if (bArray) {
|
||||
*bArray = [value isKindOfClass:[NSArray class]];
|
||||
}
|
||||
if (bNumber) {
|
||||
*bNumber = [value isKindOfClass:[NSNumber class]];
|
||||
}
|
||||
}
|
||||
return bExists;
|
||||
}
|
||||
|
||||
- (BOOL)valueForKeyIsArray:(NSString*)key
|
||||
{
|
||||
BOOL bArray = NO;
|
||||
NSObject* value = [self objectForKey:key];
|
||||
|
||||
if (value) {
|
||||
bArray = [value isKindOfClass:[NSArray class]];
|
||||
}
|
||||
return bArray;
|
||||
}
|
||||
|
||||
- (BOOL)valueForKeyIsNull:(NSString*)key
|
||||
{
|
||||
BOOL bNull = NO;
|
||||
NSObject* value = [self objectForKey:key];
|
||||
|
||||
if (value) {
|
||||
bNull = [value isKindOfClass:[NSNull class]];
|
||||
}
|
||||
return bNull;
|
||||
}
|
||||
|
||||
- (BOOL)valueForKeyIsString:(NSString*)key
|
||||
{
|
||||
BOOL bString = NO;
|
||||
NSObject* value = [self objectForKey:key];
|
||||
|
||||
if (value) {
|
||||
bString = [value isKindOfClass:[NSString class]];
|
||||
}
|
||||
return bString;
|
||||
}
|
||||
|
||||
- (BOOL)valueForKeyIsNumber:(NSString*)key
|
||||
{
|
||||
BOOL bNumber = NO;
|
||||
NSObject* value = [self objectForKey:key];
|
||||
|
||||
if (value) {
|
||||
bNumber = [value isKindOfClass:[NSNumber class]];
|
||||
}
|
||||
return bNumber;
|
||||
}
|
||||
|
||||
- (NSDictionary*)dictionaryWithLowercaseKeys
|
||||
{
|
||||
NSMutableDictionary* result = [NSMutableDictionary dictionaryWithCapacity:self.count];
|
||||
NSString* key;
|
||||
|
||||
for (key in self) {
|
||||
[result setObject:[self objectForKey:key] forKey:[key lowercaseString]];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface NSMutableArray (QueueAdditions)
|
||||
|
||||
- (id)pop;
|
||||
- (id)queueHead;
|
||||
- (id)dequeue;
|
||||
- (void)enqueue:(id)obj;
|
||||
|
||||
@end
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import "NSMutableArray+QueueAdditions.h"
|
||||
|
||||
@implementation NSMutableArray (QueueAdditions)
|
||||
|
||||
- (id)queueHead
|
||||
{
|
||||
if ([self count] == 0) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
return [self objectAtIndex:0];
|
||||
}
|
||||
|
||||
- (__autoreleasing id)dequeue
|
||||
{
|
||||
if ([self count] == 0) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
id head = [self objectAtIndex:0];
|
||||
if (head != nil) {
|
||||
// [[head retain] autorelease]; ARC - the __autoreleasing on the return value should so the same thing
|
||||
[self removeObjectAtIndex:0];
|
||||
}
|
||||
|
||||
return head;
|
||||
}
|
||||
|
||||
- (id)pop
|
||||
{
|
||||
return [self dequeue];
|
||||
}
|
||||
|
||||
- (void)enqueue:(id)object
|
||||
{
|
||||
[self addObject:object];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "CDVAvailabilityDeprecated.h"
|
||||
|
||||
@interface UIDevice (org_apache_cordova_UIDevice_Extension)
|
||||
|
||||
/*
|
||||
Get the unique identifier from the app bundle's folder, which is already a GUID
|
||||
Upgrading and/or deleting the app and re-installing will get you a new GUID, so
|
||||
this is only unique per install per device.
|
||||
*/
|
||||
- (NSString*)uniqueAppInstanceIdentifier CDV_DEPRECATED(3.8 .0, "API is slated for removal in 4.0.0");
|
||||
|
||||
@end
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "UIDevice+Extensions.h"
|
||||
|
||||
@implementation UIDevice (org_apache_cordova_UIDevice_Extension)
|
||||
|
||||
- (NSString*)uniqueAppInstanceIdentifier
|
||||
{
|
||||
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
static NSString* UUID_KEY = @"CDVUUID";
|
||||
|
||||
NSString* app_uuid = [userDefaults stringForKey:UUID_KEY];
|
||||
|
||||
if (app_uuid == nil) {
|
||||
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
|
||||
CFStringRef uuidString = CFUUIDCreateString(kCFAllocatorDefault, uuidRef);
|
||||
|
||||
app_uuid = [NSString stringWithString:(__bridge NSString*)uuidString];
|
||||
[userDefaults setObject:app_uuid forKey:UUID_KEY];
|
||||
[userDefaults synchronize];
|
||||
|
||||
CFRelease(uuidString);
|
||||
CFRelease(uuidRef);
|
||||
}
|
||||
|
||||
return app_uuid;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,507 @@
|
|||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
1B701028177A61CF00AE11F4 /* CDVShared.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B701026177A61CF00AE11F4 /* CDVShared.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F92F49E1314023E0046367C /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F92F49F1314023E0046367C /* CDVPluginResult.m */; };
|
||||
301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = 301F2F2914F3C9CA003FE9FC /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 302965BB13A94E9D007046C5 /* CDVDebug.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3034979A1513D56A0090E688 /* CDVLocalStorage.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3034979B1513D56A0090E688 /* CDVLocalStorage.m */; };
|
||||
30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */; };
|
||||
3073E9ED1656D51200957977 /* CDVScreenOrientationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 3073E9EC1656D51200957977 /* CDVScreenOrientationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C6847E1406CB38004C1A8E /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C6847F1406CB38004C1A8E /* CDVWhitelist.m */; };
|
||||
30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 30C684921407044A004C1A8E /* CDVURLProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 30C684931407044A004C1A8E /* CDVURLProtocol.m */; };
|
||||
30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E33AF013A7E24B00594D64 /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E33AF113A7E24B00594D64 /* CDVPlugin.m */; };
|
||||
30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */; };
|
||||
30E6B8CD1A8ADD900025B9EE /* CDVHandleOpenURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 30E6B8CB1A8ADD900025B9EE /* CDVHandleOpenURL.h */; };
|
||||
30E6B8CE1A8ADD900025B9EE /* CDVHandleOpenURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 30E6B8CC1A8ADD900025B9EE /* CDVHandleOpenURL.m */; };
|
||||
30F3930B169F839700B22307 /* CDVJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F39309169F839700B22307 /* CDVJSON.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
30F3930C169F839700B22307 /* CDVJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 30F3930A169F839700B22307 /* CDVJSON.m */; };
|
||||
30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
7E14B5A81705050A0032169E /* CDVTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E14B5A61705050A0032169E /* CDVTimer.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
7E14B5A91705050A0032169E /* CDVTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E14B5A71705050A0032169E /* CDVTimer.m */; };
|
||||
7E22B88519E4C0210026F95E /* CDVAvailabilityDeprecated.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E22B88419E4C0210026F95E /* CDVAvailabilityDeprecated.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8852C43614B65FD800F0E735 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8852C43714B65FD800F0E735 /* CDVViewController.m */; };
|
||||
8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */; };
|
||||
8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */; };
|
||||
8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */ = {isa = PBXBuildFile; fileRef = 8887FD501090FBE7009987E8 /* NSData+Base64.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 8887FD511090FBE7009987E8 /* NSData+Base64.m */; };
|
||||
EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */; };
|
||||
EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */; };
|
||||
EB6A98541A77EE470013FCDB /* CDVJSON_private.m in Sources */ = {isa = PBXBuildFile; fileRef = EB6A98521A77EE470013FCDB /* CDVJSON_private.m */; };
|
||||
EB96673B16A8970A00D86CDF /* CDVUserAgentUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = EB96673916A8970900D86CDF /* CDVUserAgentUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
EB96673C16A8970A00D86CDF /* CDVUserAgentUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = EB96673A16A8970900D86CDF /* CDVUserAgentUtil.m */; };
|
||||
EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */ = {isa = PBXBuildFile; fileRef = EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */; };
|
||||
EBFF4DBC16D3FE2E008F452B /* CDVWebViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = EBFF4DBA16D3FE2E008F452B /* CDVWebViewDelegate.m */; };
|
||||
EBFF4DBD16D3FE2E008F452B /* CDVWebViewDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = EBFF4DBB16D3FE2E008F452B /* CDVWebViewDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
F858FBC6166009A8007DA594 /* CDVConfigParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F858FBC4166009A8007DA594 /* CDVConfigParser.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
F858FBC7166009A8007DA594 /* CDVConfigParser.m in Sources */ = {isa = PBXBuildFile; fileRef = F858FBC5166009A8007DA594 /* CDVConfigParser.m */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
1B701026177A61CF00AE11F4 /* CDVShared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVShared.h; path = Classes/CDVShared.h; sourceTree = "<group>"; };
|
||||
1F92F49E1314023E0046367C /* CDVPluginResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPluginResult.h; path = Classes/CDVPluginResult.h; sourceTree = "<group>"; };
|
||||
1F92F49F1314023E0046367C /* CDVPluginResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPluginResult.m; path = Classes/CDVPluginResult.m; sourceTree = "<group>"; };
|
||||
301F2F2914F3C9CA003FE9FC /* CDV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDV.h; path = Classes/CDV.h; sourceTree = "<group>"; };
|
||||
302965BB13A94E9D007046C5 /* CDVDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVDebug.h; path = Classes/CDVDebug.h; sourceTree = "<group>"; };
|
||||
30325A0B136B343700982B63 /* VERSION */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = VERSION; sourceTree = "<group>"; };
|
||||
3034979A1513D56A0090E688 /* CDVLocalStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVLocalStorage.h; path = Classes/CDVLocalStorage.h; sourceTree = "<group>"; };
|
||||
3034979B1513D56A0090E688 /* CDVLocalStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVLocalStorage.m; path = Classes/CDVLocalStorage.m; sourceTree = "<group>"; };
|
||||
30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAvailability.h; path = Classes/CDVAvailability.h; sourceTree = "<group>"; };
|
||||
3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIDevice+Extensions.h"; path = "Classes/UIDevice+Extensions.h"; sourceTree = "<group>"; };
|
||||
3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIDevice+Extensions.m"; path = "Classes/UIDevice+Extensions.m"; sourceTree = "<group>"; };
|
||||
3073E9EC1656D51200957977 /* CDVScreenOrientationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVScreenOrientationDelegate.h; path = Classes/CDVScreenOrientationDelegate.h; sourceTree = "<group>"; };
|
||||
30C6847E1406CB38004C1A8E /* CDVWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVWhitelist.h; path = Classes/CDVWhitelist.h; sourceTree = "<group>"; };
|
||||
30C6847F1406CB38004C1A8E /* CDVWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVWhitelist.m; path = Classes/CDVWhitelist.m; sourceTree = "<group>"; };
|
||||
30C684921407044A004C1A8E /* CDVURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVURLProtocol.h; path = Classes/CDVURLProtocol.h; sourceTree = "<group>"; };
|
||||
30C684931407044A004C1A8E /* CDVURLProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVURLProtocol.m; path = Classes/CDVURLProtocol.m; sourceTree = "<group>"; };
|
||||
30E33AF013A7E24B00594D64 /* CDVPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVPlugin.h; path = Classes/CDVPlugin.h; sourceTree = "<group>"; };
|
||||
30E33AF113A7E24B00594D64 /* CDVPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVPlugin.m; path = Classes/CDVPlugin.m; sourceTree = "<group>"; };
|
||||
30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+QueueAdditions.h"; path = "Classes/NSMutableArray+QueueAdditions.h"; sourceTree = "<group>"; };
|
||||
30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+QueueAdditions.m"; path = "Classes/NSMutableArray+QueueAdditions.m"; sourceTree = "<group>"; };
|
||||
30E6B8CB1A8ADD900025B9EE /* CDVHandleOpenURL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVHandleOpenURL.h; path = Classes/CDVHandleOpenURL.h; sourceTree = "<group>"; };
|
||||
30E6B8CC1A8ADD900025B9EE /* CDVHandleOpenURL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVHandleOpenURL.m; path = Classes/CDVHandleOpenURL.m; sourceTree = "<group>"; };
|
||||
30F39309169F839700B22307 /* CDVJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVJSON.h; path = Classes/CDVJSON.h; sourceTree = "<group>"; };
|
||||
30F3930A169F839700B22307 /* CDVJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVJSON.m; path = Classes/CDVJSON.m; sourceTree = "<group>"; };
|
||||
30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegate.h; path = Classes/CDVCommandDelegate.h; sourceTree = "<group>"; };
|
||||
686357AA141002F100DF4CF2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
||||
686357AC141002F100DF4CF2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
686357AE141002F100DF4CF2 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
||||
686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; };
|
||||
686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
||||
686357CF14100ADB00DF4CF2 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
||||
686357D014100ADE00DF4CF2 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
|
||||
686357D214100AE700DF4CF2 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
|
||||
686357D414100AF200DF4CF2 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
||||
686357DC14100B1600DF4CF2 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
|
||||
68A32D7114102E1C006B237C /* libCordova.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCordova.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
68A32D7414103017006B237C /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; };
|
||||
7E14B5A61705050A0032169E /* CDVTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVTimer.h; path = Classes/CDVTimer.h; sourceTree = "<group>"; };
|
||||
7E14B5A71705050A0032169E /* CDVTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVTimer.m; path = Classes/CDVTimer.m; sourceTree = "<group>"; };
|
||||
7E22B88419E4C0210026F95E /* CDVAvailabilityDeprecated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVAvailabilityDeprecated.h; path = Classes/CDVAvailabilityDeprecated.h; sourceTree = "<group>"; };
|
||||
8220B5C316D5427E00EC3921 /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = System/Library/Frameworks/AssetsLibrary.framework; sourceTree = SDKROOT; };
|
||||
8852C43614B65FD800F0E735 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVViewController.h; path = Classes/CDVViewController.h; sourceTree = "<group>"; };
|
||||
8852C43714B65FD800F0E735 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVViewController.m; path = Classes/CDVViewController.m; sourceTree = "<group>"; };
|
||||
8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+Extensions.h"; path = "Classes/NSDictionary+Extensions.h"; sourceTree = "<group>"; };
|
||||
8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+Extensions.m"; path = "Classes/NSDictionary+Extensions.m"; sourceTree = "<group>"; };
|
||||
8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVInvokedUrlCommand.h; path = Classes/CDVInvokedUrlCommand.h; sourceTree = "<group>"; };
|
||||
8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVInvokedUrlCommand.m; path = Classes/CDVInvokedUrlCommand.m; sourceTree = "<group>"; };
|
||||
8887FD501090FBE7009987E8 /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "Classes/NSData+Base64.h"; sourceTree = "<group>"; };
|
||||
8887FD511090FBE7009987E8 /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "Classes/NSData+Base64.m"; sourceTree = "<group>"; };
|
||||
AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CordovaLib_Prefix.pch; sourceTree = SOURCE_ROOT; };
|
||||
EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandQueue.h; path = Classes/CDVCommandQueue.h; sourceTree = "<group>"; };
|
||||
EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandQueue.m; path = Classes/CDVCommandQueue.m; sourceTree = "<group>"; };
|
||||
EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVCommandDelegateImpl.h; path = Classes/CDVCommandDelegateImpl.h; sourceTree = "<group>"; };
|
||||
EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVCommandDelegateImpl.m; path = Classes/CDVCommandDelegateImpl.m; sourceTree = "<group>"; };
|
||||
EB6A98521A77EE470013FCDB /* CDVJSON_private.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVJSON_private.m; path = Classes/CDVJSON_private.m; sourceTree = "<group>"; };
|
||||
EB6A98531A77EE470013FCDB /* CDVJSON_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVJSON_private.h; path = Classes/CDVJSON_private.h; sourceTree = "<group>"; };
|
||||
EB96673916A8970900D86CDF /* CDVUserAgentUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVUserAgentUtil.h; path = Classes/CDVUserAgentUtil.h; sourceTree = "<group>"; };
|
||||
EB96673A16A8970900D86CDF /* CDVUserAgentUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVUserAgentUtil.m; path = Classes/CDVUserAgentUtil.m; sourceTree = "<group>"; };
|
||||
EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+Comparisons.h"; path = "Classes/NSArray+Comparisons.h"; sourceTree = "<group>"; };
|
||||
EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Comparisons.m"; path = "Classes/NSArray+Comparisons.m"; sourceTree = "<group>"; };
|
||||
EBFF4DBA16D3FE2E008F452B /* CDVWebViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVWebViewDelegate.m; path = Classes/CDVWebViewDelegate.m; sourceTree = "<group>"; };
|
||||
EBFF4DBB16D3FE2E008F452B /* CDVWebViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVWebViewDelegate.h; path = Classes/CDVWebViewDelegate.h; sourceTree = "<group>"; };
|
||||
F858FBC4166009A8007DA594 /* CDVConfigParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDVConfigParser.h; path = Classes/CDVConfigParser.h; sourceTree = "<group>"; };
|
||||
F858FBC5166009A8007DA594 /* CDVConfigParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDVConfigParser.m; path = Classes/CDVConfigParser.m; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
D2AAC07C0554694100DB518D /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
034768DFFF38A50411DB9C8B /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
68A32D7114102E1C006B237C /* libCordova.a */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = CORDOVALIB;
|
||||
};
|
||||
0867D691FE84028FC02AAC07 /* CordovaLib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8887FD101090FB43009987E8 /* Classes */,
|
||||
32C88DFF0371C24200C91783 /* Other Sources */,
|
||||
0867D69AFE84028FC02AAC07 /* Frameworks */,
|
||||
034768DFFF38A50411DB9C8B /* Products */,
|
||||
30325A0B136B343700982B63 /* VERSION */,
|
||||
);
|
||||
name = CordovaLib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
0867D69AFE84028FC02AAC07 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
68A32D7414103017006B237C /* AddressBook.framework */,
|
||||
8220B5C316D5427E00EC3921 /* AssetsLibrary.framework */,
|
||||
686357DC14100B1600DF4CF2 /* CoreMedia.framework */,
|
||||
686357CE14100ADA00DF4CF2 /* AudioToolbox.framework */,
|
||||
686357CF14100ADB00DF4CF2 /* AVFoundation.framework */,
|
||||
686357D014100ADE00DF4CF2 /* CoreLocation.framework */,
|
||||
686357D214100AE700DF4CF2 /* MobileCoreServices.framework */,
|
||||
686357D414100AF200DF4CF2 /* SystemConfiguration.framework */,
|
||||
686357CC14100AAD00DF4CF2 /* AddressBookUI.framework */,
|
||||
686357AA141002F100DF4CF2 /* UIKit.framework */,
|
||||
686357AC141002F100DF4CF2 /* Foundation.framework */,
|
||||
686357AE141002F100DF4CF2 /* CoreGraphics.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
3054098714B77FF3009841CA /* Cleaver */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
F858FBC4166009A8007DA594 /* CDVConfigParser.h */,
|
||||
F858FBC5166009A8007DA594 /* CDVConfigParser.m */,
|
||||
8852C43614B65FD800F0E735 /* CDVViewController.h */,
|
||||
8852C43714B65FD800F0E735 /* CDVViewController.m */,
|
||||
EB3B3545161CB44D003DBE7D /* CDVCommandQueue.h */,
|
||||
EB3B3546161CB44D003DBE7D /* CDVCommandQueue.m */,
|
||||
);
|
||||
name = Cleaver;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
32C88DFF0371C24200C91783 /* Other Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */,
|
||||
);
|
||||
name = "Other Sources";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
888700D710922F56009987E8 /* Commands */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
30E6B8CB1A8ADD900025B9EE /* CDVHandleOpenURL.h */,
|
||||
30E6B8CC1A8ADD900025B9EE /* CDVHandleOpenURL.m */,
|
||||
7E22B88419E4C0210026F95E /* CDVAvailabilityDeprecated.h */,
|
||||
EBFF4DBA16D3FE2E008F452B /* CDVWebViewDelegate.m */,
|
||||
EBFF4DBB16D3FE2E008F452B /* CDVWebViewDelegate.h */,
|
||||
301F2F2914F3C9CA003FE9FC /* CDV.h */,
|
||||
3034979A1513D56A0090E688 /* CDVLocalStorage.h */,
|
||||
3034979B1513D56A0090E688 /* CDVLocalStorage.m */,
|
||||
30392E4D14F4FCAB00B9E0B8 /* CDVAvailability.h */,
|
||||
30F5EBA914CA26E700987760 /* CDVCommandDelegate.h */,
|
||||
EB3B357A161F2A44003DBE7D /* CDVCommandDelegateImpl.h */,
|
||||
EB3B357B161F2A45003DBE7D /* CDVCommandDelegateImpl.m */,
|
||||
30C684921407044A004C1A8E /* CDVURLProtocol.h */,
|
||||
30C684931407044A004C1A8E /* CDVURLProtocol.m */,
|
||||
30C6847E1406CB38004C1A8E /* CDVWhitelist.h */,
|
||||
1B701026177A61CF00AE11F4 /* CDVShared.h */,
|
||||
30C6847F1406CB38004C1A8E /* CDVWhitelist.m */,
|
||||
30E33AF013A7E24B00594D64 /* CDVPlugin.h */,
|
||||
30E33AF113A7E24B00594D64 /* CDVPlugin.m */,
|
||||
1F92F49E1314023E0046367C /* CDVPluginResult.h */,
|
||||
1F92F49F1314023E0046367C /* CDVPluginResult.m */,
|
||||
8887FD341090FBE7009987E8 /* CDVInvokedUrlCommand.h */,
|
||||
8887FD351090FBE7009987E8 /* CDVInvokedUrlCommand.m */,
|
||||
3073E9EC1656D51200957977 /* CDVScreenOrientationDelegate.h */,
|
||||
30F39309169F839700B22307 /* CDVJSON.h */,
|
||||
30F3930A169F839700B22307 /* CDVJSON.m */,
|
||||
EB6A98521A77EE470013FCDB /* CDVJSON_private.m */,
|
||||
EB6A98531A77EE470013FCDB /* CDVJSON_private.h */,
|
||||
EB96673916A8970900D86CDF /* CDVUserAgentUtil.h */,
|
||||
EB96673A16A8970900D86CDF /* CDVUserAgentUtil.m */,
|
||||
);
|
||||
name = Commands;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
888700D910923009009987E8 /* Util */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3062D11E151D0EDB000D9128 /* UIDevice+Extensions.h */,
|
||||
3062D11F151D0EDB000D9128 /* UIDevice+Extensions.m */,
|
||||
EBA3557115ABD38C00F4DE24 /* NSArray+Comparisons.h */,
|
||||
EBA3557215ABD38C00F4DE24 /* NSArray+Comparisons.m */,
|
||||
8887FD281090FBE7009987E8 /* NSDictionary+Extensions.h */,
|
||||
8887FD291090FBE7009987E8 /* NSDictionary+Extensions.m */,
|
||||
302965BB13A94E9D007046C5 /* CDVDebug.h */,
|
||||
30E563CD13E217EC00C949AA /* NSMutableArray+QueueAdditions.h */,
|
||||
30E563CE13E217EC00C949AA /* NSMutableArray+QueueAdditions.m */,
|
||||
8887FD501090FBE7009987E8 /* NSData+Base64.h */,
|
||||
8887FD511090FBE7009987E8 /* NSData+Base64.m */,
|
||||
7E14B5A61705050A0032169E /* CDVTimer.h */,
|
||||
7E14B5A71705050A0032169E /* CDVTimer.m */,
|
||||
);
|
||||
name = Util;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8887FD101090FB43009987E8 /* Classes */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3054098714B77FF3009841CA /* Cleaver */,
|
||||
888700D710922F56009987E8 /* Commands */,
|
||||
888700D910923009009987E8 /* Util */,
|
||||
);
|
||||
name = Classes;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
D2AAC07A0554694100DB518D /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8887FD681090FBE7009987E8 /* NSDictionary+Extensions.h in Headers */,
|
||||
8887FD741090FBE7009987E8 /* CDVInvokedUrlCommand.h in Headers */,
|
||||
8887FD8F1090FBE7009987E8 /* NSData+Base64.h in Headers */,
|
||||
1F92F4A01314023E0046367C /* CDVPluginResult.h in Headers */,
|
||||
30E33AF213A7E24B00594D64 /* CDVPlugin.h in Headers */,
|
||||
30E6B8CD1A8ADD900025B9EE /* CDVHandleOpenURL.h in Headers */,
|
||||
302965BC13A94E9D007046C5 /* CDVDebug.h in Headers */,
|
||||
30E563CF13E217EC00C949AA /* NSMutableArray+QueueAdditions.h in Headers */,
|
||||
30C684801406CB38004C1A8E /* CDVWhitelist.h in Headers */,
|
||||
30C684941407044B004C1A8E /* CDVURLProtocol.h in Headers */,
|
||||
8852C43A14B65FD800F0E735 /* CDVViewController.h in Headers */,
|
||||
30F5EBAB14CA26E700987760 /* CDVCommandDelegate.h in Headers */,
|
||||
301F2F2A14F3C9CA003FE9FC /* CDV.h in Headers */,
|
||||
30392E4E14F4FCAB00B9E0B8 /* CDVAvailability.h in Headers */,
|
||||
7E22B88519E4C0210026F95E /* CDVAvailabilityDeprecated.h in Headers */,
|
||||
3034979C1513D56A0090E688 /* CDVLocalStorage.h in Headers */,
|
||||
3062D120151D0EDB000D9128 /* UIDevice+Extensions.h in Headers */,
|
||||
EBA3557315ABD38C00F4DE24 /* NSArray+Comparisons.h in Headers */,
|
||||
EB3B3547161CB44D003DBE7D /* CDVCommandQueue.h in Headers */,
|
||||
EB3B357C161F2A45003DBE7D /* CDVCommandDelegateImpl.h in Headers */,
|
||||
1B701028177A61CF00AE11F4 /* CDVShared.h in Headers */,
|
||||
3073E9ED1656D51200957977 /* CDVScreenOrientationDelegate.h in Headers */,
|
||||
F858FBC6166009A8007DA594 /* CDVConfigParser.h in Headers */,
|
||||
30F3930B169F839700B22307 /* CDVJSON.h in Headers */,
|
||||
EBFF4DBD16D3FE2E008F452B /* CDVWebViewDelegate.h in Headers */,
|
||||
EB96673B16A8970A00D86CDF /* CDVUserAgentUtil.h in Headers */,
|
||||
7E14B5A81705050A0032169E /* CDVTimer.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
D2AAC07D0554694100DB518D /* CordovaLib */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */;
|
||||
buildPhases = (
|
||||
D2AAC07A0554694100DB518D /* Headers */,
|
||||
D2AAC07B0554694100DB518D /* Sources */,
|
||||
D2AAC07C0554694100DB518D /* Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = CordovaLib;
|
||||
productName = CordovaLib;
|
||||
productReference = 68A32D7114102E1C006B237C /* libCordova.a */;
|
||||
productType = "com.apple.product-type.library.static";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
0867D690FE84028FC02AAC07 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0510;
|
||||
};
|
||||
buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
hasScannedForEncodings = 1;
|
||||
knownRegions = (
|
||||
English,
|
||||
Japanese,
|
||||
French,
|
||||
German,
|
||||
en,
|
||||
);
|
||||
mainGroup = 0867D691FE84028FC02AAC07 /* CordovaLib */;
|
||||
productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
D2AAC07D0554694100DB518D /* CordovaLib */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
D2AAC07B0554694100DB518D /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8887FD691090FBE7009987E8 /* NSDictionary+Extensions.m in Sources */,
|
||||
8887FD751090FBE7009987E8 /* CDVInvokedUrlCommand.m in Sources */,
|
||||
8887FD901090FBE7009987E8 /* NSData+Base64.m in Sources */,
|
||||
1F92F4A11314023E0046367C /* CDVPluginResult.m in Sources */,
|
||||
30E33AF313A7E24B00594D64 /* CDVPlugin.m in Sources */,
|
||||
30E563D013E217EC00C949AA /* NSMutableArray+QueueAdditions.m in Sources */,
|
||||
30C684821406CB38004C1A8E /* CDVWhitelist.m in Sources */,
|
||||
30C684961407044B004C1A8E /* CDVURLProtocol.m in Sources */,
|
||||
8852C43C14B65FD800F0E735 /* CDVViewController.m in Sources */,
|
||||
3034979E1513D56A0090E688 /* CDVLocalStorage.m in Sources */,
|
||||
3062D122151D0EDB000D9128 /* UIDevice+Extensions.m in Sources */,
|
||||
EBA3557515ABD38C00F4DE24 /* NSArray+Comparisons.m in Sources */,
|
||||
EB3B3548161CB44D003DBE7D /* CDVCommandQueue.m in Sources */,
|
||||
EB6A98541A77EE470013FCDB /* CDVJSON_private.m in Sources */,
|
||||
EB3B357D161F2A45003DBE7D /* CDVCommandDelegateImpl.m in Sources */,
|
||||
F858FBC7166009A8007DA594 /* CDVConfigParser.m in Sources */,
|
||||
30F3930C169F839700B22307 /* CDVJSON.m in Sources */,
|
||||
EB96673C16A8970A00D86CDF /* CDVUserAgentUtil.m in Sources */,
|
||||
30E6B8CE1A8ADD900025B9EE /* CDVHandleOpenURL.m in Sources */,
|
||||
EBFF4DBC16D3FE2E008F452B /* CDVWebViewDelegate.m in Sources */,
|
||||
7E14B5A91705050A0032169E /* CDVTimer.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
1DEB921F08733DC00010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DSTROOT = "/tmp/$(PROJECT_NAME).dst";
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = CordovaLib_Prefix.pch;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||
GCC_THUMB_SUPPORT = NO;
|
||||
GCC_VERSION = "";
|
||||
INSTALL_PATH = /usr/local/lib;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
|
||||
PRODUCT_NAME = Cordova;
|
||||
PUBLIC_HEADERS_FOLDER_PATH = include/Cordova;
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1DEB922008733DC00010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
DSTROOT = "/tmp/$(PROJECT_NAME).dst";
|
||||
GCC_MODEL_TUNING = G5;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
GCC_PREFIX_HEADER = CordovaLib_Prefix.pch;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||
GCC_THUMB_SUPPORT = NO;
|
||||
GCC_VERSION = "";
|
||||
INSTALL_PATH = /usr/local/lib;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
|
||||
PRODUCT_NAME = Cordova;
|
||||
PUBLIC_HEADERS_FOLDER_PATH = include/Cordova;
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
1DEB922308733DC00010E9CD /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||
GCC_THUMB_SUPPORT = NO;
|
||||
GCC_VERSION = "";
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_CFLAGS = "-DDEBUG";
|
||||
PUBLIC_HEADERS_FOLDER_PATH = include/Cordova;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
USER_HEADER_SEARCH_PATHS = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
1DEB922408733DC00010E9CD /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = c99;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = "";
|
||||
GCC_THUMB_SUPPORT = NO;
|
||||
GCC_VERSION = "";
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 6.0;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
PUBLIC_HEADERS_FOLDER_PATH = include/Cordova;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB921F08733DC00010E9CD /* Debug */,
|
||||
1DEB922008733DC00010E9CD /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
1DEB922308733DC00010E9CD /* Debug */,
|
||||
1DEB922408733DC00010E9CD /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
|
||||
}
|
22
fritteliuhr/platforms/ios/CordovaLib/CordovaLib_Prefix.pch
Normal file
22
fritteliuhr/platforms/ios/CordovaLib/CordovaLib_Prefix.pch
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*/
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Foundation/Foundation.h>
|
||||
#endif
|
1
fritteliuhr/platforms/ios/CordovaLib/VERSION
Normal file
1
fritteliuhr/platforms/ios/CordovaLib/VERSION
Normal file
|
@ -0,0 +1 @@
|
|||
3.8.0
|
1810
fritteliuhr/platforms/ios/CordovaLib/cordova.js
vendored
Normal file
1810
fritteliuhr/platforms/ios/CordovaLib/cordova.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue