aboutsummaryrefslogtreecommitdiffhomepage
path: root/example/mac
diff options
context:
space:
mode:
authorGravatar Jonathan Willing <jwilling@me.com>2013-05-18 20:47:25 -0500
committerGravatar Jonathan Willing <jwilling@me.com>2013-05-18 20:47:25 -0500
commitde90bb23b390da9d5adde5dffe92f0bd75dd5309 (patch)
tree77dbeff1e7626dc74592a25778543c1541db9771 /example/mac
parent6e0b88498cf83995ac40dbebc2f4709e8e457eb5 (diff)
store password in keychain on OS X demo, switch to bindings
Diffstat (limited to 'example/mac')
-rw-r--r--example/mac/macExample/macExample.xcodeproj/project.pbxproj18
-rw-r--r--example/mac/macExample/macExample/AppDelegate.h5
-rw-r--r--example/mac/macExample/macExample/AppDelegate.m143
3 files changed, 84 insertions, 82 deletions
diff --git a/example/mac/macExample/macExample.xcodeproj/project.pbxproj b/example/mac/macExample/macExample.xcodeproj/project.pbxproj
index 3513d61e..baab11de 100644
--- a/example/mac/macExample/macExample.xcodeproj/project.pbxproj
+++ b/example/mac/macExample/macExample.xcodeproj/project.pbxproj
@@ -7,6 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
+ AB666C5917484E6200545290 /* FXKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = AB666C5817484E6200545290 /* FXKeychain.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
+ AB666C5B1748558000545290 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB666C5A1748558000545290 /* Security.framework */; };
C64FF38416AF97F400F8C162 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = C64FF38316AF97F400F8C162 /* main.mm */; };
C6BD2873170BC5C500A91AC1 /* MCOCIDURLProtocol.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6BD2870170BC5C500A91AC1 /* MCOCIDURLProtocol.mm */; };
C6BD2874170BC5C500A91AC1 /* MCOMessageView.mm in Sources */ = {isa = PBXBuildFile; fileRef = C6BD2872170BC5C500A91AC1 /* MCOMessageView.mm */; };
@@ -65,6 +67,9 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
+ AB666C5717484E6200545290 /* FXKeychain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FXKeychain.h; path = ../../../common/FXKeychain.h; sourceTree = "<group>"; };
+ AB666C5817484E6200545290 /* FXKeychain.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FXKeychain.m; path = ../../../common/FXKeychain.m; sourceTree = "<group>"; };
+ AB666C5A1748558000545290 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
C64FF38316AF97F400F8C162 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
C6BD286F170BC5C500A91AC1 /* MCOCIDURLProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOCIDURLProtocol.h; sourceTree = "<group>"; };
C6BD2870170BC5C500A91AC1 /* MCOCIDURLProtocol.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOCIDURLProtocol.mm; sourceTree = "<group>"; };
@@ -92,6 +97,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ AB666C5B1748558000545290 /* Security.framework in Frameworks */,
C6BD28B4170BDFE500A91AC1 /* MailCore.framework in Frameworks */,
C6D42BE516ABB511002BB4F9 /* WebKit.framework in Frameworks */,
C6D42BB616ABB39A002BB4F9 /* Cocoa.framework in Frameworks */,
@@ -101,6 +107,15 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
+ AB666C5217484E3100545290 /* External */ = {
+ isa = PBXGroup;
+ children = (
+ AB666C5717484E6200545290 /* FXKeychain.h */,
+ AB666C5817484E6200545290 /* FXKeychain.m */,
+ );
+ name = External;
+ sourceTree = "<group>";
+ };
C6BD286D170BC5C500A91AC1 /* ui */ = {
isa = PBXGroup;
children = (
@@ -171,6 +186,7 @@
C6D42BB416ABB39A002BB4F9 /* Frameworks */ = {
isa = PBXGroup;
children = (
+ AB666C5A1748558000545290 /* Security.framework */,
C6D42BE416ABB511002BB4F9 /* WebKit.framework */,
C6D42BB516ABB39A002BB4F9 /* Cocoa.framework */,
C6D42BB716ABB39A002BB4F9 /* Other Frameworks */,
@@ -191,6 +207,7 @@
C6D42BBB16ABB39A002BB4F9 /* macExample */ = {
isa = PBXGroup;
children = (
+ AB666C5217484E3100545290 /* External */,
C6D42BBC16ABB39A002BB4F9 /* Supporting Files */,
C6D42BC716ABB39A002BB4F9 /* AppDelegate.h */,
C6D42BC816ABB39A002BB4F9 /* AppDelegate.m */,
@@ -325,6 +342,7 @@
C64FF38416AF97F400F8C162 /* main.mm in Sources */,
C6BD2873170BC5C500A91AC1 /* MCOCIDURLProtocol.mm in Sources */,
C6BD2874170BC5C500A91AC1 /* MCOMessageView.mm in Sources */,
+ AB666C5917484E6200545290 /* FXKeychain.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/example/mac/macExample/macExample/AppDelegate.h b/example/mac/macExample/macExample/AppDelegate.h
index 1d0ba332..baa48894 100644
--- a/example/mac/macExample/macExample/AppDelegate.h
+++ b/example/mac/macExample/macExample/AppDelegate.h
@@ -11,11 +11,6 @@
@class MCTMsgListViewController;
@interface AppDelegate : NSObject <NSApplicationDelegate> {
- IBOutlet NSButton * _loginButton;
- IBOutlet NSButton * _cancelButton;
- IBOutlet NSTextField * _loginTextField;
- IBOutlet NSTextField * _passwordTextField;
- IBOutlet NSProgressIndicator * _progressView;
IBOutlet MCTMsgListViewController * _msgListViewController;
IBOutlet NSWindow * _accountWindow;
}
diff --git a/example/mac/macExample/macExample/AppDelegate.m b/example/mac/macExample/macExample/AppDelegate.m
index 12c744e8..8ba89c37 100644
--- a/example/mac/macExample/macExample/AppDelegate.m
+++ b/example/mac/macExample/macExample/AppDelegate.m
@@ -11,15 +11,20 @@
#import <MailCore/MailCore.h>
#import "MCTMsgListViewController.h"
+#import "FXKeychain.h"
@interface AppDelegate () <NSTextFieldDelegate>
+@property (nonatomic, copy) NSString *login;
+@property (nonatomic, copy) NSString *hostname;
+@property (nonatomic, copy) NSString *password;
+@property (nonatomic, readonly) BOOL loginEnabled;
+@property (nonatomic, readonly) BOOL loggingIn;
+@property (nonatomic, retain) MCOIMAPSession *session;
+@property (nonatomic, retain) MCOIMAPOperation *checkOp;
@end
-@implementation AppDelegate {
- MCOIMAPSession * _session;
- MCOIMAPOperation * _checkOp;
-}
+@implementation AppDelegate
- (void) dealloc
{
@@ -28,61 +33,57 @@
- (void) awakeFromNib
{
- [_loginTextField setDelegate:self];
- [_passwordTextField setDelegate:self];
-}
-
-- (void) applicationDidFinishLaunching:(NSNotification *)aNotification
-{
- [self _updateState];
-
- NSString * login = [[NSUserDefaults standardUserDefaults] stringForKey:@"Login"];
- NSString * password = [[NSUserDefaults standardUserDefaults] stringForKey:@"Password"];
-
- if (([login length] == 0) || ([password length] == 0)) {
- [_accountWindow makeKeyAndOrderFront:nil];
- }
- else {
- [_loginTextField setStringValue:login];
- [_passwordTextField setStringValue:password];
- }
+ [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"Hostname": @"imap.gmail.com" }];
+
+ self.login = [[NSUserDefaults standardUserDefaults] stringForKey:@"Login"];
+ self.hostname = [[NSUserDefaults standardUserDefaults] stringForKey:@"Hostname"];
+ self.password = [[FXKeychain defaultKeychain] objectForKey:@"Password"];
+
+ if (self.login.length && self.password.length) {
+ [self accountLogin:nil];
+ } else {
+ [_accountWindow makeKeyAndOrderFront:nil];
+ }
}
- (void) accountLogin:(id)sender
{
- NSString * login = [_loginTextField stringValue];
- NSString * password = [_passwordTextField stringValue];
-
NSLog(@"try login");
- _session = [[MCOIMAPSession alloc] init];
- [_session setHostname:@"imap.gmail.com"];
- [_session setPort:993];
- [_session setUsername:login];
- [_session setPassword:password];
- [_session setConnectionType:MCOConnectionTypeTLS];
- _checkOp = [[_session checkAccountOperation] retain];
- NSLog(@"start op");
- [_checkOp start:^(NSError * error) {
+ [[NSUserDefaults standardUserDefaults] setObject:self.login forKey:@"Login"];
+ [[NSUserDefaults standardUserDefaults] setObject:self.hostname forKey:@"Hostname"];
+
+ if (![[[FXKeychain defaultKeychain] objectForKey:@"Password"] isEqualToString:self.password]) {
+ [[FXKeychain defaultKeychain] removeObjectForKey:@"Password"];
+ [[FXKeychain defaultKeychain] setObject:self.password forKey:@"Password"];
+ }
+
+ self.session = [[MCOIMAPSession alloc] init];
+ [self.session setHostname:self.hostname];
+ [self.session setPort:993];
+ [self.session setUsername:self.login];
+ [self.session setPassword:self.password];
+ [self.session setConnectionType:MCOConnectionTypeTLS];
+ self.checkOp = [self.session checkAccountOperation];
+
+ NSLog(@"start op");
+ [self.checkOp start:^(NSError * error) {
[_accountWindow orderOut:nil];
-
- NSString * login = [_loginTextField stringValue];
- NSString * password = [_passwordTextField stringValue];
- [[NSUserDefaults standardUserDefaults] setObject:login forKey:@"Login"];
- [[NSUserDefaults standardUserDefaults] setObject:password forKey:@"Password"];
-
- [_checkOp release];
+
+ [self willChangeValueForKey:@"loggingIn"];
+
+ [self.checkOp release];
_checkOp = nil;
- [_session release];
+ [self.session release];
_session = nil;
-
- [self _updateState];
-
- NSLog(@"op done %@", error);
-
- [_msgListViewController connect];
- }];
-
- [self _updateState];
+
+ [self didChangeValueForKey:@"loggingIn"];
+
+ NSLog(@"op done (error: %@)", error);
+ if (error != nil)
+ [_accountWindow makeKeyAndOrderFront:nil];
+
+ [_msgListViewController connectWithHostname:self.hostname login:self.login password:self.password];
+ }];
}
- (void) accountCancel:(id)sender
@@ -92,38 +93,26 @@
_checkOp = nil;
[_session release];
_session = nil;
-
- [self _updateState];
}
-- (void) _updateState
++ (NSSet *)keyPathsForValuesAffectingLoginEnabled
+{
+ return [NSSet setWithObjects:@"password", @"login", @"hostname", nil];
+}
+
++ (NSSet *)keyPathsForValuesAffectingLoggingIn
+{
+ return [NSSet setWithObjects:@"checkOp", nil];
+}
+
+- (BOOL)loginEnabled
{
- if (_checkOp == nil) {
- [_loginTextField setEnabled:YES];
- [_passwordTextField setEnabled:YES];
- NSString * login = [_loginTextField stringValue];
- NSString * password = [_passwordTextField stringValue];
- if (([login length] > 0) && ([password length] > 0)) {
- [_loginButton setEnabled:YES];
- }
- else {
- [_loginButton setEnabled:NO];
- }
- [_cancelButton setEnabled:NO];
- [_progressView stopAnimation:nil];
- }
- else {
- [_loginTextField setEnabled:NO];
- [_passwordTextField setEnabled:NO];
- [_loginButton setEnabled:NO];
- [_cancelButton setEnabled:YES];
- [_progressView startAnimation:nil];
- }
+ return self.password.length && self.login.length && self.hostname.length && _checkOp == nil;
}
-- (void) controlTextDidChange:(NSNotification *)aNotification
+- (BOOL)loggingIn
{
- [self _updateState];
+ return (self.checkOp != nil);
}
@end