Statistics
| Branch: | Tag: | Revision:

root / pithos-macos / PithosContainerNode.m @ 46b46b83

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