incubator-callback-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From shaz...@apache.org
Subject [22/27] Rename PhoneGap to Cordova.
Date Fri, 17 Feb 2012 01:38:49 GMT
http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/PGViewController.m
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/PGViewController.m b/PhoneGapLib/Classes/PGViewController.m
deleted file mode 100644
index 2dbd644..0000000
--- a/PhoneGapLib/Classes/PGViewController.m
+++ /dev/null
@@ -1,957 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
- 
- http://www.apache.org/licenses/LICENSE-2.0
- 
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import "PGViewController.h"
-#import "PGPlugin.h"
-#import "Location.h"
-#import "Connection.h"
-#import "NSDictionary+LowercaseKeys.h"
-
-#define SYMBOL_TO_NSSTRING_HELPER(x) @#x
-#define SYMBOL_TO_NSSTRING(x) SYMBOL_TO_NSSTRING_HELPER(x)
-#define degreesToRadian(x) (M_PI * (x) / 180.0)
-
-@interface PGViewController ()
-
-@property (nonatomic, readwrite, retain) NSDictionary* settings;
-@property (nonatomic, readwrite, retain) PGWhitelist* whitelist; 
-@property (nonatomic, readwrite, retain) NSMutableDictionary* pluginObjects;
-@property (nonatomic, readwrite, retain) NSDictionary* pluginsMap;
-@property (nonatomic, readwrite, retain) NSArray* supportedOrientations;
-@property (nonatomic, readwrite, copy)   NSString* sessionKey;
-@property (nonatomic, readwrite, assign) BOOL loadFromString;
-
-@property (nonatomic, readwrite, retain) IBOutlet UIActivityIndicatorView* activityView;
-@property (nonatomic, readwrite, retain) UIImageView* imageView;
-
-@end
-
-
-@implementation PGViewController
-
-@synthesize webView, supportedOrientations;
-@synthesize pluginObjects, pluginsMap, whitelist;
-@synthesize settings, sessionKey, loadFromString;
-@synthesize imageView, activityView, useSplashScreen, commandDelegate;
-@synthesize wwwFolderName, startPage;
-
-- (id) init
-{
-    self = [super init];
-    if (self != nil) {
-        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedOrientationChange) 
-                                                     name:UIDeviceOrientationDidChangeNotification object:nil];
-        
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillTerminate:) 
-                                                     name:UIApplicationWillTerminateNotification object:nil];
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillResignActive:) 
-                                                     name:UIApplicationWillResignActiveNotification object:nil];
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillEnterForeground:) 
-                                                     name:UIApplicationWillEnterForegroundNotification object:nil];
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidBecomeActive:) 
-                                                     name:UIApplicationDidBecomeActiveNotification object:nil];
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidEnterBackground:) 
-                                                     name:UIApplicationDidEnterBackgroundNotification object:nil];
-
-        self.wwwFolderName = @"www";
-        self.startPage = @"index.html";
-        [self setWantsFullScreenLayout:YES];
-    }
-    return self; 
-}
-
-// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
-- (void) viewDidLoad 
-{
-    if (self.sessionKey == nil) {
-        self.sessionKey = [NSString stringWithFormat:@"%d", arc4random()];
-    }
-    
-    [super viewDidLoad];
-	
-    self.pluginObjects = [[[NSMutableDictionary alloc] initWithCapacity:4] autorelease];
-    
-	// read from UISupportedInterfaceOrientations (or UISupportedInterfaceOrientations~iPad, if its iPad) from -Info.plist
-    self.supportedOrientations = [self parseInterfaceOrientations:
-									  [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"]];
-    
-    // read from PhoneGap.plist in the app bundle
-    NSString* appPlistName = @"PhoneGap";
-    NSDictionary* phonegapPlist = [[self class] getBundlePlist:appPlistName];
-    if (phonegapPlist == nil) {
-        NSLog(@"WARNING: %@.plist is missing.", appPlistName);
-		return;
-    }
-    self.settings = [[[NSDictionary alloc] initWithDictionary:phonegapPlist] autorelease];
-	
-    // read from Plugins dict in PhoneGap.plist in the app bundle
-    NSString* pluginsKey = @"Plugins";
-    NSDictionary* pluginsDict = [self.settings objectForKey:@"Plugins"];
-    if (pluginsDict == nil) {
-        NSLog(@"WARNING: %@ key in %@.plist is missing! PhoneGap will not work, you need to have this key.", pluginsKey, appPlistName);
-        return;
-    }
-    
-    // set the whitelist
-    self.whitelist = [[[PGWhitelist alloc] initWithArray:[self.settings objectForKey:@"ExternalHosts"]] autorelease];
-	
-    self.pluginsMap = [pluginsDict dictionaryWithLowercaseKeys];
-    
-    ///////////////////
-    
-	NSString* startFilePath = [self pathForResource:self.startPage];
-	NSURL* appURL  = nil;
-    NSString* loadErr = nil;
-    
-    if (startFilePath == nil) {
-        loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage];
-        NSLog(@"%@", loadErr);
-        self.loadFromString = YES;
-        appURL = nil;
-    } else {
-        appURL = [NSURL fileURLWithPath:startFilePath];
-    }
-
-    [ self createGapView];
-    
-    ///////////////////
-    
-    NSNumber* enableLocation       = [self.settings objectForKey:@"EnableLocation"];
-    NSString* enableViewportScale  = [self.settings objectForKey:@"EnableViewportScale"];
-    NSNumber* allowInlineMediaPlayback = [self.settings objectForKey:@"AllowInlineMediaPlayback"];
-    BOOL mediaPlaybackRequiresUserAction = YES;  // default value
-    if ([self.settings objectForKey:@"MediaPlaybackRequiresUserAction"]) {
-        mediaPlaybackRequiresUserAction = [(NSNumber*)[settings objectForKey:@"MediaPlaybackRequiresUserAction"] boolValue];
-    }
-    
-    self.webView.scalesPageToFit = [enableViewportScale boolValue];
-    
-    /*
-     * Fire up the GPS Service right away as it takes a moment for data to come back.
-     */
-    
-    if ([enableLocation boolValue]) {
-        [[self.commandDelegate getCommandInstance:@"com.phonegap.geolocation"] startLocation:nil withDict:nil];
-    }
-    
-    /*
-     * This is for iOS 4.x, where you can allow inline <video> and <audio>, and also autoplay them
-     */
-    if ([allowInlineMediaPlayback boolValue] && [self.webView respondsToSelector:@selector(allowsInlineMediaPlayback)]) {
-        self.webView.allowsInlineMediaPlayback = YES;
-    }
-    if (mediaPlaybackRequiresUserAction == NO && [self.webView respondsToSelector:@selector(mediaPlaybackRequiresUserAction)]) {
-        self.webView.mediaPlaybackRequiresUserAction = NO;
-    }
-    
-    // UIWebViewBounce property - defaults to true
-    NSNumber* bouncePreference = [self.settings objectForKey:@"UIWebViewBounce"];
-    BOOL bounceAllowed = (bouncePreference==nil || [bouncePreference boolValue]); 
-    
-    // prevent webView from bouncing
-    // based on UIWebViewBounce key in PhoneGap.plist
-    if (!bounceAllowed) {
-        if ([ self.webView respondsToSelector:@selector(scrollView) ]) {
-            ((UIScrollView *) [self.webView scrollView]).bounces = NO;
-        } else {
-            for (id subview in self.webView.subviews)
-                if ([[subview class] isSubclassOfClass: [UIScrollView class]])
-                    ((UIScrollView *)subview).bounces = NO;
-        }
-    }
-    
-    ///////////////////
-    
-    if (!loadErr) {
-        NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
-        [self.webView loadRequest:appReq];
-    } else {
-        NSString* html = [NSString stringWithFormat:@"<html><body> %@ </body></html>", loadErr];
-        [self.webView loadHTMLString:html baseURL:nil];
-    }
-    
-	self.commandDelegate = self;
-}
-
-- (NSArray*) parseInterfaceOrientations:(NSArray*)orientations
-{
-    NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease];
-	
-    if (orientations != nil) 
-    {
-        NSEnumerator* enumerator = [orientations objectEnumerator];
-        NSString* orientationString;
-        
-        while (orientationString = [enumerator nextObject]) 
-        {
-            if ([orientationString isEqualToString:@"UIInterfaceOrientationPortrait"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]];
-            } else if ([orientationString isEqualToString:@"UIInterfaceOrientationPortraitUpsideDown"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortraitUpsideDown]];
-            } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeLeft"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]];
-            } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeRight"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]];
-            }
-        }
-    }
-    
-    // default
-    if ([result count] == 0) {
-        [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]];
-    }
-    
-    return result;
-}
-
-- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
-{
-	// First ask the webview via JS if it wants to support the new orientation -jm
-	int i = 0;
-	
-	switch (interfaceOrientation){
-            
-		case UIInterfaceOrientationPortraitUpsideDown:
-			i = 180;
-			break;
-		case UIInterfaceOrientationLandscapeLeft:
-			i = -90;
-			break;
-		case UIInterfaceOrientationLandscapeRight:
-			i = 90;
-			break;
-		default:
-		case UIInterfaceOrientationPortrait:
-			// noop
-			break;
-	}
-	
-	NSString* jsCall = [ NSString stringWithFormat:@"shouldRotateToOrientation(%d);",i];
-	NSString* res = [webView stringByEvaluatingJavaScriptFromString:jsCall];
-	
-	if([res length] > 0)
-	{
-		return [res boolValue];
-	}
-	
-	// if js did not handle the new orientation ( no return value ) we will look it up in the plist -jm
-	
-	BOOL autoRotate = [self.supportedOrientations count] > 0; // autorotate if only more than 1 orientation supported
-	if (autoRotate)
-	{
-		if ([self.supportedOrientations containsObject:
-			 [NSNumber numberWithInt:interfaceOrientation]]) {
-			return YES;
-		}
-    }
-	
-	// default return value is NO! -jm
-	
-	return NO;
-}
-
-
-/**
- Called by UIKit when the device starts to rotate to a new orientation.  This fires the \c setOrientation
- method on the Orientation object in JavaScript.  Look at the JavaScript documentation for more information.
- */
-- (void)didRotateFromInterfaceOrientation: (UIInterfaceOrientation)fromInterfaceOrientation
-{
-	int i = 0;
-	
-	switch (self.interfaceOrientation){
-		case UIInterfaceOrientationPortrait:
-			i = 0;
-			break;
-		case UIInterfaceOrientationPortraitUpsideDown:
-			i = 180;
-			break;
-		case UIInterfaceOrientationLandscapeLeft:
-			i = -90;
-			break;
-		case UIInterfaceOrientationLandscapeRight:
-			i = 90;
-			break;
-	}
-	
-	NSString* jsCallback = [NSString stringWithFormat:@"window.__defineGetter__('orientation',function(){ return %d; }); PhoneGap.fireEvent('orientationchange', window);",i];
-	[self.webView stringByEvaluatingJavaScriptFromString:jsCallback];    
-}
-
-- (void) createGapView
-{
-    CGRect webViewBounds = self.view.bounds;
-    webViewBounds.origin = self.view.bounds.origin;
-	
-    if (!self.webView) 
-	{
-        self.webView = [[ [ UIGapView alloc ] initWithFrame:webViewBounds] autorelease];
-		self.webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
-		
-		[self.view addSubview:self.webView];
-		[self.view sendSubviewToBack:self.webView];
-		
-		self.webView.delegate = self;
-    }
-}
-
-- (void) didReceiveMemoryWarning {
-	// Releases the view if it doesn't have a superview.
-    [super didReceiveMemoryWarning];
-	
-	// Release any cached data, images, etc. that aren't in use.
-}
-
-
-- (void) viewDidUnload {
-	// Release any retained subviews of the main view.
-	// e.g. self.myOutlet = nil;
-}
-
-
-#pragma mark UIWebViewDelegate
-
-/**
- When web application loads Add stuff to the DOM, mainly the user-defined settings from the Settings.plist file, and
- the device's data such as device ID, platform version, etc.
- */
-- (void) webViewDidStartLoad:(UIWebView*)theWebView 
-{
-    
-}
-
-/**
- Called when the webview finishes loading.  This stops the activity view and closes the imageview
- */
-- (void) webViewDidFinishLoad:(UIWebView*)theWebView 
-{
-    // Share session key with the WebView by setting PhoneGap.sessionKey
-    NSString *sessionKeyScript = [NSString stringWithFormat:@"PhoneGap.sessionKey = \"%@\";", self.sessionKey];
-    [theWebView stringByEvaluatingJavaScriptFromString:sessionKeyScript];
-	
-    
-    NSDictionary *deviceProperties = [ self deviceProperties];
-    NSMutableString *result = [[NSMutableString alloc] initWithFormat:@"DeviceInfo = %@;", [deviceProperties JSONString]];
-    
-    /* Settings.plist
-     * Read the optional Settings.plist file and push these user-defined settings down into the web application.
-     * This can be useful for supplying build-time configuration variables down to the app to change its behaviour,
-     * such as specifying Full / Lite version, or localization (English vs German, for instance).
-     */
-    
-    NSDictionary *temp = [[self class] getBundlePlist:@"Settings"];
-    if ([temp respondsToSelector:@selector(JSONString)]) {
-        [result appendFormat:@"\nwindow.Settings = %@;", [temp JSONString]];
-    }
-    
-    NSLog(@"Device initialization: %@", result);
-    [theWebView stringByEvaluatingJavaScriptFromString:result];
-    [result release];
-    
-    /*
-     * Hide the Top Activity THROBBER in the Battery Bar
-     */
-    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
-	
-    id autoHideSplashScreenValue = [self.settings objectForKey:@"AutoHideSplashScreen"];
-    // if value is missing, default to yes
-    if (autoHideSplashScreenValue == nil || [autoHideSplashScreenValue boolValue]) {
-        self.imageView.hidden = YES;
-        self.activityView.hidden = YES;    
-        [self.view.superview bringSubviewToFront:self.webView];
-    }
-    
-    [self didRotateFromInterfaceOrientation:(UIInterfaceOrientation)[[UIDevice currentDevice] orientation]];
-}
-
-- (void) webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error 
-{
-    NSLog(@"Failed to load webpage with error: %@", [error localizedDescription]);
-    /*
-	 if ([error code] != NSURLErrorCancelled)
-	 alert([error localizedDescription]);
-     */
-}
-
-- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
-{
-	NSURL* url = [request URL];
-    
-    /*
-     * Execute any commands queued with PhoneGap.exec() on the JS side.
-     * The part of the URL after gap:// is irrelevant.
-     */
-	if ([[url scheme] isEqualToString:@"gap"]) {
-        [self flushCommandQueue];
-        return NO;
-	}
-    /*
-     * If a URL is being loaded that's a file/http/https URL, just load it internally
-     */
-    else if ([url isFileURL])
-    {
-        return YES;
-    }
-    else if ([self.whitelist schemeIsAllowed:[url scheme]])
-    {            
-        if ([self.whitelist URLIsAllowed:url] == YES)
-        {
-            NSNumber *openAllInWhitelistSetting = [self.settings objectForKey:@"OpenAllWhitelistURLsInWebView"];
-            if ((nil != openAllInWhitelistSetting) && [openAllInWhitelistSetting boolValue]) {
-                NSLog(@"OpenAllWhitelistURLsInWebView set: opening in webview");
-                return YES;
-            }
-			
-            // mainDocument will be nil for an iFrame
-            NSString* mainDocument = [theWebView.request.mainDocumentURL absoluteString];
-			
-            // anchor target="_blank" - load in Mobile Safari
-            if (navigationType == UIWebViewNavigationTypeOther && mainDocument != nil)
-            {
-                [[UIApplication sharedApplication] openURL:url];
-                return NO;
-            }
-            // other anchor target - load in PhoneGap webView
-            else
-            {
-                return YES;
-            }
-        }
-        
-        return NO;
-    }
-    /*
-     *    If we loaded the HTML from a string, we let the app handle it
-     */
-    else if (self.loadFromString == YES)
-    {
-        self.loadFromString = NO;
-        return YES;
-    }
-    /*
-     * all tel: scheme urls we let the UIWebview handle it using the default behaviour
-     */
-    else if ([[url scheme] isEqualToString:@"tel"])
-    {
-        return YES;
-    }
-    /*
-     * all about: scheme urls are not handled
-     */
-    else if ([[url scheme] isEqualToString:@"about"])
-    {
-        return NO;
-    }
-    /*
-     * We don't have a PhoneGap or web/local request, load it in the main Safari browser.
-     * pass this to the application to handle.  Could be a mailto:dude@duderanch.com or a tel:55555555 or sms:55555555 facetime:55555555
-     */
-    else
-    {
-        NSLog(@"PGAppDelegate::shouldStartLoadWithRequest: Received Unhandled URL %@", url);
-		
-        if ([[UIApplication sharedApplication] canOpenURL:url]) {
-            [[UIApplication sharedApplication] openURL:url];
-        } else { // handle any custom schemes to plugins
-            [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:PGPluginHandleOpenURLNotification object:url]];
-        }
-		
-        return NO;
-    }
-    
-    return YES;
-}
-
-#pragma mark GapHelpers
-
-- (void) javascriptAlert:(NSString*)text
-{
-    NSString* jsString = [NSString stringWithFormat:@"alert('%@');", text];
-    [webView stringByEvaluatingJavaScriptFromString:jsString];
-}
-
-+ (BOOL) isIPad 
-{
-#ifdef UI_USER_INTERFACE_IDIOM
-    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
-#else
-    return NO;
-#endif
-}
-
-+ (NSString*) resolveImageResource:(NSString*)resource
-{
-    NSString* systemVersion = [[UIDevice currentDevice] systemVersion];
-    BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending);
-    
-    // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path
-    if (isLessThaniOS4)
-    {
-        if ([[self class] isIPad]) {
-            return [NSString stringWithFormat:@"%@~ipad.png", resource];
-        } else {
-            return [NSString stringWithFormat:@"%@.png", resource];
-        }
-    }
-    
-    return resource;
-}
-
-- (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 = self.wwwFolderName;
-    
-    if ([directoryPartsJoined length] > 0) {
-        directoryStr = [NSString stringWithFormat:@"%@/%@", self.wwwFolderName, [directoryParts componentsJoinedByString:@"/"]];
-    }
-    
-    return [mainBundle pathForResource:filename ofType:@"" inDirectory:directoryStr];
-}
-
-+ (NSString*) applicationDocumentsDirectory 
-{
-    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
-    return basePath;
-}
-
-- (void) showSplashScreen
-{
-    NSString* launchImageFile = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UILaunchImageFile"];
-    if (launchImageFile == nil) { // fallback if no launch image was specified
-        launchImageFile = @"Default"; 
-    }
-    
-    NSString* orientedLaunchImageFile = nil;    
-    CGAffineTransform startupImageTransform = CGAffineTransformIdentity;
-    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
-    CGRect screenBounds = [[UIScreen mainScreen] bounds];
-    UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation;
-    BOOL isIPad = [[self class] isIPad];
-    UIImage* launchImage = nil;
-    
-    if (isIPad)
-    {
-        if (!UIDeviceOrientationIsValidInterfaceOrientation(deviceOrientation)) {
-            deviceOrientation = (UIDeviceOrientation)statusBarOrientation;
-        }
-        
-        switch (deviceOrientation) 
-        {
-            case UIDeviceOrientationLandscapeLeft: // this is where the home button is on the right (yeah, I know, confusing)
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Landscape", launchImageFile];
-                startupImageTransform = CGAffineTransformMakeRotation(degreesToRadian(90));
-            }
-                break;
-            case UIDeviceOrientationLandscapeRight: // this is where the home button is on the left (yeah, I know, confusing)
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Landscape", launchImageFile];
-                startupImageTransform = CGAffineTransformMakeRotation(degreesToRadian(-90));
-            } 
-                break;
-            case UIDeviceOrientationPortraitUpsideDown:
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Portrait", launchImageFile];
-                startupImageTransform = CGAffineTransformMakeRotation(degreesToRadian(180));
-            } 
-                break;
-            case UIDeviceOrientationPortrait:
-            default:
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Portrait", launchImageFile];
-                startupImageTransform = CGAffineTransformIdentity;
-            }
-                break;
-        }
-        
-        launchImage = [UIImage imageNamed:[[self class] resolveImageResource:orientedLaunchImageFile]];
-    }
-    else // not iPad
-    {
-        orientedLaunchImageFile = @"Default";
-        launchImage = [UIImage imageNamed:[[self class] resolveImageResource:orientedLaunchImageFile]];
-    }
-    
-    if (launchImage == nil) {
-        NSLog(@"WARNING: Splash-screen image '%@' was not found. Orientation: %d, iPad: %d", orientedLaunchImageFile, deviceOrientation, isIPad);
-    }
-    
-    self.imageView = [[[UIImageView alloc] initWithImage:launchImage] autorelease];    
-    self.imageView.tag = 1;
-    self.imageView.center = CGPointMake((screenBounds.size.width / 2), (screenBounds.size.height / 2));
-    
-    self.imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth & UIViewAutoresizingFlexibleHeight & UIViewAutoresizingFlexibleLeftMargin & UIViewAutoresizingFlexibleRightMargin);    
-    [self.imageView setTransform:startupImageTransform];
-    [self.view.superview addSubview:self.imageView];
-    
-    
-    /*
-     * The Activity View is the top spinning throbber in the status/battery bar. We init it with the default Grey Style.
-     *
-     *     whiteLarge = UIActivityIndicatorViewStyleWhiteLarge
-     *     white      = UIActivityIndicatorViewStyleWhite
-     *     gray       = UIActivityIndicatorViewStyleGray
-     *
-     */
-    NSString* topActivityIndicator = [self.settings objectForKey:@"TopActivityIndicator"];
-    UIActivityIndicatorViewStyle topActivityIndicatorStyle = UIActivityIndicatorViewStyleGray;
-    
-    if ([topActivityIndicator isEqualToString:@"whiteLarge"]) {
-        topActivityIndicatorStyle = UIActivityIndicatorViewStyleWhiteLarge;
-    } else if ([topActivityIndicator isEqualToString:@"white"]) {
-        topActivityIndicatorStyle = UIActivityIndicatorViewStyleWhite;
-    } else if ([topActivityIndicator isEqualToString:@"gray"]) {
-        topActivityIndicatorStyle = UIActivityIndicatorViewStyleGray;
-    }
-    
-    self.activityView = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:topActivityIndicatorStyle] autorelease];
-    self.activityView.tag = 2;
-    
-    id showSplashScreenSpinnerValue = [self.settings objectForKey:@"ShowSplashScreenSpinner"];
-    // backwards compatibility - if key is missing, default to true
-    if (showSplashScreenSpinnerValue == nil || [showSplashScreenSpinnerValue boolValue]) {
-        [self.view.superview addSubview:self.activityView];
-    }
-    
-    self.activityView.center = self.view.center;
-    [self.activityView startAnimating];
-    
-    [self.view.superview layoutSubviews];
-}    
-
-BOOL gSplashScreenShown = NO;
-- (void) receivedOrientationChange
-{
-    if (self.imageView == nil) {
-        gSplashScreenShown = YES;
-        if (self.useSplashScreen) {
-            [self showSplashScreen];
-        }
-    }
-}
-
-#pragma mark PhoneGapCommands
-
-/**
- * Fetches the command queue and executes each command. It is possible that the
- * queue will not be empty after this function has completed since the executed
- * commands may have run callbacks which queued more commands.
- *
- * Returns the number of executed commands.
- */
-- (int) executeQueuedCommands
-{
-    // Grab all the queued commands from the JS side.
-    NSString* queuedCommandsJSON = [self.webView stringByEvaluatingJavaScriptFromString:
-									@"PhoneGap.getAndClearQueuedCommands()"];
-	
-	
-    // Parse the returned JSON array.
-    //PG_SBJsonParser* jsonParser = [[[PG_SBJsonParser alloc] init] autorelease];
-    NSArray* queuedCommands =
-	[queuedCommandsJSON objectFromJSONString];
-	
-    // Iterate over and execute all of the commands.
-    for (NSString* commandJson in queuedCommands) {
-		
-        if(![self.commandDelegate execute:
-		 [InvokedUrlCommand commandFromObject:
-		  [commandJson mutableObjectFromJSONString]]])
-		{
-			NSLog(@"FAILED pluginJSON = %@",commandJson);
-		}
-    }
-	
-    return [queuedCommands count];
-}
-
-/**
- * Repeatedly fetches and executes the command queue until it is empty.
- */
-- (void) flushCommandQueue
-{
-    [self.webView stringByEvaluatingJavaScriptFromString:
-	 @"PhoneGap.commandQueueFlushing = true"];
-	
-    // Keep executing the command queue until no commands get executed.
-    // This ensures that commands that are queued while executing other
-    // commands are executed as well.
-    int numExecutedCommands = 0;
-    do {
-        numExecutedCommands = [self executeQueuedCommands];
-    } while (numExecutedCommands != 0);
-	
-    [self.webView stringByEvaluatingJavaScriptFromString:
-	 @"PhoneGap.commandQueueFlushing = false"];
-}
-
-- (BOOL) execute:(InvokedUrlCommand*)command
-{
-    if (command.className == nil || command.methodName == nil) {
-        return NO;
-    }
-    
-    // Fetch an instance of this class
-    PGPlugin* obj = [self.commandDelegate getCommandInstance:command.className];
-    
-    if (!([obj isKindOfClass:[PGPlugin class]])) { // still allow deprecated class, until 1.0 release
-        NSLog(@"ERROR: Plugin '%@' not found, or is not a PGPlugin. Check your plugin mapping in PhoneGap.plist.", command.className);
-        return NO;
-    }
-    BOOL retVal = YES;
-    
-    // construct the fill method name to ammend the second argument.
-    NSString* fullMethodName = [[NSString alloc] initWithFormat:@"%@:withDict:", command.methodName];
-    if ([obj respondsToSelector:NSSelectorFromString(fullMethodName)]) {
-        [obj performSelector:NSSelectorFromString(fullMethodName) withObject:command.arguments withObject:command.options];
-    } else {
-        // There's no method to call, so throw an error.
-        NSLog(@"ERROR: Method '%@' not defined in Plugin '%@'", fullMethodName, command.className);
-        retVal = NO;
-    }
-    [fullMethodName release];
-    
-    return retVal;
-}
-
-/**
- Returns an instance of a PhoneGapCommand object, based on its name.  If one exists already, it is returned.
- */
-- (id) getCommandInstance:(NSString*)pluginName
-{
-    // first, we try to find the pluginName in the pluginsMap 
-    // (acts as a whitelist as well) if it does not exist, we return nil
-    // NOTE: plugin names are matched as lowercase to avoid problems - however, a 
-    // possible issue is there can be duplicates possible if you had:
-    // "com.phonegap.Foo" and "com.phonegap.foo" - only the lower-cased entry will match
-    NSString* className = [self.pluginsMap objectForKey:[pluginName lowercaseString]];
-    if (className == nil) {
-        return nil;
-    }
-    
-    id obj = [self.pluginObjects objectForKey:className];
-    if (!obj) 
-    {
-        // attempt to load the settings for this command class
-        NSDictionary* classSettings = [self.settings objectForKey:className];
-		
-        if (classSettings) {
-            obj = [[NSClassFromString(className) alloc] initWithWebView:webView settings:classSettings];
-        } else {
-            obj = [[NSClassFromString(className) alloc] initWithWebView:webView];
-        }
-        
-        if ([obj isKindOfClass:[PGPlugin class]] && [obj respondsToSelector:@selector(setViewController:)]) { 
-            [obj setViewController:self];
-        }
-        
-        if ([obj isKindOfClass:[PGPlugin class]] && [obj respondsToSelector:@selector(setCommandDelegate:)]) { 
-            [obj setCommandDelegate:self.commandDelegate];
-        }
-
-        if (obj != nil) {
-            [self.pluginObjects setObject:obj forKey:className];
-            [obj release];
-        } else {
-            NSLog(@"PGPlugin class %@ (pluginName: %@) does not exist.", className, pluginName);
-        }
-    }
-    return obj;
-}
-
-
-#pragma mark -
-
-- (NSDictionary*) deviceProperties
-{
-    UIDevice *device = [UIDevice currentDevice];
-    NSMutableDictionary *devProps = [NSMutableDictionary dictionaryWithCapacity:4];
-    [devProps setObject:[device model] forKey:@"platform"];
-    [devProps setObject:[device systemVersion] forKey:@"version"];
-    [devProps setObject:[device uniqueIdentifier] forKey:@"uuid"];
-    [devProps setObject:[device name] forKey:@"name"];
-    [devProps setObject:[[self class] phoneGapVersion ] forKey:@"gap"];
-    
-    id cmd = [self.commandDelegate getCommandInstance:@"com.phonegap.connection"];
-    if (cmd && [cmd isKindOfClass:[PGConnection class]]) 
-    {
-        NSMutableDictionary *connProps = [NSMutableDictionary dictionaryWithCapacity:3];
-        if ([cmd respondsToSelector:@selector(connectionType)]) {
-            [connProps setObject:[cmd connectionType] forKey:@"type"];
-        }
-        [devProps setObject:connProps forKey:@"connection"];
-    }
-    
-    NSDictionary *devReturn = [NSDictionary dictionaryWithDictionary:devProps];
-    return devReturn;
-}
-
-- (NSString*) appURLScheme
-{
-    NSString* URLScheme = nil;
-    
-    NSArray *URLTypes = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"];
-    if(URLTypes != nil ) {
-        NSDictionary* dict = [URLTypes objectAtIndex:0];
-        if(dict != nil ) {
-            NSArray* URLSchemes = [dict objectForKey:@"CFBundleURLSchemes"];
-            if( URLSchemes != nil ) {    
-                URLScheme = [URLSchemes objectAtIndex:0];
-            }
-        }
-    }
-    
-    return URLScheme;
-}
-
-/**
- Returns the contents of the named plist bundle, loaded as a dictionary object
- */
-+ (NSDictionary*) getBundlePlist:(NSString*)plistName
-{
-    NSString *errorDesc = nil;
-    NSPropertyListFormat format;
-    NSString *plistPath = [[NSBundle mainBundle] pathForResource:plistName ofType:@"plist"];
-    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
-    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization
-                                          propertyListFromData:plistXML
-                                          mutabilityOption:NSPropertyListMutableContainersAndLeaves              
-                                          format:&format errorDescription:&errorDesc];
-    return temp;
-}
-
-/**
- Returns the current version of phoneGap as read from the VERSION file
- This only touches the filesystem once and stores the result in the class variable gapVersion
- */
-static NSString *gapVersion;
-+ (NSString*) phoneGapVersion
-{
-#ifdef PG_VERSION
-    gapVersion = SYMBOL_TO_NSSTRING(PG_VERSION);
-#else
-	
-    if (gapVersion == nil) {
-        NSBundle *mainBundle = [NSBundle mainBundle];
-        NSString *filename = [mainBundle pathForResource:@"VERSION" ofType:nil];
-        // read from the filesystem and save in the variable
-        // first, separate by new line
-        NSString* fileContents = [NSString stringWithContentsOfFile:filename encoding:NSUTF8StringEncoding error:NULL];
-        NSArray* all_lines = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
-        NSString* first_line = [all_lines objectAtIndex:0];        
-        
-        gapVersion = [first_line retain];
-    }
-#endif
-    
-    return gapVersion;
-}
-
-
-#pragma mark -
-#pragma mark UIApplicationDelegate impl
-
-/*
- This method lets your application know that it is about to be terminated and purged from memory entirely
- */
-- (void) onAppWillTerminate:(NSNotification*)notification
-{
-    NSLog(@"applicationWillTerminate");
-    
-    // empty the tmp directory
-    NSFileManager* fileMgr = [[NSFileManager alloc] init];
-    NSError* err = nil;    
-    
-    // clear contents of NSTemporaryDirectory 
-    NSString* tempDirectoryPath = NSTemporaryDirectory();
-    NSDirectoryEnumerator* directoryEnumerator = [fileMgr enumeratorAtPath:tempDirectoryPath];    
-    NSString* fileName = nil;
-    BOOL result;
-    
-    while ((fileName = [directoryEnumerator nextObject])) {
-        NSString* filePath = [tempDirectoryPath stringByAppendingPathComponent:fileName];
-        result = [fileMgr removeItemAtPath:filePath error:&err];
-        if (!result && err) {
-            NSLog(@"Failed to delete: %@ (error: %@)", filePath, err);
-        }
-    }    
-    [fileMgr release];
-}
-
-/*
- This method is called to let your application know that it is about to move from the active to inactive state.
- You should use this method to pause ongoing tasks, disable timer, ...
- */
-- (void) onAppWillResignActive:(NSNotification*)notification
-{
-    //NSLog(@"%@",@"applicationWillResignActive");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('resign');"];
-}
-
-/*
- In iOS 4.0 and later, this method is called as part of the transition from the background to the inactive state. 
- You can use this method to undo many of the changes you made to your application upon entering the background.
- invariably followed by applicationDidBecomeActive
- */
-- (void) onAppWillEnterForeground:(NSNotification*)notification
-{
-    //NSLog(@"%@",@"applicationWillEnterForeground");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('resume');"];
-}
-
-// This method is called to let your application know that it moved from the inactive to active state. 
-- (void) onAppDidBecomeActive:(NSNotification*)notification
-{
-    //NSLog(@"%@",@"applicationDidBecomeActive");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('active');"];
-}
-
-/*
- In iOS 4.0 and later, this method is called instead of the applicationWillTerminate: method 
- when the user quits an application that supports background execution.
- */
-- (void) onAppDidEnterBackground:(NSNotification*)notification
-{
-    //NSLog(@"%@",@"applicationDidEnterBackground");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('pause');"];
-}
-
-// ///////////////////////
-
-
-- (void)dealloc 
-{
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillTerminateNotification object:nil];
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillEnterForegroundNotification object:nil];
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
-    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
-    
-    [super dealloc];
-}
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/PGWhitelist.h
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/PGWhitelist.h b/PhoneGapLib/Classes/PGWhitelist.h
deleted file mode 100644
index 53686e6..0000000
--- a/PhoneGapLib/Classes/PGWhitelist.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
- 
- http://www.apache.org/licenses/LICENSE-2.0
- 
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import <Foundation/Foundation.h>
-
-@interface PGWhitelist : NSObject
-
-@property (nonatomic, readonly, retain) NSArray* whitelist;
-@property (nonatomic, readonly, retain) NSArray* expandedWhitelist;
-@property (nonatomic, readonly, assign) BOOL allowAll;
-
-- (id) initWithArray:(NSArray*)array;
-- (BOOL) URLIsAllowed:(NSURL*)url;
-- (BOOL) schemeIsAllowed:(NSString*)scheme;
-- (NSString*) errorStringForURL:(NSURL*)url;
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/PGWhitelist.m
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/PGWhitelist.m b/PhoneGapLib/Classes/PGWhitelist.m
deleted file mode 100644
index 412478e..0000000
--- a/PhoneGapLib/Classes/PGWhitelist.m
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
- 
- http://www.apache.org/licenses/LICENSE-2.0
- 
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import "PGWhitelist.h"
-
-@interface PGWhitelist ()
-
-@property (nonatomic, readwrite, retain) NSArray* whitelist;
-@property (nonatomic, readwrite, retain) NSArray* expandedWhitelist;
-@property (nonatomic, readwrite, assign) BOOL allowAll;
-
-- (void) processWhitelist;
-
-@end
-
-@implementation PGWhitelist
-
-@synthesize whitelist, expandedWhitelist, allowAll;
-
-- (id) initWithArray:(NSArray*)array
-{
-    self = [super init];
-    if (self) {
-        self.whitelist = array;
-        self.expandedWhitelist = nil;
-        self.allowAll = NO;
-        [self processWhitelist];
-    }
-    
-    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] autorelease];
-    [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) processWhitelist
-{
-    if (self.whitelist == nil) {
-        NSLog(@"ERROR: PGWhitelist was not initialized properly, all urls will be disallowed.");
-        return;
-    }
-    
-    NSMutableArray* expanded = [NSMutableArray arrayWithCapacity:[self.whitelist count]];
-    
-    // iterate through settings ExternalHosts, check for equality
-    NSEnumerator* enumerator = [self.whitelist  objectEnumerator];
-    id externalHost = nil;
-    
-    // only allow known TLDs (since Aug 23rd 2011), and two character country codes
-    // does not match internationalized domain names with non-ASCII characters
-    NSString* tld_match = @"(aero|asia|arpa|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|xxx|[a-z][a-z])";
-    
-    while (externalHost = [enumerator nextObject])
-    {
-        NSString* regex = [[externalHost copy] autorelease];
-        BOOL is_ip = [self isIPv4Address:regex];
-        
-        // check for single wildcard '*', if found set allowAll to YES
-        if ([regex isEqualToString:@"*"]) {
-            self.allowAll = YES;
-            self.expandedWhitelist = [NSArray arrayWithObject:regex];
-            break;
-        }
-        
-        // starts with wildcard match - we make the first '.' optional (so '*.phonegap.com' will match 'phonegap.com')
-        NSString* prefix = @"*.";
-        if ([regex hasPrefix:prefix]) { 
-            // replace the first two characters '*.' with our regex
-            regex = [regex stringByReplacingCharactersInRange:NSMakeRange(0, [prefix length]) withString:@"(\\s{0}|*.)"]; // the '*' and '.' will be substituted later
-        }
-        
-        // ends with wildcard match for TLD
-        if (!is_ip && [regex hasSuffix:@".*"]) { 
-            // replace * with tld_match
-            regex = [regex stringByReplacingCharactersInRange:NSMakeRange([regex length]-1, 1) withString:tld_match];
-        }
-        // escape periods - since '.' means any character in regex
-        regex = [regex stringByReplacingOccurrencesOfString:@"." withString:@"\\."];
-        // wildcard is match 1 or more characters (to make it simple, since we are not doing verification whether the hostname is valid)
-        regex = [regex stringByReplacingOccurrencesOfString:@"*" withString:@".*"];  
-        
-        [expanded addObject:regex];
-    }
-    
-    self.expandedWhitelist = expanded;
-}
-
-- (BOOL) schemeIsAllowed:(NSString*)scheme
-{
-    return ([scheme isEqualToString:@"http"] || 
-            [scheme isEqualToString:@"https"] || 
-            [scheme isEqualToString:@"ftp"] || 
-            [scheme isEqualToString:@"ftps"] );
-}
-
-- (BOOL) URLIsAllowed:(NSURL*)url
-{
-    if (self.expandedWhitelist == nil) {
-        NSLog(@"ERROR: PGWhitelist was not initialized properly, all urls will be disallowed.");
-        return NO;
-    }
-    
-    if (self.allowAll) {
-        return YES;
-    }
-
-    // iterate through settings ExternalHosts, check for equality
-    NSEnumerator* enumerator = [self.expandedWhitelist  objectEnumerator];
-    id regex = nil;
-    NSString* urlHost = [url host];
-    
-    // if the url host IS found in the whitelist, load it in the app (however UIWebViewNavigationTypeOther kicks it out to Safari)
-    // if the url host IS NOT found in the whitelist, we do nothing
-    while (regex = [enumerator nextObject])
-    {
-        NSPredicate* regex_test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
-        
-        if ([regex_test evaluateWithObject:urlHost] == YES)
-        {
-            // if it matches at least one rule, return 
-            return YES;
-        }
-    }
-    
-    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:@"ERROR whitelist rejection: url='%@'", [url absoluteString]];
-}
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/PhoneGapDelegate.h
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/PhoneGapDelegate.h b/PhoneGapLib/Classes/PhoneGapDelegate.h
deleted file mode 100755
index 0476a25..0000000
--- a/PhoneGapLib/Classes/PhoneGapDelegate.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
- 
- http://www.apache.org/licenses/LICENSE-2.0
- 
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import <UIKit/UIKit.h>
-#import "JSONKit.h"
-#import "PGCommandDelegate.h"
-
-@class InvokedUrlCommand;
-@class PhoneGapViewController;
-@class Sound;
-@class Contacts;
-@class Console;
-@class PGWhitelist;
-
-__attribute__((deprecated)) @interface PhoneGapDelegate : NSObject <UIApplicationDelegate, UIWebViewDelegate, PGCommandDelegate>
-{
-}
-
-@property (nonatomic, readwrite, retain) IBOutlet UIWindow *window;
-@property (nonatomic, readwrite, retain) IBOutlet UIWebView *webView;
-@property (nonatomic, readonly, retain) IBOutlet PhoneGapViewController *viewController;
-@property (nonatomic, readonly, retain) IBOutlet UIActivityIndicatorView *activityView;
-@property (nonatomic, readonly, retain) UIImageView *imageView;
-@property (nonatomic, readonly, retain) NSMutableDictionary *pluginObjects;
-@property (nonatomic, readonly, retain) NSDictionary *pluginsMap;
-@property (nonatomic, readonly, retain) NSDictionary *settings;
-@property (nonatomic, readonly, retain) PGWhitelist* whitelist; // readonly for public
-
-+ (NSDictionary*)getBundlePlist:(NSString *)plistName;
-+ (NSString*) wwwFolderName;
-+ (NSString*) phoneGapVersion;
-+ (NSString*) applicationDocumentsDirectory;
-+ (NSString*) startPage;
-
-- (int)executeQueuedCommands;
-- (void)flushCommandQueue;
-
-- (void) javascriptAlert:(NSString*)text;
-- (NSString*) appURLScheme;
-- (NSDictionary*) deviceProperties;
-
-- (void)applicationDidEnterBackground:(UIApplication *)application;
-- (void)applicationWillEnterForeground:(UIApplication *)application;
-- (void)applicationWillResignActive:(UIApplication *)application;
-- (void)applicationWillTerminate:(UIApplication *)application;
-
-@end
-

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/PhoneGapDelegate.m
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/PhoneGapDelegate.m b/PhoneGapLib/Classes/PhoneGapDelegate.m
deleted file mode 100755
index bdd6d87..0000000
--- a/PhoneGapLib/Classes/PhoneGapDelegate.m
+++ /dev/null
@@ -1,953 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
- 
- http://www.apache.org/licenses/LICENSE-2.0
- 
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import <UIKit/UIKit.h>
-#import <CoreLocation/CoreLocation.h>
-
-#import "Location.h"
-#import "Sound.h"
-#import "DebugConsole.h"
-#import "Connection.h"
-
-#import "PGURLProtocol.h"
-#import "PGWhitelist.h"
-#import "InvokedUrlCommand.h"
-#import "PhoneGapDelegate.h"
-#import "PhoneGapViewController.h"
-#import "PGPlugin.h"
-#import "NSDictionary+LowercaseKeys.h"
-
-#define SYMBOL_TO_NSSTRING_HELPER(x) @#x
-#define SYMBOL_TO_NSSTRING(x) SYMBOL_TO_NSSTRING_HELPER(x)
-
-#define degreesToRadian(x) (M_PI * (x) / 180.0)
-
-// class extension
-@interface PhoneGapDelegate ()
-
-// readwrite access for self
-
-@property (nonatomic, readwrite, retain) IBOutlet PhoneGapViewController *viewController;
-@property (nonatomic, readwrite, retain) IBOutlet UIActivityIndicatorView *activityView;
-@property (nonatomic, readwrite, retain) UIImageView *imageView;
-@property (nonatomic, readwrite, retain) NSMutableDictionary *pluginObjects;
-@property (nonatomic, readwrite, retain) NSDictionary *pluginsMap;
-@property (nonatomic, readwrite, retain) NSDictionary *settings;
-@property (nonatomic, readwrite, retain) NSURL *invokedURL;
-@property (readwrite, assign) BOOL loadFromString;
-@property (readwrite, assign) UIInterfaceOrientation orientationType;
-
-@property (nonatomic, readwrite, retain) NSString *sessionKey; 
-@property (nonatomic, readwrite, retain) PGWhitelist* whitelist; 
-
-@end
-
-
-@implementation PhoneGapDelegate
-
-@synthesize window, webView, viewController, activityView, imageView;
-@synthesize settings, invokedURL, loadFromString, orientationType, sessionKey;
-@synthesize pluginObjects, pluginsMap, whitelist;
-
-- (id) init
-{
-    self = [super init];
-    if (self != nil) {
-        self.pluginObjects = [[[NSMutableDictionary alloc] initWithCapacity:4] autorelease];
-        self.imageView = nil;
-        
-        // Turn on cookie support ( shared with our app only! )
-        NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
-        [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
-        
-        // Create the sessionKey to use throughout the lifetime of the application
-        // to authenticate the source of the gap calls
-        self.sessionKey = [NSString stringWithFormat:@"%d", arc4random()];
-        
-        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedOrientationChange) name:UIDeviceOrientationDidChangeNotification
-                                                   object:nil];
-        
-        [PGURLProtocol registerPGHttpURLProtocol];
-    }
-    return self; 
-}
-
-+ (NSString*) applicationDocumentsDirectory {
-    
-    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
-    return basePath;
-}
-
-
-+ (NSString*) wwwFolderName
-{
-    return @"www";
-}
-
-+ (NSString*) startPage
-{
-    return @"index.html";
-}
-
-+ (BOOL) isIPad 
-{
-#ifdef UI_USER_INTERFACE_IDIOM
-    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad);
-#else
-    return NO;
-#endif
-}
-
-+ (NSString*) resolveImageResource:(NSString*)resource
-{
-    NSString* systemVersion = [[UIDevice currentDevice] systemVersion];
-    BOOL isLessThaniOS4 = ([systemVersion compare:@"4.0" options:NSNumericSearch] == NSOrderedAscending);
-    
-    // the iPad image (nor retina) differentiation code was not in 3.x, and we have to explicitly set the path
-    if (isLessThaniOS4)
-    {
-        if ([[self class] isIPad]) {
-            return [NSString stringWithFormat:@"%@~ipad.png", resource];
-        } else {
-            return [NSString stringWithFormat:@"%@.png", resource];
-        }
-    }
-    
-    return resource;
-}
-
-- (NSString*) pathForResource:(NSString*)resourcepath
-{
-    return [[self class] pathForResource:resourcepath];
-}
-
-+ (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 = [self wwwFolderName];
-    
-    if ([directoryPartsJoined length] > 0) {
-        directoryStr = [NSString stringWithFormat:@"%@/%@", [self wwwFolderName], [directoryParts componentsJoinedByString:@"/"]];
-    }
-    
-    return [mainBundle pathForResource:filename
-                       ofType:@""
-                       inDirectory:directoryStr];
-}
-
-/**
-Returns the current version of phoneGap as read from the VERSION file
-This only touches the filesystem once and stores the result in the class variable gapVersion
-*/
-static NSString *gapVersion;
-+ (NSString*) phoneGapVersion
-{
-#ifdef PG_VERSION
-    gapVersion = SYMBOL_TO_NSSTRING(PG_VERSION);
-#else
-
-    if (gapVersion == nil) {
-        NSBundle *mainBundle = [NSBundle mainBundle];
-        NSString *filename = [mainBundle pathForResource:@"VERSION" ofType:nil];
-        // read from the filesystem and save in the variable
-        // first, separate by new line
-        NSString* fileContents = [NSString stringWithContentsOfFile:filename encoding:NSUTF8StringEncoding error:NULL];
-        NSArray* all_lines = [fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
-        NSString* first_line = [all_lines objectAtIndex:0];        
-        
-        gapVersion = [first_line retain];
-    }
-#endif
-    
-    return gapVersion;
-}
-
-
-/**
- Returns an instance of a PhoneGapCommand object, based on its name.  If one exists already, it is returned.
- */
--(id) getCommandInstance:(NSString*)pluginName
-{
-    // first, we try to find the pluginName in the pluginsMap 
-    // (acts as a whitelist as well) if it does not exist, we return nil
-    // NOTE: plugin names are matched as lowercase to avoid problems - however, a 
-    // possible issue is there can be duplicates possible if you had:
-    // "com.phonegap.Foo" and "com.phonegap.foo" - only the lower-cased entry will match
-    NSString* className = [self.pluginsMap objectForKey:[pluginName lowercaseString]];
-    if (className == nil) {
-        return nil;
-    }
-    
-    id obj = [self.pluginObjects objectForKey:className];
-    if (!obj) 
-    {
-        // attempt to load the settings for this command class
-        NSDictionary* classSettings = [self.settings objectForKey:className];
-
-        if (classSettings) {
-            obj = [[NSClassFromString(className) alloc] initWithWebView:webView settings:classSettings];
-        } else {
-            obj = [[NSClassFromString(className) alloc] initWithWebView:webView];
-        }
-        
-        if ([obj isKindOfClass:[PGPlugin class]] && [obj respondsToSelector:@selector(setViewController:)]) { 
-            [obj setViewController:self.viewController];
-        }
-
-        if ([obj isKindOfClass:[PGPlugin class]] && [obj respondsToSelector:@selector(setCommandDelegate:)]) { 
-            [obj setCommandDelegate:self];
-        }
-
-        if (obj != nil) {
-            [self.pluginObjects setObject:obj forKey:className];
-            [obj release];
-        } else {
-            NSLog(@"PGPlugin class %@ (pluginName: %@) does not exist.", className, pluginName);
-        }
-    }
-    return obj;
-}
-
-- (NSArray*) parseInterfaceOrientations:(NSArray*)orientations
-{
-    NSMutableArray* result = [[[NSMutableArray alloc] init] autorelease];
-
-    if (orientations != nil) 
-    {
-        NSEnumerator* enumerator = [orientations objectEnumerator];
-        NSString* orientationString;
-        
-        while (orientationString = [enumerator nextObject]) 
-        {
-            if ([orientationString isEqualToString:@"UIInterfaceOrientationPortrait"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]];
-            } else if ([orientationString isEqualToString:@"UIInterfaceOrientationPortraitUpsideDown"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortraitUpsideDown]];
-            } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeLeft"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]];
-            } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeRight"]) {
-                [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]];
-            }
-        }
-    }
-    
-    // default
-    if ([result count] == 0) {
-        [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]];
-    }
-    
-    return result;
-}
-
-- (void) showSplashScreen
-{
-    NSString* launchImageFile = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UILaunchImageFile"];
-    if (launchImageFile == nil) { // fallback if no launch image was specified
-        launchImageFile = @"Default"; 
-    }
-    
-    NSString* orientedLaunchImageFile = nil;    
-    CGAffineTransform startupImageTransform = CGAffineTransformIdentity;
-    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
-    CGRect screenBounds = [[UIScreen mainScreen] bounds];
-    UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation;
-    BOOL isIPad = [[self class] isIPad];
-    UIImage* launchImage = nil;
-    
-    if (isIPad)
-    {
-        if (!UIDeviceOrientationIsValidInterfaceOrientation(deviceOrientation)) {
-            deviceOrientation = (UIDeviceOrientation)statusBarOrientation;
-        }
-        
-        switch (deviceOrientation) 
-        {
-            case UIDeviceOrientationLandscapeLeft: // this is where the home button is on the right (yeah, I know, confusing)
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Landscape", launchImageFile];
-                startupImageTransform = CGAffineTransformMakeRotation(degreesToRadian(90));
-            }
-                break;
-            case UIDeviceOrientationLandscapeRight: // this is where the home button is on the left (yeah, I know, confusing)
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Landscape", launchImageFile];
-                startupImageTransform = CGAffineTransformMakeRotation(degreesToRadian(-90));
-            } 
-                break;
-            case UIDeviceOrientationPortraitUpsideDown:
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Portrait", launchImageFile];
-                startupImageTransform = CGAffineTransformMakeRotation(degreesToRadian(180));
-            } 
-                break;
-            case UIDeviceOrientationPortrait:
-            default:
-            {
-                orientedLaunchImageFile = [NSString stringWithFormat:@"%@-Portrait", launchImageFile];
-                startupImageTransform = CGAffineTransformIdentity;
-            }
-                break;
-        }
-        
-        launchImage = [UIImage imageNamed:[[self class] resolveImageResource:orientedLaunchImageFile]];
-    }
-    else // not iPad
-    {
-        orientedLaunchImageFile = @"Default";
-        launchImage = [UIImage imageNamed:[[self class] resolveImageResource:orientedLaunchImageFile]];
-    }
-    
-    if (launchImage == nil) {
-        NSLog(@"WARNING: Splash-screen image '%@' was not found. Orientation: %d, iPad: %d", orientedLaunchImageFile, deviceOrientation, isIPad);
-    }
-    
-    self.imageView = [[[UIImageView alloc] initWithImage:launchImage] autorelease];    
-    self.imageView.tag = 1;
-    self.imageView.center = CGPointMake((screenBounds.size.width / 2), (screenBounds.size.height / 2));
-    
-    self.imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth & UIViewAutoresizingFlexibleHeight & UIViewAutoresizingFlexibleLeftMargin & UIViewAutoresizingFlexibleRightMargin);    
-    [self.imageView setTransform:startupImageTransform];
-    [self.window addSubview:self.imageView];
-    
-    
-    /*
-     * The Activity View is the top spinning throbber in the status/battery bar. We init it with the default Grey Style.
-     *
-     *     whiteLarge = UIActivityIndicatorViewStyleWhiteLarge
-     *     white      = UIActivityIndicatorViewStyleWhite
-     *     gray       = UIActivityIndicatorViewStyleGray
-     *
-     */
-    NSString *topActivityIndicator = [self.settings objectForKey:@"TopActivityIndicator"];
-    UIActivityIndicatorViewStyle topActivityIndicatorStyle = UIActivityIndicatorViewStyleGray;
-    
-    if ([topActivityIndicator isEqualToString:@"whiteLarge"]) {
-        topActivityIndicatorStyle = UIActivityIndicatorViewStyleWhiteLarge;
-    } else if ([topActivityIndicator isEqualToString:@"white"]) {
-        topActivityIndicatorStyle = UIActivityIndicatorViewStyleWhite;
-    } else if ([topActivityIndicator isEqualToString:@"gray"]) {
-        topActivityIndicatorStyle = UIActivityIndicatorViewStyleGray;
-    }
-    
-    self.activityView = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:topActivityIndicatorStyle] autorelease];
-    self.activityView.tag = 2;
-
-    id showSplashScreenSpinnerValue = [self.settings objectForKey:@"ShowSplashScreenSpinner"];
-    // backwards compatibility - if key is missing, default to true
-    if (showSplashScreenSpinnerValue == nil || [showSplashScreenSpinnerValue boolValue]) {
-        [self.window addSubview:self.activityView];
-    }
-    
-    self.activityView.center = self.viewController.view.center;
-    [self.activityView startAnimating];
-    
-    
-    [self.window layoutSubviews];//asking window to do layout AFTER imageView is created refer to line: 250     self.window.autoresizesSubviews = YES;
-}    
-
-BOOL gSplashScreenShown_ = NO;
-- (void) receivedOrientationChange
-{
-    if (self.imageView == nil) {
-        gSplashScreenShown_ = YES;
-        [self showSplashScreen];
-    }
-}
-
-/**
- * This is main kick off after the app inits, the views and Settings are setup here.
- */
-// - (void)applicationDidFinishLaunching:(UIApplication *)application
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-{    
-    // read from UISupportedInterfaceOrientations (or UISupportedInterfaceOrientations~iPad, if its iPad) from -Info.plist
-    NSArray* supportedOrientations = [self parseInterfaceOrientations:
-                                               [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"]];
-    
-    // read from PhoneGap.plist in the app bundle
-    NSString* appPlistName = @"PhoneGap";
-    NSDictionary* phonegapPlist = [[self class] getBundlePlist:appPlistName];
-    if (phonegapPlist == nil) {
-        NSLog(@"WARNING: %@.plist is missing.", appPlistName);
-        return NO;
-    }
-    self.settings = [[[NSDictionary alloc] initWithDictionary:phonegapPlist] autorelease];
-
-    // read from Plugins dict in PhoneGap.plist in the app bundle
-    NSString* pluginsKey = @"Plugins";
-    NSDictionary* pluginsDict = [self.settings objectForKey:@"Plugins"];
-    if (pluginsDict == nil) {
-        NSLog(@"WARNING: %@ key in %@.plist is missing! PhoneGap will not work, you need to have this key.", pluginsKey, appPlistName);
-        return NO;
-    }
-    
-    // set the whitelist
-    self.whitelist = [[[PGWhitelist alloc] initWithArray:[self.settings objectForKey:@"ExternalHosts"]] autorelease];
-    
-    self.pluginsMap = [pluginsDict dictionaryWithLowercaseKeys];
-    
-    self.viewController = [[[PhoneGapViewController alloc] init] autorelease];
-    
-    NSNumber *enableLocation       = [self.settings objectForKey:@"EnableLocation"];
-    NSString *enableViewportScale  = [self.settings objectForKey:@"EnableViewportScale"];
-    NSNumber *allowInlineMediaPlayback = [self.settings objectForKey:@"AllowInlineMediaPlayback"];
-    BOOL mediaPlaybackRequiresUserAction = YES;  // default value
-    if ([self.settings objectForKey:@"MediaPlaybackRequiresUserAction"]) {
-        mediaPlaybackRequiresUserAction = [(NSNumber*)[self.settings objectForKey:@"MediaPlaybackRequiresUserAction"] boolValue];
-    }
-    
-    
-    // Set the supported orientations for rotation. If number of items in the array is > 1, autorotate is supported
-    viewController.supportedOrientations = supportedOrientations;
-    
-    //check whether the current orientation is supported: if it is, keep it, rather than forcing a rotation
-    BOOL forceStartupRotation = YES;
-    UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation];
-
-    if (UIDeviceOrientationUnknown == curDevOrientation) {
-        //UIDevice isn't firing orientation notifications yet...go look at status bar
-        curDevOrientation = (UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation];
-    }
-
-    if (UIDeviceOrientationIsValidInterfaceOrientation(curDevOrientation)) {
-        for (NSNumber *orient in supportedOrientations) {
-            if ([orient intValue] == curDevOrientation) {
-                forceStartupRotation = NO;
-                break;
-            }
-        }
-    } 
-    
-    if (forceStartupRotation) {
-        NSLog(@"supportedOrientations: %@",supportedOrientations);
-        // The first item in the supportedOrientations array is the start orientation (guaranteed to be at least Portrait)
-        UIInterfaceOrientation newOrient = [[supportedOrientations objectAtIndex:0] intValue];
-        NSLog(@"PhoneGapDelegate forcing status bar to: %d from: %d",newOrient,curDevOrientation);
-        [[UIApplication sharedApplication] setStatusBarOrientation:newOrient];
-    }
-    
-    CGRect screenBounds = [ [ UIScreen mainScreen ] bounds ];
-    self.window = [ [ [ UIWindow alloc ] initWithFrame:screenBounds ] autorelease ];
-
-
-    self.window.autoresizesSubviews = YES;
-    CGRect webViewBounds = [ [ UIScreen mainScreen ] applicationFrame ] ;
-    webViewBounds.origin = screenBounds.origin;
-    if (!self.webView) {
-        self.webView = [[ [ UIWebView alloc ] initWithFrame:webViewBounds] autorelease];
-    }
-    self.webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
-    self.webView.scalesPageToFit = [enableViewportScale boolValue];
-    
-    viewController.webView = self.webView;
-    [self.viewController.view addSubview:self.webView];
-    
-        
-    /*
-     * Fire up the GPS Service right away as it takes a moment for data to come back.
-     */
-    
-    if ([enableLocation boolValue]) {
-        [[self getCommandInstance:@"com.phonegap.geolocation"] startLocation:nil withDict:nil];
-    }
-    
-    /*
-     * This is for iOS 4.x, where you can allow inline <video> and <audio>, and also autoplay them
-     */
-    if ([allowInlineMediaPlayback boolValue] && [self.webView respondsToSelector:@selector(allowsInlineMediaPlayback)]) {
-        self.webView.allowsInlineMediaPlayback = YES;
-    }
-    if (mediaPlaybackRequiresUserAction == NO && [self.webView respondsToSelector:@selector(mediaPlaybackRequiresUserAction)]) {
-        self.webView.mediaPlaybackRequiresUserAction = NO;
-    }
-
-    self.webView.delegate = self;
-
-    [self.window addSubview:self.viewController.view];
-
-    /*
-     * webView
-     * This is where we define the inital instance of the browser (WebKit) and give it a starting url/file.
-     */
-    
-    NSString* startPage = [[self class] startPage];
-    NSURL *appURL = [NSURL URLWithString:startPage];
-    NSString* loadErr = nil;
-    
-    if(![appURL scheme])
-    {
-        NSString* startFilePath = [[self class] pathForResource:startPage];
-        if (startFilePath == nil)
-        {
-            loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", [[self class] wwwFolderName], startPage];
-            NSLog(@"%@", loadErr);
-            appURL = nil;
-        }
-        else {
-            appURL = [NSURL fileURLWithPath:startFilePath];
-        }
-    }
-    
-    if (!loadErr) {
-        NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
-        [self.webView loadRequest:appReq];
-    } else {
-        NSString* html = [NSString stringWithFormat:@"<html><body> %@ </body></html>", loadErr];
-        [self.webView loadHTMLString:html baseURL:nil];
-        self.loadFromString = YES;
-    }
-
-    [self.window makeKeyAndVisible];
-    
-    if (self.loadFromString) {
-        self.imageView.hidden = YES;
-    }
-    
-    return YES;
-}
-
-/**
- When web application loads Add stuff to the DOM, mainly the user-defined settings from the Settings.plist file, and
- the device's data such as device ID, platform version, etc.
- */
-- (void)webViewDidStartLoad:(UIWebView *)theWebView 
-{
-    
-}
-
-- (NSDictionary*) deviceProperties
-{
-    UIDevice *device = [UIDevice currentDevice];
-    NSMutableDictionary *devProps = [NSMutableDictionary dictionaryWithCapacity:4];
-    [devProps setObject:[device model] forKey:@"platform"];
-    [devProps setObject:[device systemVersion] forKey:@"version"];
-    [devProps setObject:[device uniqueIdentifier] forKey:@"uuid"];
-    [devProps setObject:[device name] forKey:@"name"];
-    [devProps setObject:[[self class] phoneGapVersion ] forKey:@"gap"];
-    
-    id cmd = [self getCommandInstance:@"com.phonegap.connection"];
-    if (cmd && [cmd isKindOfClass:[PGConnection class]]) 
-    {
-        NSMutableDictionary *connProps = [NSMutableDictionary dictionaryWithCapacity:3];
-        if ([cmd respondsToSelector:@selector(connectionType)]) {
-            [connProps setObject:[cmd connectionType] forKey:@"type"];
-        }
-        [devProps setObject:connProps forKey:@"connection"];
-    }
-    
-    NSDictionary *devReturn = [NSDictionary dictionaryWithDictionary:devProps];
-    return devReturn;
-}
-
-- (NSString*) appURLScheme
-{
-    NSString* URLScheme = nil;
-    
-    NSArray *URLTypes = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"];
-    if(URLTypes != nil ) {
-        NSDictionary* dict = [URLTypes objectAtIndex:0];
-        if(dict != nil ) {
-            NSArray* URLSchemes = [dict objectForKey:@"CFBundleURLSchemes"];
-            if( URLSchemes != nil ) {    
-                URLScheme = [URLSchemes objectAtIndex:0];
-            }
-        }
-    }
-    
-    return URLScheme;
-}
-
-- (void) javascriptAlert:(NSString*)text
-{
-    NSString* jsString = [NSString stringWithFormat:@"alert('%@');", text];
-    [webView stringByEvaluatingJavaScriptFromString:jsString];
-}
-
-/**
- Returns the contents of the named plist bundle, loaded as a dictionary object
- */
-+ (NSDictionary*)getBundlePlist:(NSString *)plistName
-{
-    NSString *errorDesc = nil;
-    NSPropertyListFormat format;
-    NSString *plistPath = [[NSBundle mainBundle] pathForResource:plistName ofType:@"plist"];
-    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
-    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization
-                                          propertyListFromData:plistXML
-                                          mutabilityOption:NSPropertyListMutableContainersAndLeaves              
-                                          format:&format errorDescription:&errorDesc];
-    return temp;
-}
-
-/**
- Called when the webview finishes loading.  This stops the activity view and closes the imageview
- */
-- (void)webViewDidFinishLoad:(UIWebView *)theWebView 
-{
-
-    // Share session key with the WebView by setting PhoneGap.sessionKey
-    NSString *sessionKeyScript = [NSString stringWithFormat:@"PhoneGap.sessionKey = \"%@\";", self.sessionKey];
-    [theWebView stringByEvaluatingJavaScriptFromString:sessionKeyScript];
-
-    
-    NSDictionary *deviceProperties = [ self deviceProperties];
-    NSMutableString *result = [[NSMutableString alloc] initWithFormat:@"DeviceInfo = %@;", [deviceProperties JSONString]];
-    
-    /* Settings.plist
-     * Read the optional Settings.plist file and push these user-defined settings down into the web application.
-     * This can be useful for supplying build-time configuration variables down to the app to change its behaviour,
-     * such as specifying Full / Lite version, or localization (English vs German, for instance).
-     */
-    
-    NSDictionary *temp = [[self class] getBundlePlist:@"Settings"];
-    if ([temp respondsToSelector:@selector(JSONString)]) {
-        [result appendFormat:@"\nwindow.Settings = %@;", [temp JSONString]];
-    }
-    
-    NSLog(@"Device initialization: %@", result);
-    [theWebView stringByEvaluatingJavaScriptFromString:result];
-    [result release];
-    
-    /*
-     * Hide the Top Activity THROBBER in the Battery Bar
-     */
-    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
-
-    id autoHideSplashScreenValue = [self.settings objectForKey:@"AutoHideSplashScreen"];
-    // if value is missing, default to yes
-    if (autoHideSplashScreenValue == nil || [autoHideSplashScreenValue boolValue]) {
-        self.imageView.hidden = YES;
-        self.activityView.hidden = YES;    
-        [self.window bringSubviewToFront:self.viewController.view];
-    }
-    
-    [self.viewController didRotateFromInterfaceOrientation:(UIInterfaceOrientation)[[UIDevice currentDevice] orientation]];
-}
-
-
-/**
- * Fail Loading With Error
- * Error - If the webpage failed to load display an error with the reason.
- *
- */
-- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
-    NSLog(@"Failed to load webpage with error: %@", [error localizedDescription]);
-    /*
-    if ([error code] != NSURLErrorCancelled)
-        alert([error localizedDescription]);
-     */
-}
-
-/**
- * Fetches the command queue and executes each command. It is possible that the
- * queue will not be empty after this function has completed since the executed
- * commands may have run callbacks which queued more commands.
- *
- * Returns the number of executed commands.
- */
-- (int)executeQueuedCommands
-{
-    // Grab all the queued commands from the JS side.
-    NSString* queuedCommandsJSON =
-        [self.webView stringByEvaluatingJavaScriptFromString:
-        @"PhoneGap.getAndClearQueuedCommands()"];
-
-    // Parse the returned JSON array.
-    //PG_SBJsonParser* jsonParser = [[[PG_SBJsonParser alloc] init] autorelease];
-    NSArray* queuedCommands =
-        [queuedCommandsJSON objectFromJSONString];
-
-    // Iterate over and execute all of the commands.
-    for (NSString* commandJson in queuedCommands) {
-        [self execute:
-            [InvokedUrlCommand commandFromObject:
-                [commandJson mutableObjectFromJSONString]]];
-    }
-
-    return [queuedCommands count];
-}
-
-/**
- * Repeatedly fetches and executes the command queue until it is empty.
- */
-- (void)flushCommandQueue
-{
-    [self.webView stringByEvaluatingJavaScriptFromString:
-        @"PhoneGap.commandQueueFlushing = true"];
-
-    // Keep executing the command queue until no commands get executed.
-    // This ensures that commands that are queued while executing other
-    // commands are executed as well.
-    int numExecutedCommands = 0;
-    do {
-        numExecutedCommands = [self executeQueuedCommands];
-    } while (numExecutedCommands != 0);
-
-    [self.webView stringByEvaluatingJavaScriptFromString:
-        @"PhoneGap.commandQueueFlushing = false"];
-}
-
-/**
- * Start Loading Request
- * This is where most of the magic happens... We take the request(s) and process the response.
- * From here we can re direct links and other protocalls to different internal methods.
- *
- */
-- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
-{
-    NSURL *url = [request URL];
-    
-    /*
-     * Execute any commands queued with PhoneGap.exec() on the JS side.
-     * The part of the URL after gap:// is irrelevant.
-     */
-     if ([[url scheme] isEqualToString:@"gap"]) {
-        [self flushCommandQueue];
-        return NO;
-     }
-    /*
-     * If a URL is being loaded that's a file/http/https URL, just load it internally
-     */
-    else if ([url isFileURL])
-    {
-        return YES;
-    }
-    else if ([self.whitelist schemeIsAllowed:[url scheme]])
-    {            
-        if ([self.whitelist URLIsAllowed:url] == YES)
-        {
-            NSNumber *openAllInWhitelistSetting = [self.settings objectForKey:@"OpenAllWhitelistURLsInWebView"];
-            if ((nil != openAllInWhitelistSetting) && [openAllInWhitelistSetting boolValue]) {
-                NSLog(@"OpenAllWhitelistURLsInWebView set: opening in webview");
-                return YES;
-            }
-
-            // mainDocument will be nil for an iFrame
-            NSString* mainDocument = [webView.request.mainDocumentURL absoluteString];
-
-            // anchor target="_blank" - load in Mobile Safari
-            if (navigationType == UIWebViewNavigationTypeOther && mainDocument != nil)
-            {
-                [[UIApplication sharedApplication] openURL:url];
-                return NO;
-            }
-            // other anchor target - load in PhoneGap webView
-            else
-            {
-                return YES;
-            }
-        }
-        
-        return NO;
-    }
-    /*
-     *    If we loaded the HTML from a string, we let the app handle it
-     */
-    else if (self.loadFromString == YES)
-    {
-        self.loadFromString = NO;
-        return YES;
-    }
-    /*
-     * all tel: scheme urls we let the UIWebview handle it using the default behaviour
-     */
-    else if ([[url scheme] isEqualToString:@"tel"])
-    {
-        return YES;
-    }
-    /*
-     * all about: scheme urls are not handled
-     */
-    else if ([[url scheme] isEqualToString:@"about"])
-    {
-        return NO;
-    }
-    /*
-     * We don't have a PhoneGap or web/local request, load it in the main Safari browser.
-     * pass this to the application to handle.  Could be a mailto:dude@duderanch.com or a tel:55555555 or sms:55555555 facetime:55555555
-     */
-    else
-    {
-        NSLog(@"PhoneGapDelegate::shouldStartLoadWithRequest: Received Unhandled URL %@", url);
-
-        if ([[UIApplication sharedApplication] canOpenURL:url]) {
-            [[UIApplication sharedApplication] openURL:url];
-        } else { // handle any custom schemes to plugins
-            [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:PGPluginHandleOpenURLNotification object:url]];
-        }
-
-        return NO;
-    }
-    
-    return YES;
-}
-
-- (BOOL) execute:(InvokedUrlCommand*)command
-{
-    if (command.className == nil || command.methodName == nil) {
-        return NO;
-    }
-    
-    // Fetch an instance of this class
-    PGPlugin* obj = [self getCommandInstance:command.className];
-    
-    if (!([obj isKindOfClass:[PGPlugin class]])) { // still allow deprecated class, until 1.0 release
-        NSLog(@"ERROR: Plugin '%@' not found, or is not a PGPlugin. Check your plugin mapping in PhoneGap.plist.", command.className);
-        return NO;
-    }
-    BOOL retVal = YES;
-    
-    // construct the fill method name to ammend the second argument.
-    NSString* fullMethodName = [[NSString alloc] initWithFormat:@"%@:withDict:", command.methodName];
-    if ([obj respondsToSelector:NSSelectorFromString(fullMethodName)]) {
-        [obj performSelector:NSSelectorFromString(fullMethodName) withObject:command.arguments withObject:command.options];
-    } else {
-        // There's no method to call, so throw an error.
-        NSLog(@"ERROR: Method '%@' not defined in Plugin '%@'", fullMethodName, command.className);
-        retVal = NO;
-    }
-    [fullMethodName release];
-    
-    return retVal;
-}
-
-/*
- This method lets your application know that it is about to be terminated and purged from memory entirely
-*/
-- (void)applicationWillTerminate:(UIApplication *)application
-{
-
-    NSLog(@"applicationWillTerminate");
-    
-    // empty the tmp directory
-    NSFileManager* fileMgr = [[NSFileManager alloc] init];
-    NSError* err = nil;    
-
-    // clear contents of NSTemporaryDirectory 
-    NSString* tempDirectoryPath = NSTemporaryDirectory();
-    NSDirectoryEnumerator* directoryEnumerator = [fileMgr enumeratorAtPath:tempDirectoryPath];    
-    NSString* fileName = nil;
-    BOOL result;
-    
-    while ((fileName = [directoryEnumerator nextObject])) {
-        NSString* filePath = [tempDirectoryPath stringByAppendingPathComponent:fileName];
-        result = [fileMgr removeItemAtPath:filePath error:&err];
-        if (!result && err) {
-            NSLog(@"Failed to delete: %@ (error: %@)", filePath, err);
-        }
-    }    
-    [fileMgr release];
-}
-
-/*
- This method is called to let your application know that it is about to move from the active to inactive state.
- You should use this method to pause ongoing tasks, disable timer, ...
-*/
-- (void)applicationWillResignActive:(UIApplication *)application
-{
-    //NSLog(@"%@",@"applicationWillResignActive");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('resign');"];
-}
-
-/*
- In iOS 4.0 and later, this method is called as part of the transition from the background to the inactive state. 
- You can use this method to undo many of the changes you made to your application upon entering the background.
- invariably followed by applicationDidBecomeActive
-*/
-- (void)applicationWillEnterForeground:(UIApplication *)application
-{
-    //NSLog(@"%@",@"applicationWillEnterForeground");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('resume');"];
-}
-
-// This method is called to let your application know that it moved from the inactive to active state. 
-- (void)applicationDidBecomeActive:(UIApplication *)application
-{
-    //NSLog(@"%@",@"applicationDidBecomeActive");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('active');"];
-}
-
-/*
- In iOS 4.0 and later, this method is called instead of the applicationWillTerminate: method 
- when the user quits an application that supports background execution.
- */
-- (void)applicationDidEnterBackground:(UIApplication *)application
-{
-    //NSLog(@"%@",@"applicationDidEnterBackground");
-    [self.webView stringByEvaluatingJavaScriptFromString:@"PhoneGap.fireDocumentEvent('pause');"];
-}
-
-
-/*
- Determine the URL passed to this application.
- Described in http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html
-*/
-- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
-{
-    if (!url) { 
-        return NO; 
-    }
-
-    // Do something with the url here
-    NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", url];
-    [self.webView stringByEvaluatingJavaScriptFromString:jsString];
-    
-    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:PGPluginHandleOpenURLNotification object:url]];
-    
-    return YES;
-}
-
-- (void)dealloc
-{
-    [PluginResult releaseStatus];
-    self.pluginObjects = nil;
-    self.pluginsMap    = nil;
-    self.viewController = nil;
-    self.activityView = nil;
-    self.window = nil;
-    self.imageView = nil;
-    self.whitelist = nil;
-    
-    [super dealloc];
-}
-
-@end
-
-@implementation NSDictionary (LowercaseKeys)
-
-- (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

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/PhoneGapViewController.h
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/PhoneGapViewController.h b/PhoneGapLib/Classes/PhoneGapViewController.h
deleted file mode 100755
index 5e3a592..0000000
--- a/PhoneGapLib/Classes/PhoneGapViewController.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
- 
- http://www.apache.org/licenses/LICENSE-2.0
- 
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-
-#import <UIKit/UIKit.h>
-#import <Foundation/Foundation.h>
-
-__attribute__((deprecated)) @interface PhoneGapViewController : UIViewController {
-}
-
-@property (nonatomic, retain) 	NSArray* supportedOrientations;
-@property (nonatomic, retain)	UIWebView* webView;
-
-
-@end


Mime
View raw message