Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosContainerNode.m @ 919cb043

History | View | Annotate | Download (25.8 kB)

1 d8d08dc1 Miltiadis Vasilakis
//
2 857217b0 Miltiadis Vasilakis
//  PithosContainerNode.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 "PithosContainerNode.h"
39 9f3a92de Miltiadis Vasilakis
#import "PithosObjectNode.h"
40 9f3a92de Miltiadis Vasilakis
#import "PithosSubdirNode.h"
41 919cb043 Miltiadis Vasilakis
#import "ASIPithos.h"
42 d8d08dc1 Miltiadis Vasilakis
#import "ASIPithosContainerRequest.h"
43 605c8932 Miltiadis Vasilakis
#import "ASIPithosContainer.h"
44 d8d08dc1 Miltiadis Vasilakis
#import "ASIPithosObject.h"
45 e5fdf4d9 Miltiadis Vasilakis
#import "ASIDownloadCache.h"
46 1b1e6fa1 Miltiadis Vasilakis
#import "PithosUtilities.h"
47 515cd8db Miltiadis Vasilakis
#import "PithosContainerNodeInfoController.h"
48 4a8699ab Miltiadis Vasilakis
#import "PithosActivityFacility.h"
49 e5fdf4d9 Miltiadis Vasilakis
50 63db4b97 Miltiadis Vasilakis
static NSImage *sharedIcon = nil;
51 d8d08dc1 Miltiadis Vasilakis
52 9f3a92de Miltiadis Vasilakis
@implementation PithosContainerNode
53 919cb043 Miltiadis Vasilakis
@synthesize pithos, pithosContainer, prefix;
54 515cd8db Miltiadis Vasilakis
@synthesize policyVersioning, policyQuota;
55 d8d08dc1 Miltiadis Vasilakis
56 e5fdf4d9 Miltiadis Vasilakis
+ (void)initialize {
57 9f3a92de Miltiadis Vasilakis
	if (self == [PithosContainerNode class])
58 4bf68b77 Miltiadis Vasilakis
        sharedIcon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericHardDiskIcon)] retain];
59 e5fdf4d9 Miltiadis Vasilakis
}
60 e5fdf4d9 Miltiadis Vasilakis
61 d8d08dc1 Miltiadis Vasilakis
#pragma mark -
62 d8d08dc1 Miltiadis Vasilakis
#pragma mark Object Lifecycle
63 d8d08dc1 Miltiadis Vasilakis
64 919cb043 Miltiadis Vasilakis
- (id)initWithPithos:(ASIPithos *)aPithos pithosContainer:(ASIPithosContainer *)aPithosContainer icon:(NSImage *)anIcon {
65 d8d08dc1 Miltiadis Vasilakis
    if ((self = [super init])) {
66 919cb043 Miltiadis Vasilakis
        self.pithos = aPithos;
67 857217b0 Miltiadis Vasilakis
        self.pithosContainer = aPithosContainer;
68 e5fdf4d9 Miltiadis Vasilakis
        prefix = nil;
69 4ae10a2b Miltiadis Vasilakis
        self.icon = anIcon;
70 63db4b97 Miltiadis Vasilakis
        childrenUpdatedNotificationName = @"PithosContainerNodeChildrenUpdated";
71 d8d08dc1 Miltiadis Vasilakis
    }
72 d8d08dc1 Miltiadis Vasilakis
    return self;
73 d8d08dc1 Miltiadis Vasilakis
}
74 d8d08dc1 Miltiadis Vasilakis
75 919cb043 Miltiadis Vasilakis
- (id)initWithPithos:(ASIPithos *)aPithos pithosContainer:(ASIPithosContainer *)aPithosContainer {
76 919cb043 Miltiadis Vasilakis
    return [self initWithPithos:aPithos pithosContainer:aPithosContainer icon:nil];
77 155f0dfd Miltiadis Vasilakis
}
78 155f0dfd Miltiadis Vasilakis
79 919cb043 Miltiadis Vasilakis
- (id)initWithPithos:(ASIPithos *)aPithos containerName:(NSString *)aContainerName icon:(NSImage *)anIcon {
80 9f3a92de Miltiadis Vasilakis
    ASIPithosContainer *container = [ASIPithosContainer container];
81 9f3a92de Miltiadis Vasilakis
    container.name = aContainerName;
82 919cb043 Miltiadis Vasilakis
    return [self initWithPithos:aPithos pithosContainer:container icon:anIcon];
83 155f0dfd Miltiadis Vasilakis
}
84 155f0dfd Miltiadis Vasilakis
85 919cb043 Miltiadis Vasilakis
- (id)initWithPithos:(ASIPithos *)aPithos containerName:(NSString *)aContainerName {
86 919cb043 Miltiadis Vasilakis
    return [self initWithPithos:aPithos containerName:aContainerName icon:nil];
87 9f3a92de Miltiadis Vasilakis
}
88 9f3a92de Miltiadis Vasilakis
89 d8d08dc1 Miltiadis Vasilakis
- (void)dealloc {
90 605c8932 Miltiadis Vasilakis
    [containerRequest clearDelegatesAndCancel];
91 605c8932 Miltiadis Vasilakis
    [containerRequest release];
92 515cd8db Miltiadis Vasilakis
    [refreshMetadataContainerRequest clearDelegatesAndCancel];
93 515cd8db Miltiadis Vasilakis
    [refreshMetadataContainerRequest release];
94 515cd8db Miltiadis Vasilakis
    [applyMetadataContainerRequest clearDelegatesAndCancel];
95 515cd8db Miltiadis Vasilakis
    [applyMetadataContainerRequest release];
96 515cd8db Miltiadis Vasilakis
    [policyQuota release];
97 515cd8db Miltiadis Vasilakis
    [policyVersioning release];
98 63db4b97 Miltiadis Vasilakis
    [childrenUpdatedNotificationName release];
99 e5fdf4d9 Miltiadis Vasilakis
    [prefix release];
100 d8d08dc1 Miltiadis Vasilakis
    [objects release];
101 9f3a92de Miltiadis Vasilakis
    [pithosContainer release];
102 919cb043 Miltiadis Vasilakis
    [pithos release];
103 d8d08dc1 Miltiadis Vasilakis
    [super dealloc];
104 d8d08dc1 Miltiadis Vasilakis
}
105 d8d08dc1 Miltiadis Vasilakis
106 d8d08dc1 Miltiadis Vasilakis
#pragma mark -
107 4ae10a2b Miltiadis Vasilakis
#pragma mark Properties
108 4ae10a2b Miltiadis Vasilakis
109 4ae10a2b Miltiadis Vasilakis
- (NSString *)url {
110 af3b9f06 Miltiadis Vasilakis
    if (url == nil)
111 af3b9f06 Miltiadis Vasilakis
        url = [[NSString alloc] initWithFormat:@"%@/%@%@", 
112 919cb043 Miltiadis Vasilakis
               (sharingAccount ? [pithos storageURLWithAuthUser:sharingAccount] : pithos.storageURL), 
113 af3b9f06 Miltiadis Vasilakis
               pithosContainer.name, 
114 af3b9f06 Miltiadis Vasilakis
               (shared ? @"?shared" : @"")];
115 4ae10a2b Miltiadis Vasilakis
    return url;
116 4ae10a2b Miltiadis Vasilakis
}
117 4ae10a2b Miltiadis Vasilakis
118 4ae10a2b Miltiadis Vasilakis
- (NSArray *)children {
119 4ae10a2b Miltiadis Vasilakis
    @synchronized(self) {
120 4ae10a2b Miltiadis Vasilakis
        switch (freshness) {
121 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateFresh:
122 4ae10a2b Miltiadis Vasilakis
                break;
123 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateRefreshNeeded:
124 4ae10a2b Miltiadis Vasilakis
                freshness = PithosNodeStateRefreshing;
125 919cb043 Miltiadis Vasilakis
                containerRequest = [[ASIPithosContainerRequest listObjectsRequestWithPithos:pithos 
126 919cb043 Miltiadis Vasilakis
                                                                              containerName:pithosContainer.name 
127 919cb043 Miltiadis Vasilakis
                                                                                      limit:0 
128 919cb043 Miltiadis Vasilakis
                                                                                     marker:nil 
129 919cb043 Miltiadis Vasilakis
                                                                                     prefix:prefix 
130 919cb043 Miltiadis Vasilakis
                                                                                  delimiter:@"/" 
131 919cb043 Miltiadis Vasilakis
                                                                                       path:nil 
132 919cb043 Miltiadis Vasilakis
                                                                                       meta:nil 
133 919cb043 Miltiadis Vasilakis
                                                                                     shared:shared 
134 919cb043 Miltiadis Vasilakis
                                                                                      until:nil] retain];
135 af3b9f06 Miltiadis Vasilakis
                if (sharingAccount)
136 919cb043 Miltiadis Vasilakis
                    [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
137 4ae10a2b Miltiadis Vasilakis
                containerRequest.delegate = self;
138 5f54c6be Miltiadis Vasilakis
                containerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
139 5f54c6be Miltiadis Vasilakis
                containerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
140 4a8699ab Miltiadis Vasilakis
                containerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
141 5f54c6be Miltiadis Vasilakis
                                             [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
142 4a8699ab Miltiadis Vasilakis
                                             [NSNumber numberWithUnsignedInteger:10], @"retries", 
143 5f54c6be Miltiadis Vasilakis
                                             NSStringFromSelector(@selector(containerRequestFinished:)), @"didFinishSelector", 
144 5f54c6be Miltiadis Vasilakis
                                             NSStringFromSelector(@selector(containerRequestFailed:)), @"didFailSelector", 
145 4a8699ab Miltiadis Vasilakis
                                             nil];
146 90fadc45 Miltiadis Vasilakis
                if (!forcedRefresh)
147 90fadc45 Miltiadis Vasilakis
                    containerRequest.downloadCache = [ASIDownloadCache sharedCache];
148 1b1e6fa1 Miltiadis Vasilakis
                [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
149 4ae10a2b Miltiadis Vasilakis
                break;
150 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateRefreshing:
151 4ae10a2b Miltiadis Vasilakis
                break;
152 4ae10a2b Miltiadis Vasilakis
            case PithosNodeStateRefreshFinished:
153 4ae10a2b Miltiadis Vasilakis
                if (newChildren) {
154 4ae10a2b Miltiadis Vasilakis
                    [children release];
155 4ae10a2b Miltiadis Vasilakis
                    children = newChildren;
156 4ae10a2b Miltiadis Vasilakis
                    newChildren = nil;
157 4ae10a2b Miltiadis Vasilakis
                }
158 4ae10a2b Miltiadis Vasilakis
                freshness = PithosNodeStateFresh;
159 4ae10a2b Miltiadis Vasilakis
            default:
160 4ae10a2b Miltiadis Vasilakis
                break;
161 4ae10a2b Miltiadis Vasilakis
        }
162 4ae10a2b Miltiadis Vasilakis
        return children;
163 4ae10a2b Miltiadis Vasilakis
    }
164 4ae10a2b Miltiadis Vasilakis
}
165 4ae10a2b Miltiadis Vasilakis
166 4ae10a2b Miltiadis Vasilakis
- (NSString *)displayName {
167 4ae10a2b Miltiadis Vasilakis
    return [[pithosContainer.name copy] autorelease];
168 4ae10a2b Miltiadis Vasilakis
}
169 4ae10a2b Miltiadis Vasilakis
170 4ae10a2b Miltiadis Vasilakis
- (void)setDisplayName:(NSString *)aDisplayName {
171 4ae10a2b Miltiadis Vasilakis
}
172 4ae10a2b Miltiadis Vasilakis
173 4ae10a2b Miltiadis Vasilakis
- (NSImage *)icon {
174 4ae10a2b Miltiadis Vasilakis
    if (icon == nil) {
175 4ae10a2b Miltiadis Vasilakis
        if ([pithosContainer.name isEqualToString:@"pithos"])
176 4ae10a2b Miltiadis Vasilakis
            icon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kToolbarHomeIcon)] retain];
177 4ae10a2b Miltiadis Vasilakis
        else if ([pithosContainer.name isEqualToString:@"trash"])
178 4ae10a2b Miltiadis Vasilakis
            icon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kFullTrashIcon)] retain];
179 4ae10a2b Miltiadis Vasilakis
        else
180 4ae10a2b Miltiadis Vasilakis
            icon = [sharedIcon retain];
181 4ae10a2b Miltiadis Vasilakis
    }
182 4ae10a2b Miltiadis Vasilakis
    return icon;
183 4ae10a2b Miltiadis Vasilakis
}
184 4ae10a2b Miltiadis Vasilakis
185 4ae10a2b Miltiadis Vasilakis
- (void)setPithosContainer:(ASIPithosContainer *)aPithosContainer {
186 4ae10a2b Miltiadis Vasilakis
    if (![pithosContainer isEqualTo:aPithosContainer]) {
187 4ae10a2b Miltiadis Vasilakis
        [pithosContainer release];
188 4ae10a2b Miltiadis Vasilakis
        pithosContainer = [aPithosContainer retain];
189 4ae10a2b Miltiadis Vasilakis
    }
190 4ae10a2b Miltiadis Vasilakis
    if (pithosContainer.policy) {
191 4ae10a2b Miltiadis Vasilakis
        self.policyVersioning = [pithosContainer.policy objectForKey:@"versioning"];
192 4ae10a2b Miltiadis Vasilakis
        self.policyQuota = [NSNumber numberWithLongLong:[[pithosContainer.policy objectForKey:@"quota"] longLongValue]];
193 4ae10a2b Miltiadis Vasilakis
    } else {
194 4ae10a2b Miltiadis Vasilakis
        self.policyVersioning = @"manual";
195 4ae10a2b Miltiadis Vasilakis
        self.policyQuota = [NSNumber numberWithLongLong:0];
196 4ae10a2b Miltiadis Vasilakis
    }
197 4ae10a2b Miltiadis Vasilakis
}
198 4ae10a2b Miltiadis Vasilakis
199 4ae10a2b Miltiadis Vasilakis
#pragma mark -
200 d8d08dc1 Miltiadis Vasilakis
#pragma mark ASIHTTPRequestDelegate
201 d8d08dc1 Miltiadis Vasilakis
202 4a8699ab Miltiadis Vasilakis
- (void)containerRequestFailed:(ASIPithosContainerRequest *)request {
203 5f54c6be Miltiadis Vasilakis
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
204 4a8699ab Miltiadis Vasilakis
    NSUInteger retries = [[containerRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
205 4a8699ab Miltiadis Vasilakis
    if (retries > 0) {
206 4a8699ab Miltiadis Vasilakis
        ASIPithosContainerRequest *newContainerRequest = (ASIPithosContainerRequest *)[PithosUtilities copyRequest:containerRequest];
207 4a8699ab Miltiadis Vasilakis
        [(NSMutableDictionary *)(newContainerRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
208 4a8699ab Miltiadis Vasilakis
        [containerRequest release];
209 4a8699ab Miltiadis Vasilakis
        containerRequest = newContainerRequest;
210 5f54c6be Miltiadis Vasilakis
        [[PithosUtilities prepareRequest:containerRequest priority:[[containerRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
211 d8d08dc1 Miltiadis Vasilakis
    } else {
212 4a8699ab Miltiadis Vasilakis
        NSString *message;
213 4a8699ab Miltiadis Vasilakis
        NSError *error = [containerRequest error];
214 4a8699ab Miltiadis Vasilakis
        if (error)
215 4a8699ab Miltiadis Vasilakis
            message = [NSString stringWithFormat:@"Container listing failed: %@", error];
216 4a8699ab Miltiadis Vasilakis
        else
217 4a8699ab Miltiadis Vasilakis
            message = [NSString stringWithFormat:@"Container listing failed: (%d) %@", 
218 4a8699ab Miltiadis Vasilakis
                       containerRequest.responseStatusCode, containerRequest.responseStatusMessage];
219 5f54c6be Miltiadis Vasilakis
        dispatch_async(dispatch_get_main_queue(), ^{
220 5f54c6be Miltiadis Vasilakis
            [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
221 5f54c6be Miltiadis Vasilakis
        });
222 4a8699ab Miltiadis Vasilakis
        [newChildren release];
223 4a8699ab Miltiadis Vasilakis
        newChildren = nil;
224 4a8699ab Miltiadis Vasilakis
        [containerRequest release];
225 4a8699ab Miltiadis Vasilakis
        containerRequest = nil;
226 4a8699ab Miltiadis Vasilakis
        [objects release];
227 4a8699ab Miltiadis Vasilakis
        objects = nil;
228 4a8699ab Miltiadis Vasilakis
        forcedRefresh = NO;
229 4a8699ab Miltiadis Vasilakis
        @synchronized(self) {
230 4a8699ab Miltiadis Vasilakis
            freshness = PithosNodeStateRefreshNeeded;
231 4a8699ab Miltiadis Vasilakis
        }
232 e5fdf4d9 Miltiadis Vasilakis
    }
233 5f54c6be Miltiadis Vasilakis
    [pool drain];
234 4a8699ab Miltiadis Vasilakis
}
235 4a8699ab Miltiadis Vasilakis
236 4a8699ab Miltiadis Vasilakis
- (void)containerRequestFinished:(ASIPithosContainerRequest *)request {
237 5f54c6be Miltiadis Vasilakis
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
238 4a8699ab Miltiadis Vasilakis
    NSLog(@"List container finished: %@", [containerRequest url]);
239 4a8699ab Miltiadis Vasilakis
    NSLog(@"Cached: %d", [containerRequest didUseCachedResponse]);
240 4a8699ab Miltiadis Vasilakis
    if (containerRequest.responseStatusCode == 200) {
241 4a8699ab Miltiadis Vasilakis
        if ((pithosContainer.blockHash == nil) || (pithosContainer.blockSize == 0)) {
242 4a8699ab Miltiadis Vasilakis
            pithosContainer.blockHash = [containerRequest blockHash];
243 4a8699ab Miltiadis Vasilakis
            pithosContainer.blockSize = [containerRequest blockSize];
244 4a8699ab Miltiadis Vasilakis
        }
245 4a8699ab Miltiadis Vasilakis
    
246 4a8699ab Miltiadis Vasilakis
        NSArray *someObjects = [containerRequest objects];
247 4a8699ab Miltiadis Vasilakis
        if (objects == nil) {
248 4a8699ab Miltiadis Vasilakis
            objects = [[NSMutableArray alloc] initWithArray:someObjects];
249 4a8699ab Miltiadis Vasilakis
        } else {
250 4a8699ab Miltiadis Vasilakis
            [objects addObjectsFromArray:someObjects];
251 4a8699ab Miltiadis Vasilakis
        }
252 4a8699ab Miltiadis Vasilakis
        if ([someObjects count] < 10000) {
253 4a8699ab Miltiadis Vasilakis
            if (!containerRequest.didUseCachedResponse || ([objects count] != [someObjects count]) || !children) {
254 4a8699ab Miltiadis Vasilakis
                // Save new children
255 4a8699ab Miltiadis Vasilakis
                NSLog(@"using newChildren");
256 4a8699ab Miltiadis Vasilakis
                newChildren = [[NSMutableArray alloc] init];
257 4a8699ab Miltiadis Vasilakis
                NSArray *objectNames = [objects valueForKey:@"name"];
258 4a8699ab Miltiadis Vasilakis
                NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
259 4a8699ab Miltiadis Vasilakis
                BOOL isSubdirNode = ([self class] == [PithosSubdirNode class]);
260 4a8699ab Miltiadis Vasilakis
                for (ASIPithosObject *object in objects) {
261 4a8699ab Miltiadis Vasilakis
                    if (!isSubdirNode || 
262 e90c77e7 Miltiadis Vasilakis
                        ([object.name hasPrefix:[((PithosSubdirNode *)self).prefix stringByAppendingString:@"/"]] &&
263 e90c77e7 Miltiadis Vasilakis
                         ([object.name length] > [((PithosSubdirNode *)self).prefix length] + 1))) {
264 4a8699ab Miltiadis Vasilakis
                        // The check above removes false objects due to trailing slash or same prefix
265 4a8699ab Miltiadis Vasilakis
                        if (object.subdir) {
266 4a8699ab Miltiadis Vasilakis
                            NSUInteger sameNameObjectIndex = [objectNames indexOfObject:[object.name substringToIndex:([object.name length] - 1)]];
267 4a8699ab Miltiadis Vasilakis
                            if ((sameNameObjectIndex == NSNotFound) || 
268 4a8699ab Miltiadis Vasilakis
                                ![PithosUtilities isContentTypeDirectory:[[objects objectAtIndex:sameNameObjectIndex] contentType]]) {
269 919cb043 Miltiadis Vasilakis
                                PithosSubdirNode *node = [[[PithosSubdirNode alloc] initWithPithos:pithos 
270 919cb043 Miltiadis Vasilakis
                                                                                   pithosContainer:pithosContainer 
271 919cb043 Miltiadis Vasilakis
                                                                                      pithosObject:object] autorelease];
272 4a8699ab Miltiadis Vasilakis
                                node.parent = self;
273 4a8699ab Miltiadis Vasilakis
                                node.shared = shared;
274 4a8699ab Miltiadis Vasilakis
                                node.sharingAccount = sharingAccount;
275 4a8699ab Miltiadis Vasilakis
                                if (children) {
276 4a8699ab Miltiadis Vasilakis
                                    NSUInteger oldIndex = [children indexOfObject:node];
277 4a8699ab Miltiadis Vasilakis
                                    if (oldIndex != NSNotFound) {
278 4a8699ab Miltiadis Vasilakis
                                        // Use the same pointer value, if possible
279 4a8699ab Miltiadis Vasilakis
                                        node = [children objectAtIndex:oldIndex];
280 4a8699ab Miltiadis Vasilakis
                                        node.pithosContainer = pithosContainer;
281 4a8699ab Miltiadis Vasilakis
                                        node.pithosObject = object;
282 4a8699ab Miltiadis Vasilakis
                                        [keptNodes addIndex:oldIndex];
283 4a8699ab Miltiadis Vasilakis
                                    }
284 4a8699ab Miltiadis Vasilakis
                                }
285 4a8699ab Miltiadis Vasilakis
                                if (sharingAccount)
286 4a8699ab Miltiadis Vasilakis
                                    node.pithosObject.allowedTo = [NSString stringWithString:@"read"];
287 4a8699ab Miltiadis Vasilakis
                                [newChildren addObject:node];
288 4a8699ab Miltiadis Vasilakis
                            }
289 4a8699ab Miltiadis Vasilakis
                        } else if ([PithosUtilities isContentTypeDirectory:object.contentType]) {
290 919cb043 Miltiadis Vasilakis
                            PithosSubdirNode *node = [[[PithosSubdirNode alloc] initWithPithos:pithos 
291 919cb043 Miltiadis Vasilakis
                                                                               pithosContainer:pithosContainer 
292 919cb043 Miltiadis Vasilakis
                                                                                  pithosObject:object] autorelease];
293 af3b9f06 Miltiadis Vasilakis
                            node.parent = self;
294 af3b9f06 Miltiadis Vasilakis
                            node.shared = shared;
295 af3b9f06 Miltiadis Vasilakis
                            node.sharingAccount = sharingAccount;
296 2ff5d98f Miltiadis Vasilakis
                            if (children) {
297 2ff5d98f Miltiadis Vasilakis
                                NSUInteger oldIndex = [children indexOfObject:node];
298 2ff5d98f Miltiadis Vasilakis
                                if (oldIndex != NSNotFound) {
299 2ff5d98f Miltiadis Vasilakis
                                    // Use the same pointer value, if possible
300 2ff5d98f Miltiadis Vasilakis
                                    node = [children objectAtIndex:oldIndex];
301 2ff5d98f Miltiadis Vasilakis
                                    node.pithosContainer = pithosContainer;
302 2ff5d98f Miltiadis Vasilakis
                                    node.pithosObject = object;
303 2ff5d98f Miltiadis Vasilakis
                                    [keptNodes addIndex:oldIndex];
304 2ff5d98f Miltiadis Vasilakis
                                }
305 857217b0 Miltiadis Vasilakis
                            }
306 2ff5d98f Miltiadis Vasilakis
                            [newChildren addObject:node];
307 4a8699ab Miltiadis Vasilakis
                        } else {
308 919cb043 Miltiadis Vasilakis
                            PithosObjectNode *node = [[[PithosObjectNode alloc] initWithPithos:pithos 
309 919cb043 Miltiadis Vasilakis
                                                                               pithosContainer:pithosContainer 
310 919cb043 Miltiadis Vasilakis
                                                                                  pithosObject:object] autorelease];
311 4a8699ab Miltiadis Vasilakis
                            node.parent = self;
312 4a8699ab Miltiadis Vasilakis
                            node.shared = shared;
313 4a8699ab Miltiadis Vasilakis
                            node.sharingAccount = sharingAccount;
314 4a8699ab Miltiadis Vasilakis
                            if (children) {
315 4a8699ab Miltiadis Vasilakis
                                NSUInteger oldIndex = [children indexOfObject:node];
316 4a8699ab Miltiadis Vasilakis
                                if (oldIndex != NSNotFound) {
317 4a8699ab Miltiadis Vasilakis
                                    // Use the same pointer value, if possible
318 4a8699ab Miltiadis Vasilakis
                                    node = [children objectAtIndex:oldIndex];
319 4a8699ab Miltiadis Vasilakis
                                    node.pithosContainer = pithosContainer;
320 4a8699ab Miltiadis Vasilakis
                                    node.pithosObject = object;
321 4a8699ab Miltiadis Vasilakis
                                    [keptNodes addIndex:oldIndex];
322 4a8699ab Miltiadis Vasilakis
                                }
323 6a9b9f40 Miltiadis Vasilakis
                            }
324 4a8699ab Miltiadis Vasilakis
                            [newChildren addObject:node];                                
325 605c8932 Miltiadis Vasilakis
                        }
326 e5fdf4d9 Miltiadis Vasilakis
                    }
327 e5fdf4d9 Miltiadis Vasilakis
                }
328 4a8699ab Miltiadis Vasilakis
                [[children objectsAtIndexes:
329 4a8699ab Miltiadis Vasilakis
                  [[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [children count])] indexesPassingTest:^(NSUInteger idx, BOOL *stop){
330 4a8699ab Miltiadis Vasilakis
                    if ([keptNodes containsIndex:idx])
331 4a8699ab Miltiadis Vasilakis
                        return NO;
332 4a8699ab Miltiadis Vasilakis
                    return YES;
333 4a8699ab Miltiadis Vasilakis
                }]] makeObjectsPerformSelector:@selector(pithosNodeWillBeRemoved)];
334 4a8699ab Miltiadis Vasilakis
            }
335 4a8699ab Miltiadis Vasilakis
            // Else cache was used and all results were fetched during this request, so existing children can be reused
336 4a8699ab Miltiadis Vasilakis
            [containerRequest release];
337 4a8699ab Miltiadis Vasilakis
            containerRequest = nil;
338 4a8699ab Miltiadis Vasilakis
            [objects release];
339 4a8699ab Miltiadis Vasilakis
            objects = nil;
340 4a8699ab Miltiadis Vasilakis
            forcedRefresh = NO;
341 4a8699ab Miltiadis Vasilakis
            @synchronized(self) {
342 4a8699ab Miltiadis Vasilakis
                freshness = PithosNodeStateRefreshFinished;
343 d8d08dc1 Miltiadis Vasilakis
            }
344 4a8699ab Miltiadis Vasilakis
            // Notify observers that children are updated
345 4a8699ab Miltiadis Vasilakis
            [[NSNotificationCenter defaultCenter] postNotificationName:childrenUpdatedNotificationName object:self];
346 4a8699ab Miltiadis Vasilakis
        } else {
347 4a8699ab Miltiadis Vasilakis
            [containerRequest release];
348 4a8699ab Miltiadis Vasilakis
            // Do an additional request to fetch more objects
349 919cb043 Miltiadis Vasilakis
            containerRequest = [[ASIPithosContainerRequest listObjectsRequestWithPithos:pithos 
350 919cb043 Miltiadis Vasilakis
                                                                          containerName:pithosContainer.name 
351 919cb043 Miltiadis Vasilakis
                                                                                  limit:0 
352 919cb043 Miltiadis Vasilakis
                                                                                 marker:[[someObjects lastObject] name] 
353 919cb043 Miltiadis Vasilakis
                                                                                 prefix:prefix 
354 919cb043 Miltiadis Vasilakis
                                                                              delimiter:@"/" 
355 919cb043 Miltiadis Vasilakis
                                                                                   path:nil 
356 919cb043 Miltiadis Vasilakis
                                                                                   meta:nil 
357 919cb043 Miltiadis Vasilakis
                                                                                 shared:shared 
358 919cb043 Miltiadis Vasilakis
                                                                                  until:nil] retain];
359 4a8699ab Miltiadis Vasilakis
            if (sharingAccount)
360 919cb043 Miltiadis Vasilakis
                [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
361 4a8699ab Miltiadis Vasilakis
            containerRequest.delegate = self;
362 5f54c6be Miltiadis Vasilakis
            containerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
363 5f54c6be Miltiadis Vasilakis
            containerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
364 4a8699ab Miltiadis Vasilakis
            containerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
365 5f54c6be Miltiadis Vasilakis
                                         [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
366 4a8699ab Miltiadis Vasilakis
                                         [NSNumber numberWithUnsignedInteger:10], @"retries", 
367 5f54c6be Miltiadis Vasilakis
                                         NSStringFromSelector(@selector(containerRequestFinished:)), @"didFinishSelector", 
368 5f54c6be Miltiadis Vasilakis
                                         NSStringFromSelector(@selector(containerRequestFailed:)), @"didFailSelector", 
369 4a8699ab Miltiadis Vasilakis
                                         nil];
370 4a8699ab Miltiadis Vasilakis
            if (!forcedRefresh)
371 4a8699ab Miltiadis Vasilakis
            containerRequest.downloadCache = [ASIDownloadCache sharedCache];
372 4a8699ab Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
373 d8d08dc1 Miltiadis Vasilakis
        }
374 4a8699ab Miltiadis Vasilakis
    } else if (containerRequest.responseStatusCode == 304) {
375 4a8699ab Miltiadis Vasilakis
        // Container is not modified, so existing children can be reused
376 605c8932 Miltiadis Vasilakis
        [containerRequest release];
377 605c8932 Miltiadis Vasilakis
        containerRequest = nil;
378 d8d08dc1 Miltiadis Vasilakis
        [objects release];
379 e5fdf4d9 Miltiadis Vasilakis
        objects = nil;
380 90fadc45 Miltiadis Vasilakis
        forcedRefresh = NO;
381 605c8932 Miltiadis Vasilakis
        @synchronized(self) {
382 605c8932 Miltiadis Vasilakis
            freshness = PithosNodeStateRefreshFinished;
383 605c8932 Miltiadis Vasilakis
        }
384 d8d08dc1 Miltiadis Vasilakis
        // Notify observers that children are updated
385 63db4b97 Miltiadis Vasilakis
        [[NSNotificationCenter defaultCenter] postNotificationName:childrenUpdatedNotificationName object:self];
386 d8d08dc1 Miltiadis Vasilakis
    } else {
387 4a8699ab Miltiadis Vasilakis
        [self containerRequestFailed:containerRequest];
388 605c8932 Miltiadis Vasilakis
    }
389 5f54c6be Miltiadis Vasilakis
    [pool drain];
390 d8d08dc1 Miltiadis Vasilakis
}
391 d8d08dc1 Miltiadis Vasilakis
392 515cd8db Miltiadis Vasilakis
- (void)containerMetadataRequestFinished:(ASIPithosContainerRequest *)request {
393 5f54c6be Miltiadis Vasilakis
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
394 515cd8db Miltiadis Vasilakis
    NSLog(@"URL: %@", [request url]);
395 515cd8db Miltiadis Vasilakis
    NSLog(@"cached: %d", [request didUseCachedResponse]);
396 515cd8db Miltiadis Vasilakis
    
397 515cd8db Miltiadis Vasilakis
    if ([request isEqualTo:applyMetadataContainerRequest]) {
398 515cd8db Miltiadis Vasilakis
        @synchronized(self) {
399 515cd8db Miltiadis Vasilakis
            [applyMetadataContainerRequest release];
400 515cd8db Miltiadis Vasilakis
            applyMetadataContainerRequest = nil;
401 515cd8db Miltiadis Vasilakis
        }
402 515cd8db Miltiadis Vasilakis
        [self refreshInfo];
403 515cd8db Miltiadis Vasilakis
    } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
404 515cd8db Miltiadis Vasilakis
        [[pithosNodeInfoController window] makeFirstResponder:nil];
405 515cd8db Miltiadis Vasilakis
        self.pithosContainer = [refreshMetadataContainerRequest container];
406 515cd8db Miltiadis Vasilakis
        @synchronized(self) {
407 515cd8db Miltiadis Vasilakis
            [refreshMetadataContainerRequest release];
408 515cd8db Miltiadis Vasilakis
            refreshMetadataContainerRequest = nil;
409 515cd8db Miltiadis Vasilakis
        }
410 515cd8db Miltiadis Vasilakis
    }
411 5f54c6be Miltiadis Vasilakis
    [pool drain];
412 515cd8db Miltiadis Vasilakis
}
413 515cd8db Miltiadis Vasilakis
414 515cd8db Miltiadis Vasilakis
- (void)containerMetadataRequestFailed:(ASIPithosContainerRequest *)request {
415 5f54c6be Miltiadis Vasilakis
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
416 515cd8db Miltiadis Vasilakis
    if ([request isEqualTo:applyMetadataContainerRequest]) {
417 1b1e6fa1 Miltiadis Vasilakis
        [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataContainerRequest];
418 515cd8db Miltiadis Vasilakis
        @synchronized(self) {
419 515cd8db Miltiadis Vasilakis
            [applyMetadataContainerRequest release];
420 515cd8db Miltiadis Vasilakis
            applyMetadataContainerRequest = nil;
421 515cd8db Miltiadis Vasilakis
        }
422 515cd8db Miltiadis Vasilakis
    } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
423 1b1e6fa1 Miltiadis Vasilakis
        [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataContainerRequest];
424 515cd8db Miltiadis Vasilakis
        @synchronized(self) {
425 515cd8db Miltiadis Vasilakis
            [refreshMetadataContainerRequest release];
426 515cd8db Miltiadis Vasilakis
            refreshMetadataContainerRequest = nil;
427 515cd8db Miltiadis Vasilakis
        }
428 515cd8db Miltiadis Vasilakis
    }
429 5f54c6be Miltiadis Vasilakis
    [pool drain];
430 515cd8db Miltiadis Vasilakis
}
431 515cd8db Miltiadis Vasilakis
432 d8d08dc1 Miltiadis Vasilakis
#pragma mark -
433 515cd8db Miltiadis Vasilakis
#pragma mark Info
434 515cd8db Miltiadis Vasilakis
435 515cd8db Miltiadis Vasilakis
- (void)applyInfo {
436 515cd8db Miltiadis Vasilakis
    @synchronized(self) {
437 515cd8db Miltiadis Vasilakis
        if (applyMetadataContainerRequest == nil) {
438 515cd8db Miltiadis Vasilakis
            [[pithosNodeInfoController window] makeFirstResponder:nil];
439 919cb043 Miltiadis Vasilakis
            applyMetadataContainerRequest = [[ASIPithosContainerRequest updateContainerMetadataRequestWithPithos:pithos 
440 919cb043 Miltiadis Vasilakis
                                                                                                   containerName:pithosContainer.name 
441 919cb043 Miltiadis Vasilakis
                                                                                                          policy:[NSDictionary dictionaryWithObjectsAndKeys:
442 919cb043 Miltiadis Vasilakis
                                                                                                                  policyVersioning, @"versioning", 
443 919cb043 Miltiadis Vasilakis
                                                                                                                  [policyQuota stringValue], @"quota", 
444 919cb043 Miltiadis Vasilakis
                                                                                                                  nil] 
445 919cb043 Miltiadis Vasilakis
                                                                                                        metadata:pithosContainer.metadata 
446 919cb043 Miltiadis Vasilakis
                                                                                                          update:NO] retain];
447 515cd8db Miltiadis Vasilakis
            applyMetadataContainerRequest.delegate = self;
448 5f54c6be Miltiadis Vasilakis
            applyMetadataContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
449 5f54c6be Miltiadis Vasilakis
            applyMetadataContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
450 5f54c6be Miltiadis Vasilakis
            applyMetadataContainerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
451 5f54c6be Miltiadis Vasilakis
                                                      [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", 
452 5f54c6be Miltiadis Vasilakis
                                                      [NSNumber numberWithUnsignedInteger:10], @"retries", 
453 5f54c6be Miltiadis Vasilakis
                                                      NSStringFromSelector(@selector(containerMetadataRequestFinished:)), @"didFinishSelector", 
454 5f54c6be Miltiadis Vasilakis
                                                      NSStringFromSelector(@selector(containerMetadataRequestFailed:)), @"didFailSelector", 
455 5f54c6be Miltiadis Vasilakis
                                                      nil];
456 1b1e6fa1 Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:applyMetadataContainerRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
457 515cd8db Miltiadis Vasilakis
        }
458 515cd8db Miltiadis Vasilakis
    }
459 515cd8db Miltiadis Vasilakis
}
460 515cd8db Miltiadis Vasilakis
461 515cd8db Miltiadis Vasilakis
- (void)refreshInfo {
462 515cd8db Miltiadis Vasilakis
    @synchronized(self) {
463 515cd8db Miltiadis Vasilakis
        if (refreshMetadataContainerRequest == nil) {
464 919cb043 Miltiadis Vasilakis
            refreshMetadataContainerRequest = [[ASIPithosContainerRequest containerMetadataRequestWithPithos:pithos 
465 919cb043 Miltiadis Vasilakis
                                                                                               containerName:pithosContainer.name] retain];
466 515cd8db Miltiadis Vasilakis
            refreshMetadataContainerRequest.delegate = self;
467 5f54c6be Miltiadis Vasilakis
            refreshMetadataContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
468 5f54c6be Miltiadis Vasilakis
            refreshMetadataContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
469 5f54c6be Miltiadis Vasilakis
            refreshMetadataContainerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
470 5f54c6be Miltiadis Vasilakis
                                                        [NSNumber numberWithInteger:NSOperationQueuePriorityHigh], @"priority", 
471 5f54c6be Miltiadis Vasilakis
                                                        [NSNumber numberWithUnsignedInteger:10], @"retries", 
472 5f54c6be Miltiadis Vasilakis
                                                        NSStringFromSelector(@selector(containerMetadataRequestFinished:)), @"didFinishSelector", 
473 5f54c6be Miltiadis Vasilakis
                                                        NSStringFromSelector(@selector(containerMetadataRequestFailed:)), @"didFailSelector", 
474 5f54c6be Miltiadis Vasilakis
                                                        nil];
475 515cd8db Miltiadis Vasilakis
            refreshMetadataContainerRequest.downloadCache = [ASIDownloadCache sharedCache];
476 1b1e6fa1 Miltiadis Vasilakis
            [[PithosUtilities prepareRequest:refreshMetadataContainerRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
477 515cd8db Miltiadis Vasilakis
        }
478 515cd8db Miltiadis Vasilakis
    }
479 515cd8db Miltiadis Vasilakis
}
480 515cd8db Miltiadis Vasilakis
481 515cd8db Miltiadis Vasilakis
#pragma mark -
482 515cd8db Miltiadis Vasilakis
#pragma mark Actions
483 515cd8db Miltiadis Vasilakis
484 515cd8db Miltiadis Vasilakis
- (void)showPithosNodeInfo:(id)sender {
485 515cd8db Miltiadis Vasilakis
    if (!pithosNodeInfoController)
486 515cd8db Miltiadis Vasilakis
        pithosNodeInfoController = [[PithosContainerNodeInfoController alloc] initWithPithosNode:self];
487 515cd8db Miltiadis Vasilakis
    [pithosNodeInfoController showWindow:sender];
488 515cd8db Miltiadis Vasilakis
    [[pithosNodeInfoController window] makeKeyAndOrderFront:sender];
489 515cd8db Miltiadis Vasilakis
    [NSApp activateIgnoringOtherApps:YES];
490 515cd8db Miltiadis Vasilakis
}
491 515cd8db Miltiadis Vasilakis
492 d8d08dc1 Miltiadis Vasilakis
@end