Metadata in the object info window can be updated.
[pithos-macos] / pithos-macos / PithosObjectNode.m
index 42cda66..f0acf27 100644 (file)
 
 #import "PithosObjectNode.h"
 #import "ASIPithosRequest.h"
+#import "ASIPithosObjectRequest.h"
 #import "ASIPithosContainer.h"
 #import "ASIPithosObject.h"
+#import "ASIDownloadCache.h"
 #import "PithosNodeInfoController.h"
 
 @implementation PithosObjectNode
 
 - (id)initWithPithosContainer:(ASIPithosContainer *)aPithosContainer pithosObject:(ASIPithosObject *)aPithosObject {
     if ((self = [super init])) {
-        pithosContainer = [aPithosContainer retain];
-        pithosObject = [aPithosObject retain];
+        self.pithosContainer = aPithosContainer;
+        self.pithosObject = aPithosObject;
         isLeafItem = YES;
     }
     return self;
 }
 
 - (void)dealloc {
+    [refreshMetadataObjectRequest clearDelegatesAndCancel];
+    [refreshMetadataObjectRequest release];
+    [applyMetadataObjectRequest clearDelegatesAndCancel];
+    [applyMetadataObjectRequest release];
     [pithosObject release];
     [pithosContainer release];
     [super dealloc];
     return icon;
 }
 
+#pragma mark -
+#pragma mark Info
+
+- (void)applyInfo {
+    @synchronized(self) {
+        if (applyMetadataObjectRequest == nil) {
+            applyMetadataObjectRequest = [[ASIPithosObjectRequest updateObjectMetadataRequestWithContainerName:pithosContainer.name 
+                                                                                                    objectName:pithosObject.name 
+                                                                                               contentEncoding:nil
+                                                                                            contentDisposition:nil 
+                                                                                                      manifest:nil 
+                                                                                                       sharing:nil 
+                                                                                                      isPublic:ASIPithosObjectRequestPublicIgnore 
+                                                                                                      metadata:pithosObject.metadata
+                                                                                                        update:NO] retain];
+            applyMetadataObjectRequest.delegate = self;
+            [applyMetadataObjectRequest startAsynchronous];
+        }
+    }
+}
+
+- (void)refreshInfo {
+    @synchronized(self) {
+        if (refreshMetadataObjectRequest == nil) {
+            refreshMetadataObjectRequest = [[ASIPithosObjectRequest objectMetadataRequestWithContainerName:pithosContainer.name 
+                                                                                                objectName:pithosObject.name] retain];
+            refreshMetadataObjectRequest.delegate = self;
+            refreshMetadataObjectRequest.downloadCache = [ASIDownloadCache sharedCache];
+            [refreshMetadataObjectRequest startAsynchronous];
+        }
+    }
+}
+
+
+#pragma mark -
+#pragma mark ASIHTTPRequestDelegate
+
+- (void)requestFinished:(ASIHTTPRequest *)request {
+    NSLog(@"URL: %@", [request url]);
+    NSLog(@"cached: %d", [request didUseCachedResponse]);
+    
+    if ([request isEqualTo:applyMetadataObjectRequest]) {
+        @synchronized(self) {
+            [applyMetadataObjectRequest release];
+            applyMetadataObjectRequest = nil;
+        }
+        [self refreshInfo];
+    } else if ([request isEqualTo:refreshMetadataObjectRequest]) {
+        self.pithosObject = [refreshMetadataObjectRequest object];
+        @synchronized(self) {
+            [refreshMetadataObjectRequest release];
+            refreshMetadataObjectRequest = nil;
+        }
+    }
+}
+
+- (void)requestFailed:(ASIHTTPRequest *)request {
+    if ([request isEqualTo:applyMetadataObjectRequest]) {
+        // XXX do something on error, cleanup
+        NSLog(@"error:%@", [applyMetadataObjectRequest error]);
+        @synchronized(self) {
+            [applyMetadataObjectRequest release];
+            applyMetadataObjectRequest = nil;
+        }
+    } else if ([request isEqualTo:refreshMetadataObjectRequest]) {
+        // XXX do something on error, cleanup
+        NSLog(@"error:%@", [refreshMetadataObjectRequest error]);
+        @synchronized(self) {
+            [refreshMetadataObjectRequest release];
+            refreshMetadataObjectRequest = nil;
+        }
+    }
+}
+
 @end