Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosSharingAccountsNode.m @ d8426ffb

History | View | Annotate | Download (11.2 kB)

1 af3b9f06 Miltiadis Vasilakis
//
2 af3b9f06 Miltiadis Vasilakis
//  PithosAccountNode.m
3 af3b9f06 Miltiadis Vasilakis
//  pithos-macos
4 af3b9f06 Miltiadis Vasilakis
//
5 919cb043 Miltiadis Vasilakis
// Copyright 2011-2012 GRNET S.A. All rights reserved.
6 af3b9f06 Miltiadis Vasilakis
//
7 af3b9f06 Miltiadis Vasilakis
// Redistribution and use in source and binary forms, with or
8 af3b9f06 Miltiadis Vasilakis
// without modification, are permitted provided that the following
9 af3b9f06 Miltiadis Vasilakis
// conditions are met:
10 af3b9f06 Miltiadis Vasilakis
// 
11 af3b9f06 Miltiadis Vasilakis
//   1. Redistributions of source code must retain the above
12 af3b9f06 Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
13 af3b9f06 Miltiadis Vasilakis
//      disclaimer.
14 af3b9f06 Miltiadis Vasilakis
// 
15 af3b9f06 Miltiadis Vasilakis
//   2. Redistributions in binary form must reproduce the above
16 af3b9f06 Miltiadis Vasilakis
//      copyright notice, this list of conditions and the following
17 af3b9f06 Miltiadis Vasilakis
//      disclaimer in the documentation and/or other materials
18 af3b9f06 Miltiadis Vasilakis
//      provided with the distribution.
19 af3b9f06 Miltiadis Vasilakis
// 
20 af3b9f06 Miltiadis Vasilakis
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21 af3b9f06 Miltiadis Vasilakis
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 af3b9f06 Miltiadis Vasilakis
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 af3b9f06 Miltiadis Vasilakis
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24 af3b9f06 Miltiadis Vasilakis
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 af3b9f06 Miltiadis Vasilakis
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 af3b9f06 Miltiadis Vasilakis
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27 af3b9f06 Miltiadis Vasilakis
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 af3b9f06 Miltiadis Vasilakis
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 af3b9f06 Miltiadis Vasilakis
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 af3b9f06 Miltiadis Vasilakis
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 af3b9f06 Miltiadis Vasilakis
// POSSIBILITY OF SUCH DAMAGE.
32 af3b9f06 Miltiadis Vasilakis
// 
33 af3b9f06 Miltiadis Vasilakis
// The views and conclusions contained in the software and
34 af3b9f06 Miltiadis Vasilakis
// documentation are those of the authors and should not be
35 af3b9f06 Miltiadis Vasilakis
// interpreted as representing official policies, either expressed
36 af3b9f06 Miltiadis Vasilakis
// or implied, of GRNET S.A.
37 af3b9f06 Miltiadis Vasilakis
38 af3b9f06 Miltiadis Vasilakis
#import "PithosSharingAccountsNode.h"
39 af3b9f06 Miltiadis Vasilakis
#import "PithosAccountNode.h"
40 af3b9f06 Miltiadis Vasilakis
#import "ASIPithosRequest.h"
41 919cb043 Miltiadis Vasilakis
#import "ASIPithos.h"
42 af3b9f06 Miltiadis Vasilakis
#import "ASIPithosAccount.h"
43 af3b9f06 Miltiadis Vasilakis
#import "ASIDownloadCache.h"
44 1b1e6fa1 Miltiadis Vasilakis
#import "PithosUtilities.h"
45 4a8699ab Miltiadis Vasilakis
#import "PithosActivityFacility.h"
46 af3b9f06 Miltiadis Vasilakis
47 af3b9f06 Miltiadis Vasilakis
@implementation PithosSharingAccountsNode
48 919cb043 Miltiadis Vasilakis
@synthesize pithos;
49 af3b9f06 Miltiadis Vasilakis
50 af3b9f06 Miltiadis Vasilakis
#pragma mark -
51 af3b9f06 Miltiadis Vasilakis
#pragma mark Object Lifecycle
52 af3b9f06 Miltiadis Vasilakis
53 919cb043 Miltiadis Vasilakis
- (id)initWithPithos:(ASIPithos *)aPithos {
54 f059e0e6 Miltiadis Vasilakis
    if ((self = [super init])) {
55 919cb043 Miltiadis Vasilakis
        self.pithos = aPithos;
56 af3b9f06 Miltiadis Vasilakis
        self.sharingAccount = @"";
57 af3b9f06 Miltiadis Vasilakis
    }
58 af3b9f06 Miltiadis Vasilakis
    return self;
59 af3b9f06 Miltiadis Vasilakis
}
60 af3b9f06 Miltiadis Vasilakis
61 af3b9f06 Miltiadis Vasilakis
- (void)dealloc {
62 af3b9f06 Miltiadis Vasilakis
    [sharingAccountsRequest clearDelegatesAndCancel];
63 af3b9f06 Miltiadis Vasilakis
    [sharingAccountsRequest release];
64 af3b9f06 Miltiadis Vasilakis
    [sharingAccounts release];
65 919cb043 Miltiadis Vasilakis
    [pithos release];
66 af3b9f06 Miltiadis Vasilakis
    [super dealloc];
67 af3b9f06 Miltiadis Vasilakis
}
68 af3b9f06 Miltiadis Vasilakis
69 af3b9f06 Miltiadis Vasilakis
#pragma mark -
70 af3b9f06 Miltiadis Vasilakis
#pragma mark Properties
71 af3b9f06 Miltiadis Vasilakis
72 d8426ffb Miltiadis Vasilakis
- (void)setPithos:(ASIPithos *)aPithos {
73 d8426ffb Miltiadis Vasilakis
    if (aPithos && ![aPithos isEqualTo:pithos]) {
74 d8426ffb Miltiadis Vasilakis
        [pithos release];
75 d8426ffb Miltiadis Vasilakis
        pithos = [aPithos retain];
76 d8426ffb Miltiadis Vasilakis
        [url release];
77 d8426ffb Miltiadis Vasilakis
        url = nil;
78 d8426ffb Miltiadis Vasilakis
    }
79 d8426ffb Miltiadis Vasilakis
}
80 d8426ffb Miltiadis Vasilakis
81 af3b9f06 Miltiadis Vasilakis
- (NSString *)url {
82 af3b9f06 Miltiadis Vasilakis
    if (url == nil) 
83 919cb043 Miltiadis Vasilakis
        url = [pithos.storageURLPrefix copy];
84 af3b9f06 Miltiadis Vasilakis
    return url;
85 af3b9f06 Miltiadis Vasilakis
}
86 af3b9f06 Miltiadis Vasilakis
87 af3b9f06 Miltiadis Vasilakis
- (NSArray *)children {
88 af3b9f06 Miltiadis Vasilakis
    @synchronized(self) {
89 af3b9f06 Miltiadis Vasilakis
        switch (freshness) {
90 af3b9f06 Miltiadis Vasilakis
            case PithosNodeStateFresh:
91 af3b9f06 Miltiadis Vasilakis
                break;
92 af3b9f06 Miltiadis Vasilakis
            case PithosNodeStateRefreshNeeded:
93 af3b9f06 Miltiadis Vasilakis
                freshness = PithosNodeStateRefreshing;
94 919cb043 Miltiadis Vasilakis
                sharingAccountsRequest = [[ASIPithosRequest listSharingAccountsRequestWithPithos:pithos limit:0 marker:nil] retain];
95 af3b9f06 Miltiadis Vasilakis
                sharingAccountsRequest.delegate = self;
96 5f54c6be Miltiadis Vasilakis
                sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
97 5f54c6be Miltiadis Vasilakis
                sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
98 4a8699ab Miltiadis Vasilakis
                sharingAccountsRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
99 5f54c6be Miltiadis Vasilakis
                                                   [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
100 4a8699ab Miltiadis Vasilakis
                                                   [NSNumber numberWithUnsignedInteger:10], @"retries", 
101 5f54c6be Miltiadis Vasilakis
                                                   NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector", 
102 5f54c6be Miltiadis Vasilakis
                                                   NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector", 
103 4a8699ab Miltiadis Vasilakis
                                                   nil];
104 90fadc45 Miltiadis Vasilakis
                if (!forcedRefresh)
105 90fadc45 Miltiadis Vasilakis
                    sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
106 1b1e6fa1 Miltiadis Vasilakis
                [[PithosUtilities prepareRequest:sharingAccountsRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
107 af3b9f06 Miltiadis Vasilakis
                break;
108 af3b9f06 Miltiadis Vasilakis
            case PithosNodeStateRefreshing:
109 af3b9f06 Miltiadis Vasilakis
                break;
110 af3b9f06 Miltiadis Vasilakis
            case PithosNodeStateRefreshFinished:
111 af3b9f06 Miltiadis Vasilakis
                if (newChildren) {
112 af3b9f06 Miltiadis Vasilakis
                    [children release];
113 af3b9f06 Miltiadis Vasilakis
                    children = newChildren;
114 af3b9f06 Miltiadis Vasilakis
                    newChildren = nil;
115 af3b9f06 Miltiadis Vasilakis
                }
116 af3b9f06 Miltiadis Vasilakis
                freshness = PithosNodeStateFresh;
117 af3b9f06 Miltiadis Vasilakis
            default:
118 af3b9f06 Miltiadis Vasilakis
                break;
119 af3b9f06 Miltiadis Vasilakis
        }
120 af3b9f06 Miltiadis Vasilakis
        return children;
121 af3b9f06 Miltiadis Vasilakis
    }
122 af3b9f06 Miltiadis Vasilakis
}
123 af3b9f06 Miltiadis Vasilakis
124 af3b9f06 Miltiadis Vasilakis
- (NSString *)displayName {
125 af3b9f06 Miltiadis Vasilakis
    if (displayName == nil)
126 af3b9f06 Miltiadis Vasilakis
        return [NSString stringWithString:@"sharing accounts"];
127 af3b9f06 Miltiadis Vasilakis
    return [[displayName copy] autorelease];
128 af3b9f06 Miltiadis Vasilakis
}
129 af3b9f06 Miltiadis Vasilakis
130 af3b9f06 Miltiadis Vasilakis
#pragma mark -
131 af3b9f06 Miltiadis Vasilakis
#pragma mark ASIHTTPRequestDelegate
132 af3b9f06 Miltiadis Vasilakis
133 4a8699ab Miltiadis Vasilakis
- (void)sharingAccountsRequestFailed:(ASIPithosRequest *)request {
134 5f54c6be Miltiadis Vasilakis
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
135 4a8699ab Miltiadis Vasilakis
    NSUInteger retries = [[sharingAccountsRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
136 4a8699ab Miltiadis Vasilakis
    if (retries > 0) {
137 4a8699ab Miltiadis Vasilakis
        ASIPithosRequest *newSharingAccountsRequest = (ASIPithosRequest *)[PithosUtilities copyRequest:sharingAccountsRequest];
138 4a8699ab Miltiadis Vasilakis
        [(NSMutableDictionary *)(newSharingAccountsRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
139 4a8699ab Miltiadis Vasilakis
        [sharingAccountsRequest release];
140 4a8699ab Miltiadis Vasilakis
        sharingAccountsRequest = newSharingAccountsRequest;
141 5f54c6be Miltiadis Vasilakis
        [[PithosUtilities prepareRequest:sharingAccountsRequest priority:[[sharingAccountsRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
142 af3b9f06 Miltiadis Vasilakis
    } else {
143 4a8699ab Miltiadis Vasilakis
        NSString *message;
144 4a8699ab Miltiadis Vasilakis
        NSError *error = [sharingAccountsRequest error];
145 4a8699ab Miltiadis Vasilakis
        if (error)
146 4a8699ab Miltiadis Vasilakis
            message = [NSString stringWithFormat:@"Sharing accounts listing failed: %@", error];
147 4a8699ab Miltiadis Vasilakis
        else
148 4a8699ab Miltiadis Vasilakis
            message = [NSString stringWithFormat:@"Sharing accounts listing failed: (%d) %@", 
149 4a8699ab Miltiadis Vasilakis
                       sharingAccountsRequest.responseStatusCode, sharingAccountsRequest.responseStatusMessage];
150 5f54c6be Miltiadis Vasilakis
        dispatch_async(dispatch_get_main_queue(), ^{
151 5f54c6be Miltiadis Vasilakis
            [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
152 5f54c6be Miltiadis Vasilakis
        });
153 4a8699ab Miltiadis Vasilakis
        [newChildren release];
154 4a8699ab Miltiadis Vasilakis
        newChildren = nil;
155 af3b9f06 Miltiadis Vasilakis
        [sharingAccountsRequest release];
156 af3b9f06 Miltiadis Vasilakis
        sharingAccountsRequest = nil;
157 af3b9f06 Miltiadis Vasilakis
        [sharingAccounts release];
158 af3b9f06 Miltiadis Vasilakis
        sharingAccounts = nil;
159 90fadc45 Miltiadis Vasilakis
        forcedRefresh = NO;
160 af3b9f06 Miltiadis Vasilakis
        @synchronized(self) {
161 4a8699ab Miltiadis Vasilakis
            freshness = PithosNodeStateRefreshNeeded;
162 af3b9f06 Miltiadis Vasilakis
        }
163 af3b9f06 Miltiadis Vasilakis
    }
164 5f54c6be Miltiadis Vasilakis
    [pool drain];
165 af3b9f06 Miltiadis Vasilakis
}
166 af3b9f06 Miltiadis Vasilakis
167 4a8699ab Miltiadis Vasilakis
- (void)sharingAccountsRequestFinished:(ASIPithosRequest *)request {
168 5f54c6be Miltiadis Vasilakis
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
169 4a8699ab Miltiadis Vasilakis
    NSLog(@"List sharing accounts finished: %@", [sharingAccountsRequest url]);
170 4a8699ab Miltiadis Vasilakis
    NSLog(@"Cached: %d", [sharingAccountsRequest didUseCachedResponse]);
171 4a8699ab Miltiadis Vasilakis
    if (sharingAccountsRequest.responseStatusCode == 200) {
172 4a8699ab Miltiadis Vasilakis
        NSArray *someSharingAccounts = [sharingAccountsRequest sharingAccounts];
173 4a8699ab Miltiadis Vasilakis
        if (sharingAccounts == nil) {
174 4a8699ab Miltiadis Vasilakis
            sharingAccounts = [[NSMutableArray alloc] initWithArray:someSharingAccounts];
175 4a8699ab Miltiadis Vasilakis
        } else {
176 4a8699ab Miltiadis Vasilakis
            [sharingAccounts addObjectsFromArray:someSharingAccounts];
177 4a8699ab Miltiadis Vasilakis
        }
178 4a8699ab Miltiadis Vasilakis
        if ([someSharingAccounts count] < 10000) {
179 4a8699ab Miltiadis Vasilakis
            if (!sharingAccountsRequest.didUseCachedResponse || ([sharingAccounts count] != [someSharingAccounts count]) || !children) {
180 4a8699ab Miltiadis Vasilakis
                // Save new children
181 4a8699ab Miltiadis Vasilakis
                NSLog(@"using newChildren");
182 4a8699ab Miltiadis Vasilakis
                newChildren = [[NSMutableArray alloc] init];
183 4a8699ab Miltiadis Vasilakis
                NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
184 4a8699ab Miltiadis Vasilakis
                for (ASIPithosAccount *account in sharingAccounts) {
185 919cb043 Miltiadis Vasilakis
                    if (![account.name isEqualToString:pithos.authUser]) {
186 4a8699ab Miltiadis Vasilakis
                        PithosAccountNode *node = [[[PithosAccountNode alloc] init] autorelease];
187 4a8699ab Miltiadis Vasilakis
                        node.parent = self;
188 4a8699ab Miltiadis Vasilakis
                        node.shared = shared;
189 4a8699ab Miltiadis Vasilakis
                        node.sharingAccount = account.name;
190 4a8699ab Miltiadis Vasilakis
                        if (children) {
191 4a8699ab Miltiadis Vasilakis
                            NSUInteger oldIndex = [children indexOfObject:node];
192 4a8699ab Miltiadis Vasilakis
                            if (oldIndex != NSNotFound) {
193 4a8699ab Miltiadis Vasilakis
                                // Use the same pointer value, if possible
194 4a8699ab Miltiadis Vasilakis
                                node = [children objectAtIndex:oldIndex];
195 4a8699ab Miltiadis Vasilakis
                                [keptNodes addIndex:oldIndex];
196 4a8699ab Miltiadis Vasilakis
                            }
197 4a8699ab Miltiadis Vasilakis
                        }
198 4a8699ab Miltiadis Vasilakis
                        [newChildren addObject:node];
199 4a8699ab Miltiadis Vasilakis
                    }
200 4a8699ab Miltiadis Vasilakis
                }
201 4a8699ab Miltiadis Vasilakis
                [[children objectsAtIndexes:
202 4a8699ab Miltiadis Vasilakis
                  [[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [children count])] indexesPassingTest:^(NSUInteger idx, BOOL *stop){
203 4a8699ab Miltiadis Vasilakis
                    if ([keptNodes containsIndex:idx])
204 4a8699ab Miltiadis Vasilakis
                        return NO;
205 4a8699ab Miltiadis Vasilakis
                    return YES;
206 4a8699ab Miltiadis Vasilakis
                }]] makeObjectsPerformSelector:@selector(pithosNodeWillBeRemoved)];
207 4a8699ab Miltiadis Vasilakis
            }
208 4a8699ab Miltiadis Vasilakis
            // Else cache was used and all results were fetched during this request, so existing children can be reused
209 4a8699ab Miltiadis Vasilakis
            [sharingAccountsRequest release];
210 4a8699ab Miltiadis Vasilakis
            sharingAccountsRequest = nil;
211 4a8699ab Miltiadis Vasilakis
            [sharingAccounts release];
212 4a8699ab Miltiadis Vasilakis
            sharingAccounts = nil;
213 4a8699ab Miltiadis Vasilakis
            forcedRefresh = NO;
214 4a8699ab Miltiadis Vasilakis
            @synchronized(self) {
215 4a8699ab Miltiadis Vasilakis
                freshness = PithosNodeStateRefreshFinished;
216 4a8699ab Miltiadis Vasilakis
            }
217 4a8699ab Miltiadis Vasilakis
            // Notify observers that children are updated
218 4a8699ab Miltiadis Vasilakis
            [[NSNotificationCenter defaultCenter] postNotificationName:@"PithosSharingAccountsNodeChildrenUpdated" object:self];
219 4a8699ab Miltiadis Vasilakis
        } else {
220 4a8699ab Miltiadis Vasilakis
            [sharingAccountsRequest release];
221 4a8699ab Miltiadis Vasilakis
            // Do an additional request to fetch more objects
222 919cb043 Miltiadis Vasilakis
            sharingAccountsRequest = [[ASIPithosRequest listSharingAccountsRequestWithPithos:pithos 
223 919cb043 Miltiadis Vasilakis
                                                                                       limit:0 
224 919cb043 Miltiadis Vasilakis
                                                                                      marker:[[someSharingAccounts lastObject] name]] retain];
225 4a8699ab Miltiadis Vasilakis
            sharingAccountsRequest.delegate = self;
226 5f54c6be Miltiadis Vasilakis
            sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
227 5f54c6be Miltiadis Vasilakis
            sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
228 4a8699ab Miltiadis Vasilakis
            sharingAccountsRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
229 5f54c6be Miltiadis Vasilakis
                                               [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
230 4a8699ab Miltiadis Vasilakis
                                               [NSNumber numberWithUnsignedInteger:10], @"retries", 
231 5f54c6be Miltiadis Vasilakis
                                               NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector", 
232 5f54c6be Miltiadis Vasilakis
                                               NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector", 
233 4a8699ab Miltiadis Vasilakis
                                               nil];
234 4a8699ab Miltiadis Vasilakis
            if (!forcedRefresh)
235 4a8699ab Miltiadis Vasilakis
                sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
236 4a8699ab Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:sharingAccountsRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
237 4a8699ab Miltiadis Vasilakis
        }
238 4a8699ab Miltiadis Vasilakis
    } else {
239 4a8699ab Miltiadis Vasilakis
        [self sharingAccountsRequestFailed:sharingAccountsRequest];
240 af3b9f06 Miltiadis Vasilakis
    }
241 5f54c6be Miltiadis Vasilakis
    [pool drain];
242 af3b9f06 Miltiadis Vasilakis
}
243 af3b9f06 Miltiadis Vasilakis
244 af3b9f06 Miltiadis Vasilakis
@end