// PithosAccount.h
// pithos-macos
//
-// Copyright 2012 GRNET S.A. All rights reserved.
+// Copyright 2012-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// PithosAccount.m
// pithos-macos
//
-// Copyright 2012 GRNET S.A. All rights reserved.
+// Copyright 2012-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
}
- (NSString *)stringByRemovingTrailingSlashes {
- NSString *stringWithRemovedTrailingSlashes = [self copy];
- while ([stringWithRemovedTrailingSlashes hasSuffix:@"/"]) {
- stringWithRemovedTrailingSlashes = [stringWithRemovedTrailingSlashes substringToIndex:(stringWithRemovedTrailingSlashes.length - 1)];
- }
- return stringWithRemovedTrailingSlashes;
+ return [self stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"/"]];
}
@end
- (PithosAccountNode *)accountNode {
if (!accountNode) {
- accountNode = [[PithosAccountNode alloc] initWithPithosAccountManager:self andPithos:self.pithos];
+ accountNode = [[PithosAccountNode alloc] initWithPithosAccountManager:self];
accountNode.childrenUpdatedNotificationName = nil;
accountNode.inheritChildrenUpdatedNotificationName = YES;
}
- (PithosSharingAccountsNode *)sharingAccountsNode {
if (!sharingAccountsNode) {
- sharingAccountsNode = [[PithosSharingAccountsNode alloc] initWithPithosAccountManager:self andPithos:self.pithos];
+ sharingAccountsNode = [[PithosSharingAccountsNode alloc] initWithPithosAccountManager:self];
sharingAccountsNode.childrenUpdatedNotificationName = nil;
sharingAccountsNode.inheritChildrenUpdatedNotificationName = YES;
}
manual:(BOOL)aManual
authToken:(NSString *)anAuthToken
authUser:(NSString *)anAuthUser
- ignoreSSLErrors:(BOOL)anIgnoreSSLErrors {
+ ignoreSSLErrors:(BOOL)anIgnoreSSLErrors
+ resetNodes:(BOOL)resetNodes {
+ BOOL pithosUpdated = (![authURLString isEqualToString:[anAuthURLString stringByRemovingTrailingSlashes]] ||
+ ![pithosObjectStoreURLString isEqualToString:[aPithosObjectStoreURLString stringByRemovingTrailingSlashes]] ||
+ ![astakosAccountURLString isEqualToString:[anAstakosAccountURLString stringByRemovingTrailingSlashes]] ||
+ ![authToken isEqualToString:anAuthToken] || ![authUser isEqualToString:anAuthUser] ||
+ (ignoreSSLErrors != anIgnoreSSLErrors));
self.authURLString = anAuthURLString;
self.pithosObjectStoreURLString = aPithosObjectStoreURLString;
self.astakosAccountURLString = anAstakosAccountURLString;
[self updateUserCatalogForDisplaynames:nil UUIDs:[NSArray arrayWithObject:authUser]];
self.active = YES;
- if (syncDaemon) {
- self.syncDaemon.pithos = self.pithos;
- if (self.syncActive)
- [self.syncDaemon startDaemon];
- }
- if (accountNode)
- self.accountNode.pithos = self.pithos;
- if (sharingAccountsNode)
- self.sharingAccountsNode.pithos = self.pithos;
- if (accountNode) {
- if (self.accountNode.children) {
+ if (pithosUpdated) {
+ if (syncDaemon) {
+ // For the sync daemon we keep using a separate pithos object.
+ self.syncDaemon.pithos = self.pithos;
+ if (self.syncActive)
+ [self.syncDaemon startDaemon];
+ }
+ if (resetNodes) {
+ [accountNode reset];
+ [accountNode refreshInfo];
+ [sharingAccountsNode reset];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"PithosAccountPithosChanged" object:self];
}
- [self.accountNode refreshInfo];
- }
- if (sharingAccountsNode && self.sharingAccountsNode.children) {
}
}
}
-- (void)updateSyncWithSyncActive:(BOOL)aSyncActive
+- (void)updateWithAuthURLString:(NSString *)anAuthURLString
+ pithosObjectStoreURLString:(NSString *)aPithosObjectStoreURLString
+ astakosAccountURLString:(NSString *)anAstakosAccountURLString
+ astakosWebloginURLString:(NSString *)anAstakosWebloginURLString
+ manual:(BOOL)aManual
+ authToken:(NSString *)anAuthToken
+ authUser:(NSString *)anAuthUser
+ ignoreSSLErrors:(BOOL)anIgnoreSSLErrors {
+ [self updateWithAuthURLString:anAuthURLString
+ pithosObjectStoreURLString:aPithosObjectStoreURLString
+ astakosAccountURLString:anAstakosAccountURLString
+ astakosWebloginURLString:anAstakosWebloginURLString
+ manual:aManual
+ authToken:anAuthToken
+ authUser:anAuthUser
+ ignoreSSLErrors:anIgnoreSSLErrors
+ resetNodes:YES];
+}
+
+- (void)updateSyncWithSyncActive:(BOOL)aSyncActive
syncDirectoryPath:(NSString *)aSyncDirectoryPath
syncAccountsDictionary:(NSMutableDictionary *)aSyncAccountsDictionary
syncSkipHidden:(BOOL)aSyncSkipHidden {
- (void)updateServicesFromServiceCatalogRequest:(ASIPithosRequest *)serviceCatalogRequest {
if (serviceCatalogRequest.responseStatusCode == 200) {
NSMutableDictionary *services = [self servicesFromServiceCatalogRequest:serviceCatalogRequest];
- self.pithosObjectStoreURLString = [services objectForKey:@"PithosObjectStoreURLString"];
- self.astakosAccountURLString = [services objectForKey:@"AstakosAccountURLString"];
- self.astakosWebloginURLString = [services objectForKey:@"AstakosWebloginURLString"];
- self.manual = NO;
-
+ NSString *newAuthToken = nil;
+ NSString *newAuthUser = nil;
if (authToken.length) {
NSDictionary *token = [serviceCatalogRequest token];
- self.authToken = [token objectForKey:@"id"];
- self.authUser = [[token objectForKey:@"tenant"] objectForKey:@"id"];
+ newAuthToken = [token objectForKey:@"id"];
+ newAuthUser = [[token objectForKey:@"tenant"] objectForKey:@"id"];
}
+ [self updateWithAuthURLString:authURLString
+ pithosObjectStoreURLString:[services objectForKey:@"PithosObjectStoreURLString"]
+ astakosAccountURLString:[services objectForKey:@"AstakosAccountURLString"]
+ astakosWebloginURLString:[services objectForKey:@"AstakosWebloginURLString"]
+ manual:NO
+ authToken:(newAuthToken ? newAuthToken : authToken)
+ authUser:(newAuthUser ? newAuthUser : authUser)
+ ignoreSSLErrors:ignoreSSLErrors
+ resetNodes:NO];
} else if (serviceCatalogRequest.responseStatusCode == 404) {
- self.pithosObjectStoreURLString = [[[NSURL URLWithString:authURLString] URLByAppendingPathComponent:@"v1"] description];
- self.astakosAccountURLString = [self.authURLString copy];
- self.astakosWebloginURLString = [self.authURLString copy];
- self.manual = YES;
+ [self updateWithAuthURLString:authURLString
+ pithosObjectStoreURLString:[[[NSURL URLWithString:authURLString] URLByAppendingPathComponent:@"v1"] description]
+ astakosAccountURLString:[authURLString copy]
+ astakosWebloginURLString:[authURLString copy]
+ manual:YES
+ authToken:authToken
+ authUser:authUser
+ ignoreSSLErrors:ignoreSSLErrors
+ resetNodes:NO];
}
}
self.astakosWebloginURLString = [decoder decodeObjectForKey:@"astakosWebloginURLString"];
self.manual = [decoder decodeBoolForKey:@"manual"];
+ self.ignoreSSLErrors = [decoder decodeBoolForKey:@"ignoreSSLErrors"];
+
// Support for older versions.
if (!authURLString && !pithosObjectStoreURLString && !astakosAccountURLString && !astakosWebloginURLString) {
NSString *tmpURLString = [decoder decodeObjectForKey:@"serverURL"];
[encoder encodeObject:authToken forKey:@"authToken"];
[encoder encodeObject:authUser forKey:@"authUser"];
[encoder encodeObject:userCatalog forKey:@"userCatalog"];
+
+ [encoder encodeBool:ignoreSSLErrors forKey:@"ignoreSSLErrors"];
}
@end
// PithosAccountNode.h
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// or implied, of GRNET S.A.
#import "PithosNode.h"
-@class ASIPithos;
@class ASIPithosAccountRequest;
@class ASIPithosAccount;
@interface PithosAccountNode : PithosNode {
- ASIPithos *pithos;
ASIPithosAccount *pithosAccount;
ASIPithosAccountRequest *accountRequest;
ASIPithosAccountRequest *applyMetadataAccountRequest;
ASIPithosAccountRequest *refreshMetadataAccountRequest;
-
- BOOL reset;
-
+
NSMutableDictionary *translatedGroups;
}
-@property(nonatomic, strong) ASIPithos *pithos;
@property(nonatomic, strong) ASIPithosAccount *pithosAccount;
@property(nonatomic, strong) ASIPithosAccountRequest *accountRequest;
@property(nonatomic, strong) ASIPithosAccountRequest *applyMetadataAccountRequest;
@property(nonatomic, strong) ASIPithosAccountRequest *refreshMetadataAccountRequest;
@property(nonatomic, strong) NSMutableDictionary *translatedGroups;
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager andPithos:(ASIPithos *)aPithos;
-
- (void)applyInfo;
- (void)refreshInfo;
+- (void)reset;
@end
\ No newline at end of file
// PithosAccountNode.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
static NSImage *sharedIcon = nil;
@implementation PithosAccountNode
-@synthesize pithos, pithosAccount, accountRequest, applyMetadataAccountRequest, refreshMetadataAccountRequest, translatedGroups;
+@synthesize pithosAccount, accountRequest, applyMetadataAccountRequest, refreshMetadataAccountRequest, translatedGroups;
+ (void)initialize {
if (self == [PithosAccountNode class])
#pragma mark -
#pragma mark Object Lifecycle
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager andPithos:(ASIPithos *)aPithos {
- if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
- pithos = aPithos;
- }
- return self;
-}
-
- (void)dealloc {
[accountRequest clearDelegatesAndCancel];
[refreshMetadataAccountRequest clearDelegatesAndCancel];
}
#pragma mark -
-#pragma mark Properties
+#pragma mark Actions
-- (void)setPithos:(ASIPithos *)aPithos {
- if (aPithos && ![aPithos isEqualTo:pithos]) {
- pithos = aPithos;
- url = nil;
- [accountRequest clearDelegatesAndCancel];
- self.accountRequest = nil;
- [refreshMetadataAccountRequest clearDelegatesAndCancel];
- self.refreshMetadataAccountRequest = nil;
- [applyMetadataAccountRequest clearDelegatesAndCancel];
- self.applyMetadataAccountRequest = nil;
- reset = YES;
- }
+- (void)reset {
+ [accountRequest clearDelegatesAndCancel];
+ self.accountRequest = nil;
+ [refreshMetadataAccountRequest clearDelegatesAndCancel];
+ self.refreshMetadataAccountRequest = nil;
+ [applyMetadataAccountRequest clearDelegatesAndCancel];
+ self.applyMetadataAccountRequest = nil;
+ children = nil;
+ newChildren = nil;
+ self.pithosAccount = nil;
+ freshness = PithosNodeStateRefreshNeeded;
+ forcedRefresh = YES;
+ [self postChildrenUpdatedNotificationName];
+ [self children];
}
+#pragma mark -
+#pragma mark Properties
+
- (void)setPithosAccount:(ASIPithosAccount *)aPithosAccount {
if (![pithosAccount isEqualTo:aPithosAccount]) {
pithosAccount = aPithosAccount;
}
- (NSString *)url {
- if (url == nil)
- url = [[NSString alloc] initWithFormat:@"%@%@",
- (sharingAccount ? [pithos storageURLWithAuthUser:sharingAccount] : pithos.storageURL),
- (shared ? @"?shared" : @"")];
- return url;
+ return [NSString stringWithFormat:@"@account@%@%@",
+ (sharingAccount ? sharingAccount : pithosAccountManager.pithos.authUser),
+ (shared ? @"?shared" : @"")];
}
- (NSArray *)children {
@synchronized(self) {
- if (reset) {
- [accountRequest clearDelegatesAndCancel];
- self.accountRequest = nil;
- [refreshMetadataAccountRequest clearDelegatesAndCancel];
- self.refreshMetadataAccountRequest = nil;
- [applyMetadataAccountRequest clearDelegatesAndCancel];
- self.applyMetadataAccountRequest = nil;
- children = nil;
- newChildren = nil;
- self.pithosAccount = nil;
- freshness = PithosNodeStateRefreshNeeded;
- forcedRefresh = YES;
- reset = NO;
- [self postChildrenUpdatedNotificationName];
- }
switch (freshness) {
case PithosNodeStateFresh:
break;
case PithosNodeStateRefreshNeeded:
freshness = PithosNodeStateRefreshing;
- self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
+ self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithosAccountManager.pithos
limit:0
marker:nil
shared:shared
until:nil];
if (sharingAccount)
- [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
else if (!forcedRefresh)
accountRequest.downloadCache = [ASIDownloadCache sharedCache];
accountRequest.delegate = self;
NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
for (ASIPithosContainer *container in containers) {
PithosContainerNode *node = [[PithosContainerNode alloc] initWithPithosAccountManager:pithosAccountManager
- andPithos:pithos
pithosContainer:container];
node.parent = self;
node.shared = shared;
[self postChildrenUpdatedNotificationName];
} else {
// Do an additional request to fetch more objects
- self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
+ self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithosAccountManager.pithos
limit:0
marker:[[someContainers lastObject] name]
shared:shared
until:nil];
if (sharingAccount)
- [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
else if (!forcedRefresh)
accountRequest.downloadCache = [ASIDownloadCache sharedCache];
accountRequest.delegate = self;
[groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
}
- self.applyMetadataAccountRequest = [ASIPithosAccountRequest updateAccountMetadataRequestWithPithos:pithos
+ self.applyMetadataAccountRequest = [ASIPithosAccountRequest updateAccountMetadataRequestWithPithos:pithosAccountManager.pithos
groups:groups
metadata:pithosAccount.metadata
update:NO];
- (void)refreshInfo {
@synchronized(self) {
if (refreshMetadataAccountRequest == nil) {
- self.refreshMetadataAccountRequest = [ASIPithosAccountRequest accountMetadataRequestWithPithos:pithos];
+ self.refreshMetadataAccountRequest = [ASIPithosAccountRequest accountMetadataRequestWithPithos:pithosAccountManager.pithos];
refreshMetadataAccountRequest.delegate = self;
refreshMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
refreshMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
// PithosBrowserController.h
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#import <Cocoa/Cocoa.h>
#import "PithosActivityFacility.h"
-@class ASIPithos;
@class PithosAccount;
@class PithosNode;
@class PithosAccountNode;
BOOL browserInitialized;
BOOL browserActive;
- ASIPithos *pithos;
-
- PithosAccount *__unsafe_unretained pithosAccountManager;
+ PithosAccount *pithosAccountManager;
PithosNode *rootNode;
PithosAccountNode *accountNode;
PithosEmptyNode *containersNode;
NSOperationQueue *downloadCallbackQueue;
}
-@property (nonatomic, strong) ASIPithos *pithos;
-
-@property (nonatomic, unsafe_unretained) PithosAccount *pithosAccountManager;
+@property (nonatomic, strong) PithosAccount *pithosAccountManager;
@property (nonatomic, strong) PithosAccountNode *accountNode;
@property (nonatomic, strong) NSArray *draggedNodes;
// PithosBrowserController.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#import "ASIPithosContainer.h"
#import "ASIPithosObject.h"
#import "PithosUtilities.h"
+#import "PithosAccount.h"
#import "UsingSizeTransformer.h"
#define REFRESH_TIMER_INTERVAL 5
@end
@implementation PithosBrowserController
-@synthesize pithos;
@synthesize pithosAccountManager, accountNode;
@synthesize draggedNodes, draggedParentNode;
@synthesize clipboardNodes, clipboardParentNode, clipboardCopy;
[activityProgressIndicator setMaxValue:1.0];
activityFacility = [PithosActivityFacility defaultPithosActivityFacility];
- self.accountNode = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager andPithos:pithos];
+ self.accountNode = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager];
containersNode = [[PithosEmptyNode alloc] initWithDisplayName:@"CONTAINERS" icon:nil];
containersNodeChildren = [[NSMutableArray alloc] init];
sharedNode = [[PithosEmptyNode alloc] initWithDisplayName:@"SHARED" icon:nil];
- mySharedNode = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager andPithos:pithos];
+ mySharedNode = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager];
mySharedNode.displayName = @"shared by me";
mySharedNode.shared = YES;
mySharedNode.icon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kUserIcon)];
- othersSharedNode = [[PithosSharingAccountsNode alloc] initWithPithosAccountManager:pithosAccountManager andPithos:pithos];
+ othersSharedNode = [[PithosSharingAccountsNode alloc] initWithPithosAccountManager:pithosAccountManager];
othersSharedNode.displayName = @"shared with me";
othersSharedNode.icon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGroupIcon)];
[uploadCallbackQueue setSuspended:NO];
[downloadCallbackQueue setSuspended:NO];
- accountNode.pithos = pithos;
accountNode.pithosAccountManager = pithosAccountManager;
- [accountNode forceRefresh];
- mySharedNode.pithos = pithos;
+ [accountNode reset];
mySharedNode.pithosAccountManager = pithosAccountManager;
- [mySharedNode forceRefresh];
- othersSharedNode.pithos = pithos;
+ [mySharedNode reset];
othersSharedNode.pithosAccountManager = pithosAccountManager;
- [othersSharedNode forceRefresh];
-
+ [othersSharedNode reset];
+
// [activityFacility reset];
activityFacility.delegate = self;
[self resetBrowser];
}
-- (void)setPithos:(ASIPithos *)aPithos {
- if (aPithos) {
- if (![aPithos.authUser isEqualToString:pithos.authUser] ||
- ![aPithos.authToken isEqualToString:pithos.authToken] ||
- (aPithos.ignoreSSLErrors != pithos.ignoreSSLErrors) ||
- ![aPithos.storageURLPrefix isEqual:pithos.storageURLPrefix] ||
- ![aPithos.publicURLPrefix isEqual:pithos.publicURLPrefix]) {
- [self resetBrowser];
- pithos = aPithos;
- [self startBrowser];
- } else {
- [self startBrowser];
- }
+- (void)setPithosAccountManager:(PithosAccount *)aPithosAccountManager {
+ if (aPithosAccountManager && (aPithosAccountManager != pithosAccountManager)) {
+ [self resetBrowser];
+ if (pithosAccountManager)
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:@"PithosAccountPithosChanged" object:pithosAccountManager];
+ pithosAccountManager = aPithosAccountManager;
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(pithosAccountManagerPithosChanged:)
+ name:@"PithosAccountPithosChanged"
+ object:pithosAccountManager];
+ [self startBrowser];
}
}
-
#pragma mark -
#pragma mark Observers
+-(void)pithosAccountManagerPithosChanged:(NSNotification *)notification {
+ if (![NSThread isMainThread]) {
+ [self performSelectorOnMainThread:@selector(pithosAccountManagerPithosChanged:) withObject:notification waitUntilDone:NO];
+ return;
+ }
+ [self resetBrowser];
+ [self startBrowser];
+}
+
- (void)pithosNodeChildrenUpdated:(NSNotification *)notification {
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(pithosNodeChildrenUpdated:) withObject:notification waitUntilDone:NO];
return;
}
PithosNode *node = (PithosNode *)[notification object];
- if ((node == accountNode) || ![node.pithos isEqualTo:pithos])
+ if ((node == accountNode) || (node.pithosAccountManager != pithosAccountManager))
return;
DLog(@"pithosNodeChildrenUpdated:%@", node.url);
NSInteger lastColumn = [browser lastColumn];
BOOL refreshAccountNode = NO;
if (!containerPithosFound) {
// Create pithos node
- ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithos
+ ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithosAccountManager.pithos
containerName:@"pithos"];
[PithosUtilities startAndWaitForRequest:containerRequest];
if ([containerRequest error]) {
}
if (!containerTrashFound) {
// Create trash node
- ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithos
+ ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithosAccountManager.pithos
containerName:@"trash"];
[PithosUtilities startAndWaitForRequest:containerRequest];
if ([containerRequest error]) {
destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
NSError *error = nil;
BOOL isDirectory;
- if ([PithosUtilities objectExistsAtPithos:pithos
+ if ([PithosUtilities objectExistsAtPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:destinationObjectName
error:&error
}
if (operation.isCancelled)
return;
- ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:node.pithosContainer.name
NSString *destinationObjectName = [[node.pithosObject.name stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];
NSError *error = nil;
BOOL isDirectory;
- if ([PithosUtilities objectExistsAtPithos:pithos
+ if ([PithosUtilities objectExistsAtPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:destinationObjectName
error:&error
return;
if (node.pithosObject.subdir)
destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
- NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithos
+ NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:node.pithosContainer.name
@autoreleasepool {
if (operation.isCancelled)
return;
- NSArray *objectRequests = [PithosUtilities objectDataRequestsForSubdirWithPithos:pithos
+ NSArray *objectRequests = [PithosUtilities objectDataRequestsForSubdirWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
toDirectory:dirPath
@autoreleasepool {
if (operation.isCancelled)
return;
- __block ASIPithosObjectRequest *objectRequest = [PithosUtilities objectDataRequestWithPithos:pithos
+ __block ASIPithosObjectRequest *objectRequest = [PithosUtilities objectDataRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
version:version
else
objectNamePrefix = [NSString string];
if ((destinationNode.pithosContainer.blockHash == nil) || (destinationNode.pithosContainer.blockSize == 0)) {
- ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest containerMetadataRequestWithPithos:pithos
+ ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest containerMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:containerName];
[PithosUtilities startAndWaitForRequest:containerRequest];
if ([containerRequest error]) {
NSArray *hashes = nil;
if (operation.isCancelled)
return;
- ASIPithosObjectRequest *objectRequest = [PithosUtilities writeObjectDataRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [PithosUtilities writeObjectDataRequestWithPithos:pithosAccountManager.pithos
containerName:containerName
objectName:objectName
contentType:contentType
NSMutableArray *filePaths = nil;
NSMutableArray *hashesArrays = nil;
NSMutableArray *directoryObjectRequests = nil;
- NSArray *objectRequests = [PithosUtilities writeObjectDataRequestsWithPithos:pithos
+ NSArray *objectRequests = [PithosUtilities writeObjectDataRequestsWithPithos:pithosAccountManager.pithos
containerName:containerName
objectName:objectName
blockSize:blockSize
NSString *destinationObjectName = [objectNamePrefix stringByAppendingPathComponent:node.displayName];
if ([node.pithosObject.name hasSuffix:@"/"])
destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
- ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:containerName
NSString *destinationObjectName = [objectNamePrefix stringByAppendingPathComponent:node.displayName];
if (node.pithosObject.subdir)
destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
- NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithos
+ NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:containerName
if ([node.pithosObject.name hasSuffix:@"/"])
destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
} else {
- destinationObjectName = [PithosUtilities safeObjectNameForPithos:pithos
+ destinationObjectName = [PithosUtilities safeObjectNameForPithos:pithosAccountManager.pithos
containerName:containerName
objectName:node.pithosObject.name];
}
if (operation.isCancelled)
return;
- ASIPithosObjectRequest *objectRequest = [PithosUtilities cpyObjectRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [PithosUtilities cpyObjectRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:containerName
if (node.pithosObject.subdir)
destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
} else {
- destinationObjectName = [PithosUtilities safeSubdirNameForPithos:pithos
+ destinationObjectName = [PithosUtilities safeSubdirNameForPithos:pithosAccountManager.pithos
containerName:containerName
subdirName:node.pithosObject.name];
}
if (operation.isCancelled)
return;
- NSArray *objectRequests = [PithosUtilities cpyObjectRequestsForSubdirWithPithos:pithos
+ NSArray *objectRequests = [PithosUtilities cpyObjectRequestsForSubdirWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:containerName
currentBytes:currentBytes];
});
NSUInteger missingBlockIndex = [missingBlocks firstIndex];
- __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithPithos:pithos
+ __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithPithos:pithosAccountManager.pithos
containerName:[objectRequest.userInfo objectForKey:@"containerName"]
blockSize:blockSize
forFile:[objectRequest.userInfo objectForKey:@"filePath"]
missingBlockIndex = [missingBlocks indexGreaterThanIndex:missingBlockIndex];
if (missingBlockIndex == NSNotFound) {
NSArray *hashes = [containerRequest.userInfo objectForKey:@"hashes"];
- ASIPithosObjectRequest *newObjectRequest = [PithosUtilities writeObjectDataRequestWithPithos:pithos
+ ASIPithosObjectRequest *newObjectRequest = [PithosUtilities writeObjectDataRequestWithPithos:pithosAccountManager.pithos
containerName:[containerRequest.userInfo objectForKey:@"containerName"]
objectName:[containerRequest.userInfo objectForKey:@"objectName"]
contentType:[containerRequest.userInfo objectForKey:@"contentType"]
[(NSMutableDictionary *)(newObjectRequest.userInfo) setObject:NSStringFromSelector(@selector(uploadObjectUsingHashMapFinished:)) forKey:@"didFinishSelector"];
[uploadNetworkQueue addOperation:[PithosUtilities prepareRequest:newObjectRequest priority:[[newObjectRequest.userInfo objectForKey:@"priority"] integerValue]]];
} else {
- __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithPithos:pithos
+ __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithPithos:pithosAccountManager.pithos
containerName:[containerRequest.userInfo objectForKey:@"containerName"]
blockSize:[[containerRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue]
forFile:[containerRequest.userInfo objectForKey:@"filePath"]
@autoreleasepool {
if (operation.isCancelled)
return;
- NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithos
+ NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
subdirName:@"untitled folder"];
NSString *fileName = [safeObjectName lastPathComponent];
if (operation.isCancelled)
return;
- ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:safeObjectName
eTag:nil
@autoreleasepool {
if (operation.isCancelled)
return;
- NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithos
+ NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
subdirName:[node.pithosObject.name stringByAppendingPathComponent:@"untitled folder"]];
NSString *fileName = [safeObjectName lastPathComponent];
if (operation.isCancelled)
return;
- ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:safeObjectName
eTag:nil
NSString *fileName = [node.pithosObject.name lastPathComponent];
if ([node.pithosObject.name hasSuffix:@"/"])
fileName = [fileName stringByAppendingString:@"/"];
- ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest deleteObjectRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest deleteObjectRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name];
if (operation.isCancelled)
@autoreleasepool {
if (operation.isCancelled)
return;
- NSArray *objectRequests = [PithosUtilities deleteObjectRequestsForSubdirWithPithos:pithos
+ NSArray *objectRequests = [PithosUtilities deleteObjectRequestsForSubdirWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name];
if (!operation.isCancelled && objectRequests) {
@autoreleasepool {
if (operation.isCancelled)
return;
- NSString *safeObjectName = [PithosUtilities safeObjectNameForPithos:pithos
+ NSString *safeObjectName = [PithosUtilities safeObjectNameForPithos:pithosAccountManager.pithos
containerName:@"trash"
objectName:node.pithosObject.name];
if (!operation.isCancelled && safeObjectName) {
- ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithos
+ ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:@"trash"
@autoreleasepool {
if (operation.isCancelled)
return;
- NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithos
+ NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithosAccountManager.pithos
containerName:@"trash"
subdirName:node.pithosObject.name];
if (!operation.isCancelled && safeObjectName) {
- NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithos
+ NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithosAccountManager.pithos
containerName:node.pithosContainer.name
objectName:node.pithosObject.name
destinationContainerName:@"trash"
// PithosContainerNode.h
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// or implied, of GRNET S.A.
#import "PithosNode.h"
-@class ASIPithos;
@class ASIPithosContainer;
@class ASIPithosContainerRequest;
@interface PithosContainerNode : PithosNode {
- ASIPithos *pithos;
ASIPithosContainer *pithosContainer;
ASIPithosContainerRequest *containerRequest;
NSNumber *policyQuota;
}
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos pithosContainer:(ASIPithosContainer *)aPithosContainer;
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos pithosContainer:(ASIPithosContainer *)aPithosContainer icon:(NSImage *)anIcon;
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos containerName:(NSString *)aContainerName;
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos containerName:(NSString *)aContainerName icon:(NSImage *)anIcon;
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager pithosContainer:(ASIPithosContainer *)aPithosContainer;
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager pithosContainer:(ASIPithosContainer *)aPithosContainer icon:(NSImage *)anIcon;
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager containerName:(NSString *)aContainerName;
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager containerName:(NSString *)aContainerName icon:(NSImage *)anIcon;
-@property(nonatomic, strong) ASIPithos *pithos;
@property(nonatomic, strong) ASIPithosContainer *pithosContainer;
@property(nonatomic, strong) ASIPithosContainerRequest *containerRequest;
@property(nonatomic, strong) NSString *prefix;
// PithosContainerNode.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#import "ASIPithosObject.h"
#import "ASIDownloadCache.h"
#import "PithosUtilities.h"
+#import "PithosAccount.h"
#import "PithosContainerNodeInfoController.h"
#import "PithosActivityFacility.h"
static NSImage *sharedIcon = nil;
@implementation PithosContainerNode
-@synthesize pithos, pithosContainer, containerRequest, prefix, applyMetadataContainerRequest, refreshMetadataContainerRequest;
+@synthesize pithosContainer, containerRequest, prefix, applyMetadataContainerRequest, refreshMetadataContainerRequest;
@synthesize policyVersioning, policyQuota;
+ (void)initialize {
#pragma mark -
#pragma mark Object Lifecycle
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos pithosContainer:(ASIPithosContainer *)aPithosContainer icon:(NSImage *)anIcon {
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager pithosContainer:(ASIPithosContainer *)aPithosContainer icon:(NSImage *)anIcon {
if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
- pithos = aPithos;
self.pithosContainer = aPithosContainer;
self.icon = anIcon;
}
return self;
}
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos pithosContainer:(ASIPithosContainer *)aPithosContainer {
- return [self initWithPithosAccountManager:aPithosAccountManager andPithos:aPithos pithosContainer:aPithosContainer icon:nil];
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager pithosContainer:(ASIPithosContainer *)aPithosContainer {
+ return [self initWithPithosAccountManager:aPithosAccountManager pithosContainer:aPithosContainer icon:nil];
}
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos containerName:(NSString *)aContainerName icon:(NSImage *)anIcon {
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager containerName:(NSString *)aContainerName icon:(NSImage *)anIcon {
ASIPithosContainer *container = [ASIPithosContainer container];
container.name = aContainerName;
- return [self initWithPithosAccountManager:aPithosAccountManager andPithos:aPithos pithosContainer:container icon:anIcon];
+ return [self initWithPithosAccountManager:aPithosAccountManager pithosContainer:container icon:anIcon];
}
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos containerName:(NSString *)aContainerName {
- return [self initWithPithosAccountManager:aPithosAccountManager andPithos:aPithos containerName:aContainerName icon:nil];
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager containerName:(NSString *)aContainerName {
+ return [self initWithPithosAccountManager:aPithosAccountManager containerName:aContainerName icon:nil];
}
- (void)dealloc {
#pragma mark -
#pragma mark Properties
-- (void)setPithos:(ASIPithos *)aPithos {
- if (aPithos && ![aPithos isEqualTo:pithos]) {
- pithos = aPithos;
- url = nil;
- }
-}
-
- (NSString *)url {
- if (url == nil)
- url = [[NSString alloc] initWithFormat:@"%@/%@%@",
- (sharingAccount ? [pithos storageURLWithAuthUser:sharingAccount] : pithos.storageURL),
- pithosContainer.name,
- (shared ? @"?shared" : @"")];
- return url;
+ return [NSString stringWithFormat:@"@container@%@/%@%@",
+ (sharingAccount ? sharingAccount : pithosAccountManager.pithos.authUser),
+ pithosContainer.name,
+ (shared ? @"?shared" : @"")];
}
- (NSArray *)children {
break;
case PithosNodeStateRefreshNeeded:
freshness = PithosNodeStateRefreshing;
- self.containerRequest = [ASIPithosContainerRequest listObjectsRequestWithPithos:pithos
+ self.containerRequest = [ASIPithosContainerRequest listObjectsRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
limit:0
marker:nil
shared:shared
until:nil];
if (sharingAccount)
- [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
else if (!forcedRefresh)
containerRequest.downloadCache = [ASIDownloadCache sharedCache];
containerRequest.delegate = self;
if ((sameNameObjectIndex == NSNotFound) ||
![PithosUtilities isContentTypeDirectory:[[objects objectAtIndex:sameNameObjectIndex] contentType]]) {
PithosSubdirNode *node = [[PithosSubdirNode alloc] initWithPithosAccountManager:pithosAccountManager
- andPithos:pithos
pithosContainer:pithosContainer
pithosObject:object];
node.parent = self;
}
} else if ([PithosUtilities isContentTypeDirectory:object.contentType]) {
PithosSubdirNode *node = [[PithosSubdirNode alloc] initWithPithosAccountManager:pithosAccountManager
- andPithos:pithos
pithosContainer:pithosContainer
pithosObject:object];
node.parent = self;
[newChildren addObject:node];
} else {
PithosObjectNode *node = [[PithosObjectNode alloc] initWithPithosAccountManager:pithosAccountManager
- andPithos:pithos
pithosContainer:pithosContainer
pithosObject:object];
node.parent = self;
[self postChildrenUpdatedNotificationName];
} else {
// Do an additional request to fetch more objects
- self.containerRequest = [ASIPithosContainerRequest listObjectsRequestWithPithos:pithos
+ self.containerRequest = [ASIPithosContainerRequest listObjectsRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
limit:0
marker:[[someObjects lastObject] name]
shared:shared
until:nil];
if (sharingAccount)
- [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
else if (!forcedRefresh)
containerRequest.downloadCache = [ASIDownloadCache sharedCache];
containerRequest.delegate = self;
@synchronized(self) {
if (applyMetadataContainerRequest == nil) {
[[pithosNodeInfoController window] makeFirstResponder:nil];
- self.applyMetadataContainerRequest = [ASIPithosContainerRequest updateContainerMetadataRequestWithPithos:pithos
+ self.applyMetadataContainerRequest = [ASIPithosContainerRequest updateContainerMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
policy:[NSDictionary dictionaryWithObjectsAndKeys:
policyVersioning, @"versioning",
- (void)refreshInfo {
@synchronized(self) {
if (refreshMetadataContainerRequest == nil) {
- self.refreshMetadataContainerRequest = [ASIPithosContainerRequest containerMetadataRequestWithPithos:pithos
+ self.refreshMetadataContainerRequest = [ASIPithosContainerRequest containerMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name];
refreshMetadataContainerRequest.delegate = self;
refreshMetadataContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
// PithosNode.m
// pithos-macos
//
-// Copyright 2011 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
}
#pragma mark -
-#pragma mark Properties
-
-- (void)setShared:(BOOL)aShared {
- if (shared != aShared) {
- shared = aShared;
- url = nil;
- }
-}
-
-- (void)setSharingAccount:(NSString *)aSharingAccount {
- if (![sharingAccount isEqualToString:aSharingAccount]) {
- sharingAccount = aSharingAccount;
- url = nil;
- }
-}
-
-#pragma mark -
#pragma mark Actions
- (void)invalidateChildren {
// PithosObjectNode.h
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// or implied, of GRNET S.A.
#import "PithosNode.h"
-@class ASIPithos;
@class ASIPithosContainer;
@class ASIPithosObject;
@class ASIPithosObjectRequest;
@interface PithosObjectNode : PithosNode {
- ASIPithos *pithos;
ASIPithosContainer *pithosContainer;
ASIPithosObject *pithosObject;
NSArray *versions;
}
- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos
pithosContainer:(ASIPithosContainer *)aPithosContainer
pithosObject:(ASIPithosObject *)aPithosObject;
-@property (nonatomic, strong) ASIPithos *pithos;
@property (nonatomic, strong) ASIPithosContainer *pithosContainer;
@property (nonatomic, strong) ASIPithosObject *pithosObject;
@property (nonatomic, strong) NSArray *versions;
// PithosObjectNode.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#import "PithosObjectNodeInfoController.h"
@implementation PithosObjectNode
-@synthesize pithos, pithosContainer, pithosObject, versions, applyMetadataObjectRequest, refreshMetadataObjectRequest, refreshVersionsObjectRequest;
+@synthesize pithosContainer, pithosObject, versions, applyMetadataObjectRequest, refreshMetadataObjectRequest, refreshVersionsObjectRequest;
@synthesize isPublic, translatedModifiedBy, translatedPermissions;
#pragma mark -
#pragma mark Object Lifecycle
- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos
pithosContainer:(ASIPithosContainer *)aPithosContainer
pithosObject:(ASIPithosObject *)aPithosObject {
if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
- pithos = aPithos;
isLeafItem = YES;
self.pithosContainer = aPithosContainer;
self.pithosObject = aPithosObject;
#pragma mark -
#pragma mark Properties
-- (void)setPithos:(ASIPithos *)aPithos {
- if (aPithos && ![aPithos isEqualTo:pithos]) {
- pithos = aPithos;
- url = nil;
- }
-}
-
- (NSString *)url {
- if (url == nil)
- url = [[NSString alloc] initWithFormat:@"object %@/%@/%@%@",
- (sharingAccount ? [pithos storageURLWithAuthUser:sharingAccount] : pithos.storageURL),
- pithosContainer.name,
- pithosObject.name,
- (shared ? @"?shared" : @"")];
- return url;
+ return [NSString stringWithFormat:@"@object@%@/%@/%@%@",
+ (sharingAccount ? sharingAccount : pithosAccountManager.pithos.authUser),
+ pithosContainer.name,
+ pithosObject.name,
+ (shared ? @"?shared" : @"")];
}
- (NSArray *)children {
if (applyMetadataObjectRequest == nil) {
[[pithosNodeInfoController window] makeFirstResponder:nil];
if (sharingAccount) {
- self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithos
+ self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:pithosObject.name
contentEncoding:nil
isPublic:(isPublic ? ASIPithosObjectRequestPublicTrue : ASIPithosObjectRequestPublicFalse)
metadata:pithosObject.metadata
update:NO];
- [applyMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [applyMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
} else {
NSMutableArray *permissions = [NSMutableArray array];
if (translatedPermissions.count) {
}
pithosObject.permissions = permissions;
- self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithos
+ self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:pithosObject.name
contentEncoding:pithosObject.contentEncoding
- (void)refreshInfo {
@synchronized(self) {
if (refreshMetadataObjectRequest == nil) {
- self.refreshMetadataObjectRequest = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithos
+ self.refreshMetadataObjectRequest = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:pithosObject.name];
if (sharingAccount)
- [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
refreshMetadataObjectRequest.delegate = self;
refreshMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
refreshMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
- (void)refreshVersions {
@synchronized(self) {
if (refreshVersionsObjectRequest == nil) {
- self.refreshVersionsObjectRequest = [ASIPithosObjectRequest objectVersionsRequestWithPithos:pithos
+ self.refreshVersionsObjectRequest = [ASIPithosObjectRequest objectVersionsRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:pithosObject.name];
if (sharingAccount)
- [refreshVersionsObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [refreshVersionsObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
refreshVersionsObjectRequest.delegate = self;
refreshVersionsObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
refreshVersionsObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
// PithosPreferencesController.h
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
// PithosPreferencesController.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
return;
} else {
[tmpPithosAccount updateServicesFromServiceCatalogRequest:serviceCatalogRequest];
+ self.authURLString = tmpPithosAccount.authURLString;
self.manual = tmpPithosAccount.manual;
self.pithosObjectStoreURLString = tmpPithosAccount.pithosObjectStoreURLString;
self.astakosAccountURLString = tmpPithosAccount.astakosAccountURLString;
return;
} else {
[tmpPithosAccount updateServicesFromServiceCatalogRequest:serviceCatalogRequest];
+ self.authURLString = tmpPithosAccount.authURLString;
self.manual = tmpPithosAccount.manual;
self.pithosObjectStoreURLString = tmpPithosAccount.pithosObjectStoreURLString;
self.astakosAccountURLString = tmpPithosAccount.astakosAccountURLString;
authToken:authToken
authUser:authUser
ignoreSSLErrors:ignoreSSLErrors];
+ self.pithosObjectStoreURLString = selectedPithosAccount.pithosObjectStoreURLString;
+ self.astakosAccountURLString = selectedPithosAccount.astakosAccountURLString;
+ self.astakosWebloginURLString = selectedPithosAccount.astakosWebloginURLString;
self.displayname = [selectedPithosAccount displaynameForUUID:authUser safe:NO];
[self updateAuthorization];
}
[delegate showPithosBrowser:self];
}
if ([selectedPithosAccount isEqualTo:delegate.currentPithosAccount])
- delegate.pithosBrowserController.pithos = selectedPithosAccount.pithos;
+ delegate.pithosBrowserController.pithosAccountManager = selectedPithosAccount;
}
- (IBAction)authorizationCancel:(id)server {
// PithosSharingAccountsNode.h
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#import "PithosNode.h"
@class ASIPithosRequest;
-@class ASIPithos;
@interface PithosSharingAccountsNode : PithosNode {
- ASIPithos *pithos;
-
ASIPithosRequest *sharingAccountsRequest;
-
- BOOL reset;
}
-@property(nonatomic, strong) ASIPithos *pithos;
@property(nonatomic, strong) ASIPithosRequest *sharingAccountsRequest;
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager andPithos:(ASIPithos *)aPithos;
+- (void)reset;
@end
\ No newline at end of file
// PithosAccountNode.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#import "PithosActivityFacility.h"
@implementation PithosSharingAccountsNode
-@synthesize pithos, sharingAccountsRequest;
+@synthesize sharingAccountsRequest;
#pragma mark -
#pragma mark Object Lifecycle
-- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager andPithos:(ASIPithos *)aPithos {
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager {
if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
- pithos = aPithos;
self.sharingAccount = @"";
}
return self;
}
#pragma mark -
-#pragma mark Properties
+#pragma mark Actions
-- (void)setPithos:(ASIPithos *)aPithos {
- if (aPithos && ![aPithos isEqualTo:pithos]) {
- pithos = aPithos;
- url = nil;
- [sharingAccountsRequest clearDelegatesAndCancel];
- self.sharingAccountsRequest = nil;
- reset = YES;
- }
+- (void)reset {
+ [sharingAccountsRequest clearDelegatesAndCancel];
+ self.sharingAccountsRequest = nil;
+ children = nil;
+ newChildren = nil;
+ freshness = PithosNodeStateRefreshNeeded;
+ forcedRefresh = YES;
+ [self postChildrenUpdatedNotificationName];
+ [self children];
}
+#pragma mark -
+#pragma mark Properties
+
- (NSString *)url {
- if (url == nil)
- url = [[pithos.storageURLPrefix description] copy];
- return url;
+ return @"@sharing accounts@";
}
- (NSArray *)children {
@synchronized(self) {
- if (reset) {
- [sharingAccountsRequest clearDelegatesAndCancel];
- self.sharingAccountsRequest = nil;
- children = nil;
- newChildren = nil;
- freshness = PithosNodeStateRefreshNeeded;
- forcedRefresh = YES;
- reset = NO;
- [self postChildrenUpdatedNotificationName];
- }
switch (freshness) {
case PithosNodeStateFresh:
break;
case PithosNodeStateRefreshNeeded:
freshness = PithosNodeStateRefreshing;
- self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithos limit:0 marker:nil];
+ self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithosAccountManager.pithos limit:0 marker:nil];
sharingAccountsRequest.delegate = self;
sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
newChildren = [[NSMutableArray alloc] init];
NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
for (ASIPithosAccount *account in sharingAccounts) {
- if (![account.name isEqualToString:pithos.authUser]) {
- PithosAccountNode *node = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager
- andPithos:pithos];
+ if (![account.name isEqualToString:pithosAccountManager.pithos.authUser]) {
+ PithosAccountNode *node = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager];
node.parent = self;
node.shared = shared;
node.sharingAccount = account.name;
[self postChildrenUpdatedNotificationName];
} else {
// Do an additional request to fetch more objects
- self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithos
+ self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithosAccountManager.pithos
limit:0
marker:[[someSharingAccounts lastObject] name]];
sharingAccountsRequest.delegate = self;
// PithosSubdirNode.h
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
}
- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos
pithosContainer:(ASIPithosContainer *)aPithosContainer
pithosObject:(ASIPithosObject *)aPithosObject;
// PithosSubdirNode.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#pragma mark Object Lifecycle
- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager
- andPithos:(ASIPithos *)aPithos
pithosContainer:(ASIPithosContainer *)aPithosContainer
pithosObject:(ASIPithosObject *)aPithosObject {
if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
- pithos = aPithos;
refreshParent = NO;
self.pithosContainer = aPithosContainer;
self.pithosObject = aPithosObject;
#pragma mark -
#pragma mark Properties
-- (void)setPithos:(ASIPithos *)aPithos {
- if (aPithos && ![aPithos isEqualTo:pithos]) {
- pithos = aPithos;
- url = nil;
- }
-}
- (NSString *)url {
- if (url == nil)
- url = [[NSString alloc] initWithFormat:@"subdir %@/%@/%@%@",
- (sharingAccount ? [pithos storageURLWithAuthUser:sharingAccount] : pithos.storageURL),
- pithosContainer.name,
- prefix,
- (shared ? @"?shared" : @"")];
- return url;
+ return [NSString stringWithFormat:@"@subdir@%@/%@/%@%@",
+ (sharingAccount ? sharingAccount : pithosAccountManager.pithos.authUser),
+ pithosContainer.name,
+ prefix,
+ (shared ? @"?shared" : @"")];
}
- (NSString *)displayName {
if (pithosObject.subdir) {
BOOL createObject = NO;
NSAlert *alert;
- ASIPithosObjectRequest *request = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithos
+ ASIPithosObjectRequest *request = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:prefix];
[PithosUtilities startAndWaitForRequest:request];
[alert addButtonWithTitle:@"Cancel"];
NSInteger choice = [alert runModal];
if (choice == NSAlertFirstButtonReturn) {
- request = [ASIPithosObjectRequest deleteObjectRequestWithPithos:pithos
+ request = [ASIPithosObjectRequest deleteObjectRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:prefix];
[PithosUtilities startAndWaitForRequest:request];
}
pithosObject.permissions = permissions;
- self.applyMetadataObjectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithos
+ self.applyMetadataObjectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:prefix
eTag:nil
} else {
[[pithosNodeInfoController window] makeFirstResponder:nil];
if (sharingAccount) {
- self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithos
+ self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:pithosObject.name
contentEncoding:nil
isPublic:(isPublic ? ASIPithosObjectRequestPublicTrue : ASIPithosObjectRequestPublicFalse)
metadata:pithosObject.metadata
update:NO];
- [applyMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [applyMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
} else {
NSMutableArray *permissions = [NSMutableArray array];
if (translatedPermissions.count) {
}
pithosObject.permissions = permissions;
- self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithos
+ self.applyMetadataObjectRequest = [ASIPithosObjectRequest updateObjectMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:pithosObject.name
contentEncoding:pithosObject.contentEncoding
self.pithosObject = [ASIPithosObject subdirWithName:pithosObject.name];
return;
} else if (refreshMetadataObjectRequest == nil) {
- self.refreshMetadataObjectRequest = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithos
+ self.refreshMetadataObjectRequest = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:prefix];
if (sharingAccount)
- [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [refreshMetadataObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
refreshMetadataObjectRequest.delegate = self;
refreshMetadataObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
refreshMetadataObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
if (pithosObject.subdir) {
return;
} else if (refreshVersionsObjectRequest == nil) {
- self.refreshVersionsObjectRequest = [ASIPithosObjectRequest objectVersionsRequestWithPithos:pithos
+ self.refreshVersionsObjectRequest = [ASIPithosObjectRequest objectVersionsRequestWithPithos:pithosAccountManager.pithos
containerName:pithosContainer.name
objectName:pithosObject.name];
if (sharingAccount)
- [refreshVersionsObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ [refreshVersionsObjectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithosAccountManager.pithos];
refreshVersionsObjectRequest.delegate = self;
refreshVersionsObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
refreshVersionsObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
// pithos_macosAppDelegate.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
}
if (!currentPithosAccount)
self.currentPithosAccount = [pithosAccounts objectAtIndex:0];
- self.pithosBrowserController.pithosAccountManager = currentPithosAccount;
-
+
if (currentPithosAccount.active) {
[self savePithosAccounts:self];
[self showPithosBrowser:self];
- self.pithosBrowserController.pithos = currentPithosAccount.pithos;
+ self.pithosBrowserController.pithosAccountManager = currentPithosAccount;
} else {
// XXX maybe call specifically to go to new account tab
[self showPithosPreferences:self];
if (pithosAccount.active) {
self.currentPithosAccount = pithosAccount;
self.pithosBrowserController.pithosAccountManager = currentPithosAccount;
- self.pithosBrowserController.pithos = currentPithosAccount.pithos;
break;
}
}
return;
}
self.currentPithosAccount = pithosAccount;
- self.pithosBrowserController.pithosAccountManager = currentPithosAccount;
[self showPithosBrowser:self];
- self.pithosBrowserController.pithos = currentPithosAccount.pithos;
+ self.pithosBrowserController.pithosAccountManager = currentPithosAccount;
}
}