Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosContainerNode.m @ 3916144e

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