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 |