You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by sh...@apache.org on 2012/02/17 02:38:49 UTC

[18/27] Rename PhoneGap to Cordova.

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/Contacts.m
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/Contacts.m b/PhoneGapLib/Classes/Contacts.m
deleted file mode 100755
index ab68929..0000000
--- a/PhoneGapLib/Classes/Contacts.m
+++ /dev/null
@@ -1,511 +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 "Contacts.h"
-#import <UIKit/UIKit.h>
-#import "Categories.h"
-#import "Notification.h"
-
-
-@implementation ContactsPicker
-
-@synthesize allowsEditing;
-@synthesize callbackId;
-@synthesize selectedId;
-
-@end
-@implementation NewContactsController
-
-@synthesize callbackId;
-
-@end
-
-@implementation PGContacts
-
-// no longer used since code gets AddressBook for each operation. 
-// If address book changes during save or remove operation, may get error but not much we can do about it
-// If address book changes during UI creation, display or edit, we don't control any saves so no need for callback
-/*void addressBookChanged(ABAddressBookRef addressBook, CFDictionaryRef info, void* context)
-{
-	// note that this function is only called when another AddressBook instance modifies 
-	// the address book, not the current one. For example, through an OTA MobileMe sync
-	Contacts* contacts = (Contacts*)context;
-	[contacts addressBookDirty];
-}*/
-
--(PGPlugin*) initWithWebView:(UIWebView*)theWebView
-{
-    self = (PGContacts*)[super initWithWebView:(UIWebView*)theWebView];
-    /*if (self) {
-		addressBook = ABAddressBookCreate();
-		ABAddressBookRegisterExternalChangeCallback(addressBook, addressBookChanged, self);
-    }*/
-	
-	return self;
-}
-
-
-// overridden to clean up Contact statics
--(void)onAppTerminate
-{
-	//NSLog(@"Contacts::onAppTerminate");
-	[PGContact releaseDefaults];
-}
-
-
-// iPhone only method to create a new contact through the GUI
-- (void) newContact:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-{	
-	NSString* callbackId = [arguments objectAtIndex:0];
-
-	NewContactsController* npController = [[[NewContactsController alloc] init] autorelease];
-	
-	ABAddressBookRef ab = ABAddressBookCreate();
-	npController.addressBook = ab; // a CF retaining assign
-    CFRelease(ab);
-    
-	npController.newPersonViewDelegate = self;
-	npController.callbackId = callbackId;
-
-	UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:npController] autorelease];
-    
-    if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) {
-        [self.viewController presentViewController:navController animated:YES completion:nil];        
-    } else {
-        [self.viewController presentModalViewController:navController animated:YES ];
-    }              
-}
-
-- (void) newPersonViewController:(ABNewPersonViewController*)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person
-{
-
-	ABRecordID recordId = kABRecordInvalidID;
-	NewContactsController* newCP = (NewContactsController*) newPersonViewController;
-	NSString* callbackId = newCP.callbackId;
-	
-	if (person != NULL) {
-			//return the contact id
-			recordId = ABRecordGetRecordID(person);
-	}
-
-    if ([newPersonViewController respondsToSelector:@selector(presentingViewController)]) { 
-        [[newPersonViewController presentingViewController] dismissViewControllerAnimated:YES completion:nil];
-    } else {
-        [[newPersonViewController parentViewController] dismissModalViewControllerAnimated:YES];
-    }        
-    
-	PluginResult* result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt:  recordId];
-	//jsString = [NSString stringWithFormat: @"%@(%d);", newCP.jsCallback, recordId];
-	[self writeJavascript: [result toSuccessCallbackString:callbackId]];
-	
-}
-
-- (void) displayContact:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	ABRecordID recordID = kABRecordInvalidID;
-	NSString* callbackId = [arguments objectAtIndex:0];
-	
-	recordID = [[arguments objectAtIndex:1] intValue];
-
-		
-	
-	bool bEdit = [options isKindOfClass:[NSNull class]] ? false : [options existsValue:@"true" forKey:@"allowsEditing"];
-	ABAddressBookRef addrBook = ABAddressBookCreate();	
-	ABRecordRef rec = ABAddressBookGetPersonWithRecordID(addrBook, recordID);
-	if (rec) {
-		DisplayContactViewController* personController = [[[DisplayContactViewController alloc] init] autorelease];
-		personController.displayedPerson = rec;
-		personController.personViewDelegate = self;
-		personController.allowsEditing = NO;
-		
-        // create this so DisplayContactViewController will have a "back" button.
-        UIViewController* parentController = [[[UIViewController alloc] init] autorelease];
-        UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:parentController] autorelease];
-
-        [navController pushViewController:personController animated:YES];
-
-        if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) {
-            [self.viewController presentViewController:navController animated:YES completion:nil];        
-        } else {
-            [self.viewController presentModalViewController:navController animated:YES ];
-        }              
-
-		if (bEdit) {
-            // create the editing controller and push it onto the stack
-            ABPersonViewController* editPersonController = [[[ABPersonViewController alloc] init] autorelease];
-            editPersonController.displayedPerson = rec;
-            editPersonController.personViewDelegate = self;
-            editPersonController.allowsEditing = YES; 
-            [navController pushViewController:editPersonController animated:YES];
-        }
-	} 
-	else 
-	{
-		// no record, return error
-		PluginResult* result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt:  UNKNOWN_ERROR];
-		[self writeJavascript:[result toErrorCallbackString:callbackId]];
-		
-	}
-	CFRelease(addrBook);
-}
-								   
-- (BOOL) personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person 
-					 property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue
-{
-	return YES;
-}
-	
-- (void) chooseContact:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments objectAtIndex:0];
-	
-	ContactsPicker* pickerController = [[[ContactsPicker alloc] init] autorelease];
-	pickerController.peoplePickerDelegate = self;
-	pickerController.callbackId = callbackId;
-	pickerController.selectedId = kABRecordInvalidID;
-	pickerController.allowsEditing = (BOOL)[options existsValue:@"true" forKey:@"allowsEditing"];
-	
-    if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) {
-        [self.viewController presentViewController:pickerController animated:YES completion:nil];        
-    } else {
-        [self.viewController presentModalViewController:pickerController animated:YES ];
-    }              
-}
-
-- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker 
-	     shouldContinueAfterSelectingPerson:(ABRecordRef)person
-{
-	
-	ContactsPicker* picker = (ContactsPicker*)peoplePicker;
-	ABRecordID contactId = ABRecordGetRecordID(person);
-	picker.selectedId = contactId; // save so can return when dismiss
-
-	
-	if (picker.allowsEditing) {
-		
-		ABPersonViewController* personController = [[[ABPersonViewController alloc] init] autorelease];
-		personController.displayedPerson = person;
-		personController.personViewDelegate = self;
-		personController.allowsEditing = picker.allowsEditing;
-		
-		
-		[peoplePicker pushViewController:personController animated:YES];
-	} else {
-		// return the contact Id
-		PluginResult* result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: contactId];
-		[self writeJavascript:[result toSuccessCallbackString: picker.callbackId]];
-		
-        if ([picker respondsToSelector:@selector(presentingViewController)]) { 
-            [[picker presentingViewController] dismissViewControllerAnimated:YES completion:nil];
-        } else {
-            [[picker parentViewController] dismissModalViewControllerAnimated:YES];
-        }        
-	}
-	return NO;
-}
-
-- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker 
-	     shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
-{
-	return YES;
-}
-
-- (void) peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
-{
-	// return contactId or invalid if none picked
-	ContactsPicker* picker = (ContactsPicker*)peoplePicker;
-	PluginResult* result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: picker.selectedId];
-	[self writeJavascript:[result toSuccessCallbackString:picker.callbackId]];
-	
-    if ([peoplePicker respondsToSelector:@selector(presentingViewController)]) { 
-        [[peoplePicker presentingViewController] dismissViewControllerAnimated:YES completion:nil];
-    } else {
-        [[peoplePicker parentViewController] dismissModalViewControllerAnimated:YES];
-    }        
-}
-
-- (void) search:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* jsString = nil;
-	NSString* callbackId = [arguments objectAtIndex:0];
-	
-	
-	NSArray* fields = [options valueForKey:@"fields"];
-	NSDictionary* findOptions = [options valueForKey:@"findOptions"];
-	
-	ABAddressBookRef  addrBook = nil;
-	NSArray* foundRecords = nil;
-	
-
-	addrBook = ABAddressBookCreate();
-	// get the findOptions values
-	BOOL multiple = NO; // default is false
-	NSString* filter = nil;
-	if (![findOptions isKindOfClass:[NSNull class]]){
-		id value = nil;
-		filter = (NSString*)[findOptions objectForKey:@"filter"];
-		value = [findOptions objectForKey:@"multiple"];
-		if ([value isKindOfClass:[NSNumber class]]){
-			// multiple is a boolean that will come through as an NSNumber
-			multiple = [(NSNumber*)value boolValue];
-			//NSLog(@"multiple is: %d", multiple);
-		}
-	}
-
-	NSDictionary* returnFields = [[PGContact class] calcReturnFields: fields];
-	
-	NSMutableArray* matches = nil;
-	if (!filter || [filter isEqualToString:@""]){ 
-		// get all records 
-		foundRecords = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook);
-		if (foundRecords && [foundRecords count] > 0){
-			// create Contacts and put into matches array
-            // doesn't make sense to ask for all records when multiple == NO but better check
-			int xferCount = multiple == YES ? [foundRecords count] : 1;
-			matches = [NSMutableArray arrayWithCapacity:xferCount];
-			for(int k = 0; k<xferCount; k++){
-				PGContact* xferContact = [[[PGContact alloc] initFromABRecord:(ABRecordRef)[foundRecords objectAtIndex:k]] autorelease];
-				[matches addObject:xferContact];
-				xferContact = nil;
-				
-			}
-		}
-	} else {
-		foundRecords = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addrBook);
-		matches = [NSMutableArray arrayWithCapacity:1];
-		BOOL bFound = NO;
-		int testCount = [foundRecords count];
-		for(int j=0; j<testCount; j++){
-			PGContact* testContact = [[[PGContact alloc] initFromABRecord: (ABRecordRef)[foundRecords objectAtIndex:j]] autorelease];
-			if (testContact){
-				bFound = [testContact foundValue:filter inFields:returnFields];
-				if(bFound){
-					[matches addObject:testContact];
-				}
-				testContact = nil;
-			}
-		}
-	}
-
-	NSMutableArray* returnContacts = [NSMutableArray arrayWithCapacity:1];
-	
-	if (matches != nil && [matches count] > 0){
-		// convert to JS Contacts format and return in callback
-        // - returnFields  determines what properties to return
-		NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 
-		int count = multiple == YES ? [matches count] : 1;
-		for(int i = 0; i<count; i++){
-			PGContact* newContact = [matches objectAtIndex:i];
-			NSDictionary* aContact = [newContact toDictionary: returnFields];
-			[returnContacts addObject:aContact];
-		}
-		[pool release];
-	}
-	PluginResult* result = nil;
-    // return found contacts (array is empty if no contacts found)
-    result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsArray: returnContacts  cast: @"navigator.contacts._findCallback"];
-    jsString = [result toSuccessCallbackString:callbackId];
-    // NSLog(@"findCallback string: %@", jsString);
-	
-
-	if(addrBook){
-		CFRelease(addrBook);
-	}
-	if (foundRecords){
-		[foundRecords release];
-	}
-	
-	if(jsString){
-		[self writeJavascript:jsString];
-    }
-	return;
-	
-	
-}
-- (void) save:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments objectAtIndex:0];
-	NSString* jsString = nil;
-	bool bIsError = FALSE, bSuccess = FALSE;
-	BOOL bUpdate = NO;
-	ContactError errCode = UNKNOWN_ERROR;
-	CFErrorRef error;
-	PluginResult* result = nil;	
-	
-	NSMutableDictionary* contactDict = [options valueForKey:@"contact"];
-	
-	ABAddressBookRef addrBook = ABAddressBookCreate();	
-	NSNumber* cId = [contactDict valueForKey:kW3ContactId];
-	PGContact* aContact = nil; 
-	ABRecordRef rec = nil;
-	if (cId && ![cId isKindOfClass:[NSNull class]]){
-		rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]);
-		if (rec){
-			aContact = [[PGContact alloc] initFromABRecord: rec ];
-			bUpdate = YES;
-		}
-	}
-	if (!aContact){
-		aContact = [[PGContact alloc] init]; 			
-	}
-	
-	bSuccess = [aContact setFromContactDict: contactDict asUpdate: bUpdate];
-	if (bSuccess){
-		if (!bUpdate){
-			bSuccess = ABAddressBookAddRecord(addrBook, [aContact record], &error);
-		}
-		if (bSuccess) {
-			bSuccess = ABAddressBookSave(addrBook, &error);
-		}
-		if (!bSuccess){  // need to provide error codes
-			bIsError = TRUE;
-			errCode = IO_ERROR; 
-		} else {
-			
-			// give original dictionary back?  If generate dictionary from saved contact, have no returnFields specified
-			// so would give back all fields (which W3C spec. indicates is not desired)
-			// for now (while testing) give back saved, full contact
-			NSDictionary* newContact = [aContact toDictionary: [PGContact defaultFields]];
-			//NSString* contactStr = [newContact JSONRepresentation];
-			result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsDictionary: newContact cast: @"navigator.contacts._contactCallback" ];
-			jsString = [result toSuccessCallbackString:callbackId];
-		}
-	} else {
-		bIsError = TRUE;
-		errCode = IO_ERROR; 
-	}
-	[aContact release];	
-	CFRelease(addrBook);
-		
-	if (bIsError){
-		result = [PluginResult resultWithStatus:PGCommandStatus_ERROR messageAsInt: errCode cast:@"navigator.contacts._errCallback" ];
-		jsString = [result toErrorCallbackString:callbackId];
-	}
-	
-	if(jsString){
-		[self writeJavascript: jsString];
-		//[webView stringByEvaluatingJavaScriptFromString:jsString];
-	}
-	
-	
-}	
-- (void) remove: (NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments objectAtIndex:0];
-	NSString* jsString = nil;
-	bool bIsError = FALSE, bSuccess = FALSE;
-	ContactError errCode = UNKNOWN_ERROR;
-	CFErrorRef error;
-	ABAddressBookRef addrBook = nil;
-	ABRecordRef rec = nil;
-	PluginResult* result = nil;
-	
-	NSMutableDictionary* contactDict = [options valueForKey:@"contact"];
-	addrBook = ABAddressBookCreate();	
-	NSNumber* cId = [contactDict valueForKey:kW3ContactId];
-	if (cId && ![cId isKindOfClass:[NSNull class]] && [cId intValue] != kABRecordInvalidID){
-		rec = ABAddressBookGetPersonWithRecordID(addrBook, [cId intValue]);
-		if (rec){
-			bSuccess = ABAddressBookRemoveRecord(addrBook, rec, &error);
-			if (!bSuccess){
-				bIsError = TRUE;
-				errCode = IO_ERROR; 
-			} else {
-				bSuccess = ABAddressBookSave(addrBook, &error);
-				if(!bSuccess){
-					bIsError = TRUE;
-					errCode = IO_ERROR;
-				}else {
-					// set id to null
-					[contactDict setObject:[NSNull null] forKey:kW3ContactId];
-					result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsDictionary: contactDict cast: @"navigator.contacts._contactCallback"];
-					jsString = [result toSuccessCallbackString:callbackId];
-					//NSString* contactStr = [contactDict JSONRepresentation];
-				}
-			}						
-		} else {
-			// no record found return error
-			bIsError = TRUE;
-			errCode = UNKNOWN_ERROR;
-		}
-		
-	} else {
-		// invalid contact id provided
-		bIsError = TRUE;
-		errCode = INVALID_ARGUMENT_ERROR;
-	}
-	
-
-	if (addrBook){
-		CFRelease(addrBook);
-	}
-	if (bIsError){
-		result = [PluginResult resultWithStatus:PGCommandStatus_ERROR messageAsInt: errCode cast: @"navigator.contacts._errCallback"];
-		 jsString = [result toErrorCallbackString:callbackId];
-	}
-	if (jsString){
-		[self writeJavascript:jsString];
-	}	
-		
-	return;
-		
-}
-
-- (void)dealloc
-{
-	/*ABAddressBookUnregisterExternalChangeCallback(addressBook, addressBookChanged, self);
-
-	if (addressBook) {
-		CFRelease(addressBook);
-	}
-	*/
-	
-    [super dealloc];
-}
-
-@end
-
-/* ABPersonViewController does not have any UI to dismiss.  Adding navigationItems to it does not work properly
- * The navigationItems are lost when the app goes into the background.  The solution was to create an empty
- * NavController in front of the ABPersonViewController. This will cause the ABPersonViewController to have a back button. By subclassing the ABPersonViewController, we can override viewDidDisappear and take down the entire NavigationController.
- */ 
-@implementation DisplayContactViewController
-@synthesize contactsPlugin;
-
-
-- (void)viewWillDisappear: (BOOL)animated
-{
-    [super viewWillDisappear: animated];
-    
-    if ([self respondsToSelector:@selector(presentingViewController)]) { 
-        [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
-    } else {
-        [[self parentViewController] dismissModalViewControllerAnimated:YES];
-    }        
-    
-}
--(void) dealloc
-{
-    self.contactsPlugin=nil;
-    [super dealloc];
-}
-
-@end
-

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

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/DebugConsole.m
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/DebugConsole.m b/PhoneGapLib/Classes/DebugConsole.m
deleted file mode 100644
index b75ec8d..0000000
--- a/PhoneGapLib/Classes/DebugConsole.m
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
- 
- http://www.apache.org/licenses/LICENSE-2.0
- 
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied.  See the License for the
- specific language governing permissions and limitations
- under the License.
- */
-
-#import "DebugConsole.h"
-
-@implementation PGDebugConsole
-
-- (void)log:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments objectAtIndex:0];
-#pragma unused(callbackId)
-    NSString* message = [arguments objectAtIndex:1];
-    NSString* log_level = @"INFO";
-    if ([options objectForKey:@"logLevel"])
-        log_level = [options objectForKey:@"logLevel"];
-
-    NSLog(@"[%@] %@", log_level, message);
-}
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/File.h
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/File.h b/PhoneGapLib/Classes/File.h
deleted file mode 100644
index a071077..0000000
--- a/PhoneGapLib/Classes/File.h
+++ /dev/null
@@ -1,107 +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>
-#import "PGPlugin.h"
-
-enum FileError {
-	NOT_FOUND_ERR = 1,
-    SECURITY_ERR = 2,
-    ABORT_ERR = 3,
-    NOT_READABLE_ERR = 4,
-    ENCODING_ERR = 5,
-    NO_MODIFICATION_ALLOWED_ERR = 6,
-    INVALID_STATE_ERR = 7,
-    SYNTAX_ERR = 8,
-    INVALID_MODIFICATION_ERR = 9,
-    QUOTA_EXCEEDED_ERR = 10,
-    TYPE_MISMATCH_ERR = 11,
-    PATH_EXISTS_ERR = 12
-};
-typedef int FileError;
-
-enum FileSystemType {
-	TEMPORARY = 0,
-	PERSISTENT = 1
-};
-typedef int FileSystemType;
-
-@interface PGFile : PGPlugin {
-	
-	NSString *appDocsPath;	
-	NSString *appLibraryPath;	
-	NSString *appTempPath;
-	NSString *persistentPath;
-	NSString *temporaryPath;
-	
-	BOOL userHasAllowed;
-
-}
-- (NSNumber*) checkFreeDiskSpace: (NSString*) appPath;
--(NSString*) getAppPath: (NSString*)pathFragment;
-//-(NSString*) getFullPath: (NSString*)pathFragment;
-- (void) requestFileSystem:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
--(NSDictionary*) getDirectoryEntry: (NSString*) fullPath isDirectory: (BOOL) isDir;
-- (void) resolveLocalFileSystemURI:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) getDirectory:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) getFile:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) getParent:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) getMetadata:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) removeRecursively:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) remove:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (NSString*) doRemove:(NSString*)fullPath callback: (NSString*)callbackId;
-- (void) copyTo:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) moveTo:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
--(BOOL) canCopyMoveSrc: (NSString*) src ToDestination: (NSString*) dest;
-- (void) doCopyMove:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options  isCopy:(BOOL)bCopy;
-//- (void) toURI:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) getFileMetadata:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) readEntries:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-
-- (void) readFile:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) readAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
--(NSString*) getMimeTypeFromPath: (NSString*) fullPath;
-- (void) write:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) testFileExists:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) testDirectoryExists:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-//- (void) createDirectory:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-//- (void) deleteDirectory:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-//- (void) deleteFile:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) getFreeDiskSpace:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) truncateFile:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-
-
-
-//- (BOOL) fileExists:(NSString*)fileName;
-//- (BOOL) directoryExists:(NSString*)dirName;
-- (void) writeToFile:(NSString*)fileName withData:(NSString*)data append:(BOOL)shouldAppend callback: (NSString*) callbackId;
-- (unsigned long long) truncateFile:(NSString*)filePath atPosition:(unsigned long long)pos;
-
-
-@property (nonatomic, retain)NSString *appDocsPath;
-@property (nonatomic, retain)NSString *appLibraryPath;
-@property (nonatomic, retain)NSString *appTempPath;
-@property (nonatomic, retain)NSString *persistentPath;
-@property (nonatomic, retain)NSString *temporaryPath;
-@property BOOL userHasAllowed;
-
-@end
-
-#define kW3FileTemporary @"temporary"
-#define kW3FilePersistent @"persistent"
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/File.m
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/File.m b/PhoneGapLib/Classes/File.m
deleted file mode 100644
index f9249c7..0000000
--- a/PhoneGapLib/Classes/File.m
+++ /dev/null
@@ -1,1241 +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 "File.h"
-#import "Categories.h"
-#import "JSONKit.h"
-#import "NSData+Base64.h"
-#import <MobileCoreServices/MobileCoreServices.h>
-
-
-@implementation PGFile
-
-@synthesize appDocsPath, appLibraryPath, appTempPath, persistentPath, temporaryPath, userHasAllowed;
-
-
-
--(id)initWithWebView:(UIWebView *)theWebView
-{
-	self = (PGFile*)[super initWithWebView:theWebView];
-	if(self)
-	{
-		// get the documents directory path
-		NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-		self.appDocsPath = [paths objectAtIndex:0];
-		
-		paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
-		self.appLibraryPath = [paths objectAtIndex:0];
-		
-		self.appTempPath =  [NSTemporaryDirectory() stringByStandardizingPath]; // remove trailing slash from NSTemporaryDirectory()
-		
-		self.persistentPath = [NSString stringWithFormat: @"/%@",[self.appDocsPath lastPathComponent]];
-		self.temporaryPath = [NSString stringWithFormat: @"/%@",[self.appTempPath lastPathComponent]];
-		//NSLog(@"docs: %@ - temp: %@", self.appDocsPath, self.appTempPath);
-	}
-	
-	return self;
-}
-- (NSNumber*) checkFreeDiskSpace: (NSString*) appPath
-{
-	NSFileManager* fMgr = [[NSFileManager alloc] init];
-	
-	NSError* pError = nil;
-	
-	NSDictionary* pDict = [ fMgr attributesOfFileSystemForPath:appPath error:&pError ];
-	NSNumber* pNumAvail = (NSNumber*)[ pDict objectForKey:NSFileSystemFreeSize ];
-	[fMgr release];
-	return pNumAvail;
-	
-}
-// figure out if the pathFragment represents a persistent of temporary directory and return the full application path.
-// returns nil if path is not persistent or temporary
--(NSString*) getAppPath: (NSString*)pathFragment
-{
-	NSString* appPath = nil;
-	NSRange rangeP = [pathFragment rangeOfString:self.persistentPath];
-	NSRange rangeT = [pathFragment rangeOfString:self.temporaryPath];
-	
-	if (rangeP.location != NSNotFound && rangeT.location != NSNotFound){
-		// we found both in the path, return whichever one is first
-		if (rangeP.length < rangeT.length) {
-			appPath = self.appDocsPath;
-		}else {
-			appPath = self.appTempPath;
-		}
-	} else if (rangeP.location != NSNotFound) {
-		appPath = self.appDocsPath;
-	} else if (rangeT.location != NSNotFound){
-		appPath = self.appTempPath;
-	}
-	return appPath;
-}
-/* get the full path to this resource
- * IN
- *	NSString* pathFragment - full Path from File or Entry object (includes system path info)
- * OUT
- *	NSString* fullPath - full iOS path to this resource,  nil if not found
- */
-/*  Was here in order to NOT have to return full path, but W3C synchronous DirectoryEntry.toURI() killed that idea since I can't call into iOS to 
- * resolve full URI.  Leaving this code here in case W3C spec changes. 
--(NSString*) getFullPath: (NSString*)pathFragment
-{
-	return pathFragment;
-	NSString* fullPath = nil;
-	NSString *appPath = [ self getAppPath: pathFragment];
-	if (appPath){
-
-		// remove last component from appPath
-		NSRange range = [appPath rangeOfString:@"/" options: NSBackwardsSearch];
-		NSString* newPath = [appPath substringToIndex:range.location];
-		// add pathFragment to get test Path
-		fullPath = [newPath stringByAppendingPathComponent:pathFragment];
-	}
-	return fullPath;
-} */
-
-/* Request the File System info
- *
- * IN:
- * arguments[0] - type (number as string)
- *	TEMPORARY = 0, PERSISTENT = 1;
- * arguments[1] - size
- *
- * OUT:
- *	Dictionary representing FileSystem object
- *		name - the human readable directory name
- *		root = DirectoryEntry object
- *			bool isDirectory
- *			bool isFile
- *			string name
- *			string fullPath
- *			fileSystem = FileSystem object - !! ignored because creates circular reference !!
- */
-
-- (void) requestFileSystem:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 2, callbackId)
-    
-    // arguments
-	NSString* strType = [arguments objectAtIndex: 0];
-	unsigned long long size = [[arguments objectAtIndex:1] longLongValue];
-
-	int type = [strType intValue];
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	if (type > 1){
-		result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: NOT_FOUND_ERR cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-		NSLog(@"iOS only supports TEMPORARY and PERSISTENT file systems");
-	} else {
-		
-		//NSString* fullPath = [NSString stringWithFormat:@"/%@", (type == 0 ? [self.appTempPath lastPathComponent] : [self.appDocsPath lastPathComponent])];
-		NSString* fullPath = (type == 0 ? self.appTempPath  : self.appDocsPath);
-		// check for avail space for size request
-		NSNumber* pNumAvail = [self checkFreeDiskSpace: fullPath];
-		//NSLog(@"Free space: %@", [NSString stringWithFormat:@"%qu", [ pNumAvail unsignedLongLongValue ]]);
-		if (pNumAvail && [pNumAvail unsignedLongLongValue] < size) {
-			result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: QUOTA_EXCEEDED_ERR cast: @"window.localFileSystem._castError"];
-			jsString = [result toErrorCallbackString:callbackId];
-		} 
-		else {
-			NSMutableDictionary* fileSystem = [NSMutableDictionary dictionaryWithCapacity:2];
-			[fileSystem setObject: (type == TEMPORARY ? kW3FileTemporary : kW3FilePersistent)forKey:@"name"];
-			NSDictionary* dirEntry = [self getDirectoryEntry: fullPath isDirectory: YES];
-			[fileSystem setObject:dirEntry forKey:@"root"];
-			result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsDictionary: fileSystem cast: @"window.localFileSystem._castFS"];
-			jsString = [result toSuccessCallbackString:callbackId];
-		}
-	}
-	[self writeJavascript: jsString];
-	
-}
-/* Creates a dictionary representing an Entry Object
- *
- * IN:
- * NSString* fullPath of the entry 
- * FileSystem type 
- * BOOL isDirectory - YES if this is a directory, NO if is a file
- * OUT:
- * NSDictionary*
- Entry object
- *		bool as NSNumber isDirectory
- *		bool as NSNumber isFile
- *		NSString*  name - last part of path
- *		NSString* fullPath
- *		fileSystem = FileSystem object - !! ignored because creates circular reference FileSystem contains DirectoryEntry which contains FileSystem.....!!
- */
--(NSDictionary*) getDirectoryEntry: (NSString*) fullPath  isDirectory: (BOOL) isDir
-{
-	
-	NSMutableDictionary* dirEntry = [NSMutableDictionary dictionaryWithCapacity:4];
-	NSString* lastPart = [fullPath lastPathComponent];
-	
-	
-	
-	[dirEntry setObject:[NSNumber numberWithBool: !isDir]  forKey:@"isFile"];
-	[dirEntry setObject:[NSNumber numberWithBool: isDir]  forKey:@"isDirectory"];
-	//NSURL* fileUrl = [NSURL fileURLWithPath:fullPath];
-	//[dirEntry setObject: [fileUrl absoluteString] forKey: @"fullPath"];
-	[dirEntry setObject: fullPath forKey: @"fullPath"];
-	[dirEntry setObject: lastPart forKey:@"name"];
-	
-	
-	return dirEntry;
-	
-}
-/*
- * Given a URI determine the File System information associated with it and return an appropriate W3C entry object
- * IN
- *	NSString* fileURI  - currently requires full file URI 
- * OUT
- *	Entry object
- *		bool isDirectory
- *		bool isFile
- *		string name
- *		string fullPath
- *		fileSystem = FileSystem object - !! ignored because creates circular reference FileSystem contains DirectoryEntry which contains FileSystem.....!!
- */
-- (void) resolveLocalFileSystemURI:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-    NSString* inputUri = [arguments objectAtIndex:0];
-    
-	NSString* jsString = nil;
-    
-    // don't know if string is encoded or not so unescape 
-    NSString* cleanUri = [inputUri stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-	// now escape in order to create URL
-    NSString* strUri = [cleanUri stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
-	NSURL* testUri = [NSURL URLWithString:strUri];  
-	PluginResult* result = nil;
-	
-	if (!testUri || ![testUri isFileURL]) {
-		// issue ENCODING_ERR
-		result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: ENCODING_ERR cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	} else {
-		NSFileManager* fileMgr = [[NSFileManager alloc] init];
-		NSString* path = [testUri path];
-		//NSLog(@"url path: %@", path);
-		BOOL	isDir = NO;
-		// see if exists and is file or dir
-		BOOL bExists = [fileMgr fileExistsAtPath:path isDirectory: &isDir];
-		if (bExists) {
-			// see if it contains docs path
-			NSRange range = [path rangeOfString:self.appDocsPath];
-			NSString* foundFullPath = nil;
-			// there's probably an api or easier way to figure out the path type but I can't find it!
-			if (range.location != NSNotFound &&  range.length == [self.appDocsPath length]){
-				foundFullPath = self.appDocsPath;
-			}else {
-				// see if it contains the temp path
-				range = [path rangeOfString:self.appTempPath];
-				if (range.location != NSNotFound && range.length == [self.appTempPath length]){
-					foundFullPath = self.appTempPath;
-				}
-			}
-			if (foundFullPath == nil) {
-				// error SECURITY_ERR - not one of the two paths types supported
-				result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: SECURITY_ERR cast: @"window.localFileSystem._castError"];
-				jsString = [result toErrorCallbackString:callbackId];
-			} else {
-				NSDictionary* fileSystem = [self getDirectoryEntry: path isDirectory: isDir];
-				result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsDictionary: fileSystem cast: @"window.localFileSystem._castEntry"];
-				jsString = [result toSuccessCallbackString:callbackId];
-								
-			}
-		
-		} else {
-			// return NOT_FOUND_ERR
-			result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: NOT_FOUND_ERR cast: @"window.localFileSystem._castError"];
-			jsString = [result toErrorCallbackString:callbackId];
-			
-		}
-
-		[fileMgr release];
-	}
-	if (jsString != nil){
-		[self writeJavascript:jsString];
-	}
-
-}
-/* Part of DirectoryEntry interface,  creates or returns the specified directory
- * IN:
- *	NSString* fullPath - full path for this directory 
- *	NSString* path - directory to be created/returned; may be full path or relative path
- *	NSDictionary* - Flags object
- *		boolean as NSNumber create - 
- *			if create is true and directory does not exist, create dir and return directory entry
- *			if create is true and exclusive is true and directory does exist, return error
- *			if create is false and directory does not exist, return error
- *			if create is false and the path represents a file, return error
- *		boolean as NSNumber exclusive - used in conjunction with create
- *			if exclusive is true and create is true - specifies failure if directory already exists
- *			
- *			
- */
-- (void) getDirectory:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	// add getDir to options and call getFile()
-	if (!options){
-		options = [NSMutableDictionary dictionaryWithCapacity:1];
-	}
-	[options setObject:[NSNumber numberWithInt:1] forKey:@"getDir"];
-	
-	[self getFile: arguments withDict: options];
-
-
-}
-/* Part of DirectoryEntry interface,  creates or returns the specified file
- * IN:
- *	NSString* fullPath - full path for this file 
- *	NSString* path - file to be created/returned; may be full path or relative path
- *	NSDictionary* - Flags object
- *		boolean as NSNumber create - 
- *			if create is true and file does not exist, create file and return File entry
- *			if create is true and exclusive is true and file does exist, return error
- *			if create is false and file does not exist, return error
- *			if create is false and the path represents a directory, return error
- *		boolean as NSNumber exclusive - used in conjunction with create
- *			if exclusive is true and create is true - specifies failure if file already exists
- *			
- *			
- */
-- (void) getFile: (NSMutableArray*) arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 2, callbackId)
-    
-	// arguments are URL encoded
-	NSString* fullPath = [arguments objectAtIndex:0];
-	NSString* requestedPath = [arguments objectAtIndex:1];
-    
-	NSString* jsString = nil;
-	PluginResult* result = nil;
-	BOOL bDirRequest = NO;
-	BOOL create = NO;
-	BOOL exclusive = NO;
-	int errorCode = 0;  // !!! risky - no error code currently defined for 0
-	
-	if ([options valueForKeyIsNumber:@"create"]) {
-		create = [(NSNumber*)[options valueForKey: @"create"] boolValue];
-	}
-	if ([options valueForKeyIsNumber:@"exclusive"]) {
-		exclusive = [(NSNumber*)[options valueForKey: @"exclusive"] boolValue];
-	}
-	
-	if ([options valueForKeyIsNumber:@"getDir"]) {
-		// this will not exist for calls directly to getFile but will have been set by getDirectory before calling this method
-		bDirRequest = [(NSNumber*)[options valueForKey: @"getDir"] boolValue];
-	}
-	// see if the requested path has invalid characters - should we be checking for  more than just ":"?
-	if ([requestedPath rangeOfString: @":"].location != NSNotFound) {
-		errorCode = ENCODING_ERR;
-	}	else {
-			
-		// was full or relative path provided?
-		NSRange range = [requestedPath rangeOfString:fullPath];
-		BOOL bIsFullPath = range.location != NSNotFound;
-		
-		NSString* reqFullPath = nil;
-		
-		if (!bIsFullPath) {
-			reqFullPath = [fullPath stringByAppendingPathComponent:requestedPath];
-		} else {
-			reqFullPath = requestedPath;
-		}
-		
-		//NSLog(@"reqFullPath = %@", reqFullPath);
-		NSFileManager* fileMgr = [[NSFileManager alloc] init];
-		BOOL bIsDir;
-		BOOL bExists = [fileMgr fileExistsAtPath: reqFullPath isDirectory: &bIsDir];
-		if (bExists && create == NO && bIsDir == !bDirRequest) {
-			// path exists and is of requested type  - return TYPE_MISMATCH_ERR
-			errorCode = TYPE_MISMATCH_ERR;
-		} else if (!bExists && create == NO) {
-			// path does not exist and create is false - return NOT_FOUND_ERR
-			errorCode = NOT_FOUND_ERR;
-		} else if (bExists && create == YES && exclusive == YES) {
-			// file/dir already exists and exclusive and create are both true - return PATH_EXISTS_ERR
-			errorCode = PATH_EXISTS_ERR;
-		} else { 
-			// if bExists and create == YES - just return data
-			// if bExists and create == NO  - just return data
-			// if !bExists and create == YES - create and return data
-			BOOL bSuccess = YES;
-			NSError* pError = nil;
-			if(!bExists && create == YES){
-				if(bDirRequest) {
-					// create the dir
-					bSuccess = [ fileMgr createDirectoryAtPath:reqFullPath withIntermediateDirectories:NO attributes:nil error:&pError];
-				} else {
-					// create the empty file
-					bSuccess = [ fileMgr createFileAtPath:reqFullPath contents: nil attributes:nil];
-				}
-			}
-			if(!bSuccess){
-				errorCode = ABORT_ERR;
-				if (pError) {
-					NSLog(@"error creating directory: %@", [pError localizedDescription]);
-				}
-			} else {
-				//NSLog(@"newly created file/dir (%@) exists: %d", reqFullPath, [fileMgr fileExistsAtPath:reqFullPath]);
-				// file existed or was created
-				result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsDictionary: [self getDirectoryEntry: reqFullPath isDirectory: bDirRequest] cast: @"window.localFileSystem._castEntry"];
-				jsString = [result toSuccessCallbackString: callbackId];
-			}
-		} // are all possible conditions met?
-		[fileMgr release];
-	} 
-
-	
-	if (errorCode > 0) {
-		// create error callback
-		result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: errorCode cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	}
-	
-	
-	
-	[self writeJavascript:jsString];
-}
-/* 
- * Look up the parent Entry containing this Entry. 
- * If this Entry is the root of its filesystem, its parent is itself.
- * IN: 
- * NSArray* arguments
- *	0 - NSString* callbackId
- *	1 - NSString* fullPath
- * NSMutableDictionary* options
- *	empty
- */
-- (void) getParent:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-	// arguments are URL encoded
-	NSString* fullPath = [arguments objectAtIndex:0];
-    
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	NSString* newPath = nil;
-	
-	
-	if ([fullPath isEqualToString:self.appDocsPath] || [fullPath isEqualToString: self.appTempPath]){
-		// return self
-		newPath = fullPath;
-		
-	} else {
-		// since this call is made from an existing Entry object - the parent should already exist so no additional error checking
-		// remove last component and return Entry
-		NSRange range = [fullPath rangeOfString:@"/" options: NSBackwardsSearch];
-		newPath = [fullPath substringToIndex:range.location];
-	}
-
-	if(newPath){
-		NSFileManager* fileMgr = [[NSFileManager alloc] init];
-		BOOL bIsDir;
-		BOOL bExists = [fileMgr fileExistsAtPath: newPath isDirectory: &bIsDir];
-		if (bExists) {
-			result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsDictionary: [self getDirectoryEntry:newPath isDirectory:bIsDir] cast: @"window.localFileSystem._castEntry"];
-			jsString = [result toSuccessCallbackString:callbackId];
-		}
-		[fileMgr release];
-	}
-	if (!jsString) {
-		// invalid path or file does not exist
-		result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: NOT_FOUND_ERR cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString: callbackId];
-	}
-	[self writeJavascript:jsString];
-
-}
-/*
- * get MetaData of entry
- * Currently MetaData only includes modificationTime.
- */
-- (void) getMetadata:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-	NSString* testPath = argPath; //[self getFullPath: argPath];
-	
-	NSFileManager* fileMgr = [[NSFileManager alloc] init];
-	NSError* error = nil;
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	NSDictionary* fileAttribs = [fileMgr attributesOfItemAtPath:testPath error:&error];
-	
-	if (fileAttribs){
-		NSDate* modDate = [fileAttribs fileModificationDate];
-		if (modDate){
-			NSNumber* msDate = [NSNumber numberWithDouble:[modDate timeIntervalSince1970]*1000];
-			NSMutableDictionary* metadataDict = [NSMutableDictionary dictionaryWithCapacity:1];
-			[metadataDict setObject:msDate forKey:@"modificationTime"];
-			result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsDictionary: metadataDict cast: @"window.localFileSystem._castDate"];
-			jsString = [result toSuccessCallbackString:callbackId];
-		}
-	} else {
-		// didn't get fileAttribs
-		FileError errorCode = ABORT_ERR;
-		NSLog(@"error getting metadata: %@", [error localizedDescription]);
-		if ([error code] == NSFileNoSuchFileError) {
-			errorCode = NOT_FOUND_ERR;
-		}
-		// log [NSNumber numberWithDouble: theMessage] objCtype to see what it returns
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: errorCode cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	}
-	if (jsString){
-		[self writeJavascript:jsString];
-	}
-	[fileMgr release];
-}
-
-/* removes the directory or file entry
- * IN: 
- * NSArray* arguments
- *	0 - NSString* callbackId
- *	1 - NSString* fullPath
- * NSMutableDictionary* options
- *	empty
- *
- * returns NO_MODIFICATION_ALLOWED_ERR  if is top level directory or no permission to delete dir
- * returns INVALID_MODIFICATION_ERR if is dir and is not empty
- * returns NOT_FOUND_ERR if file or dir is not found
-*/
-- (void) remove:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* fullPath = [arguments objectAtIndex:0];
-	
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	FileError errorCode = 0;  // !! 0 not currently defined 
-	
-	// error if try to remove top level (documents or tmp) dir
-	if ([fullPath isEqualToString:self.appDocsPath] || [fullPath isEqualToString:self.appTempPath]){
-		errorCode = NO_MODIFICATION_ALLOWED_ERR;
-	} else {
-		NSFileManager* fileMgr = [[ NSFileManager alloc] init];
-		BOOL bIsDir = NO;
-		BOOL bExists = [fileMgr fileExistsAtPath:fullPath isDirectory: &bIsDir];
-		if (!bExists){
-			errorCode = NOT_FOUND_ERR;
-		}
-		if (bIsDir &&  [[fileMgr contentsOfDirectoryAtPath:fullPath error: nil] count] != 0) {
-			// dir is not empty
-			errorCode = INVALID_MODIFICATION_ERR;
-		}
-		[fileMgr release];
-	}
-	if (errorCode > 0) {
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: errorCode cast:@"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	} else {
-		// perform actual remove
-		jsString = [self doRemove: fullPath callback: callbackId];
-	}
-	[self writeJavascript:jsString];
-
-}
-/* recurvsively removes the directory 
- * IN: 
- * NSArray* arguments
- *	0 - NSString* callbackId
- *	1 - NSString* fullPath
- * NSMutableDictionary* options
- *	empty
- *
- * returns NO_MODIFICATION_ALLOWED_ERR  if is top level directory or no permission to delete dir
- * returns NOT_FOUND_ERR if file or dir is not found
- */
-- (void) removeRecursively:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* fullPath = [arguments objectAtIndex:0];
-	
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	// error if try to remove top level (documents or tmp) dir
-	if ([fullPath isEqualToString:self.appDocsPath] || [fullPath isEqualToString:self.appTempPath]){
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: NO_MODIFICATION_ALLOWED_ERR cast:@"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	} else {
-		jsString = [self doRemove: fullPath callback: callbackId];
-	}
-	
-	[self writeJavascript:jsString];
-
-}
-/* remove the file or directory (recursively)
- * IN:
- * NSString* fullPath - the full path to the file or directory to be removed
- * NSString* callbackId
- * called from remove and removeRecursively - check all pubic api specific error conditions (dir not empty, etc) before calling
- */
-
-- (NSString*) doRemove:(NSString*)fullPath callback: (NSString*)callbackId
-{
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	BOOL bSuccess = NO;
-	NSError* pError = nil;
-	NSFileManager* fileMgr = [[ NSFileManager alloc] init];
-
-	@try {
-		bSuccess = [ fileMgr removeItemAtPath:fullPath error:&pError];
-		if (bSuccess) {
-			PluginResult* result = [PluginResult resultWithStatus:PGCommandStatus_OK ];
-			jsString = [result toSuccessCallbackString:callbackId];
-		} else {
-			// see if we can give a useful error
-			FileError errorCode = ABORT_ERR;
-			NSLog(@"error getting metadata: %@", [pError localizedDescription]);
-			if ([pError code] == NSFileNoSuchFileError) {
-				errorCode = NOT_FOUND_ERR;
-			} else if ([pError code] == NSFileWriteNoPermissionError) {
-				errorCode = NO_MODIFICATION_ALLOWED_ERR;
-			}
-			
-			result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: errorCode cast: @"window.localFileSystem._castError"];
-			jsString = [result toErrorCallbackString:callbackId];
-		}
-	} @catch (NSException* e) { // NSInvalidArgumentException if path is . or ..
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: SYNTAX_ERR cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];	
-	}
-	@finally {
-		[fileMgr release];
-		return jsString;
-	}
-}
-- (void) copyTo:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	[self doCopyMove:arguments withDict:options isCopy:YES];
-}
-- (void) moveTo:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	[self doCopyMove:arguments withDict:options isCopy:NO];
-}
-/**
- * Helpfer function to check to see if the user attempted to copy an entry into its parent without changing its name, 
- * or attempted to copy a directory into a directory that it contains directly or indirectly.
- * 
- * IN: 
- *  NSString* srcDir
- *  NSString* destinationDir
- * OUT:
- *  YES copy/ move is allows
- *  NO move is onto itself
- */	
--(BOOL) canCopyMoveSrc: (NSString*) src ToDestination: (NSString*) dest
-{
-    // This weird test is to determine if we are copying or moving a directory into itself.  
-    // Copy /Documents/myDir to /Documents/myDir-backup is okay but
-    // Copy /Documents/myDir to /Documents/myDir/backup not okay
-    BOOL copyOK = YES;
-    NSRange range = [dest rangeOfString:src];
-    
-    if (range.location != NSNotFound) {
-        NSRange testRange = {range.length-1, ([dest length] - range.length)};
-        NSRange resultRange = [dest rangeOfString: @"/" options: 0 range: testRange];
-        if (resultRange.location != NSNotFound){
-            copyOK = NO;
-        }
-    }
-    return copyOK;
-    
-}
-/* Copy/move a file or directory to a new location
- * IN: 
- * NSArray* arguments
- *	0 - NSString* callbackId
- *	1 - NSString* fullPath of entry
- *  2 - NSString* newName the new name of the entry, defaults to the current name
- *	NSMutableDictionary* options - DirectoryEntry to which to copy the entry
- *	BOOL - bCopy YES if copy, NO if move
- * 
- */
-- (void) doCopyMove:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options  isCopy:(BOOL)bCopy
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-	// arguments
-    NSString* srcFullPath = [arguments objectAtIndex:0];
-    // optional argument
-    NSString* newName = ([arguments count] > 1) ? [arguments objectAtIndex:1] : [srcFullPath lastPathComponent]; 		// use last component from appPath if new name not provided
-
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	FileError errCode = 0;  // !! Currently 0 is not defined, use this to signal error !!
-		
-	NSString* destRootPath = nil;
-	NSString* key = @"fullPath";
-	if([options valueForKeyIsString:key]){
-	   destRootPath = [options objectForKey:@"fullPath"];
-	}
-	
-	if (!destRootPath) {
-		// no destination provided
-		errCode = NOT_FOUND_ERR;
-	} else if ([newName rangeOfString: @":"].location != NSNotFound) {
-		// invalid chars in new name
-		errCode = ENCODING_ERR;
-	} else {
-		NSString* newFullPath = [destRootPath stringByAppendingPathComponent: newName];
-		if ( [newFullPath isEqualToString:srcFullPath] ){
-			// source and destination can not be the same 
-			errCode = INVALID_MODIFICATION_ERR;
-		} else {
-			NSFileManager* fileMgr = [[NSFileManager alloc] init];
-			
-			BOOL bSrcIsDir = NO;
-			BOOL bDestIsDir = NO;
-			BOOL bNewIsDir = NO;
-			BOOL bSrcExists = [fileMgr fileExistsAtPath: srcFullPath isDirectory: &bSrcIsDir];
-			BOOL bDestExists= [fileMgr fileExistsAtPath: destRootPath isDirectory: &bDestIsDir];
-			BOOL bNewExists = [fileMgr fileExistsAtPath:newFullPath isDirectory: &bNewIsDir];
-			if (!bSrcExists || !bDestExists) {
-				// the source or the destination root does not exist
-				errCode = NOT_FOUND_ERR;
-			} else if (bSrcIsDir && (bNewExists && !bNewIsDir)) {
-				// can't copy/move dir to file 
-				errCode = INVALID_MODIFICATION_ERR;
-			} else { // no errors yet
-				NSError* error = nil;
-				BOOL bSuccess = NO;
-				if (bCopy){
-					if (bSrcIsDir && ![self canCopyMoveSrc: srcFullPath ToDestination: newFullPath]/*[newFullPath hasPrefix:srcFullPath]*/) {
-						// can't copy dir into self
-						errCode = INVALID_MODIFICATION_ERR;
-					} else if (bNewExists) {
-						// the full destination should NOT already exist if a copy
-						errCode = PATH_EXISTS_ERR;
-					}  else {
-						bSuccess = [fileMgr copyItemAtPath: srcFullPath toPath: newFullPath error: &error];
-					}
-				} else { // move 
-					// iOS requires that destination must not exist before calling moveTo
-					// is W3C INVALID_MODIFICATION_ERR error if destination dir exists and has contents
-					// 
-					if (!bSrcIsDir && (bNewExists && bNewIsDir)){
-						// can't move a file to directory
-						errCode = INVALID_MODIFICATION_ERR;
-					} else if (bSrcIsDir && ![self canCopyMoveSrc: srcFullPath ToDestination: newFullPath] ) { //[newFullPath hasPrefix:srcFullPath]){
-						// can't move a dir into itself
-						errCode = INVALID_MODIFICATION_ERR;	
-					} else if (bNewExists) {
-						if (bNewIsDir && [[fileMgr contentsOfDirectoryAtPath:newFullPath error: NULL] count] != 0){
-							// can't move dir to a dir that is not empty
-							errCode = INVALID_MODIFICATION_ERR;
-							newFullPath = nil;  // so we won't try to move
-						} else {
-							// remove destination so can perform the moveItemAtPath
-							bSuccess = [fileMgr removeItemAtPath:newFullPath error: NULL];
-							if (!bSuccess) {
-								errCode = INVALID_MODIFICATION_ERR; // is this the correct error?
-								newFullPath = nil;
-							}
-						}
-					} else if (bNewIsDir && [newFullPath hasPrefix:srcFullPath]) {
-						// can't move a directory inside itself or to any child at any depth;
-						errCode = INVALID_MODIFICATION_ERR;
-						newFullPath = nil;
-					}
-						
-					if (newFullPath != nil) {
-						bSuccess = [fileMgr moveItemAtPath: srcFullPath toPath: newFullPath error: &error];
-					}
-				}
-				if (bSuccess) {
-					// should verify it is there and of the correct type???
-					NSDictionary* newEntry = [self getDirectoryEntry: newFullPath isDirectory:bSrcIsDir]; //should be the same type as source
-					result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsDictionary: newEntry cast: @"window.localFileSystem._castEntry"];
-					jsString = [result toSuccessCallbackString:callbackId];
-				}
-				else {
-					errCode = INVALID_MODIFICATION_ERR; // catch all
-					if (error) {
-						if ([error code] == NSFileReadUnknownError || [error code] == NSFileReadTooLargeError) {
-							errCode = NOT_READABLE_ERR;
-						} else if ([error code] == NSFileWriteOutOfSpaceError){
-							errCode = QUOTA_EXCEEDED_ERR;
-						} else if ([error code] == NSFileWriteNoPermissionError){
-							errCode = NO_MODIFICATION_ALLOWED_ERR;
-						}
-					}
-				}			
-			}
-			[fileMgr release];	
-		}
-	}
-	if (errCode > 0) {
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: errCode cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	}
-	
-	
-	if (jsString){
-		[self writeJavascript: jsString];
-	}
-	
-}
-/* return the URI to the entry
- * IN: 
- * NSArray* arguments
- *	0 - NSString* callbackId
- *	1 - NSString* fullPath of entry
- *	2 - desired mime type of entry - ignored - always returns file://
- */
-/*  Not needed since W3C toURI is synchronous.  Leaving code here for now in case W3C spec changes.....
-- (void) toURI:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments objectAtIndex:0];
-	NSString* argPath = [arguments objectAtIndex:1];
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	NSString* fullPath = [self getFullPath: argPath];
-	if (fullPath) {
-		// do we need to make sure the file actually exists?
-		// create file uri
-		NSString* strUri = [fullPath stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
-		NSURL* fileUrl = [NSURL fileURLWithPath:strUri];
-		if (fileUrl) {
-			result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsString: [fileUrl absoluteString]];
-			jsString = [result toSuccessCallbackString:callbackId];
-		} // else NOT_FOUND_ERR
-	}
-	if(!jsString) {
-		// was error
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: NOT_FOUND_ERR cast:  @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	}
-	
-	[self writeJavascript:jsString];
-}*/
-- (void) getFileMetadata:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-    
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	NSString* fullPath = argPath; //[self getFullPath: argPath];
-	if (fullPath) {
-		NSFileManager* fileMgr = [[NSFileManager alloc] init];
-		BOOL bIsDir = NO;
-		// make sure it exists and is not a directory
-		BOOL bExists = [fileMgr fileExistsAtPath:fullPath isDirectory: &bIsDir];
-		if(!bExists || bIsDir){
-			result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: NOT_FOUND_ERR cast:@"window.localFileSystem._castError"];
-			jsString = [result toErrorCallbackString:callbackId];
-		} else {
-			// create dictionary of file info
-			NSError* error = nil;
-			NSDictionary* fileAttrs = [fileMgr attributesOfItemAtPath:fullPath error:&error];
-			NSMutableDictionary* fileInfo = [NSMutableDictionary dictionaryWithCapacity:5];
-			[fileInfo setObject: [NSNumber numberWithUnsignedLongLong:[fileAttrs fileSize]] forKey:@"size"];
-			[fileInfo setObject:argPath forKey:@"fullPath"];
-			[fileInfo setObject: @"" forKey:@"type"]; // can't easily get the mimetype unless create URL, send request and read response so skipping
-			[fileInfo setObject: [argPath lastPathComponent] forKey:@"name"];
-			NSDate* modDate = [fileAttrs fileModificationDate];
-			NSNumber* msDate = [NSNumber numberWithDouble:[modDate timeIntervalSince1970]*1000];
-			[fileInfo setObject:msDate forKey:@"lastModifiedDate"];
-			result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsDictionary: fileInfo cast: @"window.localFileSystem._castDate"];
-			jsString = [result toSuccessCallbackString:callbackId];
-		}
-		[fileMgr release];
-	}
-	
-	[self writeJavascript:jsString];
-}
-
-- (void) readEntries:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-
-	// arguments
-    NSString* fullPath = [arguments objectAtIndex:0];
-	
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	NSFileManager* fileMgr = [[ NSFileManager alloc] init];
-	NSError* error = nil;
-	NSArray* contents = [fileMgr contentsOfDirectoryAtPath:fullPath error: &error];
-	if (contents) {
-		NSMutableArray* entries = [NSMutableArray arrayWithCapacity:1];
-		if ([contents count] > 0){
-			// create an Entry (as JSON) for each file/dir
-			for (NSString* name in contents) {
-				// see if is dir or file
-				NSString* entryPath = [fullPath stringByAppendingPathComponent:name];
-				BOOL bIsDir = NO;
-				[fileMgr fileExistsAtPath:entryPath isDirectory: &bIsDir];
-				NSDictionary* entryDict = [self getDirectoryEntry:entryPath isDirectory:bIsDir];
-				[entries addObject:entryDict];
-			}
-		}
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsArray: entries cast: @"window.localFileSystem._castEntries"];
-		jsString = [result toSuccessCallbackString:callbackId];
-	} else {
-		// assume not found but could check error for more specific error conditions
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: NOT_FOUND_ERR cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	} 
-
-	[fileMgr release];
-	
-	[self writeJavascript: jsString];
-	
-}
-/* read and return file data 
- * IN: 
- * NSArray* arguments
- *	0 - NSString* callbackId
- *	1 - NSString* fullPath
- *	2 - NSString* encoding - NOT USED,  iOS reads and writes using UTF8!
- * NSMutableDictionary* options
- *	empty
- */
-- (void) readFile:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-    
-	//NSString* encoding = [arguments objectAtIndex:2];   // not currently used
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	NSFileHandle* file = [ NSFileHandle fileHandleForReadingAtPath:argPath];
-	
-	if(!file){
-		// invalid path entry
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: NOT_FOUND_ERR cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	} else {
-		NSData* readData = [ file readDataToEndOfFile];
-		
-		[file closeFile];
-        NSString* pNStrBuff = nil;
-		if (readData) {
-            pNStrBuff = [[NSString alloc] initWithBytes: [readData bytes] length: [readData length] encoding: NSUTF8StringEncoding];
-        } else {
-            // return empty string if no data
-            pNStrBuff = [[NSString alloc] initWithString: @""];
-        }
-        
-        
-        result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsString: [ pNStrBuff stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] ];
-        jsString = [result toSuccessCallbackString:callbackId];
-        [ pNStrBuff release ];
-        
-		
-	}
-	if (jsString){
-		[self writeJavascript: jsString];
-	}
-	
-
-}
-/* Read content of text file and return as base64 encoded data url.
- * IN: 
- * NSArray* arguments
- *	0 - NSString* callbackId
- *	1 - NSString* fullPath
- * NSMutableDictionary* options
- *	empty
- * 
- * Determines the mime type from the file extension, returns ENCODING_ERR if mimetype can not be determined. 
- */
- 
-- (void) readAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-    
-	FileError errCode = ABORT_ERR; 
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	
-	if(!argPath){
-		errCode = SYNTAX_ERR;
-	} else {
-		NSString* mimeType = [self getMimeTypeFromPath:argPath];
-		if (!mimeType) {
-			// can't return as data URL if can't figure out the mimeType
-			errCode = ENCODING_ERR;
-		} else {
-			NSFileHandle* file = [ NSFileHandle fileHandleForReadingAtPath:argPath];
-			NSData* readData = [ file readDataToEndOfFile];
-			[file closeFile];
-			if (readData) {
-				NSString* output = [NSString stringWithFormat:@"data:%@;base64,%@", mimeType, [readData base64EncodedString]];
-				result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsString: output];
-				jsString = [result toSuccessCallbackString:callbackId];
-			} else {
-				errCode = NOT_FOUND_ERR;
-			}
-		}
-	}
-	if (!jsString){
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: errCode cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	}
-	//NSLog(@"readAsDataURL return: %@", jsString);
-	[self writeJavascript:jsString];
-		
-	
-}
-/* helper function to get the mimeType from the file extension
- * IN:
- *	NSString* fullPath - filename (may include path)
- * OUT:
- *	NSString* the mime type as type/subtype.  nil if not able to determine
- */
--(NSString*) getMimeTypeFromPath: (NSString*) fullPath
-{	
-	
-	NSString* mimeType = nil;
-	if(fullPath) {
-		CFStringRef typeId = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,(CFStringRef)[fullPath pathExtension], NULL);
-		if (typeId) {
-			mimeType = (NSString*)UTTypeCopyPreferredTagWithClass(typeId,kUTTagClassMIMEType);
-			if (mimeType) {
-				[mimeType autorelease];
-				//NSLog(@"mime type: %@", mimeType);
-			} else {
-                // special case for m4a
-                if ([(NSString*)typeId rangeOfString: @"m4a-audio"].location != NSNotFound){
-                    mimeType = @"audio/mp4";
-                } else if ([[fullPath pathExtension] rangeOfString:@"wav"].location != NSNotFound){
-                    mimeType = @"audio/wav";
-                }
-            }
-			CFRelease(typeId);
-		}
-	}
-	return mimeType;
-}
-
-- (void) truncateFile:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 2, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-	unsigned long long pos = (unsigned long long)[[arguments objectAtIndex:1 ] longLongValue];
-	
-	NSString *appFile = argPath; //[self getFullPath:argPath];
-	
-	unsigned long long newPos = [ self truncateFile:appFile atPosition:pos];
-	PluginResult* result = [PluginResult resultWithStatus: PGCommandStatus_OK messageAsInt: newPos];
-	[self writeJavascript:[result toSuccessCallbackString: callbackId]];
-	 
-}
-
-- (unsigned long long) truncateFile:(NSString*)filePath atPosition:(unsigned long long)pos
-{
-
-	unsigned long long newPos = 0UL;
-	
-	NSFileHandle* file = [ NSFileHandle fileHandleForWritingAtPath:filePath];
-	if(file)
-	{
-		[file truncateFileAtOffset:(unsigned long long)pos];
-		newPos = [ file offsetInFile];
-		[ file synchronizeFile];
-		[ file closeFile];
-	}
-	return newPos;
-} 
-
-/* write
- * IN:
- * NSArray* arguments
- *  0 - NSString* callbackId
- *  1 - NSString* file path to write to
- *  2 - NSString* data to write
- *  3 - NSNumber* position to begin writing 
- */
-- (void) write:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 3, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-	NSString* argData = [arguments objectAtIndex:1];
-	unsigned long long pos = (unsigned long long)[[ arguments objectAtIndex:2] longLongValue];
-	
-	NSString* fullPath = argPath; //[self getFullPath:argPath];
-	
-	[self truncateFile:fullPath atPosition:pos];
-	
-	[self writeToFile: fullPath withData:argData append:YES callback: callbackId];
-}
-- (void) writeToFile:(NSString*)filePath withData:(NSString*)data append:(BOOL)shouldAppend callback: (NSString*) callbackId
-{	
-	PluginResult* result = nil;
-	NSString* jsString = nil;
-	FileError errCode = INVALID_MODIFICATION_ERR; 
-	int bytesWritten = 0;
-	NSData* encData = [ data dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
-	if (filePath) {
-		NSOutputStream* fileStream = [NSOutputStream outputStreamToFileAtPath:filePath append:shouldAppend ];
-		if (fileStream) {
-			NSUInteger len = [ encData length ];
-			[ fileStream open ];
-			
-			bytesWritten = [ fileStream write:[encData bytes] maxLength:len];
-			
-			[ fileStream close ];
-			if (bytesWritten > 0) {
-				result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: bytesWritten];
-				jsString = [result toSuccessCallbackString:callbackId];
-			//} else {
-				// can probably get more detailed error info via [fileStream streamError]
-				//errCode already set to INVALID_MODIFICATION_ERR;
-				//bytesWritten = 0; // may be set to -1 on error
-			}
-		} // else fileStream not created return INVALID_MODIFICATION_ERR
-	} else {
-		// invalid filePath
-		errCode = NOT_FOUND_ERR;
-	}
-	if(!jsString) {
-		// was an error 
-		result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: errCode cast: @"window.localFileSystem._castError"];
-		jsString = [result toErrorCallbackString:callbackId];
-	}
-	[self writeJavascript: jsString];
-	
-}
-
-- (void) testFileExists:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-    
-	NSString* jsString = nil;
-	// Get the file manager
-	NSFileManager* fMgr = [ NSFileManager defaultManager ];
-	NSString *appFile = argPath; //[ self getFullPath: argPath];
-	
-	BOOL bExists = [fMgr fileExistsAtPath:appFile];
-	PluginResult* result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: ( bExists ? 1 : 0 )];
-	// keep original format of returning 0 or 1 to success  callback
-	jsString = [result toSuccessCallbackString: callbackId];
-	
-
-	[self writeJavascript: jsString];
-}
-
-- (void) testDirectoryExists:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    VERIFY_ARGUMENTS(arguments, 1, callbackId)
-    
-    // arguments
-	NSString* argPath = [arguments objectAtIndex:0];
-	
-	NSString* jsString = nil;
-	// Get the file manager
-	NSFileManager* fMgr = [[NSFileManager alloc] init];
-	NSString *appFile = argPath; //[self getFullPath: argPath];
-	BOOL bIsDir = NO;
-	BOOL bExists = [fMgr fileExistsAtPath:appFile isDirectory: &bIsDir];
-	
-	
-	PluginResult* result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsInt: ( (bExists && bIsDir) ? 1 : 0 )];
-	// keep original format of returning 0 or 1 to success callback
-	jsString = [result toSuccessCallbackString: callbackId];
-	[fMgr release];
-	[self writeJavascript: jsString];
-}
-
-// Returns number of bytes available via callback
-- (void) getFreeDiskSpace:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
-{
-	NSString* callbackId = [arguments pop];
-    
-    // no arguments
-    
-	NSNumber* pNumAvail = [self checkFreeDiskSpace:self.appDocsPath];
-	
-	NSString* strFreeSpace = [NSString stringWithFormat:@"%qu", [ pNumAvail unsignedLongLongValue ] ];
-	//NSLog(@"Free space is %@", strFreeSpace );
-	
-	PluginResult* result = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsString: strFreeSpace];
-	[self writeJavascript:[result toSuccessCallbackString: callbackId]];
-	
-}
-
--(void) dealloc
-{
-	self.appDocsPath = nil;
-	self.appLibraryPath = nil;
-	self.appTempPath = nil;
-	self.persistentPath = nil;
-	self.temporaryPath = nil;
-	
-	[super dealloc];
-}
-
-
-
-
-
-@end

http://git-wip-us.apache.org/repos/asf/incubator-cordova-ios/blob/bcff9559/PhoneGapLib/Classes/FileTransfer.h
----------------------------------------------------------------------
diff --git a/PhoneGapLib/Classes/FileTransfer.h b/PhoneGapLib/Classes/FileTransfer.h
deleted file mode 100644
index ddb9d70..0000000
--- a/PhoneGapLib/Classes/FileTransfer.h
+++ /dev/null
@@ -1,62 +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>
-#import "PGPlugin.h"
-
-enum FileTransferError {
-	FILE_NOT_FOUND_ERR = 1,
-    INVALID_URL_ERR = 2,
-    CONNECTION_ERR = 3
-};
-typedef int FileTransferError;
-
-@interface PGFileTransfer : PGPlugin {
-    
-}
-
-- (void) upload:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-- (void) download:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
-
--(void) downloadFile:(NSMutableArray*)arguments;
--(void) downloadSuccess:(NSMutableArray*)arguments; 
--(void) downloadFail:(NSMutableArray*)arguments; 
-
--(NSMutableDictionary*) createFileTransferError:(NSString*)code AndSource:(NSString*)source AndTarget:(NSString*)target;
-@end
-
-
-@interface FileTransferDelegate : NSObject {
-	PGFileTransfer* command;
-	NSString* callbackId;
-	NSString* source;
-	NSString* target;
-    NSInteger bytesWritten;
-}
-
-@property (nonatomic, retain) NSMutableData* responseData;
-@property (nonatomic, retain) PGFileTransfer* command;
-@property (nonatomic, retain) NSString* callbackId;
-@property (nonatomic, retain) NSString* source;
-@property (nonatomic, retain) NSString* target;
-@property NSInteger bytesWritten;
-
-
-@end;
\ No newline at end of file