Statistics
| Branch: | Tag: | Revision:

root / Classes / OpenStackAppDelegate.m @ 72744ed1

History | View | Annotate | Download (14.5 kB)

1 700184fb Miltiadis Vasilakis
//
2 700184fb Miltiadis Vasilakis
//  OpenStackAppDelegate.m
3 700184fb Miltiadis Vasilakis
//  OpenStack
4 700184fb Miltiadis Vasilakis
//
5 700184fb Miltiadis Vasilakis
//  Created by Mike Mayo on 9/30/10.
6 700184fb Miltiadis Vasilakis
//  The OpenStack project is provided under the Apache 2.0 license.
7 700184fb Miltiadis Vasilakis
//
8 700184fb Miltiadis Vasilakis
9 700184fb Miltiadis Vasilakis
#import "OpenStackAppDelegate.h"
10 700184fb Miltiadis Vasilakis
#import "RootViewController.h"
11 700184fb Miltiadis Vasilakis
#import "OpenStackAccount.h"
12 700184fb Miltiadis Vasilakis
#import "Keychain.h"
13 700184fb Miltiadis Vasilakis
14 700184fb Miltiadis Vasilakis
#import "JSON.h"
15 700184fb Miltiadis Vasilakis
#import "Server.h"
16 700184fb Miltiadis Vasilakis
#import "Archiver.h"
17 700184fb Miltiadis Vasilakis
#import "Provider.h"
18 700184fb Miltiadis Vasilakis
#import "Image.h"
19 700184fb Miltiadis Vasilakis
20 700184fb Miltiadis Vasilakis
#import "SettingsPluginHandler.h"
21 700184fb Miltiadis Vasilakis
#import "AddServerPluginHandler.h"
22 700184fb Miltiadis Vasilakis
#import "OpenStackAccount.h"
23 700184fb Miltiadis Vasilakis
24 700184fb Miltiadis Vasilakis
#import "RSSFeedViewController.h"
25 d6b38316 Miltiadis Vasilakis
#import "PithosImageViewController.h"
26 700184fb Miltiadis Vasilakis
27 700184fb Miltiadis Vasilakis
#import "RootViewController.h"
28 700184fb Miltiadis Vasilakis
#import "PasscodeViewController.h"
29 700184fb Miltiadis Vasilakis
#import "UIViewController+Conveniences.h"
30 700184fb Miltiadis Vasilakis
#import "HTNotifier.h"
31 700184fb Miltiadis Vasilakis
#import "Analytics.h"
32 07592312 Miltiadis Vasilakis
#import "ProvidersViewController.h"
33 700184fb Miltiadis Vasilakis
34 700184fb Miltiadis Vasilakis
@implementation OpenStackAppDelegate
35 700184fb Miltiadis Vasilakis
36 700184fb Miltiadis Vasilakis
@synthesize window;
37 700184fb Miltiadis Vasilakis
@synthesize navigationController;
38 700184fb Miltiadis Vasilakis
@synthesize splitViewController;
39 700184fb Miltiadis Vasilakis
@synthesize masterNavigationController;
40 700184fb Miltiadis Vasilakis
@synthesize barButtonItem;
41 700184fb Miltiadis Vasilakis
@synthesize rootViewController;
42 64929bae Miltiadis Vasilakis
@synthesize cachedObjectsDictionary;
43 64929bae Miltiadis Vasilakis
@synthesize cacheDictionaryFilePath;
44 64929bae Miltiadis Vasilakis
@synthesize cacheDirectoryPath;
45 700184fb Miltiadis Vasilakis
46 700184fb Miltiadis Vasilakis
- (void)loadSettingsDefaults {
47 700184fb Miltiadis Vasilakis
    
48 700184fb Miltiadis Vasilakis
    // if settings haven't been set up yet, let's go ahead and set some sensible defaults
49 700184fb Miltiadis Vasilakis
    
50 700184fb Miltiadis Vasilakis
    // passcode settings are ALL sensitive, so they will all go in the keychain
51 700184fb Miltiadis Vasilakis
    if (![Keychain getStringForKey:@"passcode_lock_passcode_on"]) {
52 700184fb Miltiadis Vasilakis
        [Keychain setString:@"NO" forKey:@"passcode_lock_passcode_on"];
53 700184fb Miltiadis Vasilakis
    }
54 700184fb Miltiadis Vasilakis
    
55 700184fb Miltiadis Vasilakis
    if (![Keychain getStringForKey:@"passcode_lock_simple_passcode_on"]) {
56 700184fb Miltiadis Vasilakis
        [Keychain setString:@"YES" forKey:@"passcode_lock_simple_passcode_on"];
57 700184fb Miltiadis Vasilakis
    }
58 700184fb Miltiadis Vasilakis
    
59 700184fb Miltiadis Vasilakis
    if (![Keychain getStringForKey:@"passcode_lock_erase_data_on"]) {
60 700184fb Miltiadis Vasilakis
        [Keychain setString:@"NO" forKey:@"passcode_lock_erase_data_on"];
61 700184fb Miltiadis Vasilakis
    }
62 700184fb Miltiadis Vasilakis
    
63 64929bae Miltiadis Vasilakis
    userDefaults = [[NSUserDefaults standardUserDefaults] retain];
64 700184fb Miltiadis Vasilakis
    
65 64929bae Miltiadis Vasilakis
    if (![userDefaults stringForKey:@"api_logging_level"]) {
66 64929bae Miltiadis Vasilakis
        [userDefaults setValue:@"all" forKey:@"api_logging_level"];
67 700184fb Miltiadis Vasilakis
    }
68 45f2fce6 Miltiadis Vasilakis
    
69 64929bae Miltiadis Vasilakis
    self.cachedObjectsDictionary = [userDefaults objectForKey:@"cachedObjectsDictionary"];
70 64929bae Miltiadis Vasilakis
    if (!cachedObjectsDictionary) {
71 64929bae Miltiadis Vasilakis
        self.cachedObjectsDictionary = [NSMutableDictionary dictionary];
72 64929bae Miltiadis Vasilakis
        [userDefaults setValue:cachedObjectsDictionary forKey:@"cachedObjectsDictionary"];
73 64929bae Miltiadis Vasilakis
    }
74 45f2fce6 Miltiadis Vasilakis
    
75 64929bae Miltiadis Vasilakis
    [userDefaults synchronize];
76 700184fb Miltiadis Vasilakis
    
77 700184fb Miltiadis Vasilakis
}
78 700184fb Miltiadis Vasilakis
79 700184fb Miltiadis Vasilakis
- (void)presentAndRelease:(NSTimer *)timer {
80 700184fb Miltiadis Vasilakis
    UIViewController *vc = [timer.userInfo objectForKey:@"vc"];
81 700184fb Miltiadis Vasilakis
    [[self.navigationController topViewController] presentModalViewControllerWithNavigation:vc animated:NO];
82 700184fb Miltiadis Vasilakis
    [vc release];
83 700184fb Miltiadis Vasilakis
}
84 700184fb Miltiadis Vasilakis
85 700184fb Miltiadis Vasilakis
- (void)showPasscodeLock {
86 700184fb Miltiadis Vasilakis
    if ([[Keychain getStringForKey:@"passcode_lock_passcode_on"] isEqualToString:@"YES"]) {
87 700184fb Miltiadis Vasilakis
        PasscodeViewController *vc = [[PasscodeViewController alloc] initWithNibName:@"PasscodeViewController" bundle:nil];
88 700184fb Miltiadis Vasilakis
        vc.mode = kModeEnterPasscode;
89 700184fb Miltiadis Vasilakis
        //vc.rootViewController = self;
90 700184fb Miltiadis Vasilakis
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
91 700184fb Miltiadis Vasilakis
            vc.modalPresentationStyle = UIModalPresentationFullScreen;
92 700184fb Miltiadis Vasilakis
        }                
93 700184fb Miltiadis Vasilakis
        
94 700184fb Miltiadis Vasilakis
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
95 700184fb Miltiadis Vasilakis
            OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
96 700184fb Miltiadis Vasilakis
            for (UIViewController *svc in app.splitViewController.viewControllers) {
97 700184fb Miltiadis Vasilakis
                svc.view.alpha = 0.0;
98 700184fb Miltiadis Vasilakis
            }
99 700184fb Miltiadis Vasilakis
            
100 700184fb Miltiadis Vasilakis
            // for some reason, this needs to be delayed
101 700184fb Miltiadis Vasilakis
            [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(presentAndRelease:) userInfo:[NSDictionary dictionaryWithObject:vc forKey:@"vc"] repeats:NO];
102 700184fb Miltiadis Vasilakis
            
103 700184fb Miltiadis Vasilakis
        } else {
104 700184fb Miltiadis Vasilakis
            [[self.navigationController topViewController] presentModalViewControllerWithNavigation:vc animated:NO];
105 700184fb Miltiadis Vasilakis
            [vc release];
106 700184fb Miltiadis Vasilakis
        }
107 700184fb Miltiadis Vasilakis
    }
108 700184fb Miltiadis Vasilakis
}
109 700184fb Miltiadis Vasilakis
110 700184fb Miltiadis Vasilakis
#pragma mark -
111 700184fb Miltiadis Vasilakis
#pragma mark Application lifecycle
112 700184fb Miltiadis Vasilakis
113 700184fb Miltiadis Vasilakis
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
114 700184fb Miltiadis Vasilakis
    // Override point for customization after application launch.
115 2989bee3 Miltiadis Vasilakis
//    [self setupDependencies];
116 700184fb Miltiadis Vasilakis
        
117 700184fb Miltiadis Vasilakis
    [self loadSettingsDefaults];
118 700184fb Miltiadis Vasilakis
        
119 700184fb Miltiadis Vasilakis
    rootViewController = [navigationController.viewControllers objectAtIndex:0];
120 7db1712d Miltiadis Vasilakis
    OpenStackAppDelegate <UINavigationControllerDelegate> *delegate = (OpenStackAppDelegate <UINavigationControllerDelegate> *)self;
121 700184fb Miltiadis Vasilakis
    navigationController.delegate = delegate;
122 700184fb Miltiadis Vasilakis
        
123 700184fb Miltiadis Vasilakis
    // Add the navigation controller's view to the window and display.
124 700184fb Miltiadis Vasilakis
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
125 700184fb Miltiadis Vasilakis
        
126 45f2fce6 Miltiadis Vasilakis
        /*RSSFeedViewController *vc = [[RSSFeedViewController alloc] initWithNibName:@"RSSFeedViewController" bundle:nil];
127 45f2fce6 Miltiadis Vasilakis
        vc.feed = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Cloud Servers Status", @"feed://status.rackspacecloud.com/cloudservers/rss.xml", kCloudServersIcon, nil] forKeys:[NSArray arrayWithObjects:@"name", @"url", @"logo", nil]];*/
128 700184fb Miltiadis Vasilakis
        
129 45f2fce6 Miltiadis Vasilakis
        PithosImageViewController *vc = [[PithosImageViewController alloc] initWithNibName:@"PithosImageViewController" bundle:nil];
130 700184fb Miltiadis Vasilakis
        self.masterNavigationController = [[[UINavigationController alloc] initWithRootViewController:vc] autorelease];
131 700184fb Miltiadis Vasilakis
        self.masterNavigationController.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;
132 700184fb Miltiadis Vasilakis
        self.masterNavigationController.navigationBar.translucent = self.navigationController.navigationBar.translucent;
133 700184fb Miltiadis Vasilakis
        self.masterNavigationController.navigationBar.opaque = self.navigationController.navigationBar.opaque;
134 700184fb Miltiadis Vasilakis
        self.masterNavigationController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle;
135 700184fb Miltiadis Vasilakis
        
136 700184fb Miltiadis Vasilakis
        self.splitViewController.delegate = [navigationController.viewControllers objectAtIndex:0];
137 700184fb Miltiadis Vasilakis
        self.splitViewController.viewControllers = [NSArray arrayWithObjects:self.navigationController, self.masterNavigationController, nil];
138 700184fb Miltiadis Vasilakis
        
139 700184fb Miltiadis Vasilakis
        [window addSubview:splitViewController.view];
140 700184fb Miltiadis Vasilakis
        [window makeKeyAndVisible];
141 700184fb Miltiadis Vasilakis
        [vc release];
142 700184fb Miltiadis Vasilakis
    } else {
143 45f2fce6 Miltiadis Vasilakis
        
144 700184fb Miltiadis Vasilakis
        [window addSubview:navigationController.view];
145 700184fb Miltiadis Vasilakis
        [window makeKeyAndVisible];
146 700184fb Miltiadis Vasilakis
    }
147 45f2fce6 Miltiadis Vasilakis
148 700184fb Miltiadis Vasilakis
    serviceUnavailableObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"serviceUnavailable" object:nil
149 700184fb Miltiadis Vasilakis
                                                                           queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
150 700184fb Miltiadis Vasilakis
    {
151 700184fb Miltiadis Vasilakis
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Service Unavailable" message:@"The API is currently unavailable.  Please try again later." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
152 700184fb Miltiadis Vasilakis
        [alert show];
153 700184fb Miltiadis Vasilakis
        [alert release];
154 700184fb Miltiadis Vasilakis
        [[NSNotificationCenter defaultCenter] removeObserver:serviceUnavailableObserver];
155 700184fb Miltiadis Vasilakis
    }];
156 64929bae Miltiadis Vasilakis
    
157 64929bae Miltiadis Vasilakis
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
158 64929bae Miltiadis Vasilakis
    self.cacheDirectoryPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"DownloadedFiles"];
159 64929bae Miltiadis Vasilakis
    NSFileManager *fileManager = [NSFileManager defaultManager];
160 64929bae Miltiadis Vasilakis
    NSError *error = nil;
161 64929bae Miltiadis Vasilakis
    [fileManager createDirectoryAtPath:cacheDirectoryPath withIntermediateDirectories:YES attributes:nil error:&error];
162 64929bae Miltiadis Vasilakis
    if (error) {
163 64929bae Miltiadis Vasilakis
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
164 64929bae Miltiadis Vasilakis
                                                        message:[NSString stringWithFormat:@"Error in creating cache directory\n%@",error.localizedDescription]
165 64929bae Miltiadis Vasilakis
                                                       delegate:nil 
166 64929bae Miltiadis Vasilakis
                                              cancelButtonTitle:@"OK" otherButtonTitles:nil];
167 64929bae Miltiadis Vasilakis
        [alert show];
168 64929bae Miltiadis Vasilakis
        [alert release];
169 64929bae Miltiadis Vasilakis
    }
170 64929bae Miltiadis Vasilakis
171 700184fb Miltiadis Vasilakis
    return YES;
172 700184fb Miltiadis Vasilakis
}
173 700184fb Miltiadis Vasilakis
174 f14ddbf9 Miltiadis Vasilakis
//- (void) setupDependencies {
175 f14ddbf9 Miltiadis Vasilakis
//#if TARGET_OS_EMBEDDED
176 f14ddbf9 Miltiadis Vasilakis
//    
177 f14ddbf9 Miltiadis Vasilakis
//    NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@"Constants" ofType:@"plist"];
178 f14ddbf9 Miltiadis Vasilakis
//    
179 f14ddbf9 Miltiadis Vasilakis
//    if ([[NSFileManager defaultManager] fileExistsAtPath:path]){
180 f14ddbf9 Miltiadis Vasilakis
//        
181 f14ddbf9 Miltiadis Vasilakis
//        NSDictionary *constants = [NSDictionary dictionaryWithContentsOfFile:path];
182 f14ddbf9 Miltiadis Vasilakis
//        
183 f14ddbf9 Miltiadis Vasilakis
//        [HTNotifier startNotifierWithAPIKey:[constants objectForKey:@"HOPTOAD_ACCOUNT_KEY"]
184 f14ddbf9 Miltiadis Vasilakis
//                            environmentName:HTNotifierAppStoreEnvironment];
185 f14ddbf9 Miltiadis Vasilakis
//        [[GANTracker sharedTracker] startTrackerWithAccountID:[constants objectForKey:@"ANALYTICS_ACCOUNT_KEY"] dispatchPeriod:10 delegate:nil];
186 f14ddbf9 Miltiadis Vasilakis
//        
187 f14ddbf9 Miltiadis Vasilakis
//        // track the app version
188 f14ddbf9 Miltiadis Vasilakis
//        NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
189 f14ddbf9 Miltiadis Vasilakis
//        [[GANTracker sharedTracker] setCustomVariableAtIndex:1 name:@"app_version" value:version withError:nil];
190 f14ddbf9 Miltiadis Vasilakis
//        
191 f14ddbf9 Miltiadis Vasilakis
//        DispatchAnalytics();
192 f14ddbf9 Miltiadis Vasilakis
//
193 f14ddbf9 Miltiadis Vasilakis
//    } else {
194 f14ddbf9 Miltiadis Vasilakis
//        [HTNotifier startNotifierWithAPIKey:@"HOPTOAD_ACCOUNT_KEY" environmentName:HTNotifierAppStoreEnvironment];
195 f14ddbf9 Miltiadis Vasilakis
//        [[GANTracker sharedTracker] startTrackerWithAccountID:@"ANALYTICS_ACCOUNT_KEY" dispatchPeriod:10 delegate:nil];
196 f14ddbf9 Miltiadis Vasilakis
//    }
197 f14ddbf9 Miltiadis Vasilakis
//    
198 f14ddbf9 Miltiadis Vasilakis
//#endif
199 f14ddbf9 Miltiadis Vasilakis
//}
200 700184fb Miltiadis Vasilakis
201 700184fb Miltiadis Vasilakis
202 700184fb Miltiadis Vasilakis
- (void)applicationWillResignActive:(UIApplication *)application {
203 700184fb Miltiadis Vasilakis
    
204 700184fb Miltiadis Vasilakis
//    DispatchAnalytics();
205 700184fb Miltiadis Vasilakis
}
206 700184fb Miltiadis Vasilakis
207 700184fb Miltiadis Vasilakis
208 700184fb Miltiadis Vasilakis
- (void)applicationDidEnterBackground:(UIApplication *)application {
209 700184fb Miltiadis Vasilakis
    /*
210 700184fb Miltiadis Vasilakis
     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
211 700184fb Miltiadis Vasilakis
     If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
212 700184fb Miltiadis Vasilakis
     */
213 700184fb Miltiadis Vasilakis
}
214 700184fb Miltiadis Vasilakis
215 700184fb Miltiadis Vasilakis
216 700184fb Miltiadis Vasilakis
- (void)applicationWillEnterForeground:(UIApplication *)application {
217 700184fb Miltiadis Vasilakis
    /*
218 700184fb Miltiadis Vasilakis
     Called as part of  transition from the background to the inactive state: here you can undo many of the changes made on entering the background.
219 700184fb Miltiadis Vasilakis
     */
220 700184fb Miltiadis Vasilakis
}
221 700184fb Miltiadis Vasilakis
222 700184fb Miltiadis Vasilakis
223 700184fb Miltiadis Vasilakis
- (void)applicationDidBecomeActive:(UIApplication *)application {
224 64929bae Miltiadis Vasilakis
    
225 64929bae Miltiadis Vasilakis
    /* 
226 64929bae Miltiadis Vasilakis
	 Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
227 64929bae Miltiadis Vasilakis
	*/
228 64929bae Miltiadis Vasilakis
    [userDefaults setBool:NO forKey:@"already_failed_on_connection"];
229 64929bae Miltiadis Vasilakis
    [userDefaults synchronize];
230 700184fb Miltiadis Vasilakis
    
231 700184fb Miltiadis Vasilakis
    [self showPasscodeLock];
232 700184fb Miltiadis Vasilakis
    //DispatchAnalytics();
233 700184fb Miltiadis Vasilakis
}
234 700184fb Miltiadis Vasilakis
235 700184fb Miltiadis Vasilakis
236 700184fb Miltiadis Vasilakis
- (void)applicationWillTerminate:(UIApplication *)application {    
237 700184fb Miltiadis Vasilakis
    /*
238 700184fb Miltiadis Vasilakis
     Called when the application is about to terminate.
239 700184fb Miltiadis Vasilakis
     See also applicationDidEnterBackground:.
240 700184fb Miltiadis Vasilakis
     */
241 700184fb Miltiadis Vasilakis
    // TODO: perhaps this is a good place to release all the stuff allocated in
242 700184fb Miltiadis Vasilakis
    // +(void)initialize methods all over the place
243 700184fb Miltiadis Vasilakis
//    [[SettingsPluginHandler plugins] release];
244 700184fb Miltiadis Vasilakis
//    [[AddServerPluginHandler plugins] release];
245 700184fb Miltiadis Vasilakis
//    [[OpenStackAccount accounts] release];
246 700184fb Miltiadis Vasilakis
}
247 700184fb Miltiadis Vasilakis
248 700184fb Miltiadis Vasilakis
- (void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
249 700184fb Miltiadis Vasilakis
    
250 700184fb Miltiadis Vasilakis
    TrackViewController(viewController);
251 700184fb Miltiadis Vasilakis
}
252 700184fb Miltiadis Vasilakis
253 07592312 Miltiadis Vasilakis
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
254 3a8071d4 Miltiadis Vasilakis
    if (!url) 
255 07592312 Miltiadis Vasilakis
        return NO;
256 07592312 Miltiadis Vasilakis
257 07592312 Miltiadis Vasilakis
    NSString *host = [url host];
258 07592312 Miltiadis Vasilakis
	NSString *query = [url query];
259 07592312 Miltiadis Vasilakis
260 2989bee3 Miltiadis Vasilakis
    if ([host hasPrefix:@"login"] && query) {
261 07592312 Miltiadis Vasilakis
        // user=
262 07592312 Miltiadis Vasilakis
        NSString *authUser;
263 07592312 Miltiadis Vasilakis
        NSRange userRange = [query rangeOfString:@"user=" options:NSCaseInsensitiveSearch];
264 07592312 Miltiadis Vasilakis
        if (userRange.length == 0)
265 07592312 Miltiadis Vasilakis
            // XXX maybe show an error message?
266 07592312 Miltiadis Vasilakis
            return NO;
267 07592312 Miltiadis Vasilakis
        NSUInteger authUserStartLocation = userRange.location + userRange.length;
268 07592312 Miltiadis Vasilakis
        NSRange userEndRange = [query rangeOfString:@"-" options:NSCaseInsensitiveSearch 
269 07592312 Miltiadis Vasilakis
                                              range:NSMakeRange(authUserStartLocation, [query length] - authUserStartLocation)];
270 07592312 Miltiadis Vasilakis
        if (userEndRange.length) {
271 07592312 Miltiadis Vasilakis
            authUser = [[query substringWithRange:NSMakeRange(authUserStartLocation, userEndRange.location - authUserStartLocation)]
272 07592312 Miltiadis Vasilakis
                        stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
273 07592312 Miltiadis Vasilakis
        } else {
274 07592312 Miltiadis Vasilakis
            authUser = [[query substringFromIndex:authUserStartLocation]
275 07592312 Miltiadis Vasilakis
                        stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
276 07592312 Miltiadis Vasilakis
        }
277 07592312 Miltiadis Vasilakis
        // token=
278 07592312 Miltiadis Vasilakis
        NSString *authToken;
279 07592312 Miltiadis Vasilakis
        NSRange tokenRange = [query rangeOfString:@"token=" options:NSCaseInsensitiveSearch];
280 07592312 Miltiadis Vasilakis
        if (tokenRange.length == 0)
281 07592312 Miltiadis Vasilakis
            // XXX maybe show an error message?
282 07592312 Miltiadis Vasilakis
            return NO;
283 07592312 Miltiadis Vasilakis
        NSUInteger authTokenStartLocation = tokenRange.location + tokenRange.length;
284 07592312 Miltiadis Vasilakis
        NSRange tokenEndRange = [query rangeOfString:@"&" options:NSCaseInsensitiveSearch 
285 07592312 Miltiadis Vasilakis
                                               range:NSMakeRange(authTokenStartLocation, [query length] - authTokenStartLocation)];
286 07592312 Miltiadis Vasilakis
        if (tokenEndRange.length) {
287 07592312 Miltiadis Vasilakis
            authToken = [[query substringWithRange:NSMakeRange(authTokenStartLocation, tokenEndRange.location - authTokenStartLocation)]
288 07592312 Miltiadis Vasilakis
                         stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
289 07592312 Miltiadis Vasilakis
        } else {
290 07592312 Miltiadis Vasilakis
            authToken = [[query substringFromIndex:authTokenStartLocation]
291 07592312 Miltiadis Vasilakis
                         stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
292 07592312 Miltiadis Vasilakis
        }
293 07592312 Miltiadis Vasilakis
        
294 3a8071d4 Miltiadis Vasilakis
        if (authToken || authUser) {
295 3a8071d4 Miltiadis Vasilakis
            UIViewController *vc = nil;
296 3a8071d4 Miltiadis Vasilakis
            if (([navigationController.visibleViewController class] == [AccountDetailsViewController class]) || 
297 3a8071d4 Miltiadis Vasilakis
                ([navigationController.visibleViewController class] == [AccountSettingsViewController class]))
298 3a8071d4 Miltiadis Vasilakis
                vc = navigationController.visibleViewController;
299 3a8071d4 Miltiadis Vasilakis
            else if (([masterNavigationController.visibleViewController class] == [AccountDetailsViewController class]) || 
300 3a8071d4 Miltiadis Vasilakis
                     ([masterNavigationController.visibleViewController class] == [AccountSettingsViewController class]))
301 3a8071d4 Miltiadis Vasilakis
                vc = masterNavigationController.visibleViewController;
302 3a8071d4 Miltiadis Vasilakis
            if (vc) {
303 3a8071d4 Miltiadis Vasilakis
                if (authToken)
304 3a8071d4 Miltiadis Vasilakis
                    [vc setValue:authToken forKey:@"apiKey"];
305 3a8071d4 Miltiadis Vasilakis
                if (authUser)
306 3a8071d4 Miltiadis Vasilakis
                    [vc setValue:authUser forKey:@"userName"];
307 3a8071d4 Miltiadis Vasilakis
                [((UITableViewController *)vc).tableView reloadData];
308 3a8071d4 Miltiadis Vasilakis
            }
309 07592312 Miltiadis Vasilakis
        }
310 07592312 Miltiadis Vasilakis
    }
311 07592312 Miltiadis Vasilakis
    // XXX else maybe show an error message?
312 07592312 Miltiadis Vasilakis
    return YES;
313 07592312 Miltiadis Vasilakis
}
314 07592312 Miltiadis Vasilakis
315 64929bae Miltiadis Vasilakis
#pragma mark - persistence
316 64929bae Miltiadis Vasilakis
317 64929bae Miltiadis Vasilakis
- (void)saveCacheDictionary {
318 64929bae Miltiadis Vasilakis
    [userDefaults setObject:cachedObjectsDictionary forKey:@"cachedObjectsDictionary"];
319 64929bae Miltiadis Vasilakis
    [userDefaults synchronize];
320 64929bae Miltiadis Vasilakis
}
321 64929bae Miltiadis Vasilakis
322 700184fb Miltiadis Vasilakis
323 700184fb Miltiadis Vasilakis
#pragma mark -
324 700184fb Miltiadis Vasilakis
#pragma mark Memory management
325 700184fb Miltiadis Vasilakis
326 700184fb Miltiadis Vasilakis
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
327 700184fb Miltiadis Vasilakis
    /*
328 700184fb Miltiadis Vasilakis
     Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.
329 700184fb Miltiadis Vasilakis
     */
330 700184fb Miltiadis Vasilakis
}
331 700184fb Miltiadis Vasilakis
332 700184fb Miltiadis Vasilakis
333 700184fb Miltiadis Vasilakis
- (void)dealloc {
334 700184fb Miltiadis Vasilakis
	[navigationController release];
335 700184fb Miltiadis Vasilakis
    [splitViewController release];
336 700184fb Miltiadis Vasilakis
    [masterNavigationController release];
337 700184fb Miltiadis Vasilakis
    [barButtonItem release];
338 700184fb Miltiadis Vasilakis
    [rootViewController release];
339 700184fb Miltiadis Vasilakis
	[window release];
340 64929bae Miltiadis Vasilakis
    [cachedObjectsDictionary release];
341 64929bae Miltiadis Vasilakis
    [userDefaults release];
342 700184fb Miltiadis Vasilakis
	[super dealloc];
343 700184fb Miltiadis Vasilakis
}
344 700184fb Miltiadis Vasilakis
345 700184fb Miltiadis Vasilakis
346 700184fb Miltiadis Vasilakis
@end