Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosAccount.m @ d8426ffb

History | View | Annotate | Download (16.9 kB)

1 d8426ffb Miltiadis Vasilakis
//
2 d8426ffb Miltiadis Vasilakis
//  PithosAccount.m
3 d8426ffb Miltiadis Vasilakis
//  pithos-macos
4 d8426ffb Miltiadis Vasilakis
//
5 d8426ffb Miltiadis Vasilakis
// Copyright 2012 GRNET S.A. All rights reserved.
6 d8426ffb Miltiadis Vasilakis
//
7 d8426ffb Miltiadis Vasilakis
// Redistribution and use in source and binary forms, with or
8 d8426ffb Miltiadis Vasilakis
// without modification, are permitted provided that the following
9 d8426ffb Miltiadis Vasilakis
// conditions are met:
10 d8426ffb Miltiadis Vasilakis
// 
11 d8426ffb Miltiadis Vasilakis
//   1. Redistributions of source code must retain the above
12 d8426ffb Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
13 d8426ffb Miltiadis Vasilakis
//      disclaimer.
14 d8426ffb Miltiadis Vasilakis
// 
15 d8426ffb Miltiadis Vasilakis
//   2. Redistributions in binary form must reproduce the above
16 d8426ffb Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
17 d8426ffb Miltiadis Vasilakis
//      disclaimer in the documentation and/or other materials
18 d8426ffb Miltiadis Vasilakis
//      provided with the distribution.
19 d8426ffb Miltiadis Vasilakis
// 
20 d8426ffb Miltiadis Vasilakis
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21 d8426ffb Miltiadis Vasilakis
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 d8426ffb Miltiadis Vasilakis
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 d8426ffb Miltiadis Vasilakis
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24 d8426ffb Miltiadis Vasilakis
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 d8426ffb Miltiadis Vasilakis
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 d8426ffb Miltiadis Vasilakis
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27 d8426ffb Miltiadis Vasilakis
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 d8426ffb Miltiadis Vasilakis
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 d8426ffb Miltiadis Vasilakis
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 d8426ffb Miltiadis Vasilakis
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 d8426ffb Miltiadis Vasilakis
// POSSIBILITY OF SUCH DAMAGE.
32 d8426ffb Miltiadis Vasilakis
// 
33 d8426ffb Miltiadis Vasilakis
// The views and conclusions contained in the software and
34 d8426ffb Miltiadis Vasilakis
// documentation are those of the authors and should not be
35 d8426ffb Miltiadis Vasilakis
// interpreted as representing official policies, either expressed
36 d8426ffb Miltiadis Vasilakis
// or implied, of GRNET S.A.
37 d8426ffb Miltiadis Vasilakis
38 d8426ffb Miltiadis Vasilakis
#import "PithosAccount.h"
39 d8426ffb Miltiadis Vasilakis
#import "PithosSyncDaemon.h"
40 d8426ffb Miltiadis Vasilakis
#import "ASIPithos.h"
41 d8426ffb Miltiadis Vasilakis
#import "PithosAccountNode.h"
42 d8426ffb Miltiadis Vasilakis
#import "pithos_macosAppDelegate.h"
43 d8426ffb Miltiadis Vasilakis
44 d8426ffb Miltiadis Vasilakis
@interface PithosAccount (Internal)
45 d8426ffb Miltiadis Vasilakis
- (BOOL)urlIsValid:(NSString *)urlString;
46 d8426ffb Miltiadis Vasilakis
@end
47 d8426ffb Miltiadis Vasilakis
48 d8426ffb Miltiadis Vasilakis
@implementation PithosAccount
49 d8426ffb Miltiadis Vasilakis
@synthesize uniqueName, active, name;
50 d8426ffb Miltiadis Vasilakis
@synthesize syncActive, syncDirectoryPath, syncContainerName, syncLastCompleted, syncDaemon;
51 d8426ffb Miltiadis Vasilakis
@synthesize serverURL, versionResource, loginResource, publicResource;
52 d8426ffb Miltiadis Vasilakis
@synthesize authUser, authToken, storageURLPrefix, authURL, loginURLPrefix, publicURLPrefix;
53 d8426ffb Miltiadis Vasilakis
@synthesize pithos, accountNode;
54 d8426ffb Miltiadis Vasilakis
55 d8426ffb Miltiadis Vasilakis
#pragma mark -
56 d8426ffb Miltiadis Vasilakis
#pragma mark Object Lifecycle
57 d8426ffb Miltiadis Vasilakis
58 d8426ffb Miltiadis Vasilakis
+ (id)pithosAccount {
59 d8426ffb Miltiadis Vasilakis
    PithosAccount *pithosAccount = [[[self alloc] init] autorelease];
60 d8426ffb Miltiadis Vasilakis
    pithosAccount.uniqueName = [NSString stringWithFormat:@"pithosAccount-%f", [NSDate timeIntervalSinceReferenceDate]];
61 d8426ffb Miltiadis Vasilakis
    pithosAccount.versionResource = [NSString stringWithString:@"v1"];
62 d8426ffb Miltiadis Vasilakis
    pithosAccount.loginResource = [NSString stringWithString:@"login"];
63 d8426ffb Miltiadis Vasilakis
    return pithosAccount;
64 d8426ffb Miltiadis Vasilakis
}
65 d8426ffb Miltiadis Vasilakis
66 d8426ffb Miltiadis Vasilakis
- (void)dealloc {
67 d8426ffb Miltiadis Vasilakis
    [accountNode release];
68 d8426ffb Miltiadis Vasilakis
    [pithos release];
69 d8426ffb Miltiadis Vasilakis
    [publicURLPrefix release];
70 d8426ffb Miltiadis Vasilakis
    [loginURLPrefix release];
71 d8426ffb Miltiadis Vasilakis
    [authURL release];
72 d8426ffb Miltiadis Vasilakis
    [storageURLPrefix release];
73 d8426ffb Miltiadis Vasilakis
    [authToken release];
74 d8426ffb Miltiadis Vasilakis
    [authUser release];
75 d8426ffb Miltiadis Vasilakis
    [publicResource release];
76 d8426ffb Miltiadis Vasilakis
    [loginResource release];
77 d8426ffb Miltiadis Vasilakis
    [versionResource release];
78 d8426ffb Miltiadis Vasilakis
    [serverURL release];
79 d8426ffb Miltiadis Vasilakis
    [syncDaemon release];
80 d8426ffb Miltiadis Vasilakis
    [syncLastCompleted release];
81 d8426ffb Miltiadis Vasilakis
    [syncContainerName release];
82 d8426ffb Miltiadis Vasilakis
    [syncDirectoryPath release];
83 d8426ffb Miltiadis Vasilakis
    [name release];
84 d8426ffb Miltiadis Vasilakis
    [uniqueName release];
85 d8426ffb Miltiadis Vasilakis
    [super dealloc];
86 d8426ffb Miltiadis Vasilakis
}
87 d8426ffb Miltiadis Vasilakis
88 d8426ffb Miltiadis Vasilakis
- (NSString *)description {
89 d8426ffb Miltiadis Vasilakis
    return [NSString stringWithFormat:@"uniqueName: %@, active: %d, name: %@, syncActive: %d, syncDirectoryPath: %@, syncContainerName: %@, syncLastCompleted: %@, serverURL: %@, versionResource: %@, loginResource: %@, publicResource: %@, authUser: %@, authToken: %@, storageURLPrefix: %@, authURL: %@, loginURLPrefix: %@, publicURLPrefix: %@", 
90 d8426ffb Miltiadis Vasilakis
            uniqueName, active, name, syncActive, syncDirectoryPath, syncContainerName, syncLastCompleted, serverURL, versionResource, loginResource, publicResource, authUser, authToken, storageURLPrefix, authURL, loginURLPrefix, publicURLPrefix];
91 d8426ffb Miltiadis Vasilakis
}
92 d8426ffb Miltiadis Vasilakis
93 d8426ffb Miltiadis Vasilakis
#pragma mark -
94 d8426ffb Miltiadis Vasilakis
#pragma mark Internal
95 d8426ffb Miltiadis Vasilakis
96 d8426ffb Miltiadis Vasilakis
- (BOOL)urlIsValid:(NSString *)urlString {
97 d8426ffb Miltiadis Vasilakis
    if (urlString) {
98 d8426ffb Miltiadis Vasilakis
        NSURL *url = [NSURL URLWithString:urlString];
99 d8426ffb Miltiadis Vasilakis
        if (url && url.scheme && url.host)
100 d8426ffb Miltiadis Vasilakis
            return YES;
101 d8426ffb Miltiadis Vasilakis
    }
102 d8426ffb Miltiadis Vasilakis
    return NO;
103 d8426ffb Miltiadis Vasilakis
}
104 d8426ffb Miltiadis Vasilakis
105 d8426ffb Miltiadis Vasilakis
#pragma mark -
106 d8426ffb Miltiadis Vasilakis
#pragma mark Properties
107 d8426ffb Miltiadis Vasilakis
108 d8426ffb Miltiadis Vasilakis
- (NSString *)name {
109 d8426ffb Miltiadis Vasilakis
    if (![name length]) {
110 d8426ffb Miltiadis Vasilakis
        [name release];
111 d8426ffb Miltiadis Vasilakis
        NSDictionary *pithosAccountsDictionary = [(pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate] pithosAccountsDictionary];
112 d8426ffb Miltiadis Vasilakis
        NSString *namePrefix = [NSString stringWithString:@"okeanos"];
113 d8426ffb Miltiadis Vasilakis
        NSUInteger nameSuffix = 1;
114 d8426ffb Miltiadis Vasilakis
        name = [NSString stringWithString:@"okeanos"];
115 d8426ffb Miltiadis Vasilakis
        NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
116 d8426ffb Miltiadis Vasilakis
        NSFileManager *fileManager = [NSFileManager defaultManager];
117 d8426ffb Miltiadis Vasilakis
        while ([pithosAccountsDictionary objectForKey:name] || 
118 d8426ffb Miltiadis Vasilakis
               [fileManager fileExistsAtPath:[documentsDirectoryPath stringByAppendingPathComponent:name]]) {
119 d8426ffb Miltiadis Vasilakis
            name = [NSString stringWithFormat:@"%@%d", namePrefix, ++nameSuffix];
120 d8426ffb Miltiadis Vasilakis
        }
121 d8426ffb Miltiadis Vasilakis
        [name retain];
122 d8426ffb Miltiadis Vasilakis
    }
123 d8426ffb Miltiadis Vasilakis
    return name;
124 d8426ffb Miltiadis Vasilakis
}
125 d8426ffb Miltiadis Vasilakis
126 d8426ffb Miltiadis Vasilakis
- (void)setName:(NSString *)aName {
127 d8426ffb Miltiadis Vasilakis
    NSMutableDictionary *pithosAccountsDictionary = [(pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate] pithosAccountsDictionary];
128 d8426ffb Miltiadis Vasilakis
    if (![self.name isEqualToString:aName] && [aName length] && ![pithosAccountsDictionary objectForKey:aName]) {
129 d8426ffb Miltiadis Vasilakis
        [pithosAccountsDictionary setObject:self forKey:aName];
130 d8426ffb Miltiadis Vasilakis
        [pithosAccountsDictionary removeObjectForKey:name];
131 d8426ffb Miltiadis Vasilakis
        [name release];
132 d8426ffb Miltiadis Vasilakis
        name = [aName retain];
133 d8426ffb Miltiadis Vasilakis
    }
134 d8426ffb Miltiadis Vasilakis
}
135 d8426ffb Miltiadis Vasilakis
136 d8426ffb Miltiadis Vasilakis
- (BOOL)syncActive {
137 d8426ffb Miltiadis Vasilakis
    if (active)
138 d8426ffb Miltiadis Vasilakis
        return syncActive;
139 d8426ffb Miltiadis Vasilakis
    else
140 d8426ffb Miltiadis Vasilakis
        return NO;
141 d8426ffb Miltiadis Vasilakis
}
142 d8426ffb Miltiadis Vasilakis
143 d8426ffb Miltiadis Vasilakis
- (void)setSyncActive:(BOOL)aSyncActive {
144 d8426ffb Miltiadis Vasilakis
    syncActive = aSyncActive;
145 d8426ffb Miltiadis Vasilakis
    if (syncDaemon && !self.syncActive)
146 d8426ffb Miltiadis Vasilakis
        [syncDaemon resetDaemon];
147 d8426ffb Miltiadis Vasilakis
}
148 d8426ffb Miltiadis Vasilakis
149 d8426ffb Miltiadis Vasilakis
- (NSString *)syncDirectoryPath {
150 d8426ffb Miltiadis Vasilakis
    if (![syncDirectoryPath length]) {
151 d8426ffb Miltiadis Vasilakis
        [syncDirectoryPath release];
152 d8426ffb Miltiadis Vasilakis
        syncDirectoryPath = [[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] 
153 d8426ffb Miltiadis Vasilakis
                              stringByAppendingPathComponent:self.name] retain];
154 d8426ffb Miltiadis Vasilakis
    }
155 d8426ffb Miltiadis Vasilakis
    return syncDirectoryPath;
156 d8426ffb Miltiadis Vasilakis
}
157 d8426ffb Miltiadis Vasilakis
158 d8426ffb Miltiadis Vasilakis
- (void)setSyncDirectoryPath:(NSString *)aSyncDirectoryPath {
159 d8426ffb Miltiadis Vasilakis
    if (![self.syncDirectoryPath isEqualToString:aSyncDirectoryPath] && [aSyncDirectoryPath length]) {
160 d8426ffb Miltiadis Vasilakis
        BOOL isDirectory;
161 d8426ffb Miltiadis Vasilakis
        if (![[NSFileManager defaultManager] fileExistsAtPath:aSyncDirectoryPath isDirectory:&isDirectory] || isDirectory) {
162 d8426ffb Miltiadis Vasilakis
            [syncDirectoryPath release];
163 d8426ffb Miltiadis Vasilakis
            syncDirectoryPath = [aSyncDirectoryPath retain];
164 d8426ffb Miltiadis Vasilakis
        } else {
165 d8426ffb Miltiadis Vasilakis
            return;
166 d8426ffb Miltiadis Vasilakis
        }
167 d8426ffb Miltiadis Vasilakis
168 d8426ffb Miltiadis Vasilakis
        @synchronized(self) {
169 d8426ffb Miltiadis Vasilakis
            resetSyncDaemonLocalState = YES;
170 d8426ffb Miltiadis Vasilakis
            [syncLastCompleted release];
171 d8426ffb Miltiadis Vasilakis
            syncLastCompleted = nil;
172 d8426ffb Miltiadis Vasilakis
        }
173 d8426ffb Miltiadis Vasilakis
    }
174 d8426ffb Miltiadis Vasilakis
}
175 d8426ffb Miltiadis Vasilakis
176 d8426ffb Miltiadis Vasilakis
- (NSString *)syncContainerName {
177 d8426ffb Miltiadis Vasilakis
    if (![syncContainerName length]) {
178 d8426ffb Miltiadis Vasilakis
        [syncContainerName release];
179 d8426ffb Miltiadis Vasilakis
        syncContainerName = [[NSString stringWithString:@"pithos"] retain];
180 d8426ffb Miltiadis Vasilakis
    }        
181 d8426ffb Miltiadis Vasilakis
    return syncContainerName;
182 d8426ffb Miltiadis Vasilakis
}
183 d8426ffb Miltiadis Vasilakis
184 d8426ffb Miltiadis Vasilakis
- (void)setSyncContainerName:(NSString *)aSyncContainerName {
185 d8426ffb Miltiadis Vasilakis
    if (![self.syncContainerName isEqualToString:aSyncContainerName] && [aSyncContainerName length]) {
186 d8426ffb Miltiadis Vasilakis
        [syncContainerName release];
187 d8426ffb Miltiadis Vasilakis
        syncContainerName = [aSyncContainerName retain];
188 d8426ffb Miltiadis Vasilakis
        
189 d8426ffb Miltiadis Vasilakis
        @synchronized(self) {
190 d8426ffb Miltiadis Vasilakis
            resetSyncDaemonLocalState = YES;
191 d8426ffb Miltiadis Vasilakis
            [syncLastCompleted release];
192 d8426ffb Miltiadis Vasilakis
            syncLastCompleted = nil;
193 d8426ffb Miltiadis Vasilakis
        }
194 d8426ffb Miltiadis Vasilakis
    }
195 d8426ffb Miltiadis Vasilakis
}
196 d8426ffb Miltiadis Vasilakis
197 d8426ffb Miltiadis Vasilakis
- (NSDate *)syncLastCompleted {
198 d8426ffb Miltiadis Vasilakis
    if (self.syncDaemon.lastCompletedSync && ![self.syncDaemon.lastCompletedSync isEqualToDate:syncLastCompleted]) {
199 d8426ffb Miltiadis Vasilakis
        [syncLastCompleted release];
200 d8426ffb Miltiadis Vasilakis
        syncLastCompleted = [self.syncDaemon.lastCompletedSync copy];
201 d8426ffb Miltiadis Vasilakis
    }
202 d8426ffb Miltiadis Vasilakis
    return syncLastCompleted;
203 d8426ffb Miltiadis Vasilakis
}
204 d8426ffb Miltiadis Vasilakis
205 d8426ffb Miltiadis Vasilakis
- (PithosSyncDaemon *)syncDaemon {
206 d8426ffb Miltiadis Vasilakis
    @synchronized(self) {
207 d8426ffb Miltiadis Vasilakis
        if (self.syncActive && !syncDaemon)
208 d8426ffb Miltiadis Vasilakis
            syncDaemon = [[PithosSyncDaemon alloc] initWithDirectoryPath:self.syncDirectoryPath 
209 d8426ffb Miltiadis Vasilakis
                                                           pithosAccount:self 
210 d8426ffb Miltiadis Vasilakis
                                                           containerName:self.syncContainerName 
211 d8426ffb Miltiadis Vasilakis
                                                         resetLocalState:resetSyncDaemonLocalState];
212 d8426ffb Miltiadis Vasilakis
        resetSyncDaemonLocalState = NO;
213 d8426ffb Miltiadis Vasilakis
    }
214 d8426ffb Miltiadis Vasilakis
    return syncDaemon;
215 d8426ffb Miltiadis Vasilakis
}
216 d8426ffb Miltiadis Vasilakis
217 d8426ffb Miltiadis Vasilakis
- (NSString *)serverURL {
218 d8426ffb Miltiadis Vasilakis
    if (![self urlIsValid:serverURL]) {
219 d8426ffb Miltiadis Vasilakis
        [serverURL release];
220 d8426ffb Miltiadis Vasilakis
        serverURL = [[NSString stringWithString:@"https://plus.pithos.grnet.gr"] retain];
221 d8426ffb Miltiadis Vasilakis
    }
222 d8426ffb Miltiadis Vasilakis
    return serverURL;
223 d8426ffb Miltiadis Vasilakis
}
224 d8426ffb Miltiadis Vasilakis
225 d8426ffb Miltiadis Vasilakis
- (void)setServerURL:(NSString *)aServerURL {
226 d8426ffb Miltiadis Vasilakis
    if (![self.serverURL isEqualToString:aServerURL] && [self urlIsValid:aServerURL]) {
227 d8426ffb Miltiadis Vasilakis
        [serverURL release];
228 d8426ffb Miltiadis Vasilakis
        serverURL = [aServerURL retain];
229 d8426ffb Miltiadis Vasilakis
        [storageURLPrefix release];
230 d8426ffb Miltiadis Vasilakis
        storageURLPrefix = nil;
231 d8426ffb Miltiadis Vasilakis
        [authURL release];
232 d8426ffb Miltiadis Vasilakis
        authURL = nil;
233 d8426ffb Miltiadis Vasilakis
        [publicURLPrefix release];
234 d8426ffb Miltiadis Vasilakis
        publicURLPrefix = nil;
235 d8426ffb Miltiadis Vasilakis
        [loginURLPrefix release];
236 d8426ffb Miltiadis Vasilakis
        loginURLPrefix = nil;
237 d8426ffb Miltiadis Vasilakis
238 d8426ffb Miltiadis Vasilakis
        @synchronized(self) {
239 d8426ffb Miltiadis Vasilakis
            updatePithos = YES;
240 d8426ffb Miltiadis Vasilakis
            resetSyncDaemonLocalState = YES;
241 d8426ffb Miltiadis Vasilakis
            [syncLastCompleted release];
242 d8426ffb Miltiadis Vasilakis
            syncLastCompleted = nil;
243 d8426ffb Miltiadis Vasilakis
        }
244 d8426ffb Miltiadis Vasilakis
    }
245 d8426ffb Miltiadis Vasilakis
}
246 d8426ffb Miltiadis Vasilakis
247 d8426ffb Miltiadis Vasilakis
- (void)setAuthUser:(NSString *)anAuthUser {
248 d8426ffb Miltiadis Vasilakis
    if ([anAuthUser length] && ![anAuthUser isEqualToString:authUser]) {
249 d8426ffb Miltiadis Vasilakis
        [authUser release];
250 d8426ffb Miltiadis Vasilakis
        authUser = [anAuthUser retain];
251 d8426ffb Miltiadis Vasilakis
        
252 d8426ffb Miltiadis Vasilakis
        @synchronized(self) {
253 d8426ffb Miltiadis Vasilakis
            updatePithos = YES;
254 d8426ffb Miltiadis Vasilakis
            resetSyncDaemonLocalState = YES;
255 d8426ffb Miltiadis Vasilakis
            [syncLastCompleted release];
256 d8426ffb Miltiadis Vasilakis
            syncLastCompleted = nil;
257 d8426ffb Miltiadis Vasilakis
258 d8426ffb Miltiadis Vasilakis
        }
259 d8426ffb Miltiadis Vasilakis
    }
260 d8426ffb Miltiadis Vasilakis
}
261 d8426ffb Miltiadis Vasilakis
262 d8426ffb Miltiadis Vasilakis
- (void)setAuthToken:(NSString *)anAuthToken {
263 d8426ffb Miltiadis Vasilakis
    if ([anAuthToken length] && ![anAuthToken isEqualToString:authToken]) {
264 d8426ffb Miltiadis Vasilakis
        [authToken release];
265 d8426ffb Miltiadis Vasilakis
        authToken = [anAuthToken retain];
266 d8426ffb Miltiadis Vasilakis
        
267 d8426ffb Miltiadis Vasilakis
        @synchronized(self) {
268 d8426ffb Miltiadis Vasilakis
            updatePithos = YES;
269 d8426ffb Miltiadis Vasilakis
        }
270 d8426ffb Miltiadis Vasilakis
    }
271 d8426ffb Miltiadis Vasilakis
}
272 d8426ffb Miltiadis Vasilakis
273 d8426ffb Miltiadis Vasilakis
- (NSString *)storageURLPrefix {
274 d8426ffb Miltiadis Vasilakis
    if (![self urlIsValid:storageURLPrefix]) {
275 d8426ffb Miltiadis Vasilakis
        [storageURLPrefix release];
276 d8426ffb Miltiadis Vasilakis
        if (versionResource)
277 d8426ffb Miltiadis Vasilakis
            storageURLPrefix = [[self.serverURL stringByAppendingFormat:@"/%@", versionResource] retain];
278 d8426ffb Miltiadis Vasilakis
        else
279 d8426ffb Miltiadis Vasilakis
            storageURLPrefix = [self.serverURL copy];
280 d8426ffb Miltiadis Vasilakis
    }
281 d8426ffb Miltiadis Vasilakis
    return storageURLPrefix;
282 d8426ffb Miltiadis Vasilakis
}
283 d8426ffb Miltiadis Vasilakis
284 d8426ffb Miltiadis Vasilakis
- (void)setStorageURLPrefix:(NSString *)aStorageURLPrefix {
285 d8426ffb Miltiadis Vasilakis
    if (![self.storageURLPrefix isEqualToString:aStorageURLPrefix] && [self urlIsValid:aStorageURLPrefix]) {
286 d8426ffb Miltiadis Vasilakis
        [storageURLPrefix release];
287 d8426ffb Miltiadis Vasilakis
        storageURLPrefix = [aStorageURLPrefix retain];
288 d8426ffb Miltiadis Vasilakis
    }
289 d8426ffb Miltiadis Vasilakis
}
290 d8426ffb Miltiadis Vasilakis
291 d8426ffb Miltiadis Vasilakis
- (NSString *)authURL {
292 d8426ffb Miltiadis Vasilakis
    if (![self urlIsValid:authURL]) {
293 d8426ffb Miltiadis Vasilakis
        [authURL release];
294 d8426ffb Miltiadis Vasilakis
        if (versionResource)
295 d8426ffb Miltiadis Vasilakis
            authURL = [[self.serverURL stringByAppendingFormat:@"/%@", versionResource] retain];
296 d8426ffb Miltiadis Vasilakis
        else
297 d8426ffb Miltiadis Vasilakis
            authURL = [self.serverURL copy];
298 d8426ffb Miltiadis Vasilakis
    }
299 d8426ffb Miltiadis Vasilakis
    return authURL;
300 d8426ffb Miltiadis Vasilakis
}
301 d8426ffb Miltiadis Vasilakis
302 d8426ffb Miltiadis Vasilakis
- (void)setAuthURL:(NSString *)anAuthURL {
303 d8426ffb Miltiadis Vasilakis
    if (![self.authURL isEqualToString:anAuthURL] && [self urlIsValid:anAuthURL]) {
304 d8426ffb Miltiadis Vasilakis
        [authURL release];
305 d8426ffb Miltiadis Vasilakis
        authURL = [anAuthURL retain];
306 d8426ffb Miltiadis Vasilakis
    }
307 d8426ffb Miltiadis Vasilakis
}
308 d8426ffb Miltiadis Vasilakis
309 d8426ffb Miltiadis Vasilakis
- (NSString *)publicURLPrefix {
310 d8426ffb Miltiadis Vasilakis
    if (![self urlIsValid:publicURLPrefix]) {
311 d8426ffb Miltiadis Vasilakis
        [publicURLPrefix release];
312 d8426ffb Miltiadis Vasilakis
        if (publicResource)
313 d8426ffb Miltiadis Vasilakis
            publicURLPrefix = [[self.serverURL stringByAppendingFormat:@"/%@", publicResource] retain];
314 d8426ffb Miltiadis Vasilakis
        else
315 d8426ffb Miltiadis Vasilakis
            publicURLPrefix = [self.serverURL copy];
316 d8426ffb Miltiadis Vasilakis
    }
317 d8426ffb Miltiadis Vasilakis
    return publicURLPrefix;
318 d8426ffb Miltiadis Vasilakis
}
319 d8426ffb Miltiadis Vasilakis
320 d8426ffb Miltiadis Vasilakis
- (void)setPublicURLPrefix:(NSString *)aPublicURLPrefix {
321 d8426ffb Miltiadis Vasilakis
    if (![self.publicURLPrefix isEqualToString:aPublicURLPrefix] && [self urlIsValid:aPublicURLPrefix]) {
322 d8426ffb Miltiadis Vasilakis
        [publicURLPrefix release];
323 d8426ffb Miltiadis Vasilakis
        publicURLPrefix = [aPublicURLPrefix retain];
324 d8426ffb Miltiadis Vasilakis
    }
325 d8426ffb Miltiadis Vasilakis
}
326 d8426ffb Miltiadis Vasilakis
327 d8426ffb Miltiadis Vasilakis
- (NSString *)loginURLPrefix {
328 d8426ffb Miltiadis Vasilakis
    if (![self urlIsValid:loginURLPrefix]) {
329 d8426ffb Miltiadis Vasilakis
        [loginURLPrefix release];
330 d8426ffb Miltiadis Vasilakis
        if (loginResource)
331 d8426ffb Miltiadis Vasilakis
            loginURLPrefix = [[self.serverURL stringByAppendingFormat:@"/%@", loginResource] retain];
332 d8426ffb Miltiadis Vasilakis
        else
333 d8426ffb Miltiadis Vasilakis
            loginURLPrefix = [self.serverURL copy];
334 d8426ffb Miltiadis Vasilakis
    }
335 d8426ffb Miltiadis Vasilakis
    return loginURLPrefix;
336 d8426ffb Miltiadis Vasilakis
}
337 d8426ffb Miltiadis Vasilakis
338 d8426ffb Miltiadis Vasilakis
- (void)setLoginURLPrefix:(NSString *)aLoginURLPrefix {
339 d8426ffb Miltiadis Vasilakis
    if (![self.loginURLPrefix isEqualToString:aLoginURLPrefix] && [self urlIsValid:aLoginURLPrefix]) {
340 d8426ffb Miltiadis Vasilakis
        [loginURLPrefix release];
341 d8426ffb Miltiadis Vasilakis
        loginURLPrefix = [aLoginURLPrefix retain];
342 d8426ffb Miltiadis Vasilakis
    }
343 d8426ffb Miltiadis Vasilakis
}
344 d8426ffb Miltiadis Vasilakis
345 d8426ffb Miltiadis Vasilakis
- (ASIPithos *)pithos {
346 d8426ffb Miltiadis Vasilakis
    @synchronized(self) {
347 d8426ffb Miltiadis Vasilakis
        if (!pithos || updatePithos) {
348 d8426ffb Miltiadis Vasilakis
            [pithos release];
349 d8426ffb Miltiadis Vasilakis
            pithos = [[ASIPithos pithos] retain];
350 d8426ffb Miltiadis Vasilakis
            pithos.authUser = authUser;
351 d8426ffb Miltiadis Vasilakis
            pithos.authToken = authToken;
352 d8426ffb Miltiadis Vasilakis
            pithos.storageURLPrefix = self.storageURLPrefix;
353 d8426ffb Miltiadis Vasilakis
            pithos.authURL = self.authURL;
354 d8426ffb Miltiadis Vasilakis
            pithos.publicURLPrefix = self.publicURLPrefix;
355 d8426ffb Miltiadis Vasilakis
356 d8426ffb Miltiadis Vasilakis
            if (accountNode && ![accountNode.pithos isEqualTo:pithos]) {
357 d8426ffb Miltiadis Vasilakis
                accountNode.pithos = pithos;
358 d8426ffb Miltiadis Vasilakis
                if (active)
359 d8426ffb Miltiadis Vasilakis
                    [accountNode refreshInfo];
360 d8426ffb Miltiadis Vasilakis
            }
361 d8426ffb Miltiadis Vasilakis
            
362 d8426ffb Miltiadis Vasilakis
            updatePithos = NO;
363 d8426ffb Miltiadis Vasilakis
        }
364 d8426ffb Miltiadis Vasilakis
    }
365 d8426ffb Miltiadis Vasilakis
    return pithos;
366 d8426ffb Miltiadis Vasilakis
}
367 d8426ffb Miltiadis Vasilakis
368 d8426ffb Miltiadis Vasilakis
- (PithosAccountNode *)accountNode {
369 d8426ffb Miltiadis Vasilakis
    if (!accountNode) {
370 d8426ffb Miltiadis Vasilakis
        accountNode = [[PithosAccountNode alloc] initWithPithos:self.pithos];
371 d8426ffb Miltiadis Vasilakis
    }
372 d8426ffb Miltiadis Vasilakis
    return accountNode;
373 d8426ffb Miltiadis Vasilakis
}
374 d8426ffb Miltiadis Vasilakis
375 d8426ffb Miltiadis Vasilakis
#pragma mark -
376 d8426ffb Miltiadis Vasilakis
#pragma mark Actions
377 d8426ffb Miltiadis Vasilakis
378 d8426ffb Miltiadis Vasilakis
- (void)authenticateWithServerURL:(NSString *)aServerURL authUser:(NSString *)anAuthUser authToken:(NSString *)anAuthToken {
379 d8426ffb Miltiadis Vasilakis
    self.serverURL = aServerURL;
380 d8426ffb Miltiadis Vasilakis
    self.authUser = anAuthUser;
381 d8426ffb Miltiadis Vasilakis
    self.authToken = anAuthToken;
382 d8426ffb Miltiadis Vasilakis
    NSLog(@"Account: %@\nauthentication", self);
383 d8426ffb Miltiadis Vasilakis
    if (![authUser length] || ![authToken length]) {
384 d8426ffb Miltiadis Vasilakis
        self.active = NO;
385 d8426ffb Miltiadis Vasilakis
        self.syncActive = NO;
386 d8426ffb Miltiadis Vasilakis
        // XXX Show preferences with self as the selected account?
387 d8426ffb Miltiadis Vasilakis
    } else  {
388 d8426ffb Miltiadis Vasilakis
        self.active = YES;
389 d8426ffb Miltiadis Vasilakis
        if (syncDaemon) {
390 d8426ffb Miltiadis Vasilakis
            self.syncDaemon.pithos = self.pithos;
391 d8426ffb Miltiadis Vasilakis
            if (self.syncActive)
392 d8426ffb Miltiadis Vasilakis
                [self.syncDaemon startDaemon];
393 d8426ffb Miltiadis Vasilakis
        }
394 d8426ffb Miltiadis Vasilakis
    }
395 d8426ffb Miltiadis Vasilakis
}
396 d8426ffb Miltiadis Vasilakis
397 d8426ffb Miltiadis Vasilakis
- (void)loginWithServerURL:(NSString *)aServerURL {
398 d8426ffb Miltiadis Vasilakis
    self.serverURL = aServerURL;
399 d8426ffb Miltiadis Vasilakis
    NSProcessInfo *processInfo = [NSProcessInfo processInfo];
400 d8426ffb Miltiadis Vasilakis
    NSString *loginURL = [NSString stringWithFormat:@"%@?next=pithos://%@_%d/%@", 
401 d8426ffb Miltiadis Vasilakis
                          self.loginURLPrefix, [processInfo processName], [processInfo processIdentifier], self.name];
402 d8426ffb Miltiadis Vasilakis
    NSLog(@"Account: %@\nloginURL: %@", self, loginURL);
403 d8426ffb Miltiadis Vasilakis
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:loginURL]];
404 d8426ffb Miltiadis Vasilakis
}
405 d8426ffb Miltiadis Vasilakis
406 d8426ffb Miltiadis Vasilakis
- (void)updateSyncWithSyncActive:(BOOL)aSyncActive syncDirectoryPath:(NSString *)aSyncDirectoryPath {
407 d8426ffb Miltiadis Vasilakis
    self.syncDirectoryPath = aSyncDirectoryPath;
408 d8426ffb Miltiadis Vasilakis
    self.syncActive = aSyncActive;
409 d8426ffb Miltiadis Vasilakis
    if (syncDaemon) {
410 d8426ffb Miltiadis Vasilakis
        self.syncDaemon.directoryPath = self.syncDirectoryPath;
411 d8426ffb Miltiadis Vasilakis
        if (self.syncActive)
412 d8426ffb Miltiadis Vasilakis
            [self.syncDaemon startDaemon];
413 d8426ffb Miltiadis Vasilakis
    }    
414 d8426ffb Miltiadis Vasilakis
}
415 d8426ffb Miltiadis Vasilakis
416 d8426ffb Miltiadis Vasilakis
#pragma mark -
417 d8426ffb Miltiadis Vasilakis
#pragma mark NSCoding
418 d8426ffb Miltiadis Vasilakis
419 d8426ffb Miltiadis Vasilakis
- (id)initWithCoder:(NSCoder *)decoder {
420 d8426ffb Miltiadis Vasilakis
    if ((self = [super init])) {
421 d8426ffb Miltiadis Vasilakis
        self.uniqueName = [decoder decodeObjectForKey:@"uniqueName"];
422 d8426ffb Miltiadis Vasilakis
        self.active = [decoder decodeBoolForKey:@"active"];
423 d8426ffb Miltiadis Vasilakis
        name = [[decoder decodeObjectForKey:@"name"] retain];
424 d8426ffb Miltiadis Vasilakis
425 d8426ffb Miltiadis Vasilakis
        self.syncActive = [decoder decodeBoolForKey:@"syncActive"];
426 d8426ffb Miltiadis Vasilakis
        self.syncDirectoryPath = [decoder decodeObjectForKey:@"syncDirectoryPath"];
427 d8426ffb Miltiadis Vasilakis
        self.syncContainerName = [decoder decodeObjectForKey:@"syncContainerName"];
428 d8426ffb Miltiadis Vasilakis
        self.syncLastCompleted = [decoder decodeObjectForKey:@"syncLastCompleted"];
429 d8426ffb Miltiadis Vasilakis
        
430 d8426ffb Miltiadis Vasilakis
        self.serverURL = [decoder decodeObjectForKey:@"serverURL"];
431 d8426ffb Miltiadis Vasilakis
        self.versionResource = [decoder decodeObjectForKey:@"versionResource"];
432 d8426ffb Miltiadis Vasilakis
        self.loginResource = [decoder decodeObjectForKey:@"loginResource"];
433 d8426ffb Miltiadis Vasilakis
        self.publicResource = [decoder decodeObjectForKey:@"publicResource"];
434 d8426ffb Miltiadis Vasilakis
        
435 d8426ffb Miltiadis Vasilakis
        self.authUser = [decoder decodeObjectForKey:@"authUser"];
436 d8426ffb Miltiadis Vasilakis
        self.authToken = [decoder decodeObjectForKey:@"authToken"];
437 d8426ffb Miltiadis Vasilakis
        self.storageURLPrefix = [decoder decodeObjectForKey:@"storageURLPrefix"];
438 d8426ffb Miltiadis Vasilakis
        self.authURL = [decoder decodeObjectForKey:@"authURL"];
439 d8426ffb Miltiadis Vasilakis
        self.publicURLPrefix = [decoder decodeObjectForKey:@"publicURLPrefix"];
440 d8426ffb Miltiadis Vasilakis
        self.loginURLPrefix = [decoder decodeObjectForKey:@"loginURLPrefix"];
441 d8426ffb Miltiadis Vasilakis
        
442 d8426ffb Miltiadis Vasilakis
        if (![authUser length] || ![authToken length] || ![self.storageURLPrefix length])
443 d8426ffb Miltiadis Vasilakis
            self.active = NO;
444 d8426ffb Miltiadis Vasilakis
        
445 d8426ffb Miltiadis Vasilakis
        resetSyncDaemonLocalState = NO;
446 d8426ffb Miltiadis Vasilakis
    }
447 d8426ffb Miltiadis Vasilakis
    return self;
448 d8426ffb Miltiadis Vasilakis
}
449 d8426ffb Miltiadis Vasilakis
450 d8426ffb Miltiadis Vasilakis
- (void)encodeWithCoder:(NSCoder *)encoder {
451 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:uniqueName forKey:@"uniqueName"];
452 d8426ffb Miltiadis Vasilakis
    [encoder encodeBool:active forKey:@"active"];
453 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:name forKey:@"name"];
454 d8426ffb Miltiadis Vasilakis
    
455 d8426ffb Miltiadis Vasilakis
    [encoder encodeBool:syncActive forKey:@"syncActive"];
456 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:syncDirectoryPath forKey:@"syncDirectoryPath"];
457 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:syncContainerName forKey:@"syncContainerName"];
458 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:self.syncLastCompleted forKey:@"syncLastCompleted"];
459 d8426ffb Miltiadis Vasilakis
460 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:serverURL forKey:@"serverURL"];
461 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:versionResource forKey:@"versionResource"];
462 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:publicResource forKey:@"publicResource"];
463 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:loginResource forKey:@"loginResource"];
464 d8426ffb Miltiadis Vasilakis
    
465 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:authUser forKey:@"authUser"];
466 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:authToken forKey:@"authToken"];
467 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:storageURLPrefix forKey:@"storageURLPrefix"];
468 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:authURL forKey:@"authURL"];
469 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:publicURLPrefix forKey:@"publicURLPrefix"];
470 d8426ffb Miltiadis Vasilakis
    [encoder encodeObject:loginURLPrefix forKey:@"loginURLPrefix"];
471 d8426ffb Miltiadis Vasilakis
}
472 d8426ffb Miltiadis Vasilakis
473 d8426ffb Miltiadis Vasilakis
@end