Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosAccountNode.m @ baaf1397

History | View | Annotate | Download (26.8 kB)

1 d8d08dc1 Miltiadis Vasilakis
//
2 857217b0 Miltiadis Vasilakis
//  PithosAccountNode.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 9f3a92de Miltiadis Vasilakis
#import "PithosAccountNode.h"
39 9f3a92de Miltiadis Vasilakis
#import "PithosContainerNode.h"
40 919cb043 Miltiadis Vasilakis
#import "ASIPithos.h"
41 e5fdf4d9 Miltiadis Vasilakis
#import "ASIPithosAccountRequest.h"
42 470e6f81 Miltiadis Vasilakis
#import "ASIPithosAccount.h"
43 e5fdf4d9 Miltiadis Vasilakis
#import "ASIPithosContainer.h"
44 e5fdf4d9 Miltiadis Vasilakis
#import "ASIDownloadCache.h"
45 b83af782 Miltiadis Vasilakis
#import "PithosAccount.h"
46 1b1e6fa1 Miltiadis Vasilakis
#import "PithosUtilities.h"
47 4a8699ab Miltiadis Vasilakis
#import "PithosActivityFacility.h"
48 d8d08dc1 Miltiadis Vasilakis
49 af3b9f06 Miltiadis Vasilakis
static NSImage *sharedIcon = nil;
50 af3b9f06 Miltiadis Vasilakis
51 9f3a92de Miltiadis Vasilakis
@implementation PithosAccountNode
52 bc768c45 Miltiadis Vasilakis
@synthesize pithos, pithosAccount, accountRequest, applyMetadataAccountRequest, refreshMetadataAccountRequest, translatedGroups;
53 d8d08dc1 Miltiadis Vasilakis
54 af3b9f06 Miltiadis Vasilakis
+ (void)initialize {
55 af3b9f06 Miltiadis Vasilakis
	if (self == [PithosAccountNode class])
56 cb6abe72 Miltiadis Vasilakis
        sharedIcon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kUserIcon)];
57 af3b9f06 Miltiadis Vasilakis
}
58 af3b9f06 Miltiadis Vasilakis
59 d8d08dc1 Miltiadis Vasilakis
#pragma mark -
60 d8d08dc1 Miltiadis Vasilakis
#pragma mark Object Lifecycle
61 d8d08dc1 Miltiadis Vasilakis
62 97c9a632 Miltiadis Vasilakis
- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager andPithos:(ASIPithos *)aPithos {
63 97c9a632 Miltiadis Vasilakis
    if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
64 cb6abe72 Miltiadis Vasilakis
        pithos = aPithos;
65 919cb043 Miltiadis Vasilakis
    }
66 919cb043 Miltiadis Vasilakis
    return self;
67 919cb043 Miltiadis Vasilakis
}
68 919cb043 Miltiadis Vasilakis
69 d8d08dc1 Miltiadis Vasilakis
- (void)dealloc {
70 605c8932 Miltiadis Vasilakis
    [accountRequest clearDelegatesAndCancel];
71 470e6f81 Miltiadis Vasilakis
    [refreshMetadataAccountRequest clearDelegatesAndCancel];
72 470e6f81 Miltiadis Vasilakis
    [applyMetadataAccountRequest clearDelegatesAndCancel];
73 d8d08dc1 Miltiadis Vasilakis
}
74 d8d08dc1 Miltiadis Vasilakis
75 d8d08dc1 Miltiadis Vasilakis
#pragma mark -
76 ec392f75 Miltiadis Vasilakis
#pragma mark Internal
77 ec392f75 Miltiadis Vasilakis
78 ec392f75 Miltiadis Vasilakis
- (void)updateGroups {
79 ec392f75 Miltiadis Vasilakis
    if (!pithosAccount) {
80 ec392f75 Miltiadis Vasilakis
        self.translatedGroups = [NSMutableDictionary dictionary];
81 ec392f75 Miltiadis Vasilakis
    } else if (pithosAccountManager) {
82 ec392f75 Miltiadis Vasilakis
        NSMutableSet *UUIDs = [NSMutableSet set];
83 ec392f75 Miltiadis Vasilakis
        for (NSString *groupName in pithosAccount.groups) {
84 ec392f75 Miltiadis Vasilakis
            [UUIDs addObjectsFromArray:[pithosAccount.groups objectForKey:groupName]];
85 ec392f75 Miltiadis Vasilakis
        }
86 ec392f75 Miltiadis Vasilakis
        [UUIDs removeObject:@""];
87 ec392f75 Miltiadis Vasilakis
        [UUIDs removeObject:@"*"];
88 ec392f75 Miltiadis Vasilakis
        if (UUIDs.count) {
89 baaf1397 Miltiadis Vasilakis
            [pithosAccountManager updateUserCatalogForDisplaynames:nil UUIDs:[UUIDs allObjects]];
90 ec392f75 Miltiadis Vasilakis
        }
91 ec392f75 Miltiadis Vasilakis
        
92 ec392f75 Miltiadis Vasilakis
        NSMutableDictionary *newTranslatedGroups = [NSMutableDictionary dictionaryWithCapacity:pithosAccount.groups.count];
93 ec392f75 Miltiadis Vasilakis
        for (NSString *groupName in pithosAccount.groups) {
94 ec392f75 Miltiadis Vasilakis
            NSMutableArray *groupUsers = [NSMutableArray array];
95 ec392f75 Miltiadis Vasilakis
            for (NSString *UUID in [pithosAccount.groups objectForKey:groupName]) {
96 ec392f75 Miltiadis Vasilakis
                [groupUsers addObject:[pithosAccountManager displaynameForUUID:UUID safe:YES]];
97 ec392f75 Miltiadis Vasilakis
            }
98 ec392f75 Miltiadis Vasilakis
            [newTranslatedGroups setObject:groupUsers forKey:groupName];
99 ec392f75 Miltiadis Vasilakis
        }
100 ec392f75 Miltiadis Vasilakis
        self.translatedGroups = newTranslatedGroups;
101 ec392f75 Miltiadis Vasilakis
    } else {
102 ec392f75 Miltiadis Vasilakis
        self.translatedGroups = [pithosAccount.groups copy];
103 ec392f75 Miltiadis Vasilakis
    }
104 ec392f75 Miltiadis Vasilakis
}
105 ec392f75 Miltiadis Vasilakis
106 ec392f75 Miltiadis Vasilakis
#pragma mark -
107 4ae10a2b Miltiadis Vasilakis
#pragma mark Properties
108 4ae10a2b Miltiadis Vasilakis
109 d8426ffb Miltiadis Vasilakis
- (void)setPithos:(ASIPithos *)aPithos {
110 d8426ffb Miltiadis Vasilakis
    if (aPithos && ![aPithos isEqualTo:pithos]) {
111 cb6abe72 Miltiadis Vasilakis
        pithos = aPithos;
112 d8426ffb Miltiadis Vasilakis
        url = nil;
113 da7bfe47 Miltiadis Vasilakis
        [accountRequest clearDelegatesAndCancel];
114 bc768c45 Miltiadis Vasilakis
        self.accountRequest = nil;
115 da7bfe47 Miltiadis Vasilakis
        [refreshMetadataAccountRequest clearDelegatesAndCancel];
116 bc768c45 Miltiadis Vasilakis
        self.refreshMetadataAccountRequest = nil;
117 da7bfe47 Miltiadis Vasilakis
        [applyMetadataAccountRequest clearDelegatesAndCancel];
118 bc768c45 Miltiadis Vasilakis
        self.applyMetadataAccountRequest = nil;
119 da7bfe47 Miltiadis Vasilakis
        reset = YES;
120 d8426ffb Miltiadis Vasilakis
    }
121 d8426ffb Miltiadis Vasilakis
}
122 d8426ffb Miltiadis Vasilakis
123 b83af782 Miltiadis Vasilakis
- (void)setPithosAccount:(ASIPithosAccount *)aPithosAccount {
124 ec392f75 Miltiadis Vasilakis
    if (![pithosAccount isEqualTo:aPithosAccount]) {
125 b83af782 Miltiadis Vasilakis
        pithosAccount = aPithosAccount;
126 ec392f75 Miltiadis Vasilakis
        [self updateGroups];
127 b83af782 Miltiadis Vasilakis
    }
128 b83af782 Miltiadis Vasilakis
}
129 b83af782 Miltiadis Vasilakis
130 4ae10a2b Miltiadis Vasilakis
- (NSString *)url {
131 af3b9f06 Miltiadis Vasilakis
    if (url == nil)
132 af3b9f06 Miltiadis Vasilakis
        url = [[NSString alloc] initWithFormat:@"%@%@", 
133 baaf1397 Miltiadis Vasilakis
               (sharingAccount ? [pithos storageURLWithAuthUser:sharingAccount] : pithos.storageURL),
134 af3b9f06 Miltiadis Vasilakis
               (shared ? @"?shared" : @"")];
135 4ae10a2b Miltiadis Vasilakis
    return url;
136 4ae10a2b Miltiadis Vasilakis
}
137 4ae10a2b Miltiadis Vasilakis
138 4ae10a2b Miltiadis Vasilakis
- (NSArray *)children {
139 4ae10a2b Miltiadis Vasilakis
    @synchronized(self) {
140 da7bfe47 Miltiadis Vasilakis
        if (reset) {
141 da7bfe47 Miltiadis Vasilakis
            [accountRequest clearDelegatesAndCancel];
142 bc768c45 Miltiadis Vasilakis
            self.accountRequest = nil;
143 da7bfe47 Miltiadis Vasilakis
            [refreshMetadataAccountRequest clearDelegatesAndCancel];
144 bc768c45 Miltiadis Vasilakis
            self.refreshMetadataAccountRequest = nil;
145 da7bfe47 Miltiadis Vasilakis
            [applyMetadataAccountRequest clearDelegatesAndCancel];
146 bc768c45 Miltiadis Vasilakis
            self.applyMetadataAccountRequest = nil;
147 da7bfe47 Miltiadis Vasilakis
            children = nil;
148 da7bfe47 Miltiadis Vasilakis
            newChildren = nil;
149 da7bfe47 Miltiadis Vasilakis
            self.pithosAccount = nil;
150 da7bfe47 Miltiadis Vasilakis
            freshness = PithosNodeStateRefreshNeeded;
151 da7bfe47 Miltiadis Vasilakis
            forcedRefresh = YES;
152 da7bfe47 Miltiadis Vasilakis
            reset = NO;
153 da7bfe47 Miltiadis Vasilakis
            [self postChildrenUpdatedNotificationName];
154 da7bfe47 Miltiadis Vasilakis
        }
155 4ae10a2b Miltiadis Vasilakis
        switch (freshness) {
156 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateFresh:
157 4ae10a2b Miltiadis Vasilakis
                break;
158 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateRefreshNeeded:
159 4ae10a2b Miltiadis Vasilakis
                freshness = PithosNodeStateRefreshing;
160 bc768c45 Miltiadis Vasilakis
                self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
161 bc768c45 Miltiadis Vasilakis
                                                                                         limit:0
162 bc768c45 Miltiadis Vasilakis
                                                                                        marker:nil
163 bc768c45 Miltiadis Vasilakis
                                                                                        shared:shared
164 bc768c45 Miltiadis Vasilakis
                                                                                         until:nil];
165 af3b9f06 Miltiadis Vasilakis
                if (sharingAccount)
166 919cb043 Miltiadis Vasilakis
                    [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
167 5551c25f Miltiadis Vasilakis
                else if (!forcedRefresh)
168 5551c25f Miltiadis Vasilakis
                    accountRequest.downloadCache = [ASIDownloadCache sharedCache];
169 4ae10a2b Miltiadis Vasilakis
                accountRequest.delegate = self;
170 5f54c6be Miltiadis Vasilakis
                accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
171 5f54c6be Miltiadis Vasilakis
                accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
172 4a8699ab Miltiadis Vasilakis
                accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
173 5f54c6be Miltiadis Vasilakis
                                           [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
174 4a8699ab Miltiadis Vasilakis
                                           [NSNumber numberWithUnsignedInteger:10], @"retries", 
175 5f54c6be Miltiadis Vasilakis
                                           NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector", 
176 5f54c6be Miltiadis Vasilakis
                                           NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector", 
177 4a8699ab Miltiadis Vasilakis
                                           nil];
178 1b1e6fa1 Miltiadis Vasilakis
                [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
179 4ae10a2b Miltiadis Vasilakis
                break;
180 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateRefreshing:
181 4ae10a2b Miltiadis Vasilakis
                break;
182 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateRefreshFinished:
183 4ae10a2b Miltiadis Vasilakis
                if (newChildren) {
184 4ae10a2b Miltiadis Vasilakis
                    children = newChildren;
185 4ae10a2b Miltiadis Vasilakis
                    newChildren = nil;
186 4ae10a2b Miltiadis Vasilakis
                }
187 4ae10a2b Miltiadis Vasilakis
                freshness = PithosNodeStateFresh;
188 4ae10a2b Miltiadis Vasilakis
            default:
189 4ae10a2b Miltiadis Vasilakis
                break;
190 4ae10a2b Miltiadis Vasilakis
        }
191 4ae10a2b Miltiadis Vasilakis
        return children;
192 4ae10a2b Miltiadis Vasilakis
    }
193 4ae10a2b Miltiadis Vasilakis
}
194 4ae10a2b Miltiadis Vasilakis
195 4ae10a2b Miltiadis Vasilakis
- (NSString *)displayName {
196 eebb5f02 Miltiadis Vasilakis
    if (displayName == nil) {
197 eebb5f02 Miltiadis Vasilakis
        if (!sharingAccount) {
198 eebb5f02 Miltiadis Vasilakis
            return @"account";
199 eebb5f02 Miltiadis Vasilakis
        } else if (pithosAccountManager) {
200 eebb5f02 Miltiadis Vasilakis
            return [pithosAccountManager displaynameForUUID:sharingAccount safe:YES];
201 eebb5f02 Miltiadis Vasilakis
        } else {
202 eebb5f02 Miltiadis Vasilakis
            return [sharingAccount copy];
203 eebb5f02 Miltiadis Vasilakis
        }
204 eebb5f02 Miltiadis Vasilakis
    }
205 cb6abe72 Miltiadis Vasilakis
    return [displayName copy];
206 af3b9f06 Miltiadis Vasilakis
}
207 af3b9f06 Miltiadis Vasilakis
208 af3b9f06 Miltiadis Vasilakis
- (NSImage *)icon {
209 af3b9f06 Miltiadis Vasilakis
    if (icon == nil)
210 cb6abe72 Miltiadis Vasilakis
        icon = sharedIcon;
211 af3b9f06 Miltiadis Vasilakis
    return icon;
212 4ae10a2b Miltiadis Vasilakis
}
213 4ae10a2b Miltiadis Vasilakis
214 4ae10a2b Miltiadis Vasilakis
#pragma mark -
215 e5fdf4d9 Miltiadis Vasilakis
#pragma mark ASIHTTPRequestDelegate
216 e5fdf4d9 Miltiadis Vasilakis
217 4a8699ab Miltiadis Vasilakis
- (void)accountRequestFailed:(ASIPithosAccountRequest *)request {
218 b58ff732 Miltiadis Vasilakis
    @autoreleasepool {
219 b58ff732 Miltiadis Vasilakis
        NSString *message;
220 b58ff732 Miltiadis Vasilakis
        NSError *error = [accountRequest error];
221 b58ff732 Miltiadis Vasilakis
        if (error)
222 b58ff732 Miltiadis Vasilakis
            message = [NSString stringWithFormat:@"Account listing %@ failed: %@", accountRequest.url, [error localizedDescription]];
223 b58ff732 Miltiadis Vasilakis
        else
224 b58ff732 Miltiadis Vasilakis
            message = [NSString stringWithFormat:@"Account listing %@ failed: (%d) %@", 
225 b58ff732 Miltiadis Vasilakis
                       accountRequest.url, accountRequest.responseStatusCode, accountRequest.responseStatusMessage];
226 b58ff732 Miltiadis Vasilakis
        dispatch_async(dispatch_get_main_queue(), ^{
227 b58ff732 Miltiadis Vasilakis
            [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
228 b58ff732 Miltiadis Vasilakis
        });
229 b58ff732 Miltiadis Vasilakis
        NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
230 b58ff732 Miltiadis Vasilakis
        if (retries > 0) {
231 b58ff732 Miltiadis Vasilakis
            ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest];
232 b58ff732 Miltiadis Vasilakis
            [(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
233 bc768c45 Miltiadis Vasilakis
            self.accountRequest = newAccountRequest;
234 b58ff732 Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
235 b58ff732 Miltiadis Vasilakis
        } else {
236 b58ff732 Miltiadis Vasilakis
            newChildren = nil;
237 bc768c45 Miltiadis Vasilakis
            self.accountRequest = nil;
238 b58ff732 Miltiadis Vasilakis
            forcedRefresh = NO;
239 b58ff732 Miltiadis Vasilakis
            @synchronized(self) {
240 b58ff732 Miltiadis Vasilakis
                freshness = PithosNodeStateRefreshNeeded;
241 b58ff732 Miltiadis Vasilakis
            }
242 4a8699ab Miltiadis Vasilakis
        }
243 e5fdf4d9 Miltiadis Vasilakis
    }
244 4a8699ab Miltiadis Vasilakis
}
245 4a8699ab Miltiadis Vasilakis
246 4a8699ab Miltiadis Vasilakis
- (void)accountRequestFinished:(ASIPithosAccountRequest *)request {
247 b58ff732 Miltiadis Vasilakis
    @autoreleasepool {
248 b58ff732 Miltiadis Vasilakis
        DLog(@"List account finished: %@", [accountRequest url]);
249 b58ff732 Miltiadis Vasilakis
        DLog(@"Cached: %d", [accountRequest didUseCachedResponse]);
250 b58ff732 Miltiadis Vasilakis
        if (accountRequest.responseStatusCode == 200) {
251 b58ff732 Miltiadis Vasilakis
            self.pithosAccount = [accountRequest account];
252 b58ff732 Miltiadis Vasilakis
            
253 258db46f Miltiadis Vasilakis
            NSMutableArray *containers = [accountRequest.userInfo objectForKey:@"containers"];
254 b58ff732 Miltiadis Vasilakis
            NSArray *someContainers = [accountRequest containers];
255 b58ff732 Miltiadis Vasilakis
            if (containers == nil) {
256 258db46f Miltiadis Vasilakis
                containers = [NSMutableArray arrayWithArray:someContainers];
257 b58ff732 Miltiadis Vasilakis
            } else {
258 b58ff732 Miltiadis Vasilakis
                [containers addObjectsFromArray:someContainers];
259 b58ff732 Miltiadis Vasilakis
            }
260 b58ff732 Miltiadis Vasilakis
            if ([someContainers count] < 10000) {
261 b58ff732 Miltiadis Vasilakis
                if (!accountRequest.didUseCachedResponse || ([containers count] != [someContainers count]) || !children) {
262 b58ff732 Miltiadis Vasilakis
                    // Save new children
263 b58ff732 Miltiadis Vasilakis
                    DLog(@"using newChildren");
264 b58ff732 Miltiadis Vasilakis
                    newChildren = [[NSMutableArray alloc] init];
265 b58ff732 Miltiadis Vasilakis
                    NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
266 b58ff732 Miltiadis Vasilakis
                    for (ASIPithosContainer *container in containers) {
267 97c9a632 Miltiadis Vasilakis
                        PithosContainerNode *node = [[PithosContainerNode alloc] initWithPithosAccountManager:pithosAccountManager
268 97c9a632 Miltiadis Vasilakis
                                                                                                    andPithos:pithos
269 97c9a632 Miltiadis Vasilakis
                                                                                              pithosContainer:container];
270 b58ff732 Miltiadis Vasilakis
                        node.parent = self;
271 b58ff732 Miltiadis Vasilakis
                        node.shared = shared;
272 b58ff732 Miltiadis Vasilakis
                        node.sharingAccount = sharingAccount;
273 b58ff732 Miltiadis Vasilakis
                        node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
274 b58ff732 Miltiadis Vasilakis
                        if (children) {
275 b58ff732 Miltiadis Vasilakis
                            NSUInteger oldIndex = [children indexOfObject:node];
276 b58ff732 Miltiadis Vasilakis
                            if (oldIndex != NSNotFound) {
277 b58ff732 Miltiadis Vasilakis
                                // Use the same pointer value, if possible
278 b58ff732 Miltiadis Vasilakis
                                node = [children objectAtIndex:oldIndex];
279 b58ff732 Miltiadis Vasilakis
    //                            node.pithosContainer = container;
280 b58ff732 Miltiadis Vasilakis
                                [node setLimitedPithosContainer:container];
281 b58ff732 Miltiadis Vasilakis
                                [keptNodes addIndex:oldIndex];
282 b58ff732 Miltiadis Vasilakis
                            }
283 4a8699ab Miltiadis Vasilakis
                        }
284 b58ff732 Miltiadis Vasilakis
                        [newChildren addObject:node];
285 605c8932 Miltiadis Vasilakis
                    }
286 b58ff732 Miltiadis Vasilakis
                    [[children objectsAtIndexes:
287 b58ff732 Miltiadis Vasilakis
                      [[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [children count])] indexesPassingTest:^(NSUInteger idx, BOOL *stop){
288 b58ff732 Miltiadis Vasilakis
                        if ([keptNodes containsIndex:idx])
289 b58ff732 Miltiadis Vasilakis
                            return NO;
290 b58ff732 Miltiadis Vasilakis
                        return YES;
291 b58ff732 Miltiadis Vasilakis
                    }]] makeObjectsPerformSelector:@selector(pithosNodeWillBeRemoved)];
292 b58ff732 Miltiadis Vasilakis
                }
293 b58ff732 Miltiadis Vasilakis
                // Else cache was used and all results were fetched during this request, so existing children can be reused
294 bc768c45 Miltiadis Vasilakis
                self.accountRequest = nil;
295 b58ff732 Miltiadis Vasilakis
                forcedRefresh = NO;
296 b58ff732 Miltiadis Vasilakis
                @synchronized(self) {
297 b58ff732 Miltiadis Vasilakis
                    freshness = PithosNodeStateRefreshFinished;
298 e5fdf4d9 Miltiadis Vasilakis
                }
299 b58ff732 Miltiadis Vasilakis
                [self postChildrenUpdatedNotificationName];
300 b58ff732 Miltiadis Vasilakis
            } else {
301 b58ff732 Miltiadis Vasilakis
                // Do an additional request to fetch more objects
302 bc768c45 Miltiadis Vasilakis
                self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
303 bc768c45 Miltiadis Vasilakis
                                                                                         limit:0
304 bc768c45 Miltiadis Vasilakis
                                                                                        marker:[[someContainers lastObject] name]
305 bc768c45 Miltiadis Vasilakis
                                                                                        shared:shared
306 bc768c45 Miltiadis Vasilakis
                                                                                         until:nil];
307 b58ff732 Miltiadis Vasilakis
                if (sharingAccount)
308 b58ff732 Miltiadis Vasilakis
                    [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
309 b58ff732 Miltiadis Vasilakis
                else if (!forcedRefresh)
310 b58ff732 Miltiadis Vasilakis
                    accountRequest.downloadCache = [ASIDownloadCache sharedCache];
311 b58ff732 Miltiadis Vasilakis
                accountRequest.delegate = self;
312 b58ff732 Miltiadis Vasilakis
                accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
313 b58ff732 Miltiadis Vasilakis
                accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
314 b58ff732 Miltiadis Vasilakis
                accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
315 b58ff732 Miltiadis Vasilakis
                                           [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
316 b58ff732 Miltiadis Vasilakis
                                           [NSNumber numberWithUnsignedInteger:10], @"retries", 
317 b58ff732 Miltiadis Vasilakis
                                           NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector", 
318 258db46f Miltiadis Vasilakis
                                           NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector",
319 258db46f Miltiadis Vasilakis
                                           containers, @"containers",
320 b58ff732 Miltiadis Vasilakis
                                           nil];
321 b58ff732 Miltiadis Vasilakis
                [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
322 4a8699ab Miltiadis Vasilakis
            }
323 b58ff732 Miltiadis Vasilakis
        } else if (accountRequest.responseStatusCode == 304) {
324 b58ff732 Miltiadis Vasilakis
            // Account is not modified, so existing children can be reused
325 bc768c45 Miltiadis Vasilakis
            self.accountRequest = nil;
326 4a8699ab Miltiadis Vasilakis
            forcedRefresh = NO;
327 4a8699ab Miltiadis Vasilakis
            @synchronized(self) {
328 4a8699ab Miltiadis Vasilakis
                freshness = PithosNodeStateRefreshFinished;
329 e5fdf4d9 Miltiadis Vasilakis
            }
330 d4433f6f Miltiadis Vasilakis
            [self postChildrenUpdatedNotificationName];
331 4a8699ab Miltiadis Vasilakis
        } else {
332 b58ff732 Miltiadis Vasilakis
            [self accountRequestFailed:accountRequest];
333 e5fdf4d9 Miltiadis Vasilakis
        }
334 605c8932 Miltiadis Vasilakis
    }
335 e5fdf4d9 Miltiadis Vasilakis
}
336 e5fdf4d9 Miltiadis Vasilakis
337 470e6f81 Miltiadis Vasilakis
- (void)accountMetadataRequestFinished:(ASIPithosAccountRequest *)request {
338 b58ff732 Miltiadis Vasilakis
    @autoreleasepool {
339 b58ff732 Miltiadis Vasilakis
        DLog(@"URL: %@", [request url]);
340 b58ff732 Miltiadis Vasilakis
        DLog(@"cached: %d", [request didUseCachedResponse]);
341 b58ff732 Miltiadis Vasilakis
        
342 d8426ffb Miltiadis Vasilakis
        if ([request isEqualTo:applyMetadataAccountRequest]) {
343 d8426ffb Miltiadis Vasilakis
            @synchronized(self) {
344 bc768c45 Miltiadis Vasilakis
                self.applyMetadataAccountRequest = nil;
345 d8426ffb Miltiadis Vasilakis
            }
346 b58ff732 Miltiadis Vasilakis
            [self refreshInfo];
347 d8426ffb Miltiadis Vasilakis
        } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
348 b58ff732 Miltiadis Vasilakis
            self.pithosAccount = [refreshMetadataAccountRequest account];
349 d8426ffb Miltiadis Vasilakis
            @synchronized(self) {
350 bc768c45 Miltiadis Vasilakis
                self.refreshMetadataAccountRequest = nil;
351 d8426ffb Miltiadis Vasilakis
            }
352 470e6f81 Miltiadis Vasilakis
        }
353 b58ff732 Miltiadis Vasilakis
    }
354 b58ff732 Miltiadis Vasilakis
}
355 b58ff732 Miltiadis Vasilakis
356 b58ff732 Miltiadis Vasilakis
- (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request {
357 b58ff732 Miltiadis Vasilakis
    @autoreleasepool {
358 b58ff732 Miltiadis Vasilakis
        NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
359 b58ff732 Miltiadis Vasilakis
        if (retries > 0) {
360 b58ff732 Miltiadis Vasilakis
            ASIPithosAccountRequest *newRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:request];
361 b58ff732 Miltiadis Vasilakis
            [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
362 b58ff732 Miltiadis Vasilakis
            if ([request isEqualTo:applyMetadataAccountRequest]) {
363 b58ff732 Miltiadis Vasilakis
                @synchronized(self) {
364 bc768c45 Miltiadis Vasilakis
                    self.applyMetadataAccountRequest = newRequest;
365 b58ff732 Miltiadis Vasilakis
                }
366 b58ff732 Miltiadis Vasilakis
            } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
367 b58ff732 Miltiadis Vasilakis
                @synchronized(self) {
368 bc768c45 Miltiadis Vasilakis
                    self.refreshMetadataAccountRequest = newRequest;
369 b58ff732 Miltiadis Vasilakis
                }
370 d8426ffb Miltiadis Vasilakis
            }
371 b58ff732 Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
372 b58ff732 Miltiadis Vasilakis
        } else {
373 b58ff732 Miltiadis Vasilakis
            if ([request isEqualTo:applyMetadataAccountRequest]) {
374 b58ff732 Miltiadis Vasilakis
                [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest];
375 b58ff732 Miltiadis Vasilakis
                @synchronized(self) {
376 bc768c45 Miltiadis Vasilakis
                    self.applyMetadataAccountRequest = nil;
377 b58ff732 Miltiadis Vasilakis
                }
378 b58ff732 Miltiadis Vasilakis
            } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
379 b58ff732 Miltiadis Vasilakis
                [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataAccountRequest];
380 b58ff732 Miltiadis Vasilakis
                @synchronized(self) {
381 bc768c45 Miltiadis Vasilakis
                    self.refreshMetadataAccountRequest = nil;
382 b58ff732 Miltiadis Vasilakis
                }
383 d8426ffb Miltiadis Vasilakis
            }
384 470e6f81 Miltiadis Vasilakis
        }
385 470e6f81 Miltiadis Vasilakis
    }
386 470e6f81 Miltiadis Vasilakis
}
387 470e6f81 Miltiadis Vasilakis
388 470e6f81 Miltiadis Vasilakis
#pragma mark -
389 470e6f81 Miltiadis Vasilakis
#pragma mark Info
390 470e6f81 Miltiadis Vasilakis
391 470e6f81 Miltiadis Vasilakis
- (void)applyInfo {
392 470e6f81 Miltiadis Vasilakis
    @synchronized(self) {
393 470e6f81 Miltiadis Vasilakis
        if (applyMetadataAccountRequest == nil) {
394 b83af782 Miltiadis Vasilakis
            NSMutableDictionary *groups = [NSMutableDictionary dictionary];
395 b83af782 Miltiadis Vasilakis
            if (translatedGroups.count) {
396 b83af782 Miltiadis Vasilakis
                for (NSString *groupName in translatedGroups) {
397 b83af782 Miltiadis Vasilakis
                    if (!groupName.length ||
398 b83af782 Miltiadis Vasilakis
                        [groupName rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@" -_~,;"]].location != NSNotFound) {
399 b83af782 Miltiadis Vasilakis
                        NSAlert *alert = [[NSAlert alloc] init];
400 b83af782 Miltiadis Vasilakis
                        [alert setMessageText:@"Invalid Input"];
401 b83af782 Miltiadis Vasilakis
                        [alert setInformativeText:@"Group names cannot be empty or contain ' ', '-', '_', '~', ',' or ';'."];
402 b83af782 Miltiadis Vasilakis
                        [alert addButtonWithTitle:@"OK"];
403 b83af782 Miltiadis Vasilakis
                        [alert runModal];
404 b83af782 Miltiadis Vasilakis
                        return;
405 b83af782 Miltiadis Vasilakis
                    }
406 b83af782 Miltiadis Vasilakis
                }
407 b83af782 Miltiadis Vasilakis
                if (pithosAccountManager) {
408 b83af782 Miltiadis Vasilakis
                    NSMutableSet *allGroupUsers = [NSMutableSet set];
409 b83af782 Miltiadis Vasilakis
                    for (NSMutableArray *groupUsers in [translatedGroups objectEnumerator]) {
410 b83af782 Miltiadis Vasilakis
                        [allGroupUsers addObjectsFromArray:groupUsers];
411 b83af782 Miltiadis Vasilakis
                    }
412 b83af782 Miltiadis Vasilakis
                    [allGroupUsers removeObject:@""];
413 b83af782 Miltiadis Vasilakis
                    [allGroupUsers removeObject:@"*"];
414 b83af782 Miltiadis Vasilakis
                    if (allGroupUsers.count) {
415 baaf1397 Miltiadis Vasilakis
                        ASIPithosRequest *userCatalogRequest = [pithosAccountManager updateUserCatalogForDisplaynames:[allGroupUsers allObjects]
416 b83af782 Miltiadis Vasilakis
                                                                                                                        UUIDs:nil];
417 b83af782 Miltiadis Vasilakis
                        if (userCatalogRequest.error || ((userCatalogRequest.responseStatusCode != 200) && (userCatalogRequest.responseStatusCode != 404))) {
418 b83af782 Miltiadis Vasilakis
                            return;
419 b83af782 Miltiadis Vasilakis
                        } else if (userCatalogRequest.responseStatusCode == 200) {
420 b83af782 Miltiadis Vasilakis
                            // Check if all users exist.
421 b83af782 Miltiadis Vasilakis
                            NSDictionary *displaynameCatalog = [userCatalogRequest displaynameCatalog];
422 b83af782 Miltiadis Vasilakis
                            NSMutableArray *inexistentGroupUsers = [NSMutableArray array];
423 b83af782 Miltiadis Vasilakis
                            for (NSString *groupUser in allGroupUsers) {
424 b83af782 Miltiadis Vasilakis
                                if (![displaynameCatalog objectForKey:groupUser]) {
425 b83af782 Miltiadis Vasilakis
                                    [inexistentGroupUsers addObject:groupUser];
426 b83af782 Miltiadis Vasilakis
                                }
427 b83af782 Miltiadis Vasilakis
                            }
428 b83af782 Miltiadis Vasilakis
                            if (!inexistentGroupUsers.count) {
429 ec392f75 Miltiadis Vasilakis
                                // Create groups.
430 b83af782 Miltiadis Vasilakis
                                for (NSString *groupName in translatedGroups) {
431 b83af782 Miltiadis Vasilakis
                                    NSMutableArray *groupUsers = [NSMutableArray array];
432 b83af782 Miltiadis Vasilakis
                                    for (NSString *groupUser in [translatedGroups objectForKey:groupName]) {
433 b83af782 Miltiadis Vasilakis
                                        [groupUsers addObject:([groupUser isEqualToString:@"*"] ?
434 b83af782 Miltiadis Vasilakis
                                                               @"*" : [displaynameCatalog objectForKey:groupUser])];
435 b83af782 Miltiadis Vasilakis
                                    }
436 b83af782 Miltiadis Vasilakis
                                    [groups setObject:groupUsers forKey:groupName];
437 b83af782 Miltiadis Vasilakis
                                }
438 b83af782 Miltiadis Vasilakis
                            } else {
439 b83af782 Miltiadis Vasilakis
                                NSAlert *alert = [[NSAlert alloc] init];
440 b83af782 Miltiadis Vasilakis
                                if (inexistentGroupUsers.count == 1) {
441 b83af782 Miltiadis Vasilakis
                                    [alert setMessageText:@"Invalid User"];
442 b83af782 Miltiadis Vasilakis
                                    [alert setInformativeText:[NSString stringWithFormat:@"User '%@' doesn't exist.", [inexistentGroupUsers objectAtIndex:0]]];
443 b83af782 Miltiadis Vasilakis
                                } else {
444 b83af782 Miltiadis Vasilakis
                                    [alert setMessageText:@"Invalid Users"];
445 b83af782 Miltiadis Vasilakis
                                    [alert setInformativeText:[NSString stringWithFormat:@"Users '%@' don't exist.", [inexistentGroupUsers componentsJoinedByString:@"', '"]]];
446 b83af782 Miltiadis Vasilakis
                                }
447 b83af782 Miltiadis Vasilakis
                                [alert addButtonWithTitle:@"OK"];
448 b83af782 Miltiadis Vasilakis
                                [alert runModal];
449 b83af782 Miltiadis Vasilakis
                                return;
450 b83af782 Miltiadis Vasilakis
                            }
451 b83af782 Miltiadis Vasilakis
                        } else {
452 b83af782 Miltiadis Vasilakis
                            // 404. Since we don't translate to UUIDs, check for invalid chars.
453 b83af782 Miltiadis Vasilakis
                            BOOL valid = YES;
454 b83af782 Miltiadis Vasilakis
                            for (NSString *groupUser in allGroupUsers) {
455 b83af782 Miltiadis Vasilakis
                                if ([groupUser rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@" ~,;:"]].location != NSNotFound) {
456 b83af782 Miltiadis Vasilakis
                                    valid = NO;
457 b83af782 Miltiadis Vasilakis
                                    break;
458 b83af782 Miltiadis Vasilakis
                                }
459 b83af782 Miltiadis Vasilakis
                            }
460 b83af782 Miltiadis Vasilakis
                            if (valid) {
461 b83af782 Miltiadis Vasilakis
                                [groups addEntriesFromDictionary:translatedGroups];
462 b83af782 Miltiadis Vasilakis
                            } else {
463 b83af782 Miltiadis Vasilakis
                                NSAlert *alert = [[NSAlert alloc] init];
464 b83af782 Miltiadis Vasilakis
                                [alert setMessageText:@"Invalid Input"];
465 b83af782 Miltiadis Vasilakis
                                [alert setInformativeText:@"Users cannot contain ' ', '~', ',', ';' or ':'."];
466 b83af782 Miltiadis Vasilakis
                                [alert addButtonWithTitle:@"OK"];
467 b83af782 Miltiadis Vasilakis
                                [alert runModal];
468 b83af782 Miltiadis Vasilakis
                                return;
469 b83af782 Miltiadis Vasilakis
                            }
470 b83af782 Miltiadis Vasilakis
                        }
471 b83af782 Miltiadis Vasilakis
                    } else {
472 ec392f75 Miltiadis Vasilakis
                        for (NSString *groupName in translatedGroups) {
473 ec392f75 Miltiadis Vasilakis
                            if ([[translatedGroups objectForKey:groupName] containsObject:@"*"]) {
474 ec392f75 Miltiadis Vasilakis
                                [groups setObject:[NSMutableArray arrayWithObject:@"*"] forKey:groupName];
475 ec392f75 Miltiadis Vasilakis
                            }
476 ec392f75 Miltiadis Vasilakis
                        }
477 ec392f75 Miltiadis Vasilakis
                        if (!groups.count) {
478 ec392f75 Miltiadis Vasilakis
                            [groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
479 ec392f75 Miltiadis Vasilakis
                        }
480 b83af782 Miltiadis Vasilakis
                    }
481 b83af782 Miltiadis Vasilakis
                } else {
482 b83af782 Miltiadis Vasilakis
                    [groups addEntriesFromDictionary:translatedGroups];
483 b83af782 Miltiadis Vasilakis
                }
484 b83af782 Miltiadis Vasilakis
            } else {
485 b83af782 Miltiadis Vasilakis
                [groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
486 b83af782 Miltiadis Vasilakis
            }
487 b83af782 Miltiadis Vasilakis
            
488 bc768c45 Miltiadis Vasilakis
            self.applyMetadataAccountRequest = [ASIPithosAccountRequest updateAccountMetadataRequestWithPithos:pithos
489 bc768c45 Miltiadis Vasilakis
                                                                                                        groups:groups
490 bc768c45 Miltiadis Vasilakis
                                                                                                      metadata:pithosAccount.metadata
491 bc768c45 Miltiadis Vasilakis
                                                                                                        update:NO];
492 470e6f81 Miltiadis Vasilakis
            applyMetadataAccountRequest.delegate = self;
493 5f54c6be Miltiadis Vasilakis
            applyMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
494 5f54c6be Miltiadis Vasilakis
            applyMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
495 5f54c6be Miltiadis Vasilakis
            applyMetadataAccountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
496 5f54c6be Miltiadis Vasilakis
                                                    [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", 
497 5f54c6be Miltiadis Vasilakis
                                                    [NSNumber numberWithUnsignedInteger:10], @"retries", 
498 5f54c6be Miltiadis Vasilakis
                                                    NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector", 
499 5f54c6be Miltiadis Vasilakis
                                                    NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector", 
500 5f54c6be Miltiadis Vasilakis
                                                    nil];
501 1b1e6fa1 Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:applyMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
502 470e6f81 Miltiadis Vasilakis
        }
503 470e6f81 Miltiadis Vasilakis
    }
504 470e6f81 Miltiadis Vasilakis
}
505 470e6f81 Miltiadis Vasilakis
506 470e6f81 Miltiadis Vasilakis
- (void)refreshInfo {
507 470e6f81 Miltiadis Vasilakis
    @synchronized(self) {
508 470e6f81 Miltiadis Vasilakis
        if (refreshMetadataAccountRequest == nil) {
509 bc768c45 Miltiadis Vasilakis
            self.refreshMetadataAccountRequest = [ASIPithosAccountRequest accountMetadataRequestWithPithos:pithos];
510 470e6f81 Miltiadis Vasilakis
            refreshMetadataAccountRequest.delegate = self;
511 5f54c6be Miltiadis Vasilakis
            refreshMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
512 5f54c6be Miltiadis Vasilakis
            refreshMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
513 5f54c6be Miltiadis Vasilakis
            refreshMetadataAccountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
514 5f54c6be Miltiadis Vasilakis
                                                      [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", 
515 5f54c6be Miltiadis Vasilakis
                                                      [NSNumber numberWithUnsignedInteger:10], @"retries", 
516 5f54c6be Miltiadis Vasilakis
                                                      NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector", 
517 5f54c6be Miltiadis Vasilakis
                                                      NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector", 
518 5f54c6be Miltiadis Vasilakis
                                                      nil];
519 5551c25f Miltiadis Vasilakis
            if (!sharingAccount)
520 5551c25f Miltiadis Vasilakis
                refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache];
521 1b1e6fa1 Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:refreshMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
522 470e6f81 Miltiadis Vasilakis
        }
523 470e6f81 Miltiadis Vasilakis
    }
524 470e6f81 Miltiadis Vasilakis
}
525 470e6f81 Miltiadis Vasilakis
526 d8d08dc1 Miltiadis Vasilakis
@end