Return-Path: X-Original-To: apmail-cordova-commits-archive@www.apache.org Delivered-To: apmail-cordova-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id CBFA6104F1 for ; Fri, 14 Jun 2013 17:30:54 +0000 (UTC) Received: (qmail 23971 invoked by uid 500); 14 Jun 2013 17:30:37 -0000 Delivered-To: apmail-cordova-commits-archive@cordova.apache.org Received: (qmail 23914 invoked by uid 500); 14 Jun 2013 17:30:37 -0000 Mailing-List: contact commits-help@cordova.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cordova.apache.org Delivered-To: mailing list commits@cordova.apache.org Received: (qmail 23099 invoked by uid 99); 14 Jun 2013 17:30:31 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 14 Jun 2013 17:30:31 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id E5EFB881140; Fri, 14 Jun 2013 17:30:30 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: filmaj@apache.org To: commits@cordova.apache.org Date: Fri, 14 Jun 2013 17:30:39 -0000 Message-Id: In-Reply-To: <6a25de3d19804b849af17bab7ef68c0d@git.apache.org> References: <6a25de3d19804b849af17bab7ef68c0d@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [10/83] [abbrv] [partial] start of lazy loading: axe all vendored-in libs http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDV.h ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDV.h b/lib/cordova-ios/CordovaLib/Classes/CDV.h deleted file mode 100644 index 15d9316..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDV.h +++ /dev/null @@ -1,57 +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 "CDVAvailability.h" - -#import "CDVPlugin.h" -#import "CDVViewController.h" -#import "CDVCommandDelegate.h" -#import "CDVURLProtocol.h" -#import "CDVInvokedUrlCommand.h" - -#import "CDVAccelerometer.h" -#import "CDVBattery.h" -#import "CDVCamera.h" -#import "CDVCapture.h" -#import "CDVConnection.h" -#import "CDVContact.h" -#import "CDVContacts.h" -#import "CDVDebug.h" -#import "CDVDevice.h" -#import "CDVFile.h" -#import "CDVFileTransfer.h" -#import "CDVLocation.h" -#import "CDVNotification.h" -#import "CDVPluginResult.h" -#import "CDVReachability.h" -#import "CDVSound.h" -#import "CDVSplashScreen.h" -#import "CDVWhitelist.h" -#import "CDVLocalStorage.h" -#import "CDVInAppBrowser.h" -#import "CDVScreenOrientationDelegate.h" -#import "CDVTimer.h" - -#import "NSArray+Comparisons.h" -#import "NSData+Base64.h" -#import "NSDictionary+Extensions.h" -#import "NSMutableArray+QueueAdditions.h" -#import "UIDevice+Extensions.h" - -#import "CDVJSON.h" http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.h ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.h b/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.h deleted file mode 100644 index 044ca53..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.h +++ /dev/null @@ -1,39 +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 -#import "CDVPlugin.h" - -@interface CDVAccelerometer : CDVPlugin -{ - double x; - double y; - double z; - NSTimeInterval timestamp; -} - -@property (readonly, assign) BOOL isRunning; -@property (nonatomic, strong) NSString* callbackId; - -- (CDVAccelerometer*)init; - -- (void)start:(CDVInvokedUrlCommand*)command; -- (void)stop:(CDVInvokedUrlCommand*)command; - -@end http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.m ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.m b/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.m deleted file mode 100644 index 33093d0..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVAccelerometer.m +++ /dev/null @@ -1,128 +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 "CDVAccelerometer.h" - -@interface CDVAccelerometer () {} -@property (readwrite, assign) BOOL isRunning; -@end - -@implementation CDVAccelerometer - -@synthesize callbackId, isRunning; - -// defaults to 10 msec -#define kAccelerometerInterval 40 -// g constant: -9.81 m/s^2 -#define kGravitationalConstant -9.81 - -- (CDVAccelerometer*)init -{ - self = [super init]; - if (self) { - x = 0; - y = 0; - z = 0; - timestamp = 0; - self.callbackId = nil; - self.isRunning = NO; - } - return self; -} - -- (void)dealloc -{ - [self stop:nil]; -} - -- (void)start:(CDVInvokedUrlCommand*)command -{ - NSString* cbId = command.callbackId; - NSTimeInterval desiredFrequency_num = kAccelerometerInterval; - UIAccelerometer* pAccel = [UIAccelerometer sharedAccelerometer]; - - // accelerometer expects fractional seconds, but we have msecs - pAccel.updateInterval = desiredFrequency_num / 1000; - self.callbackId = cbId; - if (!self.isRunning) { - pAccel.delegate = self; - self.isRunning = YES; - } -} - -- (void)onReset -{ - [self stop:nil]; -} - -- (void)stop:(CDVInvokedUrlCommand*)command -{ - UIAccelerometer* theAccelerometer = [UIAccelerometer sharedAccelerometer]; - - theAccelerometer.delegate = nil; - self.isRunning = NO; -} - -/** - * Picks up accel updates from device and stores them in this class - */ -- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration -{ - if (self.isRunning) { - x = acceleration.x; - y = acceleration.y; - z = acceleration.z; - timestamp = ([[NSDate date] timeIntervalSince1970] * 1000); - [self returnAccelInfo]; - } -} - -- (void)returnAccelInfo -{ - // Create an acceleration object - NSMutableDictionary* accelProps = [NSMutableDictionary dictionaryWithCapacity:4]; - - [accelProps setValue:[NSNumber numberWithDouble:x * kGravitationalConstant] forKey:@"x"]; - [accelProps setValue:[NSNumber numberWithDouble:y * kGravitationalConstant] forKey:@"y"]; - [accelProps setValue:[NSNumber numberWithDouble:z * kGravitationalConstant] forKey:@"z"]; - [accelProps setValue:[NSNumber numberWithDouble:timestamp] forKey:@"timestamp"]; - - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:accelProps]; - [result setKeepCallback:[NSNumber numberWithBool:YES]]; - [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; -} - -// TODO: Consider using filtering to isolate instantaneous data vs. gravity data -jm - -/* - #define kFilteringFactor 0.1 - - // Use a basic low-pass filter to keep only the gravity component of each axis. - grav_accelX = (acceleration.x * kFilteringFactor) + ( grav_accelX * (1.0 - kFilteringFactor)); - grav_accelY = (acceleration.y * kFilteringFactor) + ( grav_accelY * (1.0 - kFilteringFactor)); - grav_accelZ = (acceleration.z * kFilteringFactor) + ( grav_accelZ * (1.0 - kFilteringFactor)); - - // Subtract the low-pass value from the current value to get a simplified high-pass filter - instant_accelX = acceleration.x - ( (acceleration.x * kFilteringFactor) + (instant_accelX * (1.0 - kFilteringFactor)) ); - instant_accelY = acceleration.y - ( (acceleration.y * kFilteringFactor) + (instant_accelY * (1.0 - kFilteringFactor)) ); - instant_accelZ = acceleration.z - ( (acceleration.z * kFilteringFactor) + (instant_accelZ * (1.0 - kFilteringFactor)) ); - - - */ -@end http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h b/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h deleted file mode 100644 index 324237d..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h +++ /dev/null @@ -1,89 +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. - */ - -#define __CORDOVA_IOS__ - -#define __CORDOVA_0_9_6 906 -#define __CORDOVA_1_0_0 10000 -#define __CORDOVA_1_1_0 10100 -#define __CORDOVA_1_2_0 10200 -#define __CORDOVA_1_3_0 10300 -#define __CORDOVA_1_4_0 10400 -#define __CORDOVA_1_4_1 10401 -#define __CORDOVA_1_5_0 10500 -#define __CORDOVA_1_6_0 10600 -#define __CORDOVA_1_6_1 10601 -#define __CORDOVA_1_7_0 10700 -#define __CORDOVA_1_8_0 10800 -#define __CORDOVA_1_8_1 10801 -#define __CORDOVA_1_9_0 10900 -#define __CORDOVA_2_0_0 20000 -#define __CORDOVA_2_1_0 20100 -#define __CORDOVA_2_2_0 20200 -#define __CORDOVA_2_3_0 20300 -#define __CORDOVA_2_4_0 20400 -#define __CORDOVA_2_5_0 20500 -#define __CORDOVA_2_6_0 20600 -#define __CORDOVA_2_7_0 20700 -#define __CORDOVA_2_8_0 20800 -#define __CORDOVA_NA 99999 /* not available */ - -/* - #if CORDOVA_VERSION_MIN_REQUIRED >= __CORDOVA_1_7_0 - // do something when its at least 1.7.0 - #else - // do something else (non 1.7.0) - #endif - */ -#ifndef CORDOVA_VERSION_MIN_REQUIRED - #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_2_8_0 -#endif - -/* - Returns YES if it is at least version specified as NSString(X) - Usage: - if (IsAtLeastiOSVersion(@"5.1")) { - // do something for iOS 5.1 or greater - } - */ -#define IsAtLeastiOSVersion(X) ([[[UIDevice currentDevice] systemVersion] compare:X options:NSNumericSearch] != NSOrderedAscending) - -#define CDV_IsIPad() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)) - -#define CDV_IsIPhone5() ([[UIScreen mainScreen] bounds].size.height == 568 && [[UIScreen mainScreen] bounds].size.width == 320) - -/* Return the string version of the decimal version */ -#define CDV_VERSION [NSString stringWithFormat:@"%d.%d.%d", \ - (CORDOVA_VERSION_MIN_REQUIRED / 10000), \ - (CORDOVA_VERSION_MIN_REQUIRED % 10000) / 100, \ - (CORDOVA_VERSION_MIN_REQUIRED % 10000) % 100] - -#ifdef __clang__ - #define CDV_DEPRECATED(version, msg) __attribute__((deprecated("Deprecated in Cordova " #version ". " msg))) -#else - #define CDV_DEPRECATED(version, msg) __attribute__((deprecated())) -#endif - -// Enable this to log all exec() calls. -#define CDV_ENABLE_EXEC_LOGGING 0 -#if CDV_ENABLE_EXEC_LOGGING - #define CDV_EXEC_LOG NSLog -#else - #define CDV_EXEC_LOG(...) do {} while (NO) -#endif http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVBattery.h ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVBattery.h b/lib/cordova-ios/CordovaLib/Classes/CDVBattery.h deleted file mode 100644 index ba26c3a..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVBattery.h +++ /dev/null @@ -1,40 +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 -#import "CDVPlugin.h" - -@interface CDVBattery : CDVPlugin { - UIDeviceBatteryState state; - float level; - bool isPlugged; - NSString* callbackId; -} - -@property (nonatomic) UIDeviceBatteryState state; -@property (nonatomic) float level; -@property (nonatomic) bool isPlugged; -@property (strong) NSString* callbackId; - -- (void)updateBatteryStatus:(NSNotification*)notification; -- (NSDictionary*)getBatteryStatus; -- (void)start:(CDVInvokedUrlCommand*)command; -- (void)stop:(CDVInvokedUrlCommand*)command; -- (void)dealloc; -@end http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVBattery.m ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVBattery.m b/lib/cordova-ios/CordovaLib/Classes/CDVBattery.m deleted file mode 100644 index 681511c..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVBattery.m +++ /dev/null @@ -1,152 +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 "CDVBattery.h" - -@interface CDVBattery (PrivateMethods) -- (void)updateOnlineStatus; -@end - -@implementation CDVBattery - -@synthesize state, level, callbackId, isPlugged; - -/* determining type of event occurs on JavaScript side -- (void) updateBatteryLevel:(NSNotification*)notification -{ - // send batterylow event for less than 25% battery - // send batterycritical event for less than 10% battery - // W3c says to send batteryStatus event when batterylevel changes by more than 1% (iOS seems to notify each 5%) - // always update the navigator.device.battery info - float currentLevel = [[UIDevice currentDevice] batteryLevel]; - NSString* type = @""; - // no check for level == -1 since this api is only called when monitoring is enabled so level should be valid - if (currentLevel < 0.10){ - type = @"batterycritical"; - } else if (currentLevel < 0.25) { - type = @"batterylow"; - } else { - float onePercent = 0.1; - if (self.level >= 0 ){ - onePercent = self.level * 0.01; - } - if (fabsf(currentLevel - self.level) > onePercent){ - // issue batteryStatus event - type = @"batterystatus"; - } - } - // update the battery info and fire event - NSString* jsString = [NSString stringWithFormat:@"navigator.device.battery._status(\"%@\", %@)", type,[[self getBatteryStatus] JSONRepresentation]]; - [super writeJavascript:jsString]; -} - */ - -- (void)updateBatteryStatus:(NSNotification*)notification -{ - NSDictionary* batteryData = [self getBatteryStatus]; - - if (self.callbackId) { - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:batteryData]; - [result setKeepCallbackAsBool:YES]; - [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; - } -} - -/* Get the current battery status and level. Status will be unknown and level will be -1.0 if - * monitoring is turned off. - */ -- (NSDictionary*)getBatteryStatus -{ - UIDevice* currentDevice = [UIDevice currentDevice]; - UIDeviceBatteryState currentState = [currentDevice batteryState]; - - isPlugged = FALSE; // UIDeviceBatteryStateUnknown or UIDeviceBatteryStateUnplugged - if ((currentState == UIDeviceBatteryStateCharging) || (currentState == UIDeviceBatteryStateFull)) { - isPlugged = TRUE; - } - float currentLevel = [currentDevice batteryLevel]; - - if ((currentLevel != self.level) || (currentState != self.state)) { - self.level = currentLevel; - self.state = currentState; - } - - // W3C spec says level must be null if it is unknown - NSObject* w3cLevel = nil; - if ((currentState == UIDeviceBatteryStateUnknown) || (currentLevel == -1.0)) { - w3cLevel = [NSNull null]; - } else { - w3cLevel = [NSNumber numberWithFloat:(currentLevel * 100)]; - } - NSMutableDictionary* batteryData = [NSMutableDictionary dictionaryWithCapacity:2]; - [batteryData setObject:[NSNumber numberWithBool:isPlugged] forKey:@"isPlugged"]; - [batteryData setObject:w3cLevel forKey:@"level"]; - return batteryData; -} - -/* turn on battery monitoring*/ -- (void)start:(CDVInvokedUrlCommand*)command -{ - self.callbackId = command.callbackId; - - if ([UIDevice currentDevice].batteryMonitoringEnabled == NO) { - [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBatteryStatus:) - name:UIDeviceBatteryStateDidChangeNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateBatteryStatus:) - name:UIDeviceBatteryLevelDidChangeNotification object:nil]; - } -} - -/* turn off battery monitoring */ -- (void)stop:(CDVInvokedUrlCommand*)command -{ - // callback one last time to clear the callback function on JS side - if (self.callbackId) { - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:[self getBatteryStatus]]; - [result setKeepCallbackAsBool:NO]; - [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; - } - self.callbackId = nil; - [[UIDevice currentDevice] setBatteryMonitoringEnabled:NO]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceBatteryStateDidChangeNotification object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceBatteryLevelDidChangeNotification object:nil]; -} - -- (CDVPlugin*)initWithWebView:(UIWebView*)theWebView -{ - self = (CDVBattery*)[super initWithWebView:theWebView]; - if (self) { - self.state = UIDeviceBatteryStateUnknown; - self.level = -1.0; - } - return self; -} - -- (void)dealloc -{ - [self stop:nil]; -} - -- (void)onReset -{ - [self stop:nil]; -} - -@end http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVCamera.h ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVCamera.h b/lib/cordova-ios/CordovaLib/Classes/CDVCamera.h deleted file mode 100644 index 2932e3b..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVCamera.h +++ /dev/null @@ -1,102 +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 -#import -#import -#import "CDVPlugin.h" - -enum CDVDestinationType { - DestinationTypeDataUrl = 0, - DestinationTypeFileUri, - DestinationTypeNativeUri -}; -typedef NSUInteger CDVDestinationType; - -enum CDVEncodingType { - EncodingTypeJPEG = 0, - EncodingTypePNG -}; -typedef NSUInteger CDVEncodingType; - -enum CDVMediaType { - MediaTypePicture = 0, - MediaTypeVideo, - MediaTypeAll -}; -typedef NSUInteger CDVMediaType; - -@interface CDVCameraPicker : UIImagePickerController -{} - -@property (assign) NSInteger quality; -@property (copy) NSString* callbackId; -@property (copy) NSString* postUrl; -@property (nonatomic) enum CDVDestinationType returnType; -@property (nonatomic) enum CDVEncodingType encodingType; -@property (strong) UIPopoverController* popoverController; -@property (assign) CGSize targetSize; -@property (assign) bool correctOrientation; -@property (assign) bool saveToPhotoAlbum; -@property (assign) bool cropToSize; -@property (strong) UIWebView* webView; -@property (assign) BOOL popoverSupported; - -@end - -// ======================================================================= // - -@interface CDVCamera : CDVPlugin -{} - -@property (strong) CDVCameraPicker* pickerController; -@property (strong) NSMutableDictionary *metadata; -@property (strong, nonatomic) CLLocationManager *locationManager; -@property (strong) NSData* data; - -/* - * getPicture - * - * arguments: - * 1: this is the javascript function that will be called with the results, the first parameter passed to the - * javascript function is the picture as a Base64 encoded string - * 2: this is the javascript function to be called if there was an error - * options: - * quality: integer between 1 and 100 - */ -- (void)takePicture:(CDVInvokedUrlCommand*)command; -- (void)postImage:(UIImage*)anImage withFilename:(NSString*)filename toUrl:(NSURL*)url; -- (void)cleanup:(CDVInvokedUrlCommand*)command; -- (void)repositionPopover:(CDVInvokedUrlCommand*)command; - -- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info; -- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingImage:(UIImage*)image editingInfo:(NSDictionary*)editingInfo; -- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker; -- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated; -- (UIImage*)imageByScalingAndCroppingForSize:(UIImage*)anImage toSize:(CGSize)targetSize; -- (UIImage*)imageByScalingNotCroppingForSize:(UIImage*)anImage toSize:(CGSize)frameSize; -- (UIImage*)imageCorrectedForCaptureOrientation:(UIImage*)anImage; - -- (void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation*)oldLocation; -- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error; - -@end http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVCamera.m ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVCamera.m b/lib/cordova-ios/CordovaLib/Classes/CDVCamera.m deleted file mode 100644 index 1ee641c..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVCamera.m +++ /dev/null @@ -1,729 +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 "CDVCamera.h" -#import "CDVJpegHeaderWriter.h" -#import "NSArray+Comparisons.h" -#import "NSData+Base64.h" -#import "NSDictionary+Extensions.h" -#import -#import -#import -#import -#import -#import - -#define CDV_PHOTO_PREFIX @"cdv_photo_" - -static NSSet* org_apache_cordova_validArrowDirections; - -@interface CDVCamera () - -@property (readwrite, assign) BOOL hasPendingOperation; - -@end - -@implementation CDVCamera - -+ (void)initialize -{ - org_apache_cordova_validArrowDirections = [[NSSet alloc] initWithObjects:[NSNumber numberWithInt:UIPopoverArrowDirectionUp], [NSNumber numberWithInt:UIPopoverArrowDirectionDown], [NSNumber numberWithInt:UIPopoverArrowDirectionLeft], [NSNumber numberWithInt:UIPopoverArrowDirectionRight], [NSNumber numberWithInt:UIPopoverArrowDirectionAny], nil]; -} - -@synthesize hasPendingOperation, pickerController, locationManager; - -- (BOOL)popoverSupported -{ - return (NSClassFromString(@"UIPopoverController") != nil) && - (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); -} - -/* takePicture arguments: - * INDEX ARGUMENT - * 0 quality - * 1 destination type - * 2 source type - * 3 targetWidth - * 4 targetHeight - * 5 encodingType - * 6 mediaType - * 7 allowsEdit - * 8 correctOrientation - * 9 saveToPhotoAlbum - * 10 popoverOptions - * 11 cameraDirection - */ -- (void)takePicture:(CDVInvokedUrlCommand*)command -{ - NSString* callbackId = command.callbackId; - NSArray* arguments = command.arguments; - - self.hasPendingOperation = NO; - - NSString* sourceTypeString = [arguments objectAtIndex:2]; - UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; // default - if (sourceTypeString != nil) { - sourceType = (UIImagePickerControllerSourceType)[sourceTypeString intValue]; - } - - bool hasCamera = [UIImagePickerController isSourceTypeAvailable:sourceType]; - if (!hasCamera) { - NSLog(@"Camera.getPicture: source type %d not available.", sourceType); - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"no camera available"]; - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; - return; - } - - bool allowEdit = [[arguments objectAtIndex:7] boolValue]; - NSNumber* targetWidth = [arguments objectAtIndex:3]; - NSNumber* targetHeight = [arguments objectAtIndex:4]; - NSNumber* mediaValue = [arguments objectAtIndex:6]; - CDVMediaType mediaType = (mediaValue) ? [mediaValue intValue] : MediaTypePicture; - - CGSize targetSize = CGSizeMake(0, 0); - if ((targetWidth != nil) && (targetHeight != nil)) { - targetSize = CGSizeMake([targetWidth floatValue], [targetHeight floatValue]); - } - - // If a popover is already open, close it; we only want one at a time. - if (([[self pickerController] popoverController] != nil) && [[[self pickerController] popoverController] isPopoverVisible]) { - [[[self pickerController] popoverController] dismissPopoverAnimated:YES]; - [[[self pickerController] popoverController] setDelegate:nil]; - [[self pickerController] setPopoverController:nil]; - } - - CDVCameraPicker* cameraPicker = [[CDVCameraPicker alloc] init]; - self.pickerController = cameraPicker; - - cameraPicker.delegate = self; - cameraPicker.sourceType = sourceType; - cameraPicker.allowsEditing = allowEdit; // THIS IS ALL IT TAKES FOR CROPPING - jm - cameraPicker.callbackId = callbackId; - cameraPicker.targetSize = targetSize; - cameraPicker.cropToSize = NO; - // we need to capture this state for memory warnings that dealloc this object - cameraPicker.webView = self.webView; - cameraPicker.popoverSupported = [self popoverSupported]; - - cameraPicker.correctOrientation = [[arguments objectAtIndex:8] boolValue]; - cameraPicker.saveToPhotoAlbum = [[arguments objectAtIndex:9] boolValue]; - - cameraPicker.encodingType = ([arguments objectAtIndex:5]) ? [[arguments objectAtIndex:5] intValue] : EncodingTypeJPEG; - - cameraPicker.quality = ([arguments objectAtIndex:0]) ? [[arguments objectAtIndex:0] intValue] : 50; - cameraPicker.returnType = ([arguments objectAtIndex:1]) ? [[arguments objectAtIndex:1] intValue] : DestinationTypeFileUri; - - if (sourceType == UIImagePickerControllerSourceTypeCamera) { - // We only allow taking pictures (no video) in this API. - cameraPicker.mediaTypes = [NSArray arrayWithObjects:(NSString*)kUTTypeImage, nil]; - - // We can only set the camera device if we're actually using the camera. - NSNumber* cameraDirection = [command argumentAtIndex:11 withDefault:[NSNumber numberWithInteger:UIImagePickerControllerCameraDeviceRear]]; - cameraPicker.cameraDevice = (UIImagePickerControllerCameraDevice)[cameraDirection intValue]; - } else if (mediaType == MediaTypeAll) { - cameraPicker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:sourceType]; - } else { - NSArray* mediaArray = [NSArray arrayWithObjects:(NSString*)(mediaType == MediaTypeVideo ? kUTTypeMovie : kUTTypeImage), nil]; - cameraPicker.mediaTypes = mediaArray; - } - - if ([self popoverSupported] && (sourceType != UIImagePickerControllerSourceTypeCamera)) { - if (cameraPicker.popoverController == nil) { - cameraPicker.popoverController = [[NSClassFromString(@"UIPopoverController")alloc] initWithContentViewController:cameraPicker]; - } - NSDictionary* options = [command.arguments objectAtIndex:10 withDefault:nil]; - [self displayPopover:options]; - } else { - if ([self.viewController respondsToSelector:@selector(presentViewController:::)]) { - [self.viewController presentViewController:cameraPicker animated:YES completion:nil]; - } else { - [self.viewController presentModalViewController:cameraPicker animated:YES]; - } - } - self.hasPendingOperation = YES; -} - -- (void)repositionPopover:(CDVInvokedUrlCommand*)command -{ - NSDictionary* options = [command.arguments objectAtIndex:0 withDefault:nil]; - - [self displayPopover:options]; -} - -- (void)displayPopover:(NSDictionary*)options -{ - int x = 0; - int y = 32; - int width = 320; - int height = 480; - UIPopoverArrowDirection arrowDirection = UIPopoverArrowDirectionAny; - - if (options) { - x = [options integerValueForKey:@"x" defaultValue:0]; - y = [options integerValueForKey:@"y" defaultValue:32]; - width = [options integerValueForKey:@"width" defaultValue:320]; - height = [options integerValueForKey:@"height" defaultValue:480]; - arrowDirection = [options integerValueForKey:@"arrowDir" defaultValue:UIPopoverArrowDirectionAny]; - if (![org_apache_cordova_validArrowDirections containsObject:[NSNumber numberWithInt:arrowDirection]]) { - arrowDirection = UIPopoverArrowDirectionAny; - } - } - - [[[self pickerController] popoverController] setDelegate:self]; - [[[self pickerController] popoverController] presentPopoverFromRect:CGRectMake(x, y, width, height) - inView:[self.webView superview] - permittedArrowDirections:arrowDirection - animated:YES]; -} - -- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated -{ - if([navigationController isKindOfClass:[UIImagePickerController class]]){ - UIImagePickerController * cameraPicker = (UIImagePickerController*)navigationController; - - if(![cameraPicker.mediaTypes containsObject:(NSString*) kUTTypeImage]){ - [viewController.navigationItem setTitle:NSLocalizedString(@"Videos title", nil)]; - } - } -} - -- (void)cleanup:(CDVInvokedUrlCommand*)command -{ - // empty the tmp directory - NSFileManager* fileMgr = [[NSFileManager alloc] init]; - NSError* err = nil; - BOOL hasErrors = NO; - - // clear contents of NSTemporaryDirectory - NSString* tempDirectoryPath = NSTemporaryDirectory(); - NSDirectoryEnumerator* directoryEnumerator = [fileMgr enumeratorAtPath:tempDirectoryPath]; - NSString* fileName = nil; - BOOL result; - - while ((fileName = [directoryEnumerator nextObject])) { - // only delete the files we created - if (![fileName hasPrefix:CDV_PHOTO_PREFIX]) { - continue; - } - NSString* filePath = [tempDirectoryPath stringByAppendingPathComponent:fileName]; - result = [fileMgr removeItemAtPath:filePath error:&err]; - if (!result && err) { - NSLog(@"Failed to delete: %@ (error: %@)", filePath, err); - hasErrors = YES; - } - } - - CDVPluginResult* pluginResult; - if (hasErrors) { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsString:@"One or more files failed to be deleted."]; - } else { - pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - } - [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; -} - -- (void)popoverControllerDidDismissPopover:(id)popoverController -{ - // [ self imagePickerControllerDidCancel:self.pickerController ]; ' - UIPopoverController* pc = (UIPopoverController*)popoverController; - - [pc dismissPopoverAnimated:YES]; - pc.delegate = nil; - if (self.pickerController && self.pickerController.callbackId && self.pickerController.popoverController) { - self.pickerController.popoverController = nil; - NSString* callbackId = self.pickerController.callbackId; - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"no image selected"]; // error callback expects string ATM - [self.commandDelegate sendPluginResult:result callbackId:callbackId]; - } - self.hasPendingOperation = NO; -} - -- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info -{ - CDVCameraPicker* cameraPicker = (CDVCameraPicker*)picker; - - if (cameraPicker.popoverSupported && (cameraPicker.popoverController != nil)) { - [cameraPicker.popoverController dismissPopoverAnimated:YES]; - cameraPicker.popoverController.delegate = nil; - cameraPicker.popoverController = nil; - } else { - if ([cameraPicker respondsToSelector:@selector(presentingViewController)]) { - [[cameraPicker presentingViewController] dismissModalViewControllerAnimated:YES]; - } else { - [[cameraPicker parentViewController] dismissModalViewControllerAnimated:YES]; - } - } - - CDVPluginResult* result = nil; - - NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType]; - // IMAGE TYPE - if ([mediaType isEqualToString:(NSString*)kUTTypeImage]) { - if (cameraPicker.returnType == DestinationTypeNativeUri) { - NSString* nativeUri = [(NSURL*)[info objectForKey:UIImagePickerControllerReferenceURL] absoluteString]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:nativeUri]; - } else { - // get the image - UIImage* image = nil; - if (cameraPicker.allowsEditing && [info objectForKey:UIImagePickerControllerEditedImage]) { - image = [info objectForKey:UIImagePickerControllerEditedImage]; - } else { - image = [info objectForKey:UIImagePickerControllerOriginalImage]; - } - - if (cameraPicker.correctOrientation) { - image = [self imageCorrectedForCaptureOrientation:image]; - } - - UIImage* scaledImage = nil; - - if ((cameraPicker.targetSize.width > 0) && (cameraPicker.targetSize.height > 0)) { - // if cropToSize, resize image and crop to target size, otherwise resize to fit target without cropping - if (cameraPicker.cropToSize) { - scaledImage = [self imageByScalingAndCroppingForSize:image toSize:cameraPicker.targetSize]; - } else { - scaledImage = [self imageByScalingNotCroppingForSize:image toSize:cameraPicker.targetSize]; - } - } - - NSData* data = nil; - - if (cameraPicker.encodingType == EncodingTypePNG) { - data = UIImagePNGRepresentation(scaledImage == nil ? image : scaledImage); - } else { - self.data = UIImageJPEGRepresentation(scaledImage == nil ? image : scaledImage, cameraPicker.quality / 100.0f); - - NSDictionary *controllerMetadata = [info objectForKey:@"UIImagePickerControllerMediaMetadata"]; - if (controllerMetadata) { - self.metadata = [[NSMutableDictionary alloc] init]; - - NSMutableDictionary *EXIFDictionary = [[controllerMetadata objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy]; - if (EXIFDictionary) [self.metadata setObject:EXIFDictionary forKey:(NSString *)kCGImagePropertyExifDictionary]; - - [[self locationManager] startUpdatingLocation]; - return; - } - } - - if (cameraPicker.saveToPhotoAlbum) { - UIImageWriteToSavedPhotosAlbum([UIImage imageWithData:data], nil, nil, nil); - } - - if (cameraPicker.returnType == DestinationTypeFileUri) { - // write to temp directory and return URI - // get the temp directory path - NSString* docsPath = [NSTemporaryDirectory()stringByStandardizingPath]; - NSError* err = nil; - NSFileManager* fileMgr = [[NSFileManager alloc] init]; // recommended by apple (vs [NSFileManager defaultManager]) to be threadsafe - // generate unique file name - NSString* filePath; - - int i = 1; - do { - filePath = [NSString stringWithFormat:@"%@/%@%03d.%@", docsPath, CDV_PHOTO_PREFIX, i++, cameraPicker.encodingType == EncodingTypePNG ? @"png":@"jpg"]; - } while ([fileMgr fileExistsAtPath:filePath]); - - // save file - if (![data writeToFile:filePath options:NSAtomicWrite error:&err]) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsString:[err localizedDescription]]; - } else { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[[NSURL fileURLWithPath:filePath] absoluteString]]; - } - } else { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[data base64EncodedString]]; - } - } - } - // NOT IMAGE TYPE (MOVIE) - else { - NSString* moviePath = [[info objectForKey:UIImagePickerControllerMediaURL] absoluteString]; - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:moviePath]; - } - - if (result) { - [self.commandDelegate sendPluginResult:result callbackId:cameraPicker.callbackId]; - } - - self.hasPendingOperation = NO; - self.pickerController = nil; -} - -// older api calls newer didFinishPickingMediaWithInfo -- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingImage:(UIImage*)image editingInfo:(NSDictionary*)editingInfo -{ - NSDictionary* imageInfo = [NSDictionary dictionaryWithObject:image forKey:UIImagePickerControllerOriginalImage]; - - [self imagePickerController:picker didFinishPickingMediaWithInfo:imageInfo]; -} - -- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker -{ - CDVCameraPicker* cameraPicker = (CDVCameraPicker*)picker; - - if ([cameraPicker respondsToSelector:@selector(presentingViewController)]) { - [[cameraPicker presentingViewController] dismissModalViewControllerAnimated:YES]; - } else { - [[cameraPicker parentViewController] dismissModalViewControllerAnimated:YES]; - } - // popoverControllerDidDismissPopover:(id)popoverController is called if popover is cancelled - - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"no image selected"]; // error callback expects string ATM - [self.commandDelegate sendPluginResult:result callbackId:cameraPicker.callbackId]; - - self.hasPendingOperation = NO; - self.pickerController = nil; -} - -- (UIImage*)imageByScalingAndCroppingForSize:(UIImage*)anImage toSize:(CGSize)targetSize -{ - UIImage* sourceImage = anImage; - UIImage* newImage = nil; - CGSize imageSize = sourceImage.size; - CGFloat width = imageSize.width; - CGFloat height = imageSize.height; - CGFloat targetWidth = targetSize.width; - CGFloat targetHeight = targetSize.height; - CGFloat scaleFactor = 0.0; - CGFloat scaledWidth = targetWidth; - CGFloat scaledHeight = targetHeight; - CGPoint thumbnailPoint = CGPointMake(0.0, 0.0); - - if (CGSizeEqualToSize(imageSize, targetSize) == NO) { - CGFloat widthFactor = targetWidth / width; - CGFloat heightFactor = targetHeight / height; - - if (widthFactor > heightFactor) { - scaleFactor = widthFactor; // scale to fit height - } else { - scaleFactor = heightFactor; // scale to fit width - } - scaledWidth = width * scaleFactor; - scaledHeight = height * scaleFactor; - - // center the image - if (widthFactor > heightFactor) { - thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; - } else if (widthFactor < heightFactor) { - thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; - } - } - - UIGraphicsBeginImageContext(targetSize); // this will crop - - CGRect thumbnailRect = CGRectZero; - thumbnailRect.origin = thumbnailPoint; - thumbnailRect.size.width = scaledWidth; - thumbnailRect.size.height = scaledHeight; - - [sourceImage drawInRect:thumbnailRect]; - - newImage = UIGraphicsGetImageFromCurrentImageContext(); - if (newImage == nil) { - NSLog(@"could not scale image"); - } - - // pop the context to get back to the default - UIGraphicsEndImageContext(); - return newImage; -} - -- (UIImage*)imageCorrectedForCaptureOrientation:(UIImage*)anImage -{ - float rotation_radians = 0; - bool perpendicular = false; - - switch ([anImage imageOrientation]) { - case UIImageOrientationUp : - rotation_radians = 0.0; - break; - - case UIImageOrientationDown: - rotation_radians = M_PI; // don't be scared of radians, if you're reading this, you're good at math - break; - - case UIImageOrientationRight: - rotation_radians = M_PI_2; - perpendicular = true; - break; - - case UIImageOrientationLeft: - rotation_radians = -M_PI_2; - perpendicular = true; - break; - - default: - break; - } - - UIGraphicsBeginImageContext(CGSizeMake(anImage.size.width, anImage.size.height)); - CGContextRef context = UIGraphicsGetCurrentContext(); - - // Rotate around the center point - CGContextTranslateCTM(context, anImage.size.width / 2, anImage.size.height / 2); - CGContextRotateCTM(context, rotation_radians); - - CGContextScaleCTM(context, 1.0, -1.0); - float width = perpendicular ? anImage.size.height : anImage.size.width; - float height = perpendicular ? anImage.size.width : anImage.size.height; - CGContextDrawImage(context, CGRectMake(-width / 2, -height / 2, width, height), [anImage CGImage]); - - // Move the origin back since the rotation might've change it (if its 90 degrees) - if (perpendicular) { - CGContextTranslateCTM(context, -anImage.size.height / 2, -anImage.size.width / 2); - } - - UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return newImage; -} - -- (UIImage*)imageByScalingNotCroppingForSize:(UIImage*)anImage toSize:(CGSize)frameSize -{ - UIImage* sourceImage = anImage; - UIImage* newImage = nil; - CGSize imageSize = sourceImage.size; - CGFloat width = imageSize.width; - CGFloat height = imageSize.height; - CGFloat targetWidth = frameSize.width; - CGFloat targetHeight = frameSize.height; - CGFloat scaleFactor = 0.0; - CGSize scaledSize = frameSize; - - if (CGSizeEqualToSize(imageSize, frameSize) == NO) { - CGFloat widthFactor = targetWidth / width; - CGFloat heightFactor = targetHeight / height; - - // opposite comparison to imageByScalingAndCroppingForSize in order to contain the image within the given bounds - if (widthFactor > heightFactor) { - scaleFactor = heightFactor; // scale to fit height - } else { - scaleFactor = widthFactor; // scale to fit width - } - scaledSize = CGSizeMake(MIN(width * scaleFactor, targetWidth), MIN(height * scaleFactor, targetHeight)); - } - - UIGraphicsBeginImageContext(scaledSize); // this will resize - - [sourceImage drawInRect:CGRectMake(0, 0, scaledSize.width, scaledSize.height)]; - - newImage = UIGraphicsGetImageFromCurrentImageContext(); - if (newImage == nil) { - NSLog(@"could not scale image"); - } - - // pop the context to get back to the default - UIGraphicsEndImageContext(); - return newImage; -} - -- (void)postImage:(UIImage*)anImage withFilename:(NSString*)filename toUrl:(NSURL*)url -{ - self.hasPendingOperation = YES; - - NSString* boundary = @"----BOUNDARY_IS_I"; - - NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL:url]; - [req setHTTPMethod:@"POST"]; - - NSString* contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; - [req setValue:contentType forHTTPHeaderField:@"Content-type"]; - - NSData* imageData = UIImagePNGRepresentation(anImage); - - // adding the body - NSMutableData* postBody = [NSMutableData data]; - - // first parameter an image - [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; - [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"upload\"; filename=\"%@\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; - [postBody appendData:[@"Content-Type: image/png\r\n\r\n" dataUsingEncoding : NSUTF8StringEncoding]]; - [postBody appendData:imageData]; - - // // second parameter information - // [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; - // [postBody appendData:[@"Content-Disposition: form-data; name=\"some_other_name\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; - // [postBody appendData:[@"some_other_value" dataUsingEncoding:NSUTF8StringEncoding]]; - // [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r \n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; - - [req setHTTPBody:postBody]; - - NSURLResponse* response; - NSError* error; - [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error]; - - // NSData* result = [NSURLConnection sendSynchronousRequest:req returningResponse:&response error:&error]; - // NSString * resultStr = [[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding] autorelease]; - - self.hasPendingOperation = NO; -} - - -- (CLLocationManager *)locationManager { - - if (locationManager != nil) { - return locationManager; - } - - locationManager = [[CLLocationManager alloc] init]; - [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; - [locationManager setDelegate:self]; - - return locationManager; -} - -- (void)locationManager:(CLLocationManager*)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation*)oldLocation -{ - if (locationManager != nil) { - [self.locationManager stopUpdatingLocation]; - self.locationManager = nil; - - NSMutableDictionary *GPSDictionary = [[NSMutableDictionary dictionary] init]; - - CLLocationDegrees latitude = newLocation.coordinate.latitude; - CLLocationDegrees longitude = newLocation.coordinate.longitude; - - // latitude - if (latitude < 0.0) { - latitude = latitude * -1.0f; - [GPSDictionary setObject:@"S" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef]; - } else { - [GPSDictionary setObject:@"N" forKey:(NSString*)kCGImagePropertyGPSLatitudeRef]; - } - [GPSDictionary setObject:[NSNumber numberWithFloat:latitude] forKey:(NSString*)kCGImagePropertyGPSLatitude]; - - // longitude - if (longitude < 0.0) { - longitude = longitude * -1.0f; - [GPSDictionary setObject:@"W" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef]; - } - else { - [GPSDictionary setObject:@"E" forKey:(NSString*)kCGImagePropertyGPSLongitudeRef]; - } - [GPSDictionary setObject:[NSNumber numberWithFloat:longitude] forKey:(NSString*)kCGImagePropertyGPSLongitude]; - - // altitude - CGFloat altitude = newLocation.altitude; - if (!isnan(altitude)){ - if (altitude < 0) { - altitude = -altitude; - [GPSDictionary setObject:@"1" forKey:(NSString *)kCGImagePropertyGPSAltitudeRef]; - } else { - [GPSDictionary setObject:@"0" forKey:(NSString *)kCGImagePropertyGPSAltitudeRef]; - } - [GPSDictionary setObject:[NSNumber numberWithFloat:altitude] forKey:(NSString *)kCGImagePropertyGPSAltitude]; - } - - // Time and date - NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - [formatter setDateFormat:@"HH:mm:ss.SSSSSS"]; - [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; - [GPSDictionary setObject:[formatter stringFromDate:newLocation.timestamp] forKey:(NSString *)kCGImagePropertyGPSTimeStamp]; - [formatter setDateFormat:@"yyyy:MM:dd"]; - [GPSDictionary setObject:[formatter stringFromDate:newLocation.timestamp] forKey:(NSString *)kCGImagePropertyGPSDateStamp]; - - [self.metadata setObject:GPSDictionary forKey:(NSString *)kCGImagePropertyGPSDictionary]; - [self imagePickerControllerReturnImageResult]; - } -} - -- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { - if (locationManager != nil) { - [self.locationManager stopUpdatingLocation]; - self.locationManager = nil; - - [self imagePickerControllerReturnImageResult]; - } -} - -- (void)imagePickerControllerReturnImageResult -{ - CDVPluginResult* result = nil; - - if (self.metadata) { - CGImageSourceRef sourceImage = CGImageSourceCreateWithData((__bridge_retained CFDataRef)self.data, NULL); - CFStringRef sourceType = CGImageSourceGetType(sourceImage); - - CGImageDestinationRef destinationImage = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)self.data, sourceType, 1, NULL); - CGImageDestinationAddImageFromSource(destinationImage, sourceImage, 0, (__bridge CFDictionaryRef)self.metadata); - CGImageDestinationFinalize(destinationImage); - - CFRelease(sourceImage); - CFRelease(destinationImage); - } - - if (self.pickerController.saveToPhotoAlbum) { - UIImageWriteToSavedPhotosAlbum([UIImage imageWithData:[self data]], nil, nil, nil); - } - - if (self.pickerController.returnType == DestinationTypeFileUri) { - // write to temp directory and return URI - // get the temp directory path - NSString* docsPath = [NSTemporaryDirectory()stringByStandardizingPath]; - NSError* err = nil; - NSFileManager* fileMgr = [[NSFileManager alloc] init]; // recommended by apple (vs [NSFileManager defaultManager]) to be threadsafe - // generate unique file name - NSString* filePath; - - int i = 1; - do { - filePath = [NSString stringWithFormat:@"%@/%@%03d.%@", docsPath, CDV_PHOTO_PREFIX, i++, self.pickerController.encodingType == EncodingTypePNG ? @"png":@"jpg"]; - } while ([fileMgr fileExistsAtPath:filePath]); - - // save file - if (![self.data writeToFile:filePath options:NSAtomicWrite error:&err]) { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_IO_EXCEPTION messageAsString:[err localizedDescription]]; - } - else { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[[NSURL fileURLWithPath:filePath] absoluteString]]; - } - } - else { - result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[self.data base64EncodedString]]; - } - if (result) { - [self.commandDelegate sendPluginResult:result callbackId:self.pickerController.callbackId]; - } - - if (result) { - [self.commandDelegate sendPluginResult:result callbackId:self.pickerController.callbackId]; - } - - self.hasPendingOperation = NO; - self.pickerController = nil; - self.data = nil; - self.metadata = nil; -} - -@end - -@implementation CDVCameraPicker - -@synthesize quality, postUrl; -@synthesize returnType; -@synthesize callbackId; -@synthesize popoverController; -@synthesize targetSize; -@synthesize correctOrientation; -@synthesize saveToPhotoAlbum; -@synthesize encodingType; -@synthesize cropToSize; -@synthesize webView; -@synthesize popoverSupported; - -@end http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/67fa7ebb/lib/cordova-ios/CordovaLib/Classes/CDVCapture.h ---------------------------------------------------------------------- diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVCapture.h b/lib/cordova-ios/CordovaLib/Classes/CDVCapture.h deleted file mode 100644 index afb82b4..0000000 --- a/lib/cordova-ios/CordovaLib/Classes/CDVCapture.h +++ /dev/null @@ -1,118 +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 -#import -#import -#import "CDVPlugin.h" -#import "CDVFile.h" - -enum CDVCaptureError { - CAPTURE_INTERNAL_ERR = 0, - CAPTURE_APPLICATION_BUSY = 1, - CAPTURE_INVALID_ARGUMENT = 2, - CAPTURE_NO_MEDIA_FILES = 3, - CAPTURE_NOT_SUPPORTED = 20 -}; -typedef NSUInteger CDVCaptureError; - -@interface CDVImagePicker : UIImagePickerController -{ - NSString* callbackid; - NSInteger quality; - NSString* mimeType; -} -@property (assign) NSInteger quality; -@property (copy) NSString* callbackId; -@property (copy) NSString* mimeType; - -@end - -@interface CDVCapture : CDVPlugin -{ - CDVImagePicker* pickerController; - BOOL inUse; -} -@property BOOL inUse; -- (void)captureAudio:(CDVInvokedUrlCommand*)command; -- (void)captureImage:(CDVInvokedUrlCommand*)command; -- (CDVPluginResult*)processImage:(UIImage*)image type:(NSString*)mimeType forCallbackId:(NSString*)callbackId; -- (void)captureVideo:(CDVInvokedUrlCommand*)command; -- (CDVPluginResult*)processVideo:(NSString*)moviePath forCallbackId:(NSString*)callbackId; -- (void)getMediaModes:(CDVInvokedUrlCommand*)command; -- (void)getFormatData:(CDVInvokedUrlCommand*)command; -- (NSDictionary*)getMediaDictionaryFromPath:(NSString*)fullPath ofType:(NSString*)type; -- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info; -- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingImage:(UIImage*)image editingInfo:(NSDictionary*)editingInfo; -- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker; - -@end - -@interface CDVAudioNavigationController : UINavigationController - -@end - -/* AudioRecorderViewController is used to create a simple view for audio recording. - * It is created from [Capture captureAudio]. It creates a very simple interface for - * recording by presenting just a record/stop button and a Done button to close the view. - * The recording time is displayed and recording for a specified duration is supported. When duration - * is specified there is no UI to the user - recording just stops when the specified - * duration is reached. The UI has been minimized to avoid localization. - */ -@interface CDVAudioRecorderViewController : UIViewController -{ - CDVCaptureError errorCode; - NSString* callbackId; - NSNumber* duration; - CDVCapture* captureCommand; - UIBarButtonItem* doneButton; - UIView* recordingView; - UIButton* recordButton; - UIImage* recordImage; - UIImage* stopRecordImage; - UILabel* timerLabel; - AVAudioRecorder* avRecorder; - AVAudioSession* avSession; - CDVPluginResult* pluginResult; - NSTimer* timer; - BOOL isTimed; -} -@property (nonatomic) CDVCaptureError errorCode; -@property (nonatomic, copy) NSString* callbackId; -@property (nonatomic, copy) NSNumber* duration; -@property (nonatomic, strong) CDVCapture* captureCommand; -@property (nonatomic, strong) UIBarButtonItem* doneButton; -@property (nonatomic, strong) UIView* recordingView; -@property (nonatomic, strong) UIButton* recordButton; -@property (nonatomic, strong) UIImage* recordImage; -@property (nonatomic, strong) UIImage* stopRecordImage; -@property (nonatomic, strong) UILabel* timerLabel; -@property (nonatomic, strong) AVAudioRecorder* avRecorder; -@property (nonatomic, strong) AVAudioSession* avSession; -@property (nonatomic, strong) CDVPluginResult* pluginResult; -@property (nonatomic, strong) NSTimer* timer; -@property (nonatomic) BOOL isTimed; - -- (id)initWithCommand:(CDVPlugin*)theCommand duration:(NSNumber*)theDuration callbackId:(NSString*)theCallbackId; -- (void)processButton:(id)sender; -- (void)stopRecordingCleanup; -- (void)dismissAudioView:(id)sender; -- (NSString*)formatTime:(int)interval; -- (void)updateTime; -@end