Add directory exclusion support for a syncing container.
[pithos-macos] / pithos-macos / PithosNode.m
index bc1cc4e..2439f70 100644 (file)
 // or implied, of GRNET S.A.
 
 #import "PithosNode.h"
+#import "PithosNodeInfoController.h"
+#import "ASIDownloadCache.h"
+#import "ASIPithosRequest.h"
 
 @implementation PithosNode
-@dynamic url, children, displayName, icon, kind, size, modified, modifiedBy, version;
-@synthesize isLeafItem;
+@synthesize forcedRefresh, parent, shared, sharingAccount, displayName, isLeafItem, icon;
+@dynamic url, children, pithosContainer, pithosObject;
 
 #pragma mark -
 #pragma mark Object Lifecycle
 
 - (id)init {
-    if ((self == [super init])) {
-        childrenDirty = YES;
+    if ((self = [super init])) {
+        freshness = PithosNodeStateRefreshNeeded;
+        forcedRefresh = NO;
+        shared = NO;
         isLeafItem = NO;
     }
     return self;
 }
 
 - (void)dealloc {
+    [pithosNodeInfoController release];
+    [sharingAccount release];
     [icon release];
     [displayName release];
-    [previousChildren release];
+    [newChildren release];
     [children release];
     [url release];
     [super dealloc];
 }
 
 - (BOOL)isEqual:(id)anObject {
-    if ([anObject isKindOfClass:[self class]]) {
-        return [((PithosNode *)anObject).url isEqual:self.url];
-    }
-    return NO;
+    return ([anObject isKindOfClass:[self class]] && [((PithosNode *)anObject).url isEqual:self.url]);
 }
 
 - (NSUInteger)hash {
     return self.url.hash;
 }
 
+#pragma mark -
+#pragma mark Properties
+
+- (void)setShared:(BOOL)aShared {
+    if (shared != aShared) {
+        shared = aShared;
+        [url release];
+        url = nil;
+    }
+}
+
+- (void)setSharingAccount:(NSString *)aSharingAccount {
+    if (![sharingAccount isEqualToString:aSharingAccount]) {
+        [sharingAccount release];
+        sharingAccount = [aSharingAccount retain];
+        [url release];
+        url = nil;
+    }
+}
+
+#pragma mark -
+#pragma mark Actions
+
 - (void)invalidateChildren {
-    childrenDirty = YES;
+    if (freshness == PithosNodeStateFresh)
+        freshness = PithosNodeStateRefreshNeeded;
+}
+
+- (void)invalidateChildrenRecursive {    
+    if (freshness == PithosNodeStateFresh) {
+        for (PithosNode *child in children) {
+            [child invalidateChildrenRecursive];
+        }
+        freshness = PithosNodeStateRefreshNeeded;
+    }
+}
+
+- (void)refresh {
+    [self invalidateChildren];
+    self.children;
+}
+
+- (void)forceRefresh {
+    forcedRefresh = YES;
+    [self refresh];
+}
+
+- (void)showPithosNodeInfo:(id)sender {
+    // Abstract method
+}
+
+- (void)pithosNodeInfoWillClose:(id)sender {
+    if (pithosNodeInfoController) {
+        [pithosNodeInfoController release];
+        pithosNodeInfoController = nil;
+    }
+}
+
+- (void)pithosNodeWillBeRemoved {
+    if (pithosNodeInfoController) {
+        pithosNodeInfoController.node = nil;
+        [[pithosNodeInfoController window] close];
+    }
     for (PithosNode *child in children) {
-        [child invalidateChildren];
+        [child pithosNodeWillBeRemoved];
     }
 }
 
+#pragma mark -
+#pragma mark ASIHTTPRequestDelegate
+
+- (void)performRequestFinishedDelegateInBackground:(ASIPithosRequest *)request {
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
+        [self performSelector:NSSelectorFromString([request.userInfo objectForKey:@"didFinishSelector"]) withObject:request];
+    });
+}
+
+- (void)performRequestFailedDelegateInBackground:(ASIPithosRequest *)request {
+    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
+        [self performSelector:NSSelectorFromString([request.userInfo objectForKey:@"didFailSelector"]) withObject:request];
+    });
+}
+
 @end
\ No newline at end of file