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 2013/03/06 22:39:14 UTC
[7/7] mac commit: Re-arranged group and folder structure to make it
easy for plugman support.
Updated Branches:
refs/heads/plugin-enable 1db66f1d7 -> e1c859230
Re-arranged group and folder structure to make it easy for plugman support.
Project: http://git-wip-us.apache.org/repos/asf/cordova-osx/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-osx/commit/e1c85923
Tree: http://git-wip-us.apache.org/repos/asf/cordova-osx/tree/e1c85923
Diff: http://git-wip-us.apache.org/repos/asf/cordova-osx/diff/e1c85923
Branch: refs/heads/plugin-enable
Commit: e1c8592308119faf86d7465ea6a9fe7dede93f06
Parents: 1db66f1
Author: Shazron Abdullah <sh...@apache.org>
Authored: Wed Mar 6 13:39:06 2013 -0800
Committer: Shazron Abdullah <sh...@apache.org>
Committed: Wed Mar 6 13:39:06 2013 -0800
----------------------------------------------------------------------
CordovaMac/Cordova.icns | Bin 117212 -> 0 bytes
CordovaMac/CordovaLib/CDVBridge.h | 33 +
CordovaMac/CordovaLib/CDVBridge.m | 177 +
CordovaMac/CordovaLib/Commands/CDV.h | 27 +
CordovaMac/CordovaLib/Commands/CDVAvailability.h | 53 +
.../CordovaLib/Commands/CDVCommandDelegate.h | 55 +
.../CordovaLib/Commands/CDVCommandDelegateImpl.h | 32 +
.../CordovaLib/Commands/CDVCommandDelegateImpl.m | 160 +
CordovaMac/CordovaLib/Commands/CDVCommandQueue.h | 40 +
CordovaMac/CordovaLib/Commands/CDVCommandQueue.m | 164 +
CordovaMac/CordovaLib/Commands/CDVConfigParser.h | 28 +
CordovaMac/CordovaLib/Commands/CDVConfigParser.m | 70 +
CordovaMac/CordovaLib/Commands/CDVConnection.h | 34 +
CordovaMac/CordovaLib/Commands/CDVConnection.m | 125 +
CordovaMac/CordovaLib/Commands/CDVConsole.h | 29 +
CordovaMac/CordovaLib/Commands/CDVConsole.m | 75 +
CordovaMac/CordovaLib/Commands/CDVDebug.h | 25 +
CordovaMac/CordovaLib/Commands/CDVDevice.h | 29 +
CordovaMac/CordovaLib/Commands/CDVDevice.m | 84 +
.../CordovaLib/Commands/CDVInvokedUrlCommand.h | 52 +
.../CordovaLib/Commands/CDVInvokedUrlCommand.m | 140 +
CordovaMac/CordovaLib/Commands/CDVJSON.h | 30 +
CordovaMac/CordovaLib/Commands/CDVJSON.m | 77 +
CordovaMac/CordovaLib/Commands/CDVPlugin.h | 64 +
CordovaMac/CordovaLib/Commands/CDVPlugin.m | 148 +
CordovaMac/CordovaLib/Commands/CDVPluginResult.h | 65 +
CordovaMac/CordovaLib/Commands/CDVPluginResult.m | 224 +
CordovaMac/CordovaLib/Commands/CDVReachability.h | 85 +
CordovaMac/CordovaLib/Commands/CDVReachability.m | 261 ++
.../CordovaLib/Commands/Utils/NSData+Base64.h | 33 +
.../CordovaLib/Commands/Utils/NSData+Base64.m | 286 ++
.../Commands/Utils/NSMutableArray+QueueAdditions.h | 29 +
.../Commands/Utils/NSMutableArray+QueueAdditions.m | 58 +
CordovaMac/CordovaMac.xcodeproj/project.pbxproj | 342 +-
CordovaMac/CordovaMac/AppDelegate.h | 32 -
CordovaMac/CordovaMac/AppDelegate.m | 49 -
CordovaMac/CordovaMac/CDVBridge.h | 33 -
CordovaMac/CordovaMac/CDVBridge.m | 177 -
CordovaMac/CordovaMac/Classes/AppDelegate.h | 32 +
CordovaMac/CordovaMac/Classes/AppDelegate.m | 49 +
CordovaMac/CordovaMac/Classes/Constants.h | 22 +
CordovaMac/CordovaMac/Classes/ContentView.h | 35 +
CordovaMac/CordovaMac/Classes/ContentView.m | 64 +
CordovaMac/CordovaMac/Classes/Utils.h | 37 +
CordovaMac/CordovaMac/Classes/Utils.m | 94 +
CordovaMac/CordovaMac/Classes/WebViewDelegate.h | 36 +
CordovaMac/CordovaMac/Classes/WebViewDelegate.m | 87 +
CordovaMac/CordovaMac/Commands/CDV.h | 27 -
CordovaMac/CordovaMac/Commands/CDVAvailability.h | 53 -
.../CordovaMac/Commands/CDVCommandDelegate.h | 55 -
.../CordovaMac/Commands/CDVCommandDelegateImpl.h | 32 -
.../CordovaMac/Commands/CDVCommandDelegateImpl.m | 160 -
CordovaMac/CordovaMac/Commands/CDVCommandQueue.h | 40 -
CordovaMac/CordovaMac/Commands/CDVCommandQueue.m | 164 -
CordovaMac/CordovaMac/Commands/CDVConnection.h | 34 -
CordovaMac/CordovaMac/Commands/CDVConnection.m | 125 -
CordovaMac/CordovaMac/Commands/CDVConsole.h | 29 -
CordovaMac/CordovaMac/Commands/CDVConsole.m | 75 -
CordovaMac/CordovaMac/Commands/CDVDebug.h | 25 -
CordovaMac/CordovaMac/Commands/CDVDevice.h | 29 -
CordovaMac/CordovaMac/Commands/CDVDevice.m | 84 -
.../CordovaMac/Commands/CDVInvokedUrlCommand.h | 52 -
.../CordovaMac/Commands/CDVInvokedUrlCommand.m | 140 -
CordovaMac/CordovaMac/Commands/CDVJSON.h | 30 -
CordovaMac/CordovaMac/Commands/CDVJSON.m | 77 -
CordovaMac/CordovaMac/Commands/CDVPlugin.h | 64 -
CordovaMac/CordovaMac/Commands/CDVPlugin.m | 148 -
CordovaMac/CordovaMac/Commands/CDVPluginResult.h | 65 -
CordovaMac/CordovaMac/Commands/CDVPluginResult.m | 224 -
CordovaMac/CordovaMac/Commands/CDVReachability.h | 85 -
CordovaMac/CordovaMac/Commands/CDVReachability.m | 261 --
.../CordovaMac/Commands/Utils/NSData+Base64.h | 33 -
.../CordovaMac/Commands/Utils/NSData+Base64.m | 286 --
.../Commands/Utils/NSMutableArray+QueueAdditions.h | 29 -
.../Commands/Utils/NSMutableArray+QueueAdditions.m | 58 -
CordovaMac/CordovaMac/Constants.h | 22 -
CordovaMac/CordovaMac/ContentView.h | 35 -
CordovaMac/CordovaMac/ContentView.m | 64 -
CordovaMac/CordovaMac/CordovaMac-Prefix.pch | 7 +-
CordovaMac/CordovaMac/Plugins/README | 20 +
CordovaMac/CordovaMac/Resources/Cordova.icns | Bin 0 -> 117212 bytes
.../CordovaMac/Resources/en.lproj/Credits.rtf | 18 +
.../Resources/en.lproj/InfoPlist.strings | 23 +
.../CordovaMac/Resources/en.lproj/MainMenu.xib | 3533 +++++++++++++++
CordovaMac/CordovaMac/Utils.h | 37 -
CordovaMac/CordovaMac/Utils.m | 94 -
CordovaMac/CordovaMac/WebViewDelegate.h | 36 -
CordovaMac/CordovaMac/WebViewDelegate.m | 87 -
CordovaMac/CordovaMac/config.xml | 35 +
CordovaMac/CordovaMac/en.lproj/Credits.rtf | 18 -
CordovaMac/CordovaMac/en.lproj/InfoPlist.strings | 23 -
CordovaMac/CordovaMac/en.lproj/MainMenu.xib | 3533 ---------------
92 files changed, 7062 insertions(+), 6888 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/Cordova.icns
----------------------------------------------------------------------
diff --git a/CordovaMac/Cordova.icns b/CordovaMac/Cordova.icns
deleted file mode 100644
index 20fc3d3..0000000
Binary files a/CordovaMac/Cordova.icns and /dev/null differ
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/CDVBridge.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/CDVBridge.h b/CordovaMac/CordovaLib/CDVBridge.h
new file mode 100644
index 0000000..171675f
--- /dev/null
+++ b/CordovaMac/CordovaLib/CDVBridge.h
@@ -0,0 +1,33 @@
+/*
+ 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 <Cocoa/Cocoa.h>
+@class WebView;
+
+@interface CDVBridge : NSObject {
+
+}
+
+@property (nonatomic, strong) WebView* webView;
+
+- (id) initWithWebView:(WebView*)webView;
+- (void) exec:(NSString*)callbackId withService:(NSString*)service andAction:(NSString*)action andArguments:(NSArray*)arguments;
+
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/CDVBridge.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/CDVBridge.m b/CordovaMac/CordovaLib/CDVBridge.m
new file mode 100644
index 0000000..4cbdf4b
--- /dev/null
+++ b/CordovaMac/CordovaLib/CDVBridge.m
@@ -0,0 +1,177 @@
+/*
+ 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 "CDVBridge.h"
+#import <WebKit/WebKit.h>
+#import <AppKit/AppKit.h>
+#import <Foundation/NSJSONSerialization.h>
+
+@implementation CDVBridge
+
+- (BOOL) isArray:(id)item
+{
+ id win = [self.webView windowScriptObject];
+ NSNumber* result = [win callWebScriptMethod:@"CordovaBridgeUtil.isArray" withArguments:[NSArray arrayWithObject:item]];
+
+ return [result boolValue];
+}
+
+- (BOOL) isDictionary:(id)item
+{
+ id win = [self.webView windowScriptObject];
+ NSNumber* result = [win callWebScriptMethod:@"CordovaBridgeUtil.isObject" withArguments:[NSArray arrayWithObject:item]];
+ return [result boolValue];
+}
+
+- (NSDictionary*) convertWebScriptObjectToNSDictionary:(WebScriptObject*)webScriptObject
+{
+ // Assumption: webScriptObject has already been tested using isDictionary:
+
+ id win = [self.webView windowScriptObject];
+
+ WebScriptObject* keysObject = [win callWebScriptMethod:@"CordovaBridgeUtil.getDictionaryKeys" withArguments:[NSArray arrayWithObject:webScriptObject]];
+ NSArray* keys = [self convertWebScriptObjectToNSArray:keysObject];
+ NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithCapacity:[keys count]];
+
+ NSEnumerator* enumerator = [keys objectEnumerator];
+ id key;
+ while (key = [enumerator nextObject]) {
+ [dict setObject:[webScriptObject valueForKey:key] forKey:key];
+ }
+
+ return dict;
+}
+
+- (NSArray*) convertWebScriptObjectToNSArray:(WebScriptObject*)webScriptObject
+{
+ // Assumption: webScriptObject has already been tested using isArray:
+
+ NSUInteger count = [[webScriptObject valueForKey:@"length"] integerValue];
+ NSMutableArray *a = [NSMutableArray array];
+ for (unsigned i = 0; i < count; i++) {
+ id item = [webScriptObject webScriptValueAtIndex:i];
+ if ([item isKindOfClass:[WebScriptObject class]]) {
+ if ([self isArray:item]) {
+ [a addObject:[self convertWebScriptObjectToNSArray:item]];
+ } else if ([self isDictionary:item]) {
+ [a addObject:[self convertWebScriptObjectToNSDictionary:item]];
+ };
+ } else {
+ [a addObject:item];
+ }
+ }
+
+ return a;
+}
+
+- (void) registerJavaScriptHelpers
+{
+ NSString* cordovaBridgeUtil = @"CordovaBridgeUtil = {};";
+ NSString* isArray = [NSString stringWithFormat:@"CordovaBridgeUtil.isArray = function(obj) { return obj.constructor == Array; };"];
+ NSString* isObject = [NSString stringWithFormat:@"CordovaBridgeUtil.isObject = function(obj) { return obj.constructor == Object; };"];
+ NSString* dictionaryKeys = [NSString stringWithFormat:
+ @" \
+ CordovaBridgeUtil.getDictionaryKeys = function(obj) { \
+ var a = []; \
+ for (var key in obj) { \
+ if (!obj.hasOwnProperty(key)) { \
+ continue; \
+ } \
+ a.push(key); \
+ } \
+ return a; \
+ }"
+ ];
+
+ id win = [self.webView windowScriptObject];
+ [win evaluateWebScript:cordovaBridgeUtil];
+ [win evaluateWebScript:isArray];
+ [win evaluateWebScript:isObject];
+ [win evaluateWebScript:dictionaryKeys];
+}
+
+- (id) initWithWebView:(WebView *)webView
+{
+ if ((self = [super init]) != nil) {
+ self.webView = webView;
+ [self registerJavaScriptHelpers];
+ }
+
+ return self;
+}
+
+- (void) exec:(NSString*)callbackId withService:(NSString*)service andAction:(NSString*)action andArguments:(WebScriptObject*)webScriptObject
+{
+ // We are going with the iOS method of passing in a callbackId.
+ // Note that we can use the JavaScriptCore C API to pass in the JavaScript function references
+ // and context and call them directly, but this is done this way for possible plugin sharing
+ // between iOS and OS X. Also we are going async as well.
+
+ // we're just going to assume the webScriptObject passed in is an NSArray
+ NSArray* arguments = [self convertWebScriptObjectToNSArray:webScriptObject];
+#pragma unused(arguments)
+
+ NSLog(@"TODO: [%@.%@] flesh out exec to dispatch the commands, possibly re-use iOS code", service, action);
+}
+
+#pragma mark WebScripting Protocol
+
+/* checks whether a selector is acceptable to be called from JavaScript */
++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector
+{
+ BOOL result = YES;
+
+ int i = 0;
+ static SEL * acceptableList = NULL;
+ SEL currentSelector;
+
+ if (acceptableList == NULL && (acceptableList = calloc(256, sizeof(SEL)))) // up to 256 selectors
+ {
+ acceptableList[i++] = @selector(exec:withService:andAction:andArguments:);
+ }
+
+ i = 0;
+ while (result == YES && (currentSelector = acceptableList[i++]))
+ {
+ //checking for exclusions
+ result = !(selector == currentSelector);
+ }
+
+ return result;
+}
+
+/* helper function so we don't have to have underscores and stuff in js to refer to the right method */
++ (NSString*) webScriptNameForSelector:(SEL)aSelector
+{
+ id result = nil;
+
+ if (aSelector == @selector(exec:withService:andAction:andArguments:)) {
+ result = @"exec";
+ }
+
+ return result;
+}
+
+// right now exclude all properties (eg keys)
++ (BOOL) isKeyExcludedFromWebScript:(const char*)name
+{
+ return YES;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDV.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDV.h b/CordovaMac/CordovaLib/Commands/CDV.h
new file mode 100644
index 0000000..6fe45d8
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDV.h
@@ -0,0 +1,27 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVAvailability.h"
+
+#import "CDVJSON.h"
+#import "CDVDebug.h"
+#import "CDVPluginResult.h"
+#import "CDVInvokedUrlCommand.h"
+#import "CDVPlugin.h"
+#import "CDVDevice.h"
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVAvailability.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVAvailability.h b/CordovaMac/CordovaLib/Commands/CDVAvailability.h
new file mode 100644
index 0000000..955051e
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVAvailability.h
@@ -0,0 +1,53 @@
+/*
+ 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_2_6_0 20600
+#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_6_0
+#endif
+
+
+/* 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-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVCommandDelegate.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVCommandDelegate.h b/CordovaMac/CordovaLib/Commands/CDVCommandDelegate.h
new file mode 100644
index 0000000..e177c63
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVCommandDelegate.h
@@ -0,0 +1,55 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVAvailability.h"
+#import "CDVInvokedUrlCommand.h"
+
+@class CDVPlugin;
+@class CDVPluginResult;
+@class CDVWhitelist;
+
+@protocol CDVCommandDelegate <NSObject>
+
+@property (nonatomic, readonly) NSDictionary* settings;
+
+- (NSString*)pathForResource:(NSString*)resourcepath;
+- (id)getCommandInstance:(NSString*)pluginName;
+- (void)registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className CDV_DEPRECATED(2.2, "Use CDVViewController to register plugins, or use config.xml.");
+
+// Plugins should not be using this interface to call other plugins since it
+// will result in bogus callbacks being made.
+- (BOOL)execute:(CDVInvokedUrlCommand*)command CDV_DEPRECATED(2.2, "Use direct method calls instead.");
+
+// Sends a plugin result to the JS. This is thread-safe.
+- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId;
+// Evaluates the given JS. This is thread-safe.
+- (void)evalJs:(NSString*)js;
+// Can be used to evaluate JS right away instead of scheduling it on the run-loop.
+// This is required for dispatch resign and pause events, but should not be used
+// without reason. Without the run-loop delay, alerts used in JS callbacks may result
+// in dead-lock. This method must be called from the UI thread.
+- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop;
+// Runs the given block on a background thread using a shared thread-pool.
+- (void)runInBackground:(void (^)())block;
+// Returns the User-Agent of the associated UIWebView.
+- (NSString*)userAgent;
+// Returns whether the given URL passes the white-list.
+- (BOOL)URLIsWhitelisted:(NSURL*)url;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.h b/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.h
new file mode 100644
index 0000000..733dd1d
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.h
@@ -0,0 +1,32 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVCommandDelegate.h"
+
+@class NSViewController;
+@class CDVCommandQueue;
+
+@interface CDVCommandDelegateImpl : NSObject <CDVCommandDelegate>{
+// @private
+ __weak NSViewController* _viewController;
+ @protected
+ __weak CDVCommandQueue* _commandQueue;
+}
+- (id)initWithViewController:(NSViewController*)viewController;
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.m b/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.m
new file mode 100644
index 0000000..2041b7e
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVCommandDelegateImpl.m
@@ -0,0 +1,160 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVCommandDelegateImpl.h"
+#import "CDVJSON.h"
+#import "CDVCommandQueue.h"
+#import "CDVPluginResult.h"
+
+@implementation CDVCommandDelegateImpl
+
+- (id)initWithViewController:(NSViewController*)viewController
+{
+ self = [super init];
+ if (self != nil) {
+ _viewController = viewController;
+ // TODO:
+ //_commandQueue = _viewController.commandQueue;
+ }
+ return self;
+}
+
+- (NSString*)pathForResource:(NSString*)resourcepath
+{
+ NSBundle* mainBundle = [NSBundle mainBundle];
+ NSMutableArray* directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]];
+ NSString* filename = [directoryParts lastObject];
+
+ [directoryParts removeLastObject];
+
+ NSString* directoryPartsJoined = [directoryParts componentsJoinedByString:@"/"];
+#pragma unused(directoryPartsJoined)
+ NSString* directoryStr = @""; //TODO: //_viewController.wwwFolderName;
+
+// TODO:
+// if ([directoryPartsJoined length] > 0) {
+// directoryStr = [NSString stringWithFormat:@"%@/%@", _viewController.wwwFolderName, [directoryParts componentsJoinedByString:@"/"]];
+// }
+
+ return [mainBundle pathForResource:filename ofType:@"" inDirectory:directoryStr];
+}
+
+- (void)evalJsHelper2:(NSString*)js
+{
+// TODO:
+// CDV_EXEC_LOG(@"Exec: evalling: %@", [js substringToIndex:MIN([js length], 160)]);
+// NSString* commandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString:js];
+// if ([commandsJSON length] > 0) {
+// CDV_EXEC_LOG(@"Exec: Retrieved new exec messages by chaining.");
+// }
+//
+// [_commandQueue enqueCommandBatch:commandsJSON];
+}
+
+- (void)evalJsHelper:(NSString*)js
+{
+ // Cycle the run-loop before executing the JS.
+ // This works around a bug where sometimes alerts() within callbacks can cause
+ // dead-lock.
+ // If the commandQueue is currently executing, then we know that it is safe to
+ // execute the callback immediately.
+ // Using (dispatch_get_main_queue()) does *not* fix deadlocks for some reaon,
+ // but performSelectorOnMainThread: does.
+ if (![NSThread isMainThread] || !_commandQueue.currentlyExecuting) {
+ [self performSelectorOnMainThread:@selector(evalJsHelper2:) withObject:js waitUntilDone:NO];
+ } else {
+ [self evalJsHelper2:js];
+ }
+}
+
+- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId
+{
+ CDV_EXEC_LOG(@"Exec(%@): Sending result. Status=%@", callbackId, result.status);
+ // This occurs when there is are no win/fail callbacks for the call.
+ if ([@"INVALID" isEqualToString:callbackId]) {
+ return;
+ }
+ int status = [result.status intValue];
+ BOOL keepCallback = [result.keepCallback boolValue];
+ NSString* argumentsAsJSON = [result argumentsAsJSON];
+
+ NSString* js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeCallback('%@',%d,%@,%d)", callbackId, status, argumentsAsJSON, keepCallback];
+
+ [self evalJsHelper:js];
+}
+
+- (void)evalJs:(NSString*)js
+{
+ [self evalJs:js scheduledOnRunLoop:YES];
+}
+
+- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop
+{
+ js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeEvalAndFetch(function(){%@})", js];
+ if (scheduledOnRunLoop) {
+ [self evalJsHelper:js];
+ } else {
+ [self evalJsHelper2:js];
+ }
+}
+
+- (BOOL)execute:(CDVInvokedUrlCommand*)command
+{
+ return [_commandQueue execute:command];
+}
+
+- (id)getCommandInstance:(NSString*)pluginName
+{
+ //TODO:
+// return [_viewController getCommandInstance:pluginName];
+}
+
+- (void)registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className
+{
+ //TODO:
+// [_viewController registerPlugin:plugin withClassName:className];
+}
+
+- (void)runInBackground:(void (^)())block
+{
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block);
+}
+
+- (NSString*)userAgent
+{
+ // TODO:
+// return [_viewController userAgent];
+}
+
+- (BOOL)URLIsWhitelisted:(NSURL*)url
+{
+// TODO:
+// return ![_viewController.whitelist schemeIsAllowed:[url scheme]] ||
+// [_viewController.whitelist URLIsAllowed:url];
+ return NO;
+}
+
+- (NSDictionary*)settings
+{
+ // TODO:
+// return _viewController.settings;
+ return nil;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVCommandQueue.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVCommandQueue.h b/CordovaMac/CordovaLib/Commands/CDVCommandQueue.h
new file mode 100644
index 0000000..27c47b5
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVCommandQueue.h
@@ -0,0 +1,40 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+@class CDVInvokedUrlCommand;
+@class CDVViewController;
+
+@interface CDVCommandQueue : NSObject
+
+@property (nonatomic, readonly) BOOL currentlyExecuting;
+
+- (id)initWithViewController:(CDVViewController*)viewController;
+- (void)dispose;
+
+- (void)resetRequestId;
+- (void)enqueCommandBatch:(NSString*)batchJSON;
+
+- (void)maybeFetchCommandsFromJs:(NSNumber*)requestId;
+- (void)fetchCommandsFromJs;
+- (void)executePending;
+- (BOOL)execute:(CDVInvokedUrlCommand*)command;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVCommandQueue.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVCommandQueue.m b/CordovaMac/CordovaLib/Commands/CDVCommandQueue.m
new file mode 100644
index 0000000..d80115e
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVCommandQueue.m
@@ -0,0 +1,164 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#include <objc/message.h>
+#import "CDV.h"
+#import "CDVCommandQueue.h"
+#import "CDVCommandDelegateImpl.h"
+
+@interface CDVCommandQueue () {
+ NSInteger _lastCommandQueueFlushRequestId;
+ __weak NSViewController* _viewController;
+ NSMutableArray* _queue;
+ BOOL _currentlyExecuting;
+}
+@end
+
+@implementation CDVCommandQueue
+
+@synthesize currentlyExecuting = _currentlyExecuting;
+
+- (id)initWithViewController:(NSViewController*)viewController
+{
+ self = [super init];
+ if (self != nil) {
+ _viewController = viewController;
+ _queue = [[NSMutableArray alloc] init];
+ }
+ return self;
+}
+
+- (void)dispose
+{
+ // TODO(agrieve): Make this a zeroing weak ref once we drop support for 4.3.
+ _viewController = nil;
+}
+
+- (void)resetRequestId
+{
+ _lastCommandQueueFlushRequestId = 0;
+}
+
+- (void)enqueCommandBatch:(NSString*)batchJSON
+{
+ if ([batchJSON length] > 0) {
+ [_queue addObject:batchJSON];
+ [self executePending];
+ }
+}
+
+- (void)maybeFetchCommandsFromJs:(NSNumber*)requestId
+{
+ // Use the request ID to determine if we've already flushed for this request.
+ // This is required only because the NSURLProtocol enqueues the same request
+ // multiple times.
+ if ([requestId integerValue] > _lastCommandQueueFlushRequestId) {
+ _lastCommandQueueFlushRequestId = [requestId integerValue];
+ [self fetchCommandsFromJs];
+ }
+}
+
+- (void)fetchCommandsFromJs
+{
+ // TODO:
+// // Grab all the queued commands from the JS side.
+// NSString* queuedCommandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString:
+// @"cordova.require('cordova/exec').nativeFetchMessages()"];
+//
+// [self enqueCommandBatch:queuedCommandsJSON];
+// if ([queuedCommandsJSON length] > 0) {
+// CDV_EXEC_LOG(@"Exec: Retrieved new exec messages by request.");
+// }
+}
+
+- (void)executePending
+{
+ // Make us re-entrant-safe.
+ if (_currentlyExecuting) {
+ return;
+ }
+ @try {
+ _currentlyExecuting = YES;
+
+ for (NSUInteger i = 0; i < [_queue count]; ++i) {
+ // Parse the returned JSON array.
+ NSArray* commandBatch = [[_queue objectAtIndex:i] JSONObject];
+
+ // Iterate over and execute all of the commands.
+ for (NSArray* jsonEntry in commandBatch) {
+ CDVInvokedUrlCommand* command = [CDVInvokedUrlCommand commandFromJson:jsonEntry];
+ CDV_EXEC_LOG(@"Exec(%@): Calling %@.%@", command.callbackId, command.className, command.methodName);
+
+ if (![self execute:command]) {
+#ifdef DEBUG
+ NSString* commandJson = [jsonEntry JSONString];
+ static NSUInteger maxLogLength = 1024;
+ NSString* commandString = ([commandJson length] > maxLogLength) ?
+ [NSString stringWithFormat:@"%@[...]", [commandJson substringToIndex:maxLogLength]] :
+ commandJson;
+
+ DLog(@"FAILED pluginJSON = %@", commandString);
+#endif
+ }
+ }
+ }
+
+ [_queue removeAllObjects];
+ } @finally
+ {
+ _currentlyExecuting = NO;
+ }
+}
+
+- (BOOL)execute:(CDVInvokedUrlCommand*)command
+{
+ if ((command.className == nil) || (command.methodName == nil)) {
+ NSLog(@"ERROR: Classname and/or methodName not found for command.");
+ return NO;
+ }
+
+ // Fetch an instance of this class
+ //TODO:
+// CDVPlugin* obj = [_viewController.commandDelegate getCommandInstance:command.className];
+//
+ CDVPlugin* obj = nil;
+
+ if (!([obj isKindOfClass:[CDVPlugin class]])) {
+ NSLog(@"ERROR: Plugin '%@' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml.", command.className);
+ return NO;
+ }
+ BOOL retVal = YES;
+
+ // Find the proper selector to call.
+ NSString* methodName = [NSString stringWithFormat:@"%@:", command.methodName];
+ SEL normalSelector = NSSelectorFromString(methodName);
+ // Test for the legacy selector first in case they both exist.
+ if ([obj respondsToSelector:normalSelector]) {
+ // [obj performSelector:normalSelector withObject:command];
+ objc_msgSend(obj, normalSelector, command);
+ } else {
+ // There's no method to call, so throw an error.
+ NSLog(@"ERROR: Method '%@' not defined in Plugin '%@'", methodName, command.className);
+ retVal = NO;
+ }
+
+ return retVal;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVConfigParser.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVConfigParser.h b/CordovaMac/CordovaLib/Commands/CDVConfigParser.h
new file mode 100644
index 0000000..7392580
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVConfigParser.h
@@ -0,0 +1,28 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+@interface CDVConfigParser : NSObject <NSXMLParserDelegate>{}
+
+@property (nonatomic, readonly, strong) NSMutableDictionary* pluginsDict;
+@property (nonatomic, readonly, strong) NSMutableDictionary* settings;
+@property (nonatomic, readonly, strong) NSMutableArray* whitelistHosts;
+@property (nonatomic, readonly, strong) NSMutableArray* startupPluginNames;
+@property (nonatomic, readonly, strong) NSString* startPage;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVConfigParser.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVConfigParser.m b/CordovaMac/CordovaLib/Commands/CDVConfigParser.m
new file mode 100644
index 0000000..6fd5913
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVConfigParser.m
@@ -0,0 +1,70 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVConfigParser.h"
+
+@interface CDVConfigParser ()
+
+@property (nonatomic, readwrite, strong) NSMutableDictionary* pluginsDict;
+@property (nonatomic, readwrite, strong) NSMutableDictionary* settings;
+@property (nonatomic, readwrite, strong) NSMutableArray* whitelistHosts;
+@property (nonatomic, readwrite, strong) NSMutableArray* startupPluginNames;
+@property (nonatomic, readwrite, strong) NSString* startPage;
+
+@end
+
+@implementation CDVConfigParser
+
+@synthesize pluginsDict, settings, whitelistHosts, startPage, startupPluginNames;
+
+- (id)init
+{
+ self = [super init];
+ if (self != nil) {
+ self.pluginsDict = [[NSMutableDictionary alloc] initWithCapacity:30];
+ self.settings = [[NSMutableDictionary alloc] initWithCapacity:30];
+ self.whitelistHosts = [[NSMutableArray alloc] initWithCapacity:30];
+ self.startupPluginNames = [[NSMutableArray alloc] initWithCapacity:8];
+ }
+ return self;
+}
+
+- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict
+{
+ if ([elementName isEqualToString:@"preference"]) {
+ settings[attributeDict[@"name"]] = attributeDict[@"value"];
+ } else if ([elementName isEqualToString:@"plugin"]) {
+ NSString* name = [attributeDict[@"name"] lowercaseString];
+ pluginsDict[name] = attributeDict[@"value"];
+ if ([@"true" isEqualToString:attributeDict[@"onload"]]) {
+ [self.startupPluginNames addObject:name];
+ }
+ } else if ([elementName isEqualToString:@"access"]) {
+ [whitelistHosts addObject:attributeDict[@"origin"]];
+ } else if ([elementName isEqualToString:@"content"]) {
+ self.startPage = attributeDict[@"src"];
+ }
+}
+
+- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError
+{
+ NSAssert(NO, @"config.xml parse error line %d col %d", [parser lineNumber], [parser columnNumber]);
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVConnection.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVConnection.h b/CordovaMac/CordovaLib/Commands/CDVConnection.h
new file mode 100644
index 0000000..d3e8c5d
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVConnection.h
@@ -0,0 +1,34 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Foundation/Foundation.h>
+#import "CDVPlugin.h"
+#import "CDVReachability.h"
+
+@interface CDVConnection : CDVPlugin {
+ NSString* type;
+ NSString* _callbackId;
+
+ CDVReachability* internetReach;
+}
+
+@property (copy) NSString* connectionType;
+@property (strong) CDVReachability* internetReach;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVConnection.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVConnection.m b/CordovaMac/CordovaLib/Commands/CDVConnection.m
new file mode 100644
index 0000000..61030d3
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVConnection.m
@@ -0,0 +1,125 @@
+/*
+ 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 "CDVConnection.h"
+#import "CDVReachability.h"
+
+@interface CDVConnection (PrivateMethods)
+- (void)updateOnlineStatus;
+- (void)sendPluginResult;
+@end
+
+@implementation CDVConnection
+
+@synthesize connectionType, internetReach;
+
+- (void)getConnectionInfo:(CDVInvokedUrlCommand*)command
+{
+ _callbackId = command.callbackId;
+ [self sendPluginResult];
+}
+
+- (void)sendPluginResult
+{
+ CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:self.connectionType];
+
+ [result setKeepCallbackAsBool:YES];
+ [self.commandDelegate sendPluginResult:result callbackId:_callbackId];
+}
+
+- (NSString*)w3cConnectionTypeFor:(CDVReachability*)reachability
+{
+ NetworkStatus networkStatus = [reachability currentReachabilityStatus];
+
+ switch (networkStatus) {
+ case NotReachable:
+ return @"none";
+
+ case ReachableViaWWAN:
+ return @"2g"; // no generic default, so we use the lowest common denominator
+
+ case ReachableViaWiFi:
+ return @"wifi";
+
+ default:
+ return @"unknown";
+ }
+}
+
+- (BOOL)isCellularConnection:(NSString*)theConnectionType
+{
+ return [theConnectionType isEqualToString:@"2g"] ||
+ [theConnectionType isEqualToString:@"3g"] ||
+ [theConnectionType isEqualToString:@"4g"];
+}
+
+- (void)updateReachability:(CDVReachability*)reachability
+{
+ if (reachability) {
+ // check whether the connection type has changed
+ NSString* newConnectionType = [self w3cConnectionTypeFor:reachability];
+ if ([newConnectionType isEqualToString:self.connectionType]) { // the same as before, remove dupes
+ return;
+ } else {
+ self.connectionType = [self w3cConnectionTypeFor:reachability];
+ }
+ }
+ [self sendPluginResult];
+}
+
+- (void)updateConnectionType:(NSNotification*)note
+{
+ CDVReachability* curReach = [note object];
+
+ if ((curReach != nil) && [curReach isKindOfClass:[CDVReachability class]]) {
+ [self updateReachability:curReach];
+ }
+}
+
+- (void)onPause
+{
+ [self.internetReach stopNotifier];
+}
+
+- (void)onResume
+{
+ [self.internetReach startNotifier];
+ [self updateReachability:self.internetReach];
+}
+
+- (CDVPlugin*)initWithWebView:(WebView*)theWebView
+{
+ self = [super initWithWebView:theWebView];
+ if (self) {
+ self.connectionType = @"none";
+ self.internetReach = [CDVReachability reachabilityForInternetConnection];
+ self.connectionType = [self w3cConnectionTypeFor:self.internetReach];
+ [self.internetReach startNotifier];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateConnectionType:)
+ name:kReachabilityChangedNotification object:nil];
+// TODO:
+// if (&UIApplicationDidEnterBackgroundNotification && &UIApplicationWillEnterForegroundNotification) {
+// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil];
+// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil];
+// }
+ }
+ return self;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVConsole.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVConsole.h b/CordovaMac/CordovaLib/Commands/CDVConsole.h
new file mode 100644
index 0000000..bb44368
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVConsole.h
@@ -0,0 +1,29 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+
+@interface CDVConsole : NSObject {
+
+}
+
+- (void) log:(NSString*)message;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVConsole.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVConsole.m b/CordovaMac/CordovaLib/Commands/CDVConsole.m
new file mode 100644
index 0000000..fc4b879
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVConsole.m
@@ -0,0 +1,75 @@
+/*
+ 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 "CDVConsole.h"
+
+
+@implementation CDVConsole
+
+
+- (void) log:(NSString*)message
+{
+ NSLog(@"%@", message);
+}
+
+#pragma mark WebScripting Protocol
+
+/* checks whether a selector is acceptable to be called from JavaScript */
++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector
+{
+ BOOL result = YES;
+
+ int i = 0;
+ static SEL * acceptableList = NULL;
+ SEL currentSelector;
+
+ if (acceptableList == NULL && (acceptableList = calloc(256, sizeof(SEL)))) // up to 256 selectors
+ {
+ acceptableList[i++] = @selector(log:);
+ }
+
+ i = 0;
+ while (result == YES && (currentSelector = acceptableList[i++]))
+ {
+ //checking for exclusions
+ result = !(selector == currentSelector);
+ }
+
+ return result;
+}
+
+/* helper function so we don't have to have underscores and stuff in js to refer to the right method */
++ (NSString*) webScriptNameForSelector:(SEL)aSelector
+{
+ id result = nil;
+
+ if (aSelector == @selector(log:)) {
+ result = @"log";
+ }
+
+ return result;
+}
+
+// right now exclude all properties (eg keys)
++ (BOOL) isKeyExcludedFromWebScript:(const char*)name
+{
+ return YES;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVDebug.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVDebug.h b/CordovaMac/CordovaLib/Commands/CDVDebug.h
new file mode 100644
index 0000000..4a0d9f9
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVDebug.h
@@ -0,0 +1,25 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#ifdef DEBUG
+ #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
+#else
+ #define DLog(...)
+#endif
+#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVDevice.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVDevice.h b/CordovaMac/CordovaLib/Commands/CDVDevice.h
new file mode 100644
index 0000000..81cffb7
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVDevice.h
@@ -0,0 +1,29 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVPlugin.h"
+
+@interface CDVDevice : CDVPlugin
+{}
+
++ (NSString*)cordovaVersion;
+
+- (void)getDeviceInfo:(CDVInvokedUrlCommand*)command;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVDevice.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVDevice.m b/CordovaMac/CordovaLib/Commands/CDVDevice.m
new file mode 100644
index 0000000..83ff1d3
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVDevice.m
@@ -0,0 +1,84 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#import "CDVDevice.h"
+#import "CDVAvailability.h"
+
+@implementation CDVDevice
+
+- (NSString*)modelVersion
+{
+ size_t size;
+
+ sysctlbyname("hw.machine", NULL, &size, NULL, 0);
+ char* machine = malloc(size);
+ sysctlbyname("hw.machine", machine, &size, NULL, 0);
+ NSString* platform = [NSString stringWithUTF8String:machine];
+ free(machine);
+
+ return platform;
+}
+
+- (NSString*)model
+{
+ return nil;
+}
+
+- (NSString*)uniqueAppInstanceIdentifier
+{
+ return nil;
+}
+
+- (NSString*)systemVersion
+{
+ return nil;
+}
+
+- (void)getDeviceInfo:(CDVInvokedUrlCommand*)command
+{
+ NSDictionary* deviceProperties = [self deviceProperties];
+ CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:deviceProperties];
+
+ [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+}
+
+- (NSDictionary*)deviceProperties
+{
+ NSMutableDictionary* devProps = [NSMutableDictionary dictionaryWithCapacity:4];
+
+ [devProps setObject:[self modelVersion] forKey:@"model"];
+ [devProps setObject:@"OS X" forKey:@"platform"];
+ [devProps setObject:[self systemVersion] forKey:@"version"];
+ [devProps setObject:[self uniqueAppInstanceIdentifier] forKey:@"uuid"];
+ [devProps setObject:[self model] forKey:@"name"];
+ [devProps setObject:[[self class] cordovaVersion] forKey:@"cordova"];
+
+ NSDictionary* devReturn = [NSDictionary dictionaryWithDictionary:devProps];
+ return devReturn;
+}
+
++ (NSString*)cordovaVersion
+{
+ return CDV_VERSION;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.h b/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.h
new file mode 100644
index 0000000..5f7e204
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.h
@@ -0,0 +1,52 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+@interface CDVInvokedUrlCommand : NSObject {
+ NSString* __weak _callbackId;
+ NSString* __weak _className;
+ NSString* __weak _methodName;
+ NSArray* __weak _arguments;
+}
+
+@property (weak, nonatomic, readonly) NSArray* arguments;
+@property (weak, nonatomic, readonly) NSString* callbackId;
+@property (weak, nonatomic, readonly) NSString* className;
+@property (weak, nonatomic, readonly) NSString* methodName;
+
++ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry;
+
+- (id)initWithArguments:(NSArray*)arguments
+ callbackId :(NSString*)callbackId
+ className :(NSString*)className
+ methodName :(NSString*)methodName;
+
+- (id)initFromJson:(NSArray*)jsonEntry;
+
+// Returns the argument at the given index.
+// If index >= the number of arguments, returns nil.
+// If the argument at the given index is NSNull, returns nil.
+- (id)argumentAtIndex:(NSUInteger)index;
+// Same as above, but returns defaultValue instead of nil.
+- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue;
+// Same as above, but returns defaultValue instead of nil, and if the argument is not of the expected class, returns defaultValue
+- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.m b/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.m
new file mode 100644
index 0000000..6c7a856
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVInvokedUrlCommand.m
@@ -0,0 +1,140 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVInvokedUrlCommand.h"
+#import "CDVJSON.h"
+#import "NSData+Base64.h"
+
+@implementation CDVInvokedUrlCommand
+
+@synthesize arguments = _arguments;
+@synthesize callbackId = _callbackId;
+@synthesize className = _className;
+@synthesize methodName = _methodName;
+
++ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry
+{
+ return [[CDVInvokedUrlCommand alloc] initFromJson:jsonEntry];
+}
+
+- (id)initFromJson:(NSArray*)jsonEntry
+{
+ id tmp = [jsonEntry objectAtIndex:0];
+ NSString* callbackId = tmp == [NSNull null] ? nil : tmp;
+ NSString* className = [jsonEntry objectAtIndex:1];
+ NSString* methodName = [jsonEntry objectAtIndex:2];
+ NSMutableArray* arguments = [jsonEntry objectAtIndex:3];
+
+ return [self initWithArguments:arguments
+ callbackId:callbackId
+ className:className
+ methodName:methodName];
+}
+
+- (id)initWithArguments:(NSArray*)arguments
+ callbackId:(NSString*)callbackId
+ className:(NSString*)className
+ methodName:(NSString*)methodName
+{
+ self = [super init];
+ if (self != nil) {
+ _arguments = arguments;
+ _callbackId = callbackId;
+ _className = className;
+ _methodName = methodName;
+ }
+ [self massageArguments];
+ return self;
+}
+
+- (void)massageArguments
+{
+ NSMutableArray* newArgs = nil;
+
+ for (NSUInteger i = 0, count = [_arguments count]; i < count; ++i) {
+ id arg = [_arguments objectAtIndex:i];
+ if (![arg isKindOfClass:[NSDictionary class]]) {
+ continue;
+ }
+ NSDictionary* dict = arg;
+ NSString* type = [dict objectForKey:@"CDVType"];
+ if (!type || ![type isEqualToString:@"ArrayBuffer"]) {
+ continue;
+ }
+ NSString* data = [dict objectForKey:@"data"];
+ if (!data) {
+ continue;
+ }
+ if (newArgs == nil) {
+ newArgs = [NSMutableArray arrayWithArray:_arguments];
+ _arguments = newArgs;
+ }
+ [newArgs replaceObjectAtIndex:i withObject:[NSData dataFromBase64String:data]];
+ }
+}
+
+- (void)legacyArguments:(NSMutableArray**)legacyArguments andDict:(NSMutableDictionary**)legacyDict
+{
+ NSMutableArray* newArguments = [NSMutableArray arrayWithArray:_arguments];
+
+ for (NSUInteger i = 0; i < [newArguments count]; ++i) {
+ if ([[newArguments objectAtIndex:i] isKindOfClass:[NSDictionary class]]) {
+ if (legacyDict != NULL) {
+ *legacyDict = [newArguments objectAtIndex:i];
+ }
+ [newArguments removeObjectAtIndex:i];
+ break;
+ }
+ }
+
+ // Legacy (two versions back) has no callbackId.
+ if (_callbackId != nil) {
+ [newArguments insertObject:_callbackId atIndex:0];
+ }
+ if (legacyArguments != NULL) {
+ *legacyArguments = newArguments;
+ }
+}
+
+- (id)argumentAtIndex:(NSUInteger)index
+{
+ return [self argumentAtIndex:index withDefault:nil];
+}
+
+- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue
+{
+ return [self argumentAtIndex:index withDefault:defaultValue andClass:nil];
+}
+
+- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass
+{
+ if (index >= [_arguments count]) {
+ return defaultValue;
+ }
+ id ret = [_arguments objectAtIndex:index];
+ if (ret == [NSNull null]) {
+ ret = defaultValue;
+ }
+ if ((aClass != nil) && ![ret isKindOfClass:aClass]) {
+ ret = defaultValue;
+ }
+ return ret;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVJSON.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVJSON.h b/CordovaMac/CordovaLib/Commands/CDVJSON.h
new file mode 100644
index 0000000..eaa895e
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVJSON.h
@@ -0,0 +1,30 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+@interface NSArray (CDVJSONSerializing)
+- (NSString*)JSONString;
+@end
+
+@interface NSDictionary (CDVJSONSerializing)
+- (NSString*)JSONString;
+@end
+
+@interface NSString (CDVJSONSerializing)
+- (id)JSONObject;
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVJSON.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVJSON.m b/CordovaMac/CordovaLib/Commands/CDVJSON.m
new file mode 100644
index 0000000..78267e5
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVJSON.m
@@ -0,0 +1,77 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVJSON.h"
+#import <Foundation/NSJSONSerialization.h>
+
+@implementation NSArray (CDVJSONSerializing)
+
+- (NSString*)JSONString
+{
+ NSError* error = nil;
+ NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self
+ options:NSJSONWritingPrettyPrinted
+ error:&error];
+
+ if (error != nil) {
+ NSLog(@"NSArray JSONString error: %@", [error localizedDescription]);
+ return nil;
+ } else {
+ return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+ }
+}
+
+@end
+
+@implementation NSDictionary (CDVJSONSerializing)
+
+- (NSString*)JSONString
+{
+ NSError* error = nil;
+ NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self
+ options:NSJSONWritingPrettyPrinted
+ error:&error];
+
+ if (error != nil) {
+ NSLog(@"NSDictionary JSONString error: %@", [error localizedDescription]);
+ return nil;
+ } else {
+ return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+ }
+}
+
+@end
+
+@implementation NSString (CDVJSONSerializing)
+
+- (id)JSONObject
+{
+ NSError* error = nil;
+ id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding]
+ options:kNilOptions
+ error:&error];
+
+ if (error != nil) {
+ NSLog(@"NSString JSONObject error: %@", [error localizedDescription]);
+ }
+
+ return object;
+}
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVPlugin.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVPlugin.h b/CordovaMac/CordovaLib/Commands/CDVPlugin.h
new file mode 100644
index 0000000..8f8d1a1
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVPlugin.h
@@ -0,0 +1,64 @@
+/*
+ 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 <WebKit/WebKit.h>
+#import "CDVPluginResult.h"
+#import "NSMutableArray+QueueAdditions.h"
+#import "CDVCommandDelegate.h"
+
+NSString* const CDVPageDidLoadNotification;
+NSString* const CDVPluginHandleOpenURLNotification;
+NSString* const CDVPluginResetNotification;
+NSString* const CDVLocalNotification;
+
+@interface CDVPlugin : NSObject {}
+
+@property (nonatomic, weak) WebView* webView;
+@property (nonatomic, unsafe_unretained) NSViewController* viewController;
+@property (nonatomic, unsafe_unretained) id <CDVCommandDelegate> commandDelegate;
+
+@property (readonly, assign) BOOL hasPendingOperation;
+
+- (CDVPlugin*)initWithWebView:(WebView*)theWebView;
+- (void)pluginInitialize;
+
+- (void)handleOpenURL:(NSNotification*)notification;
+- (void)onAppTerminate;
+- (void)onMemoryWarning;
+- (void)onReset;
+- (void)dispose;
+
+/*
+ // see initWithWebView implementation
+ - (void) onPause {}
+ - (void) onResume {}
+ - (void) onOrientationWillChange {}
+ - (void) onOrientationDidChange {}
+ - (void)didReceiveLocalNotification:(NSNotification *)notification;
+ */
+
+- (id)appDelegate;
+
+// TODO(agrieve): Deprecate these in favour of using CDVCommandDelegate directly.
+- (NSString*)writeJavascript:(NSString*)javascript;
+- (NSString*)success:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId;
+- (NSString*)error:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVPlugin.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVPlugin.m b/CordovaMac/CordovaLib/Commands/CDVPlugin.m
new file mode 100644
index 0000000..6301fac
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVPlugin.m
@@ -0,0 +1,148 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVPlugin.h"
+
+NSString* const CDVPageDidLoadNotification = @"CDVPageDidLoadNotification";
+NSString* const CDVPluginHandleOpenURLNotification = @"CDVPluginHandleOpenURLNotification";
+NSString* const CDVPluginResetNotification = @"CDVPluginResetNotification";
+NSString* const CDVLocalNotification = @"CDVLocalNotification";
+
+@interface CDVPlugin ()
+
+@property (readwrite, assign) BOOL hasPendingOperation;
+
+@end
+
+@implementation CDVPlugin
+@synthesize webView, viewController, commandDelegate, hasPendingOperation;
+
+- (CDVPlugin*)initWithWebView:(WebView*)theWebView
+{
+ self = [super init];
+ if (self) {
+// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppTerminate) name:UIApplicationWillTerminateNotification object:nil];
+// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:CDVPluginHandleOpenURLNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReset) name:CDVPluginResetNotification object:theWebView];
+
+ self.webView = theWebView;
+ }
+ return self;
+}
+
+- (void)pluginInitialize
+{
+ // You can listen to more app notifications, see:
+ // http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-DontLinkElementID_4
+
+ // NOTE: if you want to use these, make sure you uncomment the corresponding notification handler
+
+ // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil];
+ // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil];
+ // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationWillChange) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];
+ // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationDidChange) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
+
+ // Added in 2.3.0
+ // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveLocalNotification:) name:CDVLocalNotification object:nil];
+
+ // Added in 2.5.0
+ // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pageDidLoad:) name:CDVPageDidLoadNotification object:self.webView];
+}
+
+- (void)dispose
+{
+ viewController = nil;
+ commandDelegate = nil;
+ webView = nil;
+}
+
+/*
+// NOTE: for onPause and onResume, calls into JavaScript must not call or trigger any blocking UI, like alerts
+- (void) onPause {}
+- (void) onResume {}
+- (void) onOrientationWillChange {}
+- (void) onOrientationDidChange {}
+*/
+
+/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */
+- (void)handleOpenURL:(NSNotification*)notification
+{
+ // override to handle urls sent to your app
+ // register your url schemes in your App-Info.plist
+
+ NSURL* url = [notification object];
+
+ if ([url isKindOfClass:[NSURL class]]) {
+ /* Do your thing! */
+ }
+}
+
+/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */
+- (void)onAppTerminate
+{
+ // override this if you need to do any cleanup on app exit
+}
+
+- (void)onMemoryWarning
+{
+ // override to remove caches, etc
+}
+
+- (void)onReset
+{
+ // Override to cancel any long-running requests when the WebView navigates or refreshes.
+}
+
+- (void)dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self]; // this will remove all notification unless added using addObserverForName:object:queue:usingBlock:
+}
+
+- (id)appDelegate
+{
+ // TODO:
+ //return [[UIApplication sharedApplication] delegate];
+ return nil;
+}
+
+- (NSString*)writeJavascript:(NSString*)javascript
+{
+ return [self.webView stringByEvaluatingJavaScriptFromString:javascript];
+}
+
+- (NSString*)success:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId
+{
+ [self.commandDelegate evalJs:[pluginResult toSuccessCallbackString:callbackId]];
+ return @"";
+}
+
+- (NSString*)error:(CDVPluginResult*)pluginResult callbackId:(NSString*)callbackId
+{
+ [self.commandDelegate evalJs:[pluginResult toErrorCallbackString:callbackId]];
+ return @"";
+}
+
+// default implementation does nothing, ideally, we are not registered for notification if we aren't going to do anything.
+// - (void)didReceiveLocalNotification:(NSNotification *)notification
+// {
+// // UILocalNotification* localNotification = [notification object]; // get the payload as a LocalNotification
+// }
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVPluginResult.h
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVPluginResult.h b/CordovaMac/CordovaLib/Commands/CDVPluginResult.h
new file mode 100644
index 0000000..8393df2
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVPluginResult.h
@@ -0,0 +1,65 @@
+/*
+ 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>
+
+typedef enum {
+ CDVCommandStatus_NO_RESULT = 0,
+ CDVCommandStatus_OK,
+ CDVCommandStatus_CLASS_NOT_FOUND_EXCEPTION,
+ CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION,
+ CDVCommandStatus_INSTANTIATION_EXCEPTION,
+ CDVCommandStatus_MALFORMED_URL_EXCEPTION,
+ CDVCommandStatus_IO_EXCEPTION,
+ CDVCommandStatus_INVALID_ACTION,
+ CDVCommandStatus_JSON_EXCEPTION,
+ CDVCommandStatus_ERROR
+} CDVCommandStatus;
+
+@interface CDVPluginResult : NSObject {}
+
+@property (nonatomic, strong, readonly) NSNumber* status;
+@property (nonatomic, strong, readonly) id message;
+@property (nonatomic, strong) NSNumber* keepCallback;
+
+- (CDVPluginResult*)init;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages;
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode;
+
++ (void)setVerbose:(BOOL)verbose;
++ (BOOL)isVerbose;
+
+- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback;
+
+- (NSString*)argumentsAsJSON;
+
+// These methods are used by the legacy plugin return result method
+- (NSString*)toJSONString;
+- (NSString*)toSuccessCallbackString:(NSString*)callbackId;
+- (NSString*)toErrorCallbackString:(NSString*)callbackId;
+
+@end
http://git-wip-us.apache.org/repos/asf/cordova-osx/blob/e1c85923/CordovaMac/CordovaLib/Commands/CDVPluginResult.m
----------------------------------------------------------------------
diff --git a/CordovaMac/CordovaLib/Commands/CDVPluginResult.m b/CordovaMac/CordovaLib/Commands/CDVPluginResult.m
new file mode 100644
index 0000000..a03e005
--- /dev/null
+++ b/CordovaMac/CordovaLib/Commands/CDVPluginResult.m
@@ -0,0 +1,224 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+#import "CDVPluginResult.h"
+#import "CDVJSON.h"
+#import "CDVDebug.h"
+#import "NSData+Base64.h"
+
+@interface CDVPluginResult ()
+
+- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage;
+
+@end
+
+@implementation CDVPluginResult
+@synthesize status, message, keepCallback;
+
+static NSArray* org_apache_cordova_CommandStatusMsgs;
+
+id messageFromArrayBuffer(NSData* data)
+{
+ return @{
+ @"CDVType" : @"ArrayBuffer",
+ @"data" :[data base64EncodedString]
+ };
+}
+
+id massageMessage(id message)
+{
+ if ([message isKindOfClass:[NSData class]]) {
+ return messageFromArrayBuffer(message);
+ }
+ return message;
+}
+
+id messageFromMultipart(NSArray* theMessages)
+{
+ NSMutableArray* messages = [NSMutableArray arrayWithArray:theMessages];
+
+ for (NSUInteger i = 0; i < messages.count; ++i) {
+ [messages replaceObjectAtIndex:i withObject:massageMessage([messages objectAtIndex:i])];
+ }
+
+ return @{
+ @"CDVType" : @"MultiPart",
+ @"messages" : messages
+ };
+}
+
++ (void)initialize
+{
+ org_apache_cordova_CommandStatusMsgs = [[NSArray alloc] initWithObjects:@"No result",
+ @"OK",
+ @"Class not found",
+ @"Illegal access",
+ @"Instantiation error",
+ @"Malformed url",
+ @"IO error",
+ @"Invalid action",
+ @"JSON error",
+ @"Error",
+ nil];
+}
+
+- (CDVPluginResult*)init
+{
+ return [self initWithStatus:CDVCommandStatus_NO_RESULT message:nil];
+}
+
+- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage
+{
+ self = [super init];
+ if (self) {
+ status = [NSNumber numberWithInt:statusOrdinal];
+ message = theMessage;
+ keepCallback = [NSNumber numberWithBool:NO];
+ }
+ return self;
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:[org_apache_cordova_CommandStatusMsgs objectAtIndex:statusOrdinal]];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:theMessage];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:theMessage];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithInt:theMessage]];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithDouble:theMessage]];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithBool:theMessage]];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:theMessage];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:messageFromArrayBuffer(theMessage)];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages
+{
+ return [[self alloc] initWithStatus:statusOrdinal message:messageFromMultipart(theMessages)];
+}
+
++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode
+{
+ NSDictionary* errDict = @{@"code": [NSNumber numberWithInt:errorCode]};
+
+ return [[self alloc] initWithStatus:statusOrdinal message:errDict];
+}
+
+- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback
+{
+ [self setKeepCallback:[NSNumber numberWithBool:bKeepCallback]];
+}
+
+- (NSString*)argumentsAsJSON
+{
+ id arguments = (self.message == nil ? [NSNull null] : self.message);
+ NSArray* argumentsWrappedInArray = [NSArray arrayWithObject:arguments];
+
+ NSString* argumentsJSON = [argumentsWrappedInArray JSONString];
+
+ argumentsJSON = [argumentsJSON substringWithRange:NSMakeRange(1, [argumentsJSON length] - 2)];
+
+ return argumentsJSON;
+}
+
+// These methods are used by the legacy plugin return result method
+- (NSString*)toJSONString
+{
+ NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
+ self.status, @"status",
+ self.message ? self. message:[NSNull null], @"message",
+ self.keepCallback, @"keepCallback",
+ nil];
+
+ NSError* error = nil;
+ NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dict
+ options:NSJSONWritingPrettyPrinted
+ error:&error];
+ NSString* resultString = nil;
+
+ if (error != nil) {
+ NSLog(@"toJSONString error: %@", [error localizedDescription]);
+ } else {
+ resultString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+ }
+
+ if ([[self class] isVerbose]) {
+ NSLog(@"PluginResult:toJSONString - %@", resultString);
+ }
+ return resultString;
+}
+
+- (NSString*)toSuccessCallbackString:(NSString*)callbackId
+{
+ NSString* successCB = [NSString stringWithFormat:@"cordova.callbackSuccess('%@',%@);", callbackId, [self toJSONString]];
+
+ if ([[self class] isVerbose]) {
+ NSLog(@"PluginResult toSuccessCallbackString: %@", successCB);
+ }
+ return successCB;
+}
+
+- (NSString*)toErrorCallbackString:(NSString*)callbackId
+{
+ NSString* errorCB = [NSString stringWithFormat:@"cordova.callbackError('%@',%@);", callbackId, [self toJSONString]];
+
+ if ([[self class] isVerbose]) {
+ NSLog(@"PluginResult toErrorCallbackString: %@", errorCB);
+ }
+ return errorCB;
+}
+
+static BOOL gIsVerbose = NO;
++ (void)setVerbose:(BOOL)verbose
+{
+ gIsVerbose = verbose;
+}
+
++ (BOOL)isVerbose
+{
+ return gIsVerbose;
+}
+
+@end