Statistics
| Branch: | Revision:

root / asi-http-request-with-pithos / Classes / ASIAuthenticationDialog.m @ cc176feb

History | View | Annotate | Download (15.8 kB)

1 be116d22 Miltiadis Vasilakis
//
2 be116d22 Miltiadis Vasilakis
//  ASIAuthenticationDialog.m
3 be116d22 Miltiadis Vasilakis
//  Part of ASIHTTPRequest -> http://allseeing-i.com/ASIHTTPRequest
4 be116d22 Miltiadis Vasilakis
//
5 be116d22 Miltiadis Vasilakis
//  Created by Ben Copsey on 21/08/2009.
6 be116d22 Miltiadis Vasilakis
//  Copyright 2009 All-Seeing Interactive. All rights reserved.
7 be116d22 Miltiadis Vasilakis
//
8 be116d22 Miltiadis Vasilakis
9 be116d22 Miltiadis Vasilakis
#import "ASIAuthenticationDialog.h"
10 be116d22 Miltiadis Vasilakis
#import "ASIHTTPRequest.h"
11 be116d22 Miltiadis Vasilakis
#import <QuartzCore/QuartzCore.h>
12 be116d22 Miltiadis Vasilakis
13 be116d22 Miltiadis Vasilakis
static ASIAuthenticationDialog *sharedDialog = nil;
14 be116d22 Miltiadis Vasilakis
BOOL isDismissing = NO;
15 be116d22 Miltiadis Vasilakis
static NSMutableArray *requestsNeedingAuthentication = nil;
16 be116d22 Miltiadis Vasilakis
17 be116d22 Miltiadis Vasilakis
static const NSUInteger kUsernameRow = 0;
18 be116d22 Miltiadis Vasilakis
static const NSUInteger kUsernameSection = 0;
19 be116d22 Miltiadis Vasilakis
static const NSUInteger kPasswordRow = 1;
20 be116d22 Miltiadis Vasilakis
static const NSUInteger kPasswordSection = 0;
21 be116d22 Miltiadis Vasilakis
static const NSUInteger kDomainRow = 0;
22 be116d22 Miltiadis Vasilakis
static const NSUInteger kDomainSection = 1;
23 be116d22 Miltiadis Vasilakis
24 be116d22 Miltiadis Vasilakis
25 be116d22 Miltiadis Vasilakis
@implementation ASIAutorotatingViewController
26 be116d22 Miltiadis Vasilakis
27 be116d22 Miltiadis Vasilakis
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
28 be116d22 Miltiadis Vasilakis
{
29 be116d22 Miltiadis Vasilakis
	return YES;
30 be116d22 Miltiadis Vasilakis
}
31 be116d22 Miltiadis Vasilakis
32 be116d22 Miltiadis Vasilakis
@end
33 be116d22 Miltiadis Vasilakis
34 be116d22 Miltiadis Vasilakis
35 be116d22 Miltiadis Vasilakis
@interface ASIAuthenticationDialog ()
36 be116d22 Miltiadis Vasilakis
- (void)showTitle;
37 be116d22 Miltiadis Vasilakis
- (void)show;
38 be116d22 Miltiadis Vasilakis
- (NSArray *)requestsRequiringTheseCredentials;
39 be116d22 Miltiadis Vasilakis
- (void)presentNextDialog;
40 be116d22 Miltiadis Vasilakis
- (void)keyboardWillShow:(NSNotification *)notification;
41 be116d22 Miltiadis Vasilakis
- (void)orientationChanged:(NSNotification *)notification;
42 be116d22 Miltiadis Vasilakis
- (void)cancelAuthenticationFromDialog:(id)sender;
43 be116d22 Miltiadis Vasilakis
- (void)loginWithCredentialsFromDialog:(id)sender;
44 be116d22 Miltiadis Vasilakis
@property (retain) UITableView *tableView;
45 be116d22 Miltiadis Vasilakis
@end
46 be116d22 Miltiadis Vasilakis
47 be116d22 Miltiadis Vasilakis
@implementation ASIAuthenticationDialog
48 be116d22 Miltiadis Vasilakis
49 be116d22 Miltiadis Vasilakis
#pragma mark init / dealloc
50 be116d22 Miltiadis Vasilakis
51 be116d22 Miltiadis Vasilakis
+ (void)initialize
52 be116d22 Miltiadis Vasilakis
{
53 be116d22 Miltiadis Vasilakis
	if (self == [ASIAuthenticationDialog class]) {
54 be116d22 Miltiadis Vasilakis
		requestsNeedingAuthentication = [[NSMutableArray array] retain];
55 be116d22 Miltiadis Vasilakis
	}
56 be116d22 Miltiadis Vasilakis
}
57 be116d22 Miltiadis Vasilakis
58 be116d22 Miltiadis Vasilakis
+ (void)presentAuthenticationDialogForRequest:(ASIHTTPRequest *)theRequest
59 be116d22 Miltiadis Vasilakis
{
60 be116d22 Miltiadis Vasilakis
	// No need for a lock here, this will always be called on the main thread
61 be116d22 Miltiadis Vasilakis
	if (!sharedDialog) {
62 be116d22 Miltiadis Vasilakis
		sharedDialog = [[self alloc] init];
63 be116d22 Miltiadis Vasilakis
		[sharedDialog setRequest:theRequest];
64 be116d22 Miltiadis Vasilakis
		if ([theRequest authenticationNeeded] == ASIProxyAuthenticationNeeded) {
65 be116d22 Miltiadis Vasilakis
			[sharedDialog setType:ASIProxyAuthenticationType];
66 be116d22 Miltiadis Vasilakis
		} else {
67 be116d22 Miltiadis Vasilakis
			[sharedDialog setType:ASIStandardAuthenticationType];
68 be116d22 Miltiadis Vasilakis
		}
69 be116d22 Miltiadis Vasilakis
		[sharedDialog show];
70 be116d22 Miltiadis Vasilakis
	} else {
71 be116d22 Miltiadis Vasilakis
		[requestsNeedingAuthentication addObject:theRequest];
72 be116d22 Miltiadis Vasilakis
	}
73 be116d22 Miltiadis Vasilakis
}
74 be116d22 Miltiadis Vasilakis
75 be116d22 Miltiadis Vasilakis
- (id)init
76 be116d22 Miltiadis Vasilakis
{
77 be116d22 Miltiadis Vasilakis
	if ((self = [self initWithNibName:nil bundle:nil])) {
78 be116d22 Miltiadis Vasilakis
		[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
79 be116d22 Miltiadis Vasilakis
80 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
81 be116d22 Miltiadis Vasilakis
		if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
82 be116d22 Miltiadis Vasilakis
#endif
83 be116d22 Miltiadis Vasilakis
			if (![UIDevice currentDevice].generatesDeviceOrientationNotifications) {
84 be116d22 Miltiadis Vasilakis
				[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
85 be116d22 Miltiadis Vasilakis
				[self setDidEnableRotationNotifications:YES];
86 be116d22 Miltiadis Vasilakis
			}
87 be116d22 Miltiadis Vasilakis
			[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
88 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
89 be116d22 Miltiadis Vasilakis
		}
90 be116d22 Miltiadis Vasilakis
#endif
91 be116d22 Miltiadis Vasilakis
	}
92 be116d22 Miltiadis Vasilakis
	return self;
93 be116d22 Miltiadis Vasilakis
}
94 be116d22 Miltiadis Vasilakis
95 be116d22 Miltiadis Vasilakis
- (void)dealloc
96 be116d22 Miltiadis Vasilakis
{
97 be116d22 Miltiadis Vasilakis
	if ([self didEnableRotationNotifications]) {
98 be116d22 Miltiadis Vasilakis
		[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
99 be116d22 Miltiadis Vasilakis
	}
100 be116d22 Miltiadis Vasilakis
	[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
101 be116d22 Miltiadis Vasilakis
102 be116d22 Miltiadis Vasilakis
	[request release];
103 be116d22 Miltiadis Vasilakis
	[tableView release];
104 be116d22 Miltiadis Vasilakis
	[presentingController.view removeFromSuperview];
105 be116d22 Miltiadis Vasilakis
	[presentingController release];
106 be116d22 Miltiadis Vasilakis
	[super dealloc];
107 be116d22 Miltiadis Vasilakis
}
108 be116d22 Miltiadis Vasilakis
109 be116d22 Miltiadis Vasilakis
#pragma mark keyboard notifications
110 be116d22 Miltiadis Vasilakis
111 be116d22 Miltiadis Vasilakis
- (void)keyboardWillShow:(NSNotification *)notification
112 be116d22 Miltiadis Vasilakis
{
113 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
114 be116d22 Miltiadis Vasilakis
	if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
115 be116d22 Miltiadis Vasilakis
#endif
116 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_2
117 be116d22 Miltiadis Vasilakis
		NSValue *keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey];
118 be116d22 Miltiadis Vasilakis
#else
119 be116d22 Miltiadis Vasilakis
		NSValue *keyboardBoundsValue = [[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey];
120 be116d22 Miltiadis Vasilakis
#endif
121 be116d22 Miltiadis Vasilakis
		CGRect keyboardBounds;
122 be116d22 Miltiadis Vasilakis
		[keyboardBoundsValue getValue:&keyboardBounds];
123 be116d22 Miltiadis Vasilakis
		UIEdgeInsets e = UIEdgeInsetsMake(0, 0, keyboardBounds.size.height, 0);
124 be116d22 Miltiadis Vasilakis
		[[self tableView] setScrollIndicatorInsets:e];
125 be116d22 Miltiadis Vasilakis
		[[self tableView] setContentInset:e];
126 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
127 be116d22 Miltiadis Vasilakis
	}
128 be116d22 Miltiadis Vasilakis
#endif
129 be116d22 Miltiadis Vasilakis
}
130 be116d22 Miltiadis Vasilakis
131 be116d22 Miltiadis Vasilakis
// Manually handles orientation changes on iPhone
132 be116d22 Miltiadis Vasilakis
- (void)orientationChanged:(NSNotification *)notification
133 be116d22 Miltiadis Vasilakis
{
134 be116d22 Miltiadis Vasilakis
	[self showTitle];
135 be116d22 Miltiadis Vasilakis
	
136 cc176feb Miltiadis Vasilakis
	UIInterfaceOrientation o = (UIInterfaceOrientation)[[UIApplication sharedApplication] statusBarOrientation];
137 be116d22 Miltiadis Vasilakis
	CGFloat angle = 0;
138 be116d22 Miltiadis Vasilakis
	switch (o) {
139 be116d22 Miltiadis Vasilakis
		case UIDeviceOrientationLandscapeLeft: angle = 90; break;
140 be116d22 Miltiadis Vasilakis
		case UIDeviceOrientationLandscapeRight: angle = -90; break;
141 be116d22 Miltiadis Vasilakis
		case UIDeviceOrientationPortraitUpsideDown: angle = 180; break;
142 be116d22 Miltiadis Vasilakis
		default: break;
143 be116d22 Miltiadis Vasilakis
	}
144 be116d22 Miltiadis Vasilakis
145 be116d22 Miltiadis Vasilakis
	CGRect f = [[UIScreen mainScreen] applicationFrame];
146 be116d22 Miltiadis Vasilakis
147 be116d22 Miltiadis Vasilakis
	// Swap the frame height and width if necessary
148 be116d22 Miltiadis Vasilakis
 	if (UIDeviceOrientationIsLandscape(o)) {
149 be116d22 Miltiadis Vasilakis
		CGFloat t;
150 be116d22 Miltiadis Vasilakis
		t = f.size.width;
151 be116d22 Miltiadis Vasilakis
		f.size.width = f.size.height;
152 be116d22 Miltiadis Vasilakis
		f.size.height = t;
153 be116d22 Miltiadis Vasilakis
	}
154 be116d22 Miltiadis Vasilakis
155 be116d22 Miltiadis Vasilakis
	CGAffineTransform previousTransform = self.view.layer.affineTransform;
156 be116d22 Miltiadis Vasilakis
	CGAffineTransform newTransform = CGAffineTransformMakeRotation((CGFloat)(angle * M_PI / 180.0));
157 be116d22 Miltiadis Vasilakis
158 be116d22 Miltiadis Vasilakis
	// Reset the transform so we can set the size
159 be116d22 Miltiadis Vasilakis
	self.view.layer.affineTransform = CGAffineTransformIdentity;
160 be116d22 Miltiadis Vasilakis
	self.view.frame = (CGRect){ { 0, 0 }, f.size};
161 be116d22 Miltiadis Vasilakis
162 be116d22 Miltiadis Vasilakis
	// Revert to the previous transform for correct animation
163 be116d22 Miltiadis Vasilakis
	self.view.layer.affineTransform = previousTransform;
164 be116d22 Miltiadis Vasilakis
165 be116d22 Miltiadis Vasilakis
	[UIView beginAnimations:nil context:NULL];
166 be116d22 Miltiadis Vasilakis
	[UIView setAnimationDuration:0.3];
167 be116d22 Miltiadis Vasilakis
168 be116d22 Miltiadis Vasilakis
	// Set the new transform
169 be116d22 Miltiadis Vasilakis
	self.view.layer.affineTransform = newTransform;
170 be116d22 Miltiadis Vasilakis
171 be116d22 Miltiadis Vasilakis
	// Fix the view origin
172 be116d22 Miltiadis Vasilakis
	self.view.frame = (CGRect){ { f.origin.x, f.origin.y },self.view.frame.size};
173 be116d22 Miltiadis Vasilakis
    [UIView commitAnimations];
174 be116d22 Miltiadis Vasilakis
}
175 be116d22 Miltiadis Vasilakis
		 
176 be116d22 Miltiadis Vasilakis
#pragma mark utilities
177 be116d22 Miltiadis Vasilakis
178 be116d22 Miltiadis Vasilakis
- (UIViewController *)presentingController
179 be116d22 Miltiadis Vasilakis
{
180 be116d22 Miltiadis Vasilakis
	if (!presentingController) {
181 be116d22 Miltiadis Vasilakis
		presentingController = [[ASIAutorotatingViewController alloc] initWithNibName:nil bundle:nil];
182 be116d22 Miltiadis Vasilakis
183 be116d22 Miltiadis Vasilakis
		// Attach to the window, but don't interfere.
184 be116d22 Miltiadis Vasilakis
		UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
185 be116d22 Miltiadis Vasilakis
		[window addSubview:[presentingController view]];
186 be116d22 Miltiadis Vasilakis
		[[presentingController view] setFrame:CGRectZero];
187 be116d22 Miltiadis Vasilakis
		[[presentingController view] setUserInteractionEnabled:NO];
188 be116d22 Miltiadis Vasilakis
	}
189 be116d22 Miltiadis Vasilakis
190 be116d22 Miltiadis Vasilakis
	return presentingController;
191 be116d22 Miltiadis Vasilakis
}
192 be116d22 Miltiadis Vasilakis
193 be116d22 Miltiadis Vasilakis
- (UITextField *)textFieldInRow:(NSUInteger)row section:(NSUInteger)section
194 be116d22 Miltiadis Vasilakis
{
195 be116d22 Miltiadis Vasilakis
	return [[[[[self tableView] cellForRowAtIndexPath:
196 be116d22 Miltiadis Vasilakis
			   [NSIndexPath indexPathForRow:row inSection:section]]
197 be116d22 Miltiadis Vasilakis
			  contentView] subviews] objectAtIndex:0];
198 be116d22 Miltiadis Vasilakis
}
199 be116d22 Miltiadis Vasilakis
200 be116d22 Miltiadis Vasilakis
- (UITextField *)usernameField
201 be116d22 Miltiadis Vasilakis
{
202 be116d22 Miltiadis Vasilakis
	return [self textFieldInRow:kUsernameRow section:kUsernameSection];
203 be116d22 Miltiadis Vasilakis
}
204 be116d22 Miltiadis Vasilakis
205 be116d22 Miltiadis Vasilakis
- (UITextField *)passwordField
206 be116d22 Miltiadis Vasilakis
{
207 be116d22 Miltiadis Vasilakis
	return [self textFieldInRow:kPasswordRow section:kPasswordSection];
208 be116d22 Miltiadis Vasilakis
}
209 be116d22 Miltiadis Vasilakis
210 be116d22 Miltiadis Vasilakis
- (UITextField *)domainField
211 be116d22 Miltiadis Vasilakis
{
212 be116d22 Miltiadis Vasilakis
	return [self textFieldInRow:kDomainRow section:kDomainSection];
213 be116d22 Miltiadis Vasilakis
}
214 be116d22 Miltiadis Vasilakis
215 be116d22 Miltiadis Vasilakis
#pragma mark show / dismiss
216 be116d22 Miltiadis Vasilakis
217 be116d22 Miltiadis Vasilakis
+ (void)dismiss
218 be116d22 Miltiadis Vasilakis
{
219 cc176feb Miltiadis Vasilakis
	if ([sharedDialog respondsToSelector:@selector(presentingViewController)])
220 cc176feb Miltiadis Vasilakis
		[[sharedDialog presentingViewController] dismissModalViewControllerAnimated:YES];
221 cc176feb Miltiadis Vasilakis
	else 
222 cc176feb Miltiadis Vasilakis
		[[sharedDialog parentViewController] dismissModalViewControllerAnimated:YES];
223 be116d22 Miltiadis Vasilakis
}
224 be116d22 Miltiadis Vasilakis
225 be116d22 Miltiadis Vasilakis
- (void)viewDidDisappear:(BOOL)animated
226 be116d22 Miltiadis Vasilakis
{
227 be116d22 Miltiadis Vasilakis
	[self retain];
228 be116d22 Miltiadis Vasilakis
	[sharedDialog release];
229 be116d22 Miltiadis Vasilakis
	sharedDialog = nil;
230 be116d22 Miltiadis Vasilakis
	[self performSelector:@selector(presentNextDialog) withObject:nil afterDelay:0];
231 be116d22 Miltiadis Vasilakis
	[self release];
232 be116d22 Miltiadis Vasilakis
}
233 be116d22 Miltiadis Vasilakis
234 be116d22 Miltiadis Vasilakis
- (void)dismiss
235 be116d22 Miltiadis Vasilakis
{
236 be116d22 Miltiadis Vasilakis
	if (self == sharedDialog) {
237 be116d22 Miltiadis Vasilakis
		[[self class] dismiss];
238 be116d22 Miltiadis Vasilakis
	} else {
239 cc176feb Miltiadis Vasilakis
		if ([self respondsToSelector:@selector(presentingViewController)])
240 cc176feb Miltiadis Vasilakis
			[[self presentingViewController] dismissModalViewControllerAnimated:YES];
241 cc176feb Miltiadis Vasilakis
		else
242 cc176feb Miltiadis Vasilakis
			[[self parentViewController] dismissModalViewControllerAnimated:YES];
243 be116d22 Miltiadis Vasilakis
	}
244 be116d22 Miltiadis Vasilakis
}
245 be116d22 Miltiadis Vasilakis
246 be116d22 Miltiadis Vasilakis
- (void)showTitle
247 be116d22 Miltiadis Vasilakis
{
248 be116d22 Miltiadis Vasilakis
	UINavigationBar *navigationBar = [[[self view] subviews] objectAtIndex:0];
249 be116d22 Miltiadis Vasilakis
	UINavigationItem *navItem = [[navigationBar items] objectAtIndex:0];
250 be116d22 Miltiadis Vasilakis
	if (UIInterfaceOrientationIsPortrait([[UIDevice currentDevice] orientation])) {
251 be116d22 Miltiadis Vasilakis
		// Setup the title
252 be116d22 Miltiadis Vasilakis
		if ([self type] == ASIProxyAuthenticationType) {
253 be116d22 Miltiadis Vasilakis
			[navItem setPrompt:@"Login to this secure proxy server."];
254 be116d22 Miltiadis Vasilakis
		} else {
255 be116d22 Miltiadis Vasilakis
			[navItem setPrompt:@"Login to this secure server."];
256 be116d22 Miltiadis Vasilakis
		}
257 be116d22 Miltiadis Vasilakis
	} else {
258 be116d22 Miltiadis Vasilakis
		[navItem setPrompt:nil];
259 be116d22 Miltiadis Vasilakis
	}
260 be116d22 Miltiadis Vasilakis
	[navigationBar sizeToFit];
261 be116d22 Miltiadis Vasilakis
	CGRect f = [[self view] bounds];
262 be116d22 Miltiadis Vasilakis
	f.origin.y = [navigationBar frame].size.height;
263 be116d22 Miltiadis Vasilakis
	f.size.height -= f.origin.y;
264 be116d22 Miltiadis Vasilakis
	[[self tableView] setFrame:f];
265 be116d22 Miltiadis Vasilakis
}
266 be116d22 Miltiadis Vasilakis
267 be116d22 Miltiadis Vasilakis
- (void)show
268 be116d22 Miltiadis Vasilakis
{
269 be116d22 Miltiadis Vasilakis
	// Remove all subviews
270 be116d22 Miltiadis Vasilakis
	UIView *v;
271 be116d22 Miltiadis Vasilakis
	while ((v = [[[self view] subviews] lastObject])) {
272 be116d22 Miltiadis Vasilakis
		[v removeFromSuperview];
273 be116d22 Miltiadis Vasilakis
	}
274 be116d22 Miltiadis Vasilakis
275 be116d22 Miltiadis Vasilakis
	// Setup toolbar
276 be116d22 Miltiadis Vasilakis
	UINavigationBar *bar = [[[UINavigationBar alloc] init] autorelease];
277 be116d22 Miltiadis Vasilakis
	[bar setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
278 be116d22 Miltiadis Vasilakis
279 be116d22 Miltiadis Vasilakis
	UINavigationItem *navItem = [[[UINavigationItem alloc] init] autorelease];
280 be116d22 Miltiadis Vasilakis
	bar.items = [NSArray arrayWithObject:navItem];
281 be116d22 Miltiadis Vasilakis
282 be116d22 Miltiadis Vasilakis
	[[self view] addSubview:bar];
283 be116d22 Miltiadis Vasilakis
284 be116d22 Miltiadis Vasilakis
	[self showTitle];
285 be116d22 Miltiadis Vasilakis
286 be116d22 Miltiadis Vasilakis
	// Setup toolbar buttons
287 be116d22 Miltiadis Vasilakis
	if ([self type] == ASIProxyAuthenticationType) {
288 be116d22 Miltiadis Vasilakis
		[navItem setTitle:[[self request] proxyHost]];
289 be116d22 Miltiadis Vasilakis
	} else {
290 be116d22 Miltiadis Vasilakis
		[navItem setTitle:[[[self request] url] host]];
291 be116d22 Miltiadis Vasilakis
	}
292 be116d22 Miltiadis Vasilakis
293 be116d22 Miltiadis Vasilakis
	[navItem setLeftBarButtonItem:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelAuthenticationFromDialog:)] autorelease]];
294 be116d22 Miltiadis Vasilakis
	[navItem setRightBarButtonItem:[[[UIBarButtonItem alloc] initWithTitle:@"Login" style:UIBarButtonItemStyleDone target:self action:@selector(loginWithCredentialsFromDialog:)] autorelease]];
295 be116d22 Miltiadis Vasilakis
296 be116d22 Miltiadis Vasilakis
	// We show the login form in a table view, similar to Safari's authentication dialog
297 be116d22 Miltiadis Vasilakis
	[bar sizeToFit];
298 be116d22 Miltiadis Vasilakis
	CGRect f = [[self view] bounds];
299 be116d22 Miltiadis Vasilakis
	f.origin.y = [bar frame].size.height;
300 be116d22 Miltiadis Vasilakis
	f.size.height -= f.origin.y;
301 be116d22 Miltiadis Vasilakis
302 be116d22 Miltiadis Vasilakis
	[self setTableView:[[[UITableView alloc] initWithFrame:f style:UITableViewStyleGrouped] autorelease]];
303 be116d22 Miltiadis Vasilakis
	[[self tableView] setDelegate:self];
304 be116d22 Miltiadis Vasilakis
	[[self tableView] setDataSource:self];
305 be116d22 Miltiadis Vasilakis
	[[self tableView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
306 be116d22 Miltiadis Vasilakis
	[[self view] addSubview:[self tableView]];
307 be116d22 Miltiadis Vasilakis
308 be116d22 Miltiadis Vasilakis
	// Force reload the table content, and focus the first field to show the keyboard
309 be116d22 Miltiadis Vasilakis
	[[self tableView] reloadData];
310 be116d22 Miltiadis Vasilakis
	[[[[[self tableView] cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]].contentView subviews] objectAtIndex:0] becomeFirstResponder];
311 be116d22 Miltiadis Vasilakis
312 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
313 be116d22 Miltiadis Vasilakis
	if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
314 be116d22 Miltiadis Vasilakis
		[self setModalPresentationStyle:UIModalPresentationFormSheet];
315 be116d22 Miltiadis Vasilakis
	}
316 be116d22 Miltiadis Vasilakis
#endif
317 be116d22 Miltiadis Vasilakis
318 be116d22 Miltiadis Vasilakis
	[[self presentingController] presentModalViewController:self animated:YES];
319 be116d22 Miltiadis Vasilakis
}
320 be116d22 Miltiadis Vasilakis
321 be116d22 Miltiadis Vasilakis
#pragma mark button callbacks
322 be116d22 Miltiadis Vasilakis
323 be116d22 Miltiadis Vasilakis
- (void)cancelAuthenticationFromDialog:(id)sender
324 be116d22 Miltiadis Vasilakis
{
325 be116d22 Miltiadis Vasilakis
	for (ASIHTTPRequest *theRequest in [self requestsRequiringTheseCredentials]) {
326 be116d22 Miltiadis Vasilakis
		[theRequest cancelAuthentication];
327 be116d22 Miltiadis Vasilakis
		[requestsNeedingAuthentication removeObject:theRequest];
328 be116d22 Miltiadis Vasilakis
	}
329 be116d22 Miltiadis Vasilakis
	[self dismiss];
330 be116d22 Miltiadis Vasilakis
}
331 be116d22 Miltiadis Vasilakis
332 be116d22 Miltiadis Vasilakis
- (NSArray *)requestsRequiringTheseCredentials
333 be116d22 Miltiadis Vasilakis
{
334 be116d22 Miltiadis Vasilakis
	NSMutableArray *requestsRequiringTheseCredentials = [NSMutableArray array];
335 be116d22 Miltiadis Vasilakis
	NSURL *requestURL = [[self request] url];
336 be116d22 Miltiadis Vasilakis
	for (ASIHTTPRequest *otherRequest in requestsNeedingAuthentication) {
337 be116d22 Miltiadis Vasilakis
		NSURL *theURL = [otherRequest url];
338 be116d22 Miltiadis Vasilakis
		if (([otherRequest authenticationNeeded] == [[self request] authenticationNeeded]) && [[theURL host] isEqualToString:[requestURL host]] && ([theURL port] == [requestURL port] || ([requestURL port] && [[theURL port] isEqualToNumber:[requestURL port]])) && [[theURL scheme] isEqualToString:[requestURL scheme]] && ((![otherRequest authenticationRealm] && ![[self request] authenticationRealm]) || ([otherRequest authenticationRealm] && [[self request] authenticationRealm] && [[[self request] authenticationRealm] isEqualToString:[otherRequest authenticationRealm]]))) {
339 be116d22 Miltiadis Vasilakis
			[requestsRequiringTheseCredentials addObject:otherRequest];
340 be116d22 Miltiadis Vasilakis
		}
341 be116d22 Miltiadis Vasilakis
	}
342 be116d22 Miltiadis Vasilakis
	[requestsRequiringTheseCredentials addObject:[self request]];
343 be116d22 Miltiadis Vasilakis
	return requestsRequiringTheseCredentials;
344 be116d22 Miltiadis Vasilakis
}
345 be116d22 Miltiadis Vasilakis
346 be116d22 Miltiadis Vasilakis
- (void)presentNextDialog
347 be116d22 Miltiadis Vasilakis
{
348 be116d22 Miltiadis Vasilakis
	if ([requestsNeedingAuthentication count]) {
349 be116d22 Miltiadis Vasilakis
		ASIHTTPRequest *nextRequest = [requestsNeedingAuthentication objectAtIndex:0];
350 be116d22 Miltiadis Vasilakis
		[requestsNeedingAuthentication removeObjectAtIndex:0];
351 be116d22 Miltiadis Vasilakis
		[[self class] presentAuthenticationDialogForRequest:nextRequest];
352 be116d22 Miltiadis Vasilakis
	}
353 be116d22 Miltiadis Vasilakis
}
354 be116d22 Miltiadis Vasilakis
355 be116d22 Miltiadis Vasilakis
356 be116d22 Miltiadis Vasilakis
- (void)loginWithCredentialsFromDialog:(id)sender
357 be116d22 Miltiadis Vasilakis
{
358 be116d22 Miltiadis Vasilakis
	for (ASIHTTPRequest *theRequest in [self requestsRequiringTheseCredentials]) {
359 be116d22 Miltiadis Vasilakis
360 be116d22 Miltiadis Vasilakis
		NSString *username = [[self usernameField] text];
361 be116d22 Miltiadis Vasilakis
		NSString *password = [[self passwordField] text];
362 be116d22 Miltiadis Vasilakis
363 be116d22 Miltiadis Vasilakis
		if (username == nil) { username = @""; }
364 be116d22 Miltiadis Vasilakis
		if (password == nil) { password = @""; }
365 be116d22 Miltiadis Vasilakis
366 be116d22 Miltiadis Vasilakis
		if ([self type] == ASIProxyAuthenticationType) {
367 be116d22 Miltiadis Vasilakis
			[theRequest setProxyUsername:username];
368 be116d22 Miltiadis Vasilakis
			[theRequest setProxyPassword:password];
369 be116d22 Miltiadis Vasilakis
		} else {
370 be116d22 Miltiadis Vasilakis
			[theRequest setUsername:username];
371 be116d22 Miltiadis Vasilakis
			[theRequest setPassword:password];
372 be116d22 Miltiadis Vasilakis
		}
373 be116d22 Miltiadis Vasilakis
374 be116d22 Miltiadis Vasilakis
		// Handle NTLM domains
375 be116d22 Miltiadis Vasilakis
		NSString *scheme = ([self type] == ASIStandardAuthenticationType) ? [[self request] authenticationScheme] : [[self request] proxyAuthenticationScheme];
376 be116d22 Miltiadis Vasilakis
		if ([scheme isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeNTLM]) {
377 be116d22 Miltiadis Vasilakis
			NSString *domain = [[self domainField] text];
378 be116d22 Miltiadis Vasilakis
			if ([self type] == ASIProxyAuthenticationType) {
379 be116d22 Miltiadis Vasilakis
				[theRequest setProxyDomain:domain];
380 be116d22 Miltiadis Vasilakis
			} else {
381 be116d22 Miltiadis Vasilakis
				[theRequest setDomain:domain];
382 be116d22 Miltiadis Vasilakis
			}
383 be116d22 Miltiadis Vasilakis
		}
384 be116d22 Miltiadis Vasilakis
385 be116d22 Miltiadis Vasilakis
		[theRequest retryUsingSuppliedCredentials];
386 be116d22 Miltiadis Vasilakis
		[requestsNeedingAuthentication removeObject:theRequest];
387 be116d22 Miltiadis Vasilakis
	}
388 be116d22 Miltiadis Vasilakis
	[self dismiss];
389 be116d22 Miltiadis Vasilakis
}
390 be116d22 Miltiadis Vasilakis
391 be116d22 Miltiadis Vasilakis
#pragma mark table view data source
392 be116d22 Miltiadis Vasilakis
393 be116d22 Miltiadis Vasilakis
- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView
394 be116d22 Miltiadis Vasilakis
{
395 be116d22 Miltiadis Vasilakis
	NSString *scheme = ([self type] == ASIStandardAuthenticationType) ? [[self request] authenticationScheme] : [[self request] proxyAuthenticationScheme];
396 be116d22 Miltiadis Vasilakis
	if ([scheme isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeNTLM]) {
397 be116d22 Miltiadis Vasilakis
		return 2;
398 be116d22 Miltiadis Vasilakis
	}
399 be116d22 Miltiadis Vasilakis
	return 1;
400 be116d22 Miltiadis Vasilakis
}
401 be116d22 Miltiadis Vasilakis
402 be116d22 Miltiadis Vasilakis
- (CGFloat)tableView:(UITableView *)aTableView heightForFooterInSection:(NSInteger)section
403 be116d22 Miltiadis Vasilakis
{
404 be116d22 Miltiadis Vasilakis
	if (section == [self numberOfSectionsInTableView:aTableView]-1) {
405 be116d22 Miltiadis Vasilakis
		return 30;
406 be116d22 Miltiadis Vasilakis
	}
407 be116d22 Miltiadis Vasilakis
	return 0;
408 be116d22 Miltiadis Vasilakis
}
409 be116d22 Miltiadis Vasilakis
410 be116d22 Miltiadis Vasilakis
- (CGFloat)tableView:(UITableView *)aTableView heightForHeaderInSection:(NSInteger)section
411 be116d22 Miltiadis Vasilakis
{
412 be116d22 Miltiadis Vasilakis
	if (section == 0) {
413 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_3_2
414 be116d22 Miltiadis Vasilakis
		if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
415 be116d22 Miltiadis Vasilakis
			return 54;
416 be116d22 Miltiadis Vasilakis
		}
417 be116d22 Miltiadis Vasilakis
#endif
418 be116d22 Miltiadis Vasilakis
		return 30;
419 be116d22 Miltiadis Vasilakis
	}
420 be116d22 Miltiadis Vasilakis
	return 0;
421 be116d22 Miltiadis Vasilakis
}
422 be116d22 Miltiadis Vasilakis
423 be116d22 Miltiadis Vasilakis
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
424 be116d22 Miltiadis Vasilakis
{
425 be116d22 Miltiadis Vasilakis
	if (section == 0) {
426 be116d22 Miltiadis Vasilakis
		return [[self request] authenticationRealm];
427 be116d22 Miltiadis Vasilakis
	}
428 be116d22 Miltiadis Vasilakis
	return nil;
429 be116d22 Miltiadis Vasilakis
}
430 be116d22 Miltiadis Vasilakis
431 be116d22 Miltiadis Vasilakis
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
432 be116d22 Miltiadis Vasilakis
{
433 be116d22 Miltiadis Vasilakis
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_3_0
434 be116d22 Miltiadis Vasilakis
	UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
435 be116d22 Miltiadis Vasilakis
#else
436 be116d22 Miltiadis Vasilakis
	UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0,0,0,0) reuseIdentifier:nil] autorelease];
437 be116d22 Miltiadis Vasilakis
#endif
438 be116d22 Miltiadis Vasilakis
439 be116d22 Miltiadis Vasilakis
	[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
440 be116d22 Miltiadis Vasilakis
441 be116d22 Miltiadis Vasilakis
	CGRect f = CGRectInset([cell bounds], 10, 10);
442 be116d22 Miltiadis Vasilakis
	UITextField *textField = [[[UITextField alloc] initWithFrame:f] autorelease];
443 be116d22 Miltiadis Vasilakis
	[textField setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
444 be116d22 Miltiadis Vasilakis
	[textField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
445 be116d22 Miltiadis Vasilakis
	[textField setAutocorrectionType:UITextAutocorrectionTypeNo];
446 be116d22 Miltiadis Vasilakis
447 be116d22 Miltiadis Vasilakis
	NSUInteger s = [indexPath section];
448 be116d22 Miltiadis Vasilakis
	NSUInteger r = [indexPath row];
449 be116d22 Miltiadis Vasilakis
450 be116d22 Miltiadis Vasilakis
	if (s == kUsernameSection && r == kUsernameRow) {
451 be116d22 Miltiadis Vasilakis
		[textField setPlaceholder:@"User"];
452 be116d22 Miltiadis Vasilakis
	} else if (s == kPasswordSection && r == kPasswordRow) {
453 be116d22 Miltiadis Vasilakis
		[textField setPlaceholder:@"Password"];
454 be116d22 Miltiadis Vasilakis
		[textField setSecureTextEntry:YES];
455 be116d22 Miltiadis Vasilakis
	} else if (s == kDomainSection && r == kDomainRow) {
456 be116d22 Miltiadis Vasilakis
		[textField setPlaceholder:@"Domain"];
457 be116d22 Miltiadis Vasilakis
	}
458 be116d22 Miltiadis Vasilakis
	[cell.contentView addSubview:textField];
459 be116d22 Miltiadis Vasilakis
460 be116d22 Miltiadis Vasilakis
	return cell;
461 be116d22 Miltiadis Vasilakis
}
462 be116d22 Miltiadis Vasilakis
463 be116d22 Miltiadis Vasilakis
- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
464 be116d22 Miltiadis Vasilakis
{
465 be116d22 Miltiadis Vasilakis
	if (section == 0) {
466 be116d22 Miltiadis Vasilakis
		return 2;
467 be116d22 Miltiadis Vasilakis
	} else {
468 be116d22 Miltiadis Vasilakis
		return 1;
469 be116d22 Miltiadis Vasilakis
	}
470 be116d22 Miltiadis Vasilakis
}
471 be116d22 Miltiadis Vasilakis
472 be116d22 Miltiadis Vasilakis
- (NSString *)tableView:(UITableView *)aTableView titleForFooterInSection:(NSInteger)section
473 be116d22 Miltiadis Vasilakis
{
474 be116d22 Miltiadis Vasilakis
	if (section == [self numberOfSectionsInTableView:aTableView]-1) {
475 be116d22 Miltiadis Vasilakis
		// If we're using Basic authentication and the connection is not using SSL, we'll show the plain text message
476 be116d22 Miltiadis Vasilakis
		if ([[[self request] authenticationScheme] isEqualToString:(NSString *)kCFHTTPAuthenticationSchemeBasic] && ![[[[self request] url] scheme] isEqualToString:@"https"]) {
477 be116d22 Miltiadis Vasilakis
			return @"Password will be sent in the clear.";
478 be116d22 Miltiadis Vasilakis
		// We are using Digest, NTLM, or any scheme over SSL
479 be116d22 Miltiadis Vasilakis
		} else {
480 be116d22 Miltiadis Vasilakis
			return @"Password will be sent securely.";
481 be116d22 Miltiadis Vasilakis
		}
482 be116d22 Miltiadis Vasilakis
	}
483 be116d22 Miltiadis Vasilakis
	return nil;
484 be116d22 Miltiadis Vasilakis
}
485 be116d22 Miltiadis Vasilakis
486 be116d22 Miltiadis Vasilakis
#pragma mark -
487 be116d22 Miltiadis Vasilakis
488 be116d22 Miltiadis Vasilakis
@synthesize request;
489 be116d22 Miltiadis Vasilakis
@synthesize type;
490 be116d22 Miltiadis Vasilakis
@synthesize tableView;
491 be116d22 Miltiadis Vasilakis
@synthesize didEnableRotationNotifications;
492 be116d22 Miltiadis Vasilakis
@synthesize presentingController;
493 be116d22 Miltiadis Vasilakis
@end