Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / pithos_macosAppDelegate.m @ 46b46b83

History | View | Annotate | Download (17.7 kB)

1 d8d08dc1 Miltiadis Vasilakis
//
2 d8d08dc1 Miltiadis Vasilakis
//  pithos_macosAppDelegate.m
3 d8d08dc1 Miltiadis Vasilakis
//  pithos-macos
4 d8d08dc1 Miltiadis Vasilakis
//
5 919cb043 Miltiadis Vasilakis
// Copyright 2011-2012 GRNET S.A. All rights reserved.
6 d8d08dc1 Miltiadis Vasilakis
//
7 d8d08dc1 Miltiadis Vasilakis
// Redistribution and use in source and binary forms, with or
8 d8d08dc1 Miltiadis Vasilakis
// without modification, are permitted provided that the following
9 d8d08dc1 Miltiadis Vasilakis
// conditions are met:
10 d8d08dc1 Miltiadis Vasilakis
// 
11 d8d08dc1 Miltiadis Vasilakis
//   1. Redistributions of source code must retain the above
12 d8d08dc1 Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
13 d8d08dc1 Miltiadis Vasilakis
//      disclaimer.
14 d8d08dc1 Miltiadis Vasilakis
// 
15 d8d08dc1 Miltiadis Vasilakis
//   2. Redistributions in binary form must reproduce the above
16 d8d08dc1 Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
17 d8d08dc1 Miltiadis Vasilakis
//      disclaimer in the documentation and/or other materials
18 d8d08dc1 Miltiadis Vasilakis
//      provided with the distribution.
19 d8d08dc1 Miltiadis Vasilakis
// 
20 d8d08dc1 Miltiadis Vasilakis
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21 d8d08dc1 Miltiadis Vasilakis
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 d8d08dc1 Miltiadis Vasilakis
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 d8d08dc1 Miltiadis Vasilakis
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24 d8d08dc1 Miltiadis Vasilakis
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 d8d08dc1 Miltiadis Vasilakis
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 d8d08dc1 Miltiadis Vasilakis
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27 d8d08dc1 Miltiadis Vasilakis
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 d8d08dc1 Miltiadis Vasilakis
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 d8d08dc1 Miltiadis Vasilakis
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 d8d08dc1 Miltiadis Vasilakis
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 d8d08dc1 Miltiadis Vasilakis
// POSSIBILITY OF SUCH DAMAGE.
32 d8d08dc1 Miltiadis Vasilakis
// 
33 d8d08dc1 Miltiadis Vasilakis
// The views and conclusions contained in the software and
34 d8d08dc1 Miltiadis Vasilakis
// documentation are those of the authors and should not be
35 d8d08dc1 Miltiadis Vasilakis
// interpreted as representing official policies, either expressed
36 d8d08dc1 Miltiadis Vasilakis
// or implied, of GRNET S.A.
37 d8d08dc1 Miltiadis Vasilakis
38 d8d08dc1 Miltiadis Vasilakis
#import "pithos_macosAppDelegate.h"
39 d8426ffb Miltiadis Vasilakis
#import "PithosAccount.h"
40 d8d08dc1 Miltiadis Vasilakis
#import "PithosBrowserController.h"
41 589a14ca Miltiadis Vasilakis
#import "PithosPreferencesController.h"
42 0224a49f Miltiadis Vasilakis
#import "PithosSyncDaemon.h"
43 589a14ca Miltiadis Vasilakis
#import "ASIPithosRequest.h"
44 919cb043 Miltiadis Vasilakis
#import "ASIPithos.h"
45 af3b9f06 Miltiadis Vasilakis
#import "ASIDownloadCache.h"
46 d8426ffb Miltiadis Vasilakis
#import "LastCompletedSyncTransformer.h"
47 d8d08dc1 Miltiadis Vasilakis
48 d8d08dc1 Miltiadis Vasilakis
@implementation pithos_macosAppDelegate
49 580d6623 Antony Chazapis
@synthesize pithosBrowserController, alwaysNo, activated, currentPithosAccount, pithosAccounts, pithosAccountsDictionary, syncPithosAccount;
50 d8d08dc1 Miltiadis Vasilakis
51 d8d08dc1 Miltiadis Vasilakis
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
52 d8426ffb Miltiadis Vasilakis
    [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self 
53 d8426ffb Miltiadis Vasilakis
                                                       andSelector:@selector(handleAppleEvent:withReplyEvent:) 
54 d8426ffb Miltiadis Vasilakis
                                                     forEventClass:kInternetEventClass 
55 d8426ffb Miltiadis Vasilakis
                                                        andEventID:kAEGetURL];
56 efbe8f14 Miltiadis Vasilakis
    
57 d8426ffb Miltiadis Vasilakis
    userDefaults = [[NSUserDefaults standardUserDefaults] retain];
58 c6f07a3c Miltiadis Vasilakis
    
59 d8426ffb Miltiadis Vasilakis
    syncTimeInterval = [userDefaults doubleForKey:@"syncTimeInterval"];
60 d8426ffb Miltiadis Vasilakis
    if (syncTimeInterval <= 0.0) {
61 d8426ffb Miltiadis Vasilakis
        syncTimeInterval = 180.0;
62 d8426ffb Miltiadis Vasilakis
        [userDefaults setDouble:syncTimeInterval forKey:@"syncTimeInterval"];
63 d8426ffb Miltiadis Vasilakis
        [userDefaults synchronize];
64 0224a49f Miltiadis Vasilakis
    }
65 0224a49f Miltiadis Vasilakis
    
66 d8426ffb Miltiadis Vasilakis
    NSData *tmpData = [userDefaults objectForKey:@"pithosAccounts"];
67 d8426ffb Miltiadis Vasilakis
    NSArray *tmpArray;
68 d8426ffb Miltiadis Vasilakis
    if (tmpData && (tmpArray = [NSKeyedUnarchiver unarchiveObjectWithData:tmpData]))
69 d8426ffb Miltiadis Vasilakis
        self.pithosAccounts = [NSMutableArray arrayWithArray:tmpArray];
70 d8426ffb Miltiadis Vasilakis
    else
71 d8426ffb Miltiadis Vasilakis
        self.pithosAccounts = [NSMutableArray array];
72 222199ae Miltiadis Vasilakis
    
73 d8426ffb Miltiadis Vasilakis
    if (![pithosAccounts count]) {
74 d8426ffb Miltiadis Vasilakis
        [pithosAccounts addObject:[PithosAccount pithosAccount]];
75 d8426ffb Miltiadis Vasilakis
        self.pithosAccounts = self.pithosAccounts;
76 d8426ffb Miltiadis Vasilakis
    } else {
77 d8426ffb Miltiadis Vasilakis
        self.activated = YES;
78 d8426ffb Miltiadis Vasilakis
    }
79 0224a49f Miltiadis Vasilakis
    
80 d8426ffb Miltiadis Vasilakis
    pithosAccountsDictionary = [[NSMutableDictionary alloc] initWithCapacity:[pithosAccounts count]];
81 d8426ffb Miltiadis Vasilakis
    for (PithosAccount *pithosAccount in pithosAccounts) {
82 d8426ffb Miltiadis Vasilakis
        [pithosAccountsDictionary setObject:pithosAccount forKey:pithosAccount.name];
83 d8426ffb Miltiadis Vasilakis
        if (!currentPithosAccount && pithosAccount.active)
84 d8426ffb Miltiadis Vasilakis
            currentPithosAccount = [pithosAccount retain];
85 d8426ffb Miltiadis Vasilakis
    }
86 d8426ffb Miltiadis Vasilakis
    if (!currentPithosAccount)
87 d8426ffb Miltiadis Vasilakis
        self.currentPithosAccount = [pithosAccounts objectAtIndex:0];
88 589a14ca Miltiadis Vasilakis
    
89 d8426ffb Miltiadis Vasilakis
    if (currentPithosAccount.active) {
90 d8426ffb Miltiadis Vasilakis
        [self savePithosAccounts:self];
91 d8426ffb Miltiadis Vasilakis
        [self showPithosBrowser:self];
92 d8426ffb Miltiadis Vasilakis
        pithosBrowserController.pithos = currentPithosAccount.pithos;
93 d8426ffb Miltiadis Vasilakis
    } else {
94 d8426ffb Miltiadis Vasilakis
        // XXX maybe call specifically to go to new account tab
95 d8426ffb Miltiadis Vasilakis
        [self showPithosPreferences:self];
96 d8426ffb Miltiadis Vasilakis
    }
97 d8426ffb Miltiadis Vasilakis
98 d8426ffb Miltiadis Vasilakis
    syncTimer = [[NSTimer scheduledTimerWithTimeInterval:syncTimeInterval 
99 d8426ffb Miltiadis Vasilakis
                                                  target:self 
100 d8426ffb Miltiadis Vasilakis
                                                selector:@selector(sync) 
101 d8426ffb Miltiadis Vasilakis
                                                userInfo:nil 
102 d8426ffb Miltiadis Vasilakis
                                                 repeats:YES] retain];
103 d8426ffb Miltiadis Vasilakis
    [syncTimer fire];
104 589a14ca Miltiadis Vasilakis
}
105 589a14ca Miltiadis Vasilakis
106 589a14ca Miltiadis Vasilakis
// Based on: http://cocoatutorial.grapewave.com/2010/01/creating-a-status-bar-application/
107 589a14ca Miltiadis Vasilakis
// and: http://www.cocoadev.com/index.pl?ThumbnailImages
108 589a14ca Miltiadis Vasilakis
- (void)awakeFromNib {
109 72c9d681 Miltiadis Vasilakis
    NSImage *sourceImage = [NSImage imageNamed:@"pithos-large.png"];
110 589a14ca Miltiadis Vasilakis
    
111 589a14ca Miltiadis Vasilakis
    NSImage *smallImage = [[[NSImage alloc] initWithSize:NSMakeSize(18, 18)] autorelease];
112 589a14ca Miltiadis Vasilakis
    [smallImage lockFocus];
113 589a14ca Miltiadis Vasilakis
    [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
114 589a14ca Miltiadis Vasilakis
    [sourceImage setSize:NSMakeSize(18, 18)];
115 589a14ca Miltiadis Vasilakis
    [sourceImage compositeToPoint:NSZeroPoint operation:NSCompositeCopy];
116 589a14ca Miltiadis Vasilakis
    [smallImage unlockFocus];
117 589a14ca Miltiadis Vasilakis
    
118 589a14ca Miltiadis Vasilakis
    statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
119 589a14ca Miltiadis Vasilakis
    [statusItem setMenu:statusMenu];
120 589a14ca Miltiadis Vasilakis
    [statusItem setImage:sourceImage];
121 589a14ca Miltiadis Vasilakis
    [statusItem setHighlightMode:YES];
122 3812626f Miltiadis Vasilakis
    
123 3812626f Miltiadis Vasilakis
    self.alwaysNo = NO;
124 d8d08dc1 Miltiadis Vasilakis
}
125 d8d08dc1 Miltiadis Vasilakis
126 9f3a92de Miltiadis Vasilakis
- (void)handleAppleEvent:(NSAppleEventDescriptor *)event withReplyEvent: (NSAppleEventDescriptor *)replyEvent {
127 9f3a92de Miltiadis Vasilakis
    NSURL *url = [NSURL URLWithString:[[event paramDescriptorForKeyword:keyDirectObject] stringValue]];
128 9f3a92de Miltiadis Vasilakis
    NSString *host = [url host];
129 9f3a92de Miltiadis Vasilakis
	NSString *query = [url query];
130 d8426ffb Miltiadis Vasilakis
    PithosAccount *pithosAccount = [pithosAccountsDictionary objectForKey:[url lastPathComponent]];
131 9f3a92de Miltiadis Vasilakis
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
132 d8426ffb Miltiadis Vasilakis
    if ([host isEqualToString:[NSString stringWithFormat:@"%@_%d", [processInfo processName], [processInfo processIdentifier]]] && 
133 d8426ffb Miltiadis Vasilakis
        pithosAccount && query) {
134 9f3a92de Miltiadis Vasilakis
        // user=
135 9f3a92de Miltiadis Vasilakis
        NSString *authUser;
136 9f3a92de Miltiadis Vasilakis
        NSRange userRange = [query rangeOfString:@"user=" options:NSCaseInsensitiveSearch];
137 9f3a92de Miltiadis Vasilakis
        if (userRange.length == 0)
138 9f3a92de Miltiadis Vasilakis
            // XXX maybe show an error message?
139 9f3a92de Miltiadis Vasilakis
            return;
140 9f3a92de Miltiadis Vasilakis
        NSUInteger authUserStartLocation = userRange.location + userRange.length;
141 9f3a92de Miltiadis Vasilakis
        NSRange userEndRange = [query rangeOfString:@"&" options:NSCaseInsensitiveSearch 
142 9f3a92de Miltiadis Vasilakis
                                              range:NSMakeRange(authUserStartLocation, [query length] - authUserStartLocation)];
143 9f3a92de Miltiadis Vasilakis
        if (userEndRange.length) {
144 155f0dfd Miltiadis Vasilakis
            authUser = [[query substringWithRange:NSMakeRange(authUserStartLocation, userEndRange.location - authUserStartLocation)]
145 155f0dfd Miltiadis Vasilakis
                        stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
146 9f3a92de Miltiadis Vasilakis
        } else {
147 155f0dfd Miltiadis Vasilakis
            authUser = [[query substringFromIndex:authUserStartLocation]
148 155f0dfd Miltiadis Vasilakis
                        stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
149 9f3a92de Miltiadis Vasilakis
        }
150 9f3a92de Miltiadis Vasilakis
        // token=
151 9f3a92de Miltiadis Vasilakis
        NSString *authToken;
152 9f3a92de Miltiadis Vasilakis
        NSRange tokenRange = [query rangeOfString:@"token=" options:NSCaseInsensitiveSearch];
153 9f3a92de Miltiadis Vasilakis
        if (tokenRange.length == 0)
154 9f3a92de Miltiadis Vasilakis
            // XXX maybe show an error message?
155 9f3a92de Miltiadis Vasilakis
            return;
156 9f3a92de Miltiadis Vasilakis
        NSUInteger authTokenStartLocation = tokenRange.location + tokenRange.length;
157 9f3a92de Miltiadis Vasilakis
        NSRange tokenEndRange = [query rangeOfString:@"&" options:NSCaseInsensitiveSearch 
158 9f3a92de Miltiadis Vasilakis
                                              range:NSMakeRange(authTokenStartLocation, [query length] - authTokenStartLocation)];
159 9f3a92de Miltiadis Vasilakis
        if (tokenEndRange.length) {
160 155f0dfd Miltiadis Vasilakis
            authToken = [[query substringWithRange:NSMakeRange(authTokenStartLocation, tokenEndRange.location - authTokenStartLocation)]
161 155f0dfd Miltiadis Vasilakis
                         stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
162 9f3a92de Miltiadis Vasilakis
        } else {
163 155f0dfd Miltiadis Vasilakis
            authToken = [[query substringFromIndex:authTokenStartLocation]
164 155f0dfd Miltiadis Vasilakis
                         stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
165 9f3a92de Miltiadis Vasilakis
        }
166 589a14ca Miltiadis Vasilakis
        
167 9f3a92de Miltiadis Vasilakis
        NSLog(@"query authUser: '%@', authToken: '%@'", authUser, authToken);
168 589a14ca Miltiadis Vasilakis
        if ([authUser length] && [authToken length]) {
169 d8426ffb Miltiadis Vasilakis
            [pithosAccount authenticateWithServerURL:nil authUser:authUser authToken:authToken];
170 d8426ffb Miltiadis Vasilakis
            [self savePithosAccounts:self];
171 d8426ffb Miltiadis Vasilakis
            if (pithosPreferencesController && [pithosPreferencesController.selectedPithosAccount isEqualTo:pithosAccount]) {
172 d8426ffb Miltiadis Vasilakis
                pithosPreferencesController.authUser = pithosAccount.authUser;
173 d8426ffb Miltiadis Vasilakis
                pithosPreferencesController.authToken = pithosAccount.authToken;
174 d8426ffb Miltiadis Vasilakis
            }
175 d8426ffb Miltiadis Vasilakis
            self.activated = YES;
176 d8426ffb Miltiadis Vasilakis
            if ([pithosAccount isEqualTo:currentPithosAccount]) {
177 d8426ffb Miltiadis Vasilakis
                [self showPithosBrowser:self];
178 d8426ffb Miltiadis Vasilakis
                pithosBrowserController.pithos = pithosAccount.pithos;
179 d8426ffb Miltiadis Vasilakis
            }
180 589a14ca Miltiadis Vasilakis
        }
181 589a14ca Miltiadis Vasilakis
        // XXX else maybe show an error message?
182 9f3a92de Miltiadis Vasilakis
    }
183 9f3a92de Miltiadis Vasilakis
    // XXX else maybe show an error message?
184 9f3a92de Miltiadis Vasilakis
}
185 9f3a92de Miltiadis Vasilakis
186 d8426ffb Miltiadis Vasilakis
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
187 d8426ffb Miltiadis Vasilakis
    [self savePithosAccounts:self];
188 d8426ffb Miltiadis Vasilakis
    if ([self.pithosBrowserController operationsPending]) {
189 d8426ffb Miltiadis Vasilakis
        NSAlert *alert = [[[NSAlert alloc] init] autorelease];
190 d8426ffb Miltiadis Vasilakis
        [alert setMessageText:@"Pending Operations"];
191 d8426ffb Miltiadis Vasilakis
        [alert setInformativeText:@"There are pending operations in the browser, do you want to quit and cancel them?"];
192 d8426ffb Miltiadis Vasilakis
        [alert addButtonWithTitle:@"OK"];
193 d8426ffb Miltiadis Vasilakis
        [alert addButtonWithTitle:@"Cancel"];
194 d8426ffb Miltiadis Vasilakis
        NSInteger choice = [alert runModal];
195 d8426ffb Miltiadis Vasilakis
        if (choice == NSAlertSecondButtonReturn) 
196 d8426ffb Miltiadis Vasilakis
            return NSTerminateCancel;
197 d0d3b184 Miltiadis Vasilakis
    }
198 d8426ffb Miltiadis Vasilakis
    return NSTerminateNow;
199 d0d3b184 Miltiadis Vasilakis
}
200 d0d3b184 Miltiadis Vasilakis
201 d0d3b184 Miltiadis Vasilakis
#pragma mark -
202 d8426ffb Miltiadis Vasilakis
#pragma mark NSMenuDelegate
203 d8426ffb Miltiadis Vasilakis
204 d8426ffb Miltiadis Vasilakis
- (void)menuNeedsUpdate:(NSMenu *)menu {
205 d8426ffb Miltiadis Vasilakis
    NSMenuItem *menuItem;
206 d8426ffb Miltiadis Vasilakis
    [menu removeAllItems];
207 d8426ffb Miltiadis Vasilakis
    if ([menu isEqualTo:accountsMenu]) {
208 d8426ffb Miltiadis Vasilakis
        [menu setAutoenablesItems:NO];
209 d8426ffb Miltiadis Vasilakis
        for (PithosAccount *pithosAccount in pithosAccounts) {
210 d8426ffb Miltiadis Vasilakis
            menuItem = [[[NSMenuItem alloc] initWithTitle:pithosAccount.name 
211 d8426ffb Miltiadis Vasilakis
                                                   action:@selector(menuChangePithosAccount:) 
212 d8426ffb Miltiadis Vasilakis
                                            keyEquivalent:@""] autorelease];
213 d8426ffb Miltiadis Vasilakis
            [menuItem setRepresentedObject:pithosAccount];
214 d8426ffb Miltiadis Vasilakis
            [menuItem setEnabled:pithosAccount.active];
215 d8426ffb Miltiadis Vasilakis
            [menuItem setState:((pithosAccount.active && [currentPithosAccount isEqualTo:pithosAccount]) ? NSOnState : NSOffState)];
216 d8426ffb Miltiadis Vasilakis
            [menu addItem:menuItem];
217 d8426ffb Miltiadis Vasilakis
        }
218 d8426ffb Miltiadis Vasilakis
    } else if ([menu isEqualTo:lastSyncMenu]) {
219 d8426ffb Miltiadis Vasilakis
        NSString *menuItemTitle;
220 d8426ffb Miltiadis Vasilakis
        [menu setAutoenablesItems:NO];
221 d8426ffb Miltiadis Vasilakis
        for (PithosAccount *pithosAccount in pithosAccounts) {
222 d8426ffb Miltiadis Vasilakis
            menuItemTitle = [NSString stringWithFormat:@"%@: %@", 
223 d8426ffb Miltiadis Vasilakis
                             pithosAccount.name, 
224 d8426ffb Miltiadis Vasilakis
                             [[[[LastCompletedSyncTransformer alloc] init] autorelease] transformedValue:pithosAccount.syncLastCompleted]];
225 d8426ffb Miltiadis Vasilakis
            if ([pithosAccount isEqualTo:syncPithosAccount] && [pithosAccount.syncDaemon isSyncing])
226 d8426ffb Miltiadis Vasilakis
                menuItemTitle = [menuItemTitle stringByAppendingString:@" (syncing)"];
227 d8426ffb Miltiadis Vasilakis
            menuItem = [[[NSMenuItem alloc] initWithTitle:menuItemTitle 
228 d8426ffb Miltiadis Vasilakis
                                                   action:@selector(menuChangeSyncActive:) 
229 d8426ffb Miltiadis Vasilakis
                                            keyEquivalent:@""] autorelease];
230 d8426ffb Miltiadis Vasilakis
            [menuItem setRepresentedObject:pithosAccount];
231 d8426ffb Miltiadis Vasilakis
            [menuItem setEnabled:pithosAccount.active];
232 d8426ffb Miltiadis Vasilakis
            [menuItem setState:((pithosAccount.active && pithosAccount.syncActive) ? NSOnState : NSOffState)];
233 d8426ffb Miltiadis Vasilakis
            [menu addItem:menuItem];
234 d8426ffb Miltiadis Vasilakis
        }
235 d8426ffb Miltiadis Vasilakis
        [menu addItem:[NSMenuItem separatorItem]];
236 d8426ffb Miltiadis Vasilakis
        [menu addItem:[[[NSMenuItem alloc] initWithTitle:@"Next Sync" 
237 d8426ffb Miltiadis Vasilakis
                                                  action:@selector(sync) 
238 d8426ffb Miltiadis Vasilakis
                                           keyEquivalent:@""] autorelease]];
239 d8426ffb Miltiadis Vasilakis
    }
240 d8426ffb Miltiadis Vasilakis
}
241 d8426ffb Miltiadis Vasilakis
242 d8426ffb Miltiadis Vasilakis
#pragma mark -
243 d8426ffb Miltiadis Vasilakis
#pragma mark Actions
244 589a14ca Miltiadis Vasilakis
245 589a14ca Miltiadis Vasilakis
- (IBAction)showPithosBrowser:(id)sender {
246 d8426ffb Miltiadis Vasilakis
    if (!activated)
247 d8426ffb Miltiadis Vasilakis
        return;
248 589a14ca Miltiadis Vasilakis
    [pithosBrowserController showWindow:sender];
249 589a14ca Miltiadis Vasilakis
    [[pithosBrowserController window] makeKeyAndOrderFront:sender];
250 589a14ca Miltiadis Vasilakis
    [NSApp activateIgnoringOtherApps:YES];
251 589a14ca Miltiadis Vasilakis
}
252 589a14ca Miltiadis Vasilakis
253 589a14ca Miltiadis Vasilakis
- (IBAction)showPithosPreferences:(id)sender {
254 589a14ca Miltiadis Vasilakis
    [pithosPreferencesController showWindow:sender];
255 589a14ca Miltiadis Vasilakis
    [[pithosPreferencesController window] makeKeyAndOrderFront:sender];
256 589a14ca Miltiadis Vasilakis
    [NSApp activateIgnoringOtherApps:YES];
257 589a14ca Miltiadis Vasilakis
}
258 589a14ca Miltiadis Vasilakis
259 d8426ffb Miltiadis Vasilakis
- (void)sync {
260 d8426ffb Miltiadis Vasilakis
    if (!activated || ![pithosAccounts count])
261 d8426ffb Miltiadis Vasilakis
        return;
262 d8426ffb Miltiadis Vasilakis
    NSUInteger syncIndex;
263 d8426ffb Miltiadis Vasilakis
    BOOL syncPithosAccountFound = [pithosAccounts containsObject:syncPithosAccount];
264 d8426ffb Miltiadis Vasilakis
    if (syncPithosAccountFound)
265 d8426ffb Miltiadis Vasilakis
         syncIndex = [pithosAccounts indexOfObject:syncPithosAccount];
266 d8426ffb Miltiadis Vasilakis
    
267 d8426ffb Miltiadis Vasilakis
    PithosAccount *singleSyncPithosAccount = nil;
268 d8426ffb Miltiadis Vasilakis
    for (PithosAccount *pithosAccount in pithosAccounts) {
269 d8426ffb Miltiadis Vasilakis
        if (!singleSyncPithosAccount && pithosAccount.active && pithosAccount.syncActive && pithosAccount.syncDaemon) {
270 d8426ffb Miltiadis Vasilakis
            singleSyncPithosAccount = pithosAccount;
271 d8426ffb Miltiadis Vasilakis
        } else if (singleSyncPithosAccount && pithosAccount.active && pithosAccount.syncActive && pithosAccount.syncDaemon) {
272 d8426ffb Miltiadis Vasilakis
            singleSyncPithosAccount = nil;
273 d8426ffb Miltiadis Vasilakis
            break;
274 d8426ffb Miltiadis Vasilakis
        }
275 d8426ffb Miltiadis Vasilakis
    }
276 d8426ffb Miltiadis Vasilakis
    
277 d8426ffb Miltiadis Vasilakis
    if (syncPithosAccount && syncPithosAccount.active && syncPithosAccount.syncActive && syncPithosAccount.syncDaemon) {
278 d8426ffb Miltiadis Vasilakis
        // An active syncDaemon was previously syncing
279 d8426ffb Miltiadis Vasilakis
        if (singleSyncPithosAccount && [singleSyncPithosAccount isEqualTo:syncPithosAccount]) {
280 d8426ffb Miltiadis Vasilakis
            // It's the only one, sync again
281 d8426ffb Miltiadis Vasilakis
            [syncPithosAccount.syncDaemon startDaemon];
282 d8426ffb Miltiadis Vasilakis
            [syncPithosAccount.syncDaemon sync];
283 d8426ffb Miltiadis Vasilakis
            return;
284 d8426ffb Miltiadis Vasilakis
        } else if ([syncPithosAccount.syncDaemon isSyncing]) {
285 d8426ffb Miltiadis Vasilakis
            // It's still syncing, mark it as late and return
286 d8426ffb Miltiadis Vasilakis
            [syncPithosAccount.syncDaemon syncLate];
287 d8426ffb Miltiadis Vasilakis
            return;
288 d8426ffb Miltiadis Vasilakis
        }
289 d8426ffb Miltiadis Vasilakis
    }
290 d8426ffb Miltiadis Vasilakis
    PithosAccount *newSyncPithosAccount = nil;
291 d8426ffb Miltiadis Vasilakis
    if (syncPithosAccountFound) {
292 d8426ffb Miltiadis Vasilakis
        for (PithosAccount *pithosAccount in [pithosAccounts objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(syncIndex + 1, [pithosAccounts count] - syncIndex - 1)]]) {
293 d8426ffb Miltiadis Vasilakis
            if (pithosAccount.active && pithosAccount.syncActive && pithosAccount.syncDaemon) {
294 d8426ffb Miltiadis Vasilakis
                newSyncPithosAccount = pithosAccount;
295 d8426ffb Miltiadis Vasilakis
                break;
296 d8426ffb Miltiadis Vasilakis
            }
297 d8426ffb Miltiadis Vasilakis
        }
298 d8426ffb Miltiadis Vasilakis
        if (!newSyncPithosAccount) {
299 d8426ffb Miltiadis Vasilakis
            for (PithosAccount *pithosAccount in [pithosAccounts objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, syncIndex)]]) {
300 d8426ffb Miltiadis Vasilakis
                if (pithosAccount.active && pithosAccount.syncActive && pithosAccount.syncDaemon) {
301 d8426ffb Miltiadis Vasilakis
                    newSyncPithosAccount = pithosAccount;
302 d8426ffb Miltiadis Vasilakis
                    break;
303 d8426ffb Miltiadis Vasilakis
                }
304 d8426ffb Miltiadis Vasilakis
            }
305 d8426ffb Miltiadis Vasilakis
        }
306 d8426ffb Miltiadis Vasilakis
    } else {
307 d8426ffb Miltiadis Vasilakis
        for (PithosAccount *pithosAccount in pithosAccounts) {
308 d8426ffb Miltiadis Vasilakis
            if (pithosAccount.active && pithosAccount.syncActive && pithosAccount.syncDaemon) {
309 d8426ffb Miltiadis Vasilakis
                newSyncPithosAccount = pithosAccount;
310 d8426ffb Miltiadis Vasilakis
                break;
311 d8426ffb Miltiadis Vasilakis
            }
312 d8426ffb Miltiadis Vasilakis
        }
313 d8426ffb Miltiadis Vasilakis
    }        
314 d8426ffb Miltiadis Vasilakis
    if (newSyncPithosAccount) {
315 d8426ffb Miltiadis Vasilakis
        // A different syncDaemon is found, sync it
316 d8426ffb Miltiadis Vasilakis
        self.syncPithosAccount = newSyncPithosAccount;
317 d8426ffb Miltiadis Vasilakis
        [syncPithosAccount.syncDaemon startDaemon];
318 d8426ffb Miltiadis Vasilakis
        [syncPithosAccount.syncDaemon sync];
319 d8426ffb Miltiadis Vasilakis
    } else if (syncPithosAccountFound && syncPithosAccount && syncPithosAccount.active && syncPithosAccount.syncActive && syncPithosAccount.syncDaemon) {
320 d8426ffb Miltiadis Vasilakis
        [syncPithosAccount.syncDaemon startDaemon];
321 d8426ffb Miltiadis Vasilakis
        [syncPithosAccount.syncDaemon sync];
322 d8426ffb Miltiadis Vasilakis
    } else {
323 d8426ffb Miltiadis Vasilakis
        self.syncPithosAccount = nil;
324 d8426ffb Miltiadis Vasilakis
    }
325 0224a49f Miltiadis Vasilakis
}
326 0224a49f Miltiadis Vasilakis
327 d8426ffb Miltiadis Vasilakis
- (void)savePithosAccounts:(id)sender {
328 d8426ffb Miltiadis Vasilakis
    [userDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:pithosAccounts] forKey:@"pithosAccounts"];
329 d8426ffb Miltiadis Vasilakis
    [userDefaults synchronize];
330 d8426ffb Miltiadis Vasilakis
}
331 589a14ca Miltiadis Vasilakis
332 d8426ffb Miltiadis Vasilakis
- (void)removedPithosAccount:(PithosAccount *)removedPithosAccount {
333 d8426ffb Miltiadis Vasilakis
    if ([self.currentPithosAccount isEqualTo:removedPithosAccount]) {
334 d8426ffb Miltiadis Vasilakis
        for (PithosAccount *pithosAccount in pithosAccounts) {
335 d8426ffb Miltiadis Vasilakis
            if (pithosAccount.active) {
336 d8426ffb Miltiadis Vasilakis
                self.currentPithosAccount = pithosAccount;
337 d8426ffb Miltiadis Vasilakis
                pithosBrowserController.pithos = currentPithosAccount.pithos;
338 d8426ffb Miltiadis Vasilakis
                break;
339 d8426ffb Miltiadis Vasilakis
            }
340 d8426ffb Miltiadis Vasilakis
        }
341 d8426ffb Miltiadis Vasilakis
        if ([self.currentPithosAccount isEqualTo:removedPithosAccount]) {
342 d8426ffb Miltiadis Vasilakis
            self.activated = NO;
343 d8426ffb Miltiadis Vasilakis
            [pithosBrowserController.window close];
344 d8426ffb Miltiadis Vasilakis
            [pithosBrowserController resetBrowser];
345 d8426ffb Miltiadis Vasilakis
            self.currentPithosAccount = [pithosAccounts objectAtIndex:0];
346 d8426ffb Miltiadis Vasilakis
        }
347 d8426ffb Miltiadis Vasilakis
    }
348 d8426ffb Miltiadis Vasilakis
    if ([self.syncPithosAccount isEqualTo:removedPithosAccount])
349 d8426ffb Miltiadis Vasilakis
        self.syncPithosAccount = nil;
350 dbfd951b Miltiadis Vasilakis
}
351 dbfd951b Miltiadis Vasilakis
352 d8426ffb Miltiadis Vasilakis
#pragma mark -
353 d8426ffb Miltiadis Vasilakis
#pragma mark Menu Actions
354 d8426ffb Miltiadis Vasilakis
355 d8426ffb Miltiadis Vasilakis
- (void)menuChangePithosAccount:(NSMenuItem *)sender {
356 d8426ffb Miltiadis Vasilakis
    PithosAccount *pithosAccount = (PithosAccount *)[sender representedObject];
357 d8426ffb Miltiadis Vasilakis
    if (!pithosAccount.active)
358 d8426ffb Miltiadis Vasilakis
        return;
359 d8426ffb Miltiadis Vasilakis
    if (![currentPithosAccount isEqualTo:pithosAccount] && [pithosAccounts containsObject:pithosAccount]) {
360 d8426ffb Miltiadis Vasilakis
        if ([self.pithosBrowserController operationsPending]) {
361 d8426ffb Miltiadis Vasilakis
            NSAlert *alert = [[[NSAlert alloc] init] autorelease];
362 d8426ffb Miltiadis Vasilakis
            [alert setMessageText:@"Pending Operations"];
363 d8426ffb Miltiadis Vasilakis
            [alert setInformativeText:@"There are pending operations in the browser, do you want to change accounts and cancel them?"];
364 d8426ffb Miltiadis Vasilakis
            [alert addButtonWithTitle:@"OK"];
365 d8426ffb Miltiadis Vasilakis
            [alert addButtonWithTitle:@"Cancel"];
366 d8426ffb Miltiadis Vasilakis
            NSInteger choice = [alert runModal];
367 d8426ffb Miltiadis Vasilakis
            if (choice == NSAlertSecondButtonReturn) 
368 d8426ffb Miltiadis Vasilakis
                return;
369 d8426ffb Miltiadis Vasilakis
        }
370 d8426ffb Miltiadis Vasilakis
        self.currentPithosAccount = pithosAccount;
371 d8426ffb Miltiadis Vasilakis
        [self showPithosBrowser:self];
372 d8426ffb Miltiadis Vasilakis
        pithosBrowserController.pithos = currentPithosAccount.pithos;
373 74314fd6 Miltiadis Vasilakis
    }
374 0224a49f Miltiadis Vasilakis
}
375 0224a49f Miltiadis Vasilakis
376 d8426ffb Miltiadis Vasilakis
- (void)menuChangeSyncActive:(NSMenuItem *)sender {
377 d8426ffb Miltiadis Vasilakis
    PithosAccount *pithosAccount = (PithosAccount *)[sender representedObject];
378 d8426ffb Miltiadis Vasilakis
    if (!pithosAccount.active)
379 d8426ffb Miltiadis Vasilakis
        return;
380 d8426ffb Miltiadis Vasilakis
    pithosAccount.syncActive = !pithosAccount.syncActive;
381 d8426ffb Miltiadis Vasilakis
    if (pithosPreferencesController && [pithosPreferencesController.selectedPithosAccount isEqualTo:pithosAccount])
382 d8426ffb Miltiadis Vasilakis
        pithosPreferencesController.syncActive = pithosAccount.syncActive;
383 d8426ffb Miltiadis Vasilakis
    [self savePithosAccounts:self];
384 d8426ffb Miltiadis Vasilakis
}
385 d8426ffb Miltiadis Vasilakis
386 d8d08dc1 Miltiadis Vasilakis
@end