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