From e82f3b210e0e49fb9d9531565f634ed9d49426a5 Mon Sep 17 00:00:00 2001 From: Claudio Bisegni Date: Sun, 18 Oct 2009 20:39:21 +0200 Subject: [PATCH] OpenAFS Preference Pane 64bit and Symbolic Link features implemented. Now the OpenAFS preference pane is compiled with 32 and 64 bit snowleopard support, so the preference windows is no more restarted in 32 bit mode. The tab for symbolic link creation has been implemented. Now the user can create and delete link. For create a link both name and destination path must be set. AFSBackgrounder has been updated to manager in a separate thread the link creation and destroy operation, according to the vaule of checkbox "Enable Symbolic Link" in "Mounts" tab. Reviewed-on: http://gerrit.openafs.org/677 Tested-by: Derrick Brashear Reviewed-by: Derrick Brashear --- .../AFSBackgrounder/AFSBackgrounderDelegate.h | 6 +- .../AFSBackgrounder/AFSBackgrounderDelegate.m | 231 ++++++++++++++------- .../AFSPreference/AFSBackgrounder/AFSMenuExtra.m | 4 + .../AFSBackgrounder/AFSMenuExtraView.m | 7 +- .../DARWIN/AFSPreference/AFSCommanderPref.h | 24 ++- .../DARWIN/AFSPreference/AFSCommanderPref.m | 176 ++++++++++++++-- .../English.lproj/OpenAFSPreference.xib | 131 ++++++------ src/platform/DARWIN/AFSPreference/Info.plist | 2 +- .../DARWIN/AFSPreference/LynkCreationController.m | 30 ++- .../OpenAFS.xcodeproj/project.pbxproj | 27 ++- src/platform/DARWIN/AFSPreference/global.h | 2 + 11 files changed, 449 insertions(+), 191 deletions(-) diff --git a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.h b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.h index ef5707e..31239f2 100644 --- a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.h +++ b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.h @@ -37,7 +37,9 @@ //NSTimer for tokens refresh NSTimer *timerForCheckTokensList; NSLock *tokensLock; - + bool currentLinkActivationStatus; + NSMutableDictionary *linkConfiguration; + NSLock *linkCreationLock; } - (void)startTimer; - (void)stopTimer; @@ -54,7 +56,7 @@ - (void)menuNeedsUpdate:(NSMenu *)menu; - (void)repairHelperTool; - (void) afsVolumeMountChange:(NSNotification *)notification; - +- (void) updateLinkModeStatusWithpreferenceStatus:(BOOL)status; -(NSStatusItem*)statusItem; -(void) setStatusItem:(BOOL)show; -(NSImage*)imageToRender; diff --git a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.m b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.m index e108254..d5d3170 100644 --- a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.m +++ b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSBackgrounderDelegate.m @@ -20,11 +20,18 @@ #include #include #include +#import + +#define LINK_ICON 'srvr' @implementation AFSBackgrounderDelegate #pragma mark NSApp Delegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - afsMngr = [[AFSPropertyManager alloc] initWithAfsPath:afsSysPath]; + + linkCreationLock = [[NSLock alloc] init]; + + afsMngr = [[AFSPropertyManager alloc] initWithAfsPath:PREFERENCE_AFS_SYS_PAT_STATIC]; + // allocate the lock for concurent afs check state tokensLock = [[NSLock alloc] init]; @@ -41,8 +48,12 @@ noTokenImage = [self getImageFromBundle:@"noToken" fileExt:@"png"]; - //get the sazi of the menu icon + //get the size of the menu icon menuSize = [hasTokenImage size]; + + //inizialize the local link mode status + currentLinkActivationStatus = NO; + //Start to read the afs path [self readPreferenceFile:nil]; [self startTimer]; @@ -50,24 +61,27 @@ // Register for preference user change - [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(readPreferenceFile:) + [[NSDistributedNotificationCenter defaultCenter] addObserver:self + selector:@selector(readPreferenceFile:) name:kAFSMenuExtraID object:kPrefChangeNotification]; // Register for afs state change - [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(afsVolumeMountChange:) + [[NSDistributedNotificationCenter defaultCenter] addObserver:self + selector:@selector(afsVolumeMountChange:) name:kAFSMenuExtraID object:kMExtraAFSStateChange]; // Register for menu state change - [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(chageMenuVisibility:) + [[NSDistributedNotificationCenter defaultCenter] addObserver:self + selector:@selector(chageMenuVisibility:) name:kAFSMenuExtraID object:kMExtraAFSMenuChangeState]; //Register for mount/unmount afs volume - [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self - selector:@selector(afsVolumeMountChange:) + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self + selector:@selector(afsVolumeMountChange:) name:NSWorkspaceDidMountNotification object:nil]; - [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self - selector:@selector(afsVolumeMountChange:) + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self + selector:@selector(afsVolumeMountChange:) name:NSWorkspaceDidUnmountNotification object:nil]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self @@ -116,6 +130,7 @@ if(tokensLock) [tokensLock release]; if(afsMngr) [afsMngr release]; + if(linkCreationLock) [linkCreationLock release]; return NSTerminateNow; } #pragma mark Notification Handler @@ -128,30 +143,126 @@ [afsSysPath release]; afsSysPath = nil; } - CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost); - CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost); + CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); afsSysPath = PREFERENCE_AFS_SYS_PAT_STATIC; // read the preference for aklog use - useAklogPrefValue = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_AKLOG, - (CFStringRef)kAfsCommanderID, - kCFPreferencesCurrentUser, + useAklogPrefValue = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_AKLOG, + (CFStringRef)kAfsCommanderID, + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - showStatusMenu = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_SHOW_STATUS_MENU, - (CFStringRef)kAfsCommanderID, - kCFPreferencesCurrentUser, + showStatusMenu = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_SHOW_STATUS_MENU, + (CFStringRef)kAfsCommanderID, + kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - aklogTokenAtLogin = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_AKLOG_TOKEN_AT_LOGIN, (CFStringRef)kAfsCommanderID, - kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + aklogTokenAtLogin = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_AKLOG_TOKEN_AT_LOGIN, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + //get link configuration + NSData *prefData = (NSData*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_LINK_CONFIGURATION, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + linkConfiguration = (NSMutableDictionary*)[NSPropertyListSerialization propertyListFromData:prefData + mutabilityOption:NSPropertyListMutableContainers + format:nil + errorDescription:nil]; + + //get link enabled status + NSNumber *linkEnabledStatus = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_LINK, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + [self updateLinkModeStatusWithpreferenceStatus:[linkEnabledStatus boolValue]]; + + //set the menu name [self updateAfsStatus:nil]; } // ------------------------------------------------------------------------------- +// - (void) updateLinkModeStatusWithpreferenceStatus:(BOOL)status +// ------------------------------------------------------------------------------- +- (void) updateLinkModeStatusWithpreferenceStatus:(BOOL)status { + //exec the link operation on thread + [NSThread detachNewThreadSelector:@selector(performLinkOpeartionOnThread:) + toTarget:self + withObject:[NSNumber numberWithBool:status]]; +} + + +// ------------------------------------------------------------------------------- +// - (void) performLinkOpenartionOnThread:(id)object +// ------------------------------------------------------------------------------- +- (void) performLinkOpeartionOnThread:(id)object { + [linkCreationLock lock]; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSError *error = nil; + NSString *key = nil; + NSString *linkDstPath = nil; + NSString *linkSrcPath = nil; + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES); + NSString *documentFolderPath = [paths objectAtIndex:0]; + NSNumber *number = (NSNumber*)object; + //NSString *fType = NSFileTypeForHFSTypeCode(LINK_ICON); + //NSImage *picture = [[NSWorkspace sharedWorkspace] iconForFileType:fType]; + + BOOL linkSourcePathExist = NO; + BOOL linkDestinationPathExist = NO; + + NSLog(@"updateLinkModeStatusWithpreferenceStatus %d", [number boolValue]); + NSEnumerator *keys = [linkConfiguration keyEnumerator]; + while ((key = [keys nextObject])) { + //link path + linkSrcPath = [documentFolderPath stringByAppendingPathComponent:key]; + //afs destionation path + linkDstPath = [linkConfiguration objectForKey:key]; + linkSourcePathExist = [[NSFileManager defaultManager] fileExistsAtPath:linkSrcPath]; + linkDestinationPathExist = [[NSFileManager defaultManager] fileExistsAtPath:linkDstPath]; + + if([number boolValue]) { + if(!linkSourcePathExist) { + if(linkDestinationPathExist) { + NSLog(@"Creating link \"%@\" to point to \"%@\"", linkSrcPath, linkDstPath); + [[NSFileManager defaultManager] createSymbolicLinkAtPath:linkSrcPath + withDestinationPath:linkDstPath + error:&error]; + if(!error) { + //Link has been created so i can chnge the icon + /* [[NSWorkspace sharedWorkspace] setIcon:picture + forFile:linkName + options:0];*/ + NSLog(@"Link \"%@\" created", linkSrcPath); + } else { + NSLog(@"Link Creation Error: %@", [error localizedDescription]); + } + } else { + NSLog(@"Deleting Link: %@", linkSrcPath); + [[NSFileManager defaultManager] removeItemAtPath:linkSrcPath + error:&error]; + } + } else { + //the lynk already exist check if the dest path is accesible + if(!linkSourcePathExist) { + NSLog(@"Deleting Link: %@", linkSrcPath); + [[NSFileManager defaultManager] removeItemAtPath:linkSrcPath + error:&error]; + } + } + } else { + //delete the link + NSLog(@"Deleting Link: %@", linkSrcPath); + [[NSFileManager defaultManager] removeItemAtPath:linkSrcPath + error:&error]; + + } + } + + //update the status + currentLinkActivationStatus = [number boolValue]; + //release thread resource + [pool release]; + [linkCreationLock unlock]; +} + +// ------------------------------------------------------------------------------- // - (void)chageMenuVisibility:(NSNotification *)notification // ------------------------------------------------------------------------------- - (void)chageMenuVisibility:(NSNotification *)notification { @@ -184,6 +295,7 @@ // ------------------------------------------------------------------------------- - (void) afsVolumeMountChange:(NSNotification *)notification{ [self updateAfsStatus:nil]; + [self readPreferenceFile:nil]; } @@ -209,47 +321,22 @@ // ------------------------------------------------------------------------------- - (void)startStopAfs:(id)sender { - if(!afsSysPath) return; - - OSStatus status = noErr; - NSString *afsdPath = [TaskUtil searchExecutablePath:@"afsd"]; - NSString *rootHelperApp = nil; - BOOL currentAfsState = NO; - @try { - if(afsdPath == nil) return; + BOOL currentAfsState = NO; currentAfsState = [afsMngr checkAfsStatus]; - rootHelperApp = [[NSBundle mainBundle] pathForResource:@"afshlp" ofType:@""]; - - //Check helper app - [self repairHelperTool]; - // make the parameter to call the root helper app - status = [[AuthUtil shared] autorize]; - if(status == noErr){ - if(currentAfsState){ - //shutdown afs - NSMutableString *afsKextPath = [[NSMutableString alloc] initWithCapacity:256]; - [afsKextPath setString:afsSysPath]; - [afsKextPath appendString:@"/etc/afs.kext"]; - - const char *stopAfsArgs[] = {"stop_afs", [afsKextPath UTF8String], [afsdPath UTF8String], 0L}; - [[AuthUtil shared] execUnixCommand:[rootHelperApp UTF8String] - args:stopAfsArgs - output:nil]; - } else { - const char *startAfsArgs[] = {[[ [NSBundle mainBundle] pathForResource:@"start_afs" ofType:@"sh"] UTF8String], [afsSysPath UTF8String], [afsdPath UTF8String], 0L}; - [[AuthUtil shared] execUnixCommand:[rootHelperApp UTF8String] - args:startAfsArgs - output:nil]; - } + if(currentAfsState){ + //shutdown afs + NSLog(@"Shutting down afs"); + [afsMngr shutdown]; + } else { + //Start afs + NSLog(@"Starting up afs"); + [afsMngr startup]; } - } - @catch (NSException * e) { - NSLog([e reason]); - } - @finally { - [[AuthUtil shared] deautorize]; + }@catch (NSException * e) { + NSLog(@"error %@", [e reason]); + }@finally { [self updateAfsStatus:nil]; //Send notification to preferencepane [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAfsCommanderID object:kMenuExtraEventOccured]; @@ -262,33 +349,28 @@ // ------------------------------------------------------------------------------- - (void)getToken:(id)sender { - NSRect globalRect; - globalRect.origin = [[[statusItem view] window] convertBaseToScreen:[[statusItem view] frame].origin]; - globalRect.size = [[statusItem view] frame].size; - AFSPropertyManager *afsPropMngr = [[AFSPropertyManager alloc] initWithAfsPath:afsSysPath ]; - [afsPropMngr loadConfiguration]; - if([useAklogPrefValue boolValue]) { - [afsPropMngr getTokens:false - usr:nil - pwd:nil]; + [afsMngr getTokens:false + usr:nil + pwd:nil]; [self klogUserEven:nil]; } else { + globalRect.origin = [[[statusItem view] window] convertBaseToScreen:[[statusItem view] frame].origin]; + globalRect.size = [[statusItem view] frame].size; + // register for user event - [[NSDistributedNotificationCenter defaultCenter] addObserver:self - selector:@selector(klogUserEven:) - name:kAFSMenuExtraID + [[NSDistributedNotificationCenter defaultCenter] addObserver:self + selector:@selector(klogUserEven:) + name:kAFSMenuExtraID object:kLogWindowClosed]; - credentialMenuController = [[AFSMenuCredentialContoller alloc] initWhitRec:globalRect - afsPropManager:afsPropMngr]; + credentialMenuController = [[AFSMenuCredentialContoller alloc] initWhitRec:globalRect + afsPropManager:afsMngr]; [credentialMenuController showWindow]; } - //Dispose afs manager - [afsPropMngr release]; - [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAfsCommanderID + [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAfsCommanderID object:kMExtraTokenOperation]; } @@ -312,6 +394,9 @@ //Try to locking if(![tokensLock tryLock]) return; + //reload configuration + [afsMngr loadConfiguration]; + // check the afs state in esclusive mode afsState = [afsMngr checkAfsStatus]; diff --git a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtra.m b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtra.m index cf5c4d8..0073a31 100644 --- a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtra.m +++ b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtra.m @@ -165,10 +165,14 @@ afsSysPath = PREFERENCE_AFS_SYS_PAT_STATIC; // read the preference for aklog use + + useAklogPrefValue = [[NSUserDefaults standardUserDefaults] boolForKey:PREFERENCE_USE_AKLOG]; + NSLog(@"NSUserDefaults:%d", useAklogPrefValue); useAklogPrefValue = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_AKLOG, (CFStringRef)afsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + NSLog(@"CFPreferencesCopyValue:%d", useAklogPrefValue); [self updateAfsStatus:nil]; } diff --git a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtraView.m b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtraView.m index 8abd48f..b6839e6 100644 --- a/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtraView.m +++ b/src/platform/DARWIN/AFSPreference/AFSBackgrounder/AFSMenuExtraView.m @@ -43,20 +43,15 @@ int fontHeight = 0; NSAttributedString *kerberosStringIndicator = nil; - //check if we nedd to simulate the background menu clicked + //check if we need to simulate the background menu clicked [statusItem drawStatusBarBackgroundInRect:[self bounds] withHighlight:isMenuVisible]; - image = [backgrounderDelegator imageToRender]; if (image) { // Live updating even when menu is down handled by making the extra // draw the background if needed. [image compositeToPoint:NSMakePoint(0, 0) operation:NSCompositeSourceOver]; } - - - - //Draw, if necessary, the kerberos indicator for aklog usage for get token if([backgrounderDelegator useAklogPrefValue] == NSOnState) { kerberosStringIndicator = [[self makeKerberosIndicator:&fontHeight] autorelease]; diff --git a/src/platform/DARWIN/AFSPreference/AFSCommanderPref.h b/src/platform/DARWIN/AFSPreference/AFSCommanderPref.h index 9180d3b..f6666c7 100644 --- a/src/platform/DARWIN/AFSPreference/AFSCommanderPref.h +++ b/src/platform/DARWIN/AFSPreference/AFSCommanderPref.h @@ -50,17 +50,17 @@ int CoreMenuExtraRemoveMenuExtra(void *menuExtra, int whoCares); IBOutlet NSBox *groupsBox; //id installationPathTextField; - id startStopButton; - id cellList; + IBOutlet NSButton *startStopButton; + IBOutlet NSTableView *cellList; //id cellNameTextEdit; - id cellIpButton; - id addCellButton; - id removeCellButton; + IBOutlet NSControl *cellIpButton; + IBOutlet NSControl *addCellButton; + IBOutlet NSControl *removeCellButton; //id refreshConfigurationButton; - id saveConfigurationButton; + IBOutlet NSControl *saveConfigurationButton; id labelSaveResult; - id tokensTable; - id afsMenucheckBox; + IBOutlet NSTableView *tokensTable; + IBOutlet NSControl *afsMenucheckBox; //Configuration sheet id ipConfigurationSheet; @@ -83,7 +83,8 @@ int CoreMenuExtraRemoveMenuExtra(void *menuExtra, int whoCares); IBOutlet NSButton *checkEnableLink; IBOutlet NSButton *buttonAddLink; IBOutlet NSButton *buttonRemoveLink; - bool enableLink; + IBOutlet NSTableView *tableViewLink; + NSMutableDictionary *linkConfiguration; AFSPropertyManager *afsProperty; //AFS Property managment class NSMutableArray *filteredCellDB; //Filtered CellServDB @@ -121,6 +122,7 @@ int CoreMenuExtraRemoveMenuExtra(void *menuExtra, int whoCares); - (IBAction) krb5KredentialAtLoginTimeEvent:(id) sender; - (IBAction) searchCellTextEvent:(id) sender; - (IBAction) manageBackgrounderActivation:(id)sender; +- (IBAction) tableViewLinkPerformClick:(id) sender; - (void) credentialAtLoginTimeEventCreationLaunchAgentDir:(NSWindow*)alert returnCode:(int)returnCode contextInfo:(void *)contextInfo; - (void) clearCellServDBFiltering; - (void) filterCellServDB:(NSString*)textToFilter; @@ -129,7 +131,8 @@ int CoreMenuExtraRemoveMenuExtra(void *menuExtra, int whoCares); - (void) modifyCell:(DBCellElement*) cellElement; - (void) modifyCellByIDX:(int) idx; - (void) showMessage:(NSString*) message; -- (void) manageButtonState:(int) rowSelected; +- (void) tableViewCellmanageButtonState:(int) rowSelected; +- (void) tableViewLinkmanageButtonState:(NSIndexSet *) rowsSelectedIndex; - (void) setAfsStatus; - (void) refreshTokens:(NSTimer*)theTimer; - (void) repairHelperTool; @@ -144,4 +147,5 @@ int CoreMenuExtraRemoveMenuExtra(void *menuExtra, int whoCares); @interface AFSCommanderPref (NSTableDataSource) - (id) getTableTokensListValue:(int) colId row:(int)row; - (id) getTableCelListValue:(int) colId row:(int)row; +- (id) getTableLinkValue:(int) colId row:(int)row; @end; \ No newline at end of file diff --git a/src/platform/DARWIN/AFSPreference/AFSCommanderPref.m b/src/platform/DARWIN/AFSPreference/AFSCommanderPref.m index fca2b97..a413c17 100644 --- a/src/platform/DARWIN/AFSPreference/AFSCommanderPref.m +++ b/src/platform/DARWIN/AFSPreference/AFSCommanderPref.m @@ -31,6 +31,7 @@ #define TABLE_TOKENS_LIST 1 #define TABLE_CELL_LIST 2 +#define TABLE_LINK_LIST 3 #define TAB_TOKENS 1 #define TAB_CELL_SERV_DB 2 @@ -43,6 +44,11 @@ #define CELLSRVDB_TABLE_NAME_COLUMN 2 #define CELLSRVDB_TABLE_DESCRIPTION_COLUMN 3 +//Link Table +#define TABLE_COLUMN_LINK_NAME 0 +#define TABLE_COLUMN_LINK_PATH 1 + + @implementation AFSCommanderPref // ------------------------------------------------------------------------------- @@ -150,9 +156,9 @@ name:NSWorkspaceDidUnmountNotification object:nil]; // set self as table data source - [((NSTableView*)cellList) setDataSource:self]; - [((NSTableView*)tokensTable) setDataSource:self]; - + [cellList setDataSource:self]; + [tokensTable setDataSource:self]; + //[tableViewLink setDataSource:self]; //check the afs state [self setAfsStatus]; @@ -259,7 +265,6 @@ // ------------------------------------------------------------------------------- - (void) readPreferenceFile { - // read the preference for aklog use NSNumber *useAklogPrefValue = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_AKLOG, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); @@ -273,9 +278,9 @@ [installKRB5AuthAtLoginButton setState:[PListManager checkKrb5AtLoginTimeLaunchdEnable]]; //check for AFS enable at startup - NSNumber *afsEnableStartupTime = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_START_AFS_AT_STARTUP, + NSNumber *afsEnableStartupTime = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_START_AFS_AT_STARTUP, (CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost); - if(afsEnableStartupTime) + if(afsEnableStartupTime) startAFSAtLogin = [afsEnableStartupTime boolValue]; else startAFSAtLogin = false; @@ -287,6 +292,18 @@ //backgrounder state [backgrounderActivationCheck setState:[PListManager launchdJobState:BACKGROUNDER_P_FILE]]; + + //link enabled status + NSNumber *linkEnabledStatus = (NSNumber*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_USE_LINK, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + [checkEnableLink setState:[linkEnabledStatus boolValue]]; + + //link configuration + NSData *prefData = (NSData*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_LINK_CONFIGURATION, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + linkConfiguration = (NSMutableDictionary*)[NSPropertyListSerialization propertyListFromData:prefData + mutabilityOption:NSPropertyListMutableContainers + format:nil + errorDescription:nil]; + } // ------------------------------------------------------------------------------- @@ -319,9 +336,13 @@ (CFNumberRef)[NSNumber numberWithBool:[afsMenucheckBox state]], (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + //write preference for link + CFPreferencesSetValue((CFStringRef)PREFERENCE_USE_LINK, + (CFNumberRef)[NSNumber numberWithBool:[checkEnableLink state]], + (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesAnyUser, kCFPreferencesAnyHost); CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); - [[NSDistributedNotificationCenter defaultCenter] postNotificationName:kAFSMenuExtraID object:kPrefChangeNotification]; } @@ -875,14 +896,6 @@ } // ------------------------------------------------------------------------------- -// manageButtonState: -// ------------------------------------------------------------------------------- --(void) manageButtonState:(int) rowSelected { - [((NSControl*) cellIpButton) setEnabled:rowSelected >= 0]; - [((NSControl*) removeCellButton) setEnabled:rowSelected >= 0]; -} - -// ------------------------------------------------------------------------------- // setAfsStatus: // ------------------------------------------------------------------------------- -(void) setAfsStatus @@ -942,14 +955,40 @@ // removeExtra: // ------------------------------------------------------------------------------- - (IBAction) removeLink:(id) sender { + if(!linkConfiguration) return; + int index = 0; + NSArray *keys = [linkConfiguration allKeys]; + NSIndexSet *linkToRemove = [tableViewLink selectedRowIndexes]; + if( [linkToRemove count] > 0) { + index = [linkToRemove firstIndex]; + do { + [linkConfiguration removeObjectForKey:[keys objectAtIndex:index]]; + } while ((index = [linkToRemove indexGreaterThanIndex:index]) != -1); + } + //write the new configuration + NSData *prefData = nil; + if([linkConfiguration count] > 0) { + prefData = [NSPropertyListSerialization dataWithPropertyList:linkConfiguration + format:NSPropertyListXMLFormat_v1_0 + options:0 + error:nil]; + } + CFPreferencesSetValue((CFStringRef)PREFERENCE_LINK_CONFIGURATION, + (CFDataRef)prefData, + (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + + CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + + //reload the new data + [tableViewLink reloadData]; } // ------------------------------------------------------------------------------- // removeExtra: // ------------------------------------------------------------------------------- - (IBAction) enableLink:(id) sender { - + [self writePreferenceFile]; } // ------------------------------------------------------------------------------- @@ -964,6 +1003,12 @@ [backgrounderActivationCheck setState:[PListManager launchdJobState:BACKGROUNDER_P_FILE]]; } +// ------------------------------------------------------------------------------- +// tableViewLinkPerformClick: +// ------------------------------------------------------------------------------- +- (IBAction) tableViewLinkPerformClick:(id) sender { + NSLog(@"tableViewLinkPerformClick"); +} // ------------------------------------------------------------------------------- // - (void)tabView:(NSTabView *)tabView willSelectTabViewItem: (NSTabViewItem *)tabViewItem @@ -973,8 +1018,7 @@ //check to see if the cache param tab is the tab that will be selected if([((NSString*)[tabViewItem identifier]) intValue] == TAB_LINK) { - [ViewUtility enbleDisableControlView:[tabViewItem view] - controlState:NO]; + [tableViewLink reloadData]; } } @@ -1038,6 +1082,11 @@ //We are refreshing cell db table result = [self getTableCelListValue:[identifier intValue] row:rowIndex]; break; + + case TABLE_LINK_LIST: + result = [self getTableLinkValue:[identifier intValue] row:rowIndex]; + break; + } return result; @@ -1088,6 +1137,26 @@ } // ------------------------------------------------------------------------------- +// getTableCelListValue: +// ------------------------------------------------------------------------------- +- (id)getTableLinkValue:(int) colId row:(int)row +{ + id result = nil; + NSArray *allKey = [linkConfiguration allKeys]; + switch(colId){ + case TABLE_COLUMN_LINK_NAME: + result = [allKey objectAtIndex:row]; + break; + + case TABLE_COLUMN_LINK_PATH: + result = [linkConfiguration objectForKey:[allKey objectAtIndex:row]]; + break; + } + return result; +} + + +// ------------------------------------------------------------------------------- // numberOfRowsInTableView: // ------------------------------------------------------------------------------- - (int)numberOfRowsInTableView:(NSTableView *)aTableView @@ -1104,6 +1173,11 @@ if(filteredCellDB) rowCount = [filteredCellDB count]; break; + case TABLE_LINK_LIST: + if(linkConfiguration) rowCount = [linkConfiguration count]; + break; + + } return rowCount; } @@ -1116,7 +1190,21 @@ // ------------------------------------------------------------------------------- - (BOOL)selectionShouldChangeInTableView:(NSTableView *)aTable { - [self manageButtonState:[aTable selectedRow]]; + switch([aTable tag]){ + case TABLE_TOKENS_LIST: + + break; + + case TABLE_CELL_LIST: + [self tableViewCellmanageButtonState:[aTable selectedRow]]; + break; + + case TABLE_LINK_LIST: + break; + + + } + return YES; } @@ -1125,10 +1213,58 @@ // ------------------------------------------------------------------------------- - (BOOL)tableView:(NSTableView *)aTable shouldSelectRow:(int)aRow { - [self manageButtonState:aRow]; + switch([aTable tag]){ + case TABLE_TOKENS_LIST: + + break; + + case TABLE_CELL_LIST: + [self tableViewCellmanageButtonState:aRow]; + break; + + case TABLE_LINK_LIST: + break; + + + } + return YES; } +// ------------------------------------------------------------------------------- +// tableView: +// ------------------------------------------------------------------------------- +- (void)tableViewSelectionDidChange:(NSNotification *)aNotification { + NSTableView *aTable = [aNotification object]; + switch([aTable tag]){ + case TABLE_TOKENS_LIST: + break; + + case TABLE_CELL_LIST: + break; + + case TABLE_LINK_LIST: + [self tableViewLinkmanageButtonState:[aTable selectedRowIndexes]]; + break; + + + } +} +// ------------------------------------------------------------------------------- +// manageButtonState: +// ------------------------------------------------------------------------------- +-(void) tableViewCellmanageButtonState:(int) rowSelected { + [((NSControl*) cellIpButton) setEnabled:rowSelected >= 0]; + [((NSControl*) removeCellButton) setEnabled:rowSelected >= 0]; +} + +// ------------------------------------------------------------------------------- +// manageButtonState: +// ------------------------------------------------------------------------------- +-(void) tableViewLinkmanageButtonState:(NSIndexSet *) rowsSelectedIndex { + NSLog(@"link selected %d", [rowsSelectedIndex count]); + [buttonRemoveLink setEnabled:[rowsSelectedIndex count]>0]; +} @end diff --git a/src/platform/DARWIN/AFSPreference/English.lproj/OpenAFSPreference.xib b/src/platform/DARWIN/AFSPreference/English.lproj/OpenAFSPreference.xib index 582e5d6..2638635 100644 --- a/src/platform/DARWIN/AFSPreference/English.lproj/OpenAFSPreference.xib +++ b/src/platform/DARWIN/AFSPreference/English.lproj/OpenAFSPreference.xib @@ -3,15 +3,16 @@ 1050 10B504 - 732 + 740 1038.2 437.00 com.apple.InterfaceBuilder.CocoaPlugin - 732 + 740 YES + YES @@ -47,7 +48,7 @@ View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 274 @@ -58,7 +59,6 @@ 256 {{17, 1}, {304, 14}} - YES 67239424 @@ -76,7 +76,7 @@ controlColor 3 - MC42NjY2NjY2ODY1AA + MC42NjY2NjY2NjY3AA @@ -105,7 +105,6 @@ 268 {{13, 7}, {109, 28}} - YES 67239424 @@ -133,7 +132,6 @@ 265 {{526, 9}, {21, 23}} - YES -2080244224 @@ -161,7 +159,6 @@ 268 {{138, 13}, {117, 18}} - YES 67239424 @@ -187,12 +184,10 @@ {{1, 1}, {562, 43}} - {{17, 423}, {564, 45}} - {0, 0} 67239424 @@ -228,7 +223,6 @@ 274 {{13, 15}, {572, 401}} - YES @@ -255,7 +249,6 @@ 256 {516, 140} - 1 YES @@ -263,7 +256,6 @@ 256 {516, 17} - @@ -271,7 +263,6 @@ -2147483392 {{-22, 0}, {12, 17}} - YES @@ -340,7 +331,6 @@ {{1, 17}, {516, 140}} - @@ -351,7 +341,6 @@ -2147483392 {{494, 17}, {11, 80}} - 256 _doScroller: @@ -362,7 +351,6 @@ -2147483392 {{1, 97}, {505, 11}} - 257 _doScroller: @@ -377,7 +365,6 @@ {{1, 0}, {516, 17}} - @@ -387,7 +374,6 @@ {{17, 199}, {518, 158}} - 562 @@ -402,7 +388,6 @@ 265 {{329, 164}, {80, 28}} - YES 67239424 @@ -426,7 +411,6 @@ 265 {{407, 164}, {133, 28}} - YES 67239424 @@ -450,7 +434,6 @@ 268 {{14, 172}, {86, 18}} - YES 67239424 @@ -483,7 +466,6 @@ 268 {{5, 32}, {75, 18}} - YES 67239424 @@ -506,7 +488,6 @@ 268 {{5, 12}, {167, 18}} - YES 67239424 @@ -529,7 +510,6 @@ 268 {{5, 52}, {170, 18}} - YES 67239424 @@ -550,12 +530,10 @@ {{1, 1}, {193, 78}} - {{113, 97}, {195, 94}} - {0, 0} 67239424 @@ -579,7 +557,6 @@ 268 {{14, 152}, {96, 18}} - YES 67239424 @@ -600,7 +577,6 @@ {{10, 25}, {552, 363}} - Tokens @@ -1143,8 +1119,8 @@ YES YES - , - . + . + , NO NO YES @@ -1211,8 +1187,8 @@ YES YES - , - . + . + , NO NO YES @@ -1292,8 +1268,8 @@ YES YES - , - . + . + , NO NO YES @@ -1421,8 +1397,8 @@ YES YES - , - . + . + , NO NO NO @@ -1535,8 +1511,8 @@ YES YES - , - . + . + , NO NO YES @@ -1710,6 +1686,7 @@ 256 {501, 283} + 3 YES @@ -1727,6 +1704,7 @@ YES + 0 84 40 1000 @@ -1756,6 +1734,7 @@ + 1 411 40 1000 @@ -1937,7 +1916,6 @@ 289 {{323, 3}, {258, 11}} - YES 68288064 @@ -1956,10 +1934,9 @@ {595, 486} - {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 9 @@ -1973,7 +1950,7 @@ View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 256 @@ -2134,7 +2111,7 @@ {715, 485} {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} InfoController @@ -2529,14 +2506,6 @@ - buttonRemoveLink - - - - 2044 - - - buttonAddLink @@ -2607,6 +2576,38 @@ 2057 + + + tableViewLink + + + + 2059 + + + + dataSource + + + + 2060 + + + + delegate + + + + 2061 + + + + buttonRemoveLink + + + + 2063 + @@ -3951,11 +3952,11 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{369, 135}, {595, 486}} + {{165, 432}, {595, 486}} com.apple.InterfaceBuilder.CocoaPlugin - {{369, 135}, {595, 486}} + {{165, 432}, {595, 486}} {3.40282e+38, 3.40282e+38} @@ -4240,7 +4241,7 @@ Zm9yIGRlYnVnZ2luZyBhcyBpdCBwcmludHMgYSBMT1Qgb2YgaW5mb3JtYXRpb24uCg - 2057 + 2063 @@ -4271,6 +4272,7 @@ Zm9yIGRlYnVnZ2luZyBhcyBpdCBwcmludHMgYSBMT1Qgb2YgaW5mb3JtYXRpb24uCg showCellIP: startStopAfs: tableDoubleAction: + tableViewLinkPerformClick: unlog: @@ -4295,6 +4297,7 @@ Zm9yIGRlYnVnZ2luZyBhcyBpdCBwcmludHMgYSBMT1Qgb2YgaW5mb3JtYXRpb24uCg id id id + id @@ -4336,6 +4339,7 @@ Zm9yIGRlYnVnZ2luZyBhcyBpdCBwcmludHMgYSBMT1Qgb2YgaW5mb3JtYXRpb24uCg saveConfigurationButton startStopButton statCacheEntry + tableViewLink textFieldDevInfoLabel textSearchField tokensButton @@ -4346,11 +4350,11 @@ Zm9yIGRlYnVnZ2luZyBhcyBpdCBwcmludHMgYSBMT1Qgb2YgaW5mb3JtYXRpb24uCg YES - id + NSControl NSView NSButton NSTextField - id + NSControl NSTextField NSTextField NSButton @@ -4358,8 +4362,8 @@ Zm9yIGRlYnVnZ2luZyBhcyBpdCBwcmludHMgYSBMT1Qgb2YgaW5mb3JtYXRpb24uCg NSButton NSButton NSTextField - id - id + NSControl + NSTableView NSButton NSButton id @@ -4377,14 +4381,15 @@ Zm9yIGRlYnVnZ2luZyBhcyBpdCBwcmludHMgYSBMT1Qgb2YgaW5mb3JtYXRpb24uCg id LynkCreationController NSTextField - id - id - id + NSControl + NSControl + NSButton NSTextField + NSTableView NSTextField NSSearchField NSButton - id + NSTableView NSButton NSButton NSButton diff --git a/src/platform/DARWIN/AFSPreference/Info.plist b/src/platform/DARWIN/AFSPreference/Info.plist index 80459b9..2d3b14e 100644 --- a/src/platform/DARWIN/AFSPreference/Info.plist +++ b/src/platform/DARWIN/AFSPreference/Info.plist @@ -21,7 +21,7 @@ CFBundleSignature INFN CFBundleVersion - 1.0b + 1.0 NSMainNibFile OpenAFSPreference NSPrefPaneIconFile diff --git a/src/platform/DARWIN/AFSPreference/LynkCreationController.m b/src/platform/DARWIN/AFSPreference/LynkCreationController.m index 308f61c..684958c 100644 --- a/src/platform/DARWIN/AFSPreference/LynkCreationController.m +++ b/src/platform/DARWIN/AFSPreference/LynkCreationController.m @@ -7,7 +7,7 @@ // #import "LynkCreationController.h" - +#import "global.h" @implementation LynkCreationController @@ -16,6 +16,34 @@ } - (IBAction) save:(id) sender { + NSMutableDictionary *linkConfiguration = nil; + if([[[textFieldLinkDestPath stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0 || + [[[textfieldLinkName stringValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0 ) + return; + + //load all configuration + NSData *prefData = (NSData*)CFPreferencesCopyValue((CFStringRef)PREFERENCE_LINK_CONFIGURATION, (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + if(prefData) { + linkConfiguration = [NSPropertyListSerialization propertyListFromData:prefData + mutabilityOption:NSPropertyListMutableContainers + format:nil + errorDescription:nil]; + } else { + linkConfiguration = [NSMutableDictionary dictionaryWithCapacity:1]; + } + + [linkConfiguration setObject:[textFieldLinkDestPath stringValue] + forKey:[textfieldLinkName stringValue]]; + + //save new configuration + prefData = [NSPropertyListSerialization dataWithPropertyList:linkConfiguration + format:NSPropertyListXMLFormat_v1_0 + options:0 + error:nil]; + CFPreferencesSetValue((CFStringRef)PREFERENCE_LINK_CONFIGURATION, + (CFDataRef)prefData, + (CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); + CFPreferencesSynchronize((CFStringRef)kAfsCommanderID, kCFPreferencesCurrentUser, kCFPreferencesAnyHost); [NSApp endSheet:lynkCreationSheet]; } diff --git a/src/platform/DARWIN/AFSPreference/OpenAFS.xcodeproj/project.pbxproj b/src/platform/DARWIN/AFSPreference/OpenAFS.xcodeproj/project.pbxproj index 7fa0150..d10bdc4 100644 --- a/src/platform/DARWIN/AFSPreference/OpenAFS.xcodeproj/project.pbxproj +++ b/src/platform/DARWIN/AFSPreference/OpenAFS.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 42; + objectVersion = 45; objects = { /* Begin PBXBuildFile section */ @@ -608,7 +608,7 @@ 089C1669FE841209C02AAC07 /* Project object */ = { isa = PBXProject; buildConfigurationList = 1DBD214C08BA80EA00186707 /* Build configuration list for PBXProject "OpenAFS" */; - compatibilityVersion = "Xcode 2.4"; + compatibilityVersion = "Xcode 3.1"; hasScannedForEncodings = 1; knownRegions = ( English, @@ -844,16 +844,13 @@ 1DBD214A08BA80EA00186707 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = AFSCommander_Prefix.pch; INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Library/PreferencePanes"; + INSTALL_PATH = ""; PRODUCT_NAME = OpenAFS; WRAPPER_EXTENSION = prefPane; }; @@ -862,14 +859,14 @@ 1DBD214D08BA80EA00186707 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; - ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_ENABLE_OBJC_GC = supported; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INSTALL_PATH = /Library/PreferencePanes; - ONLY_ACTIVE_ARCH = NO; + INSTALL_PATH = ""; + ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; SKIP_INSTALL = NO; VALID_ARCHS = "i386 ppc x86_64"; @@ -879,15 +876,15 @@ 1DBD214E08BA80EA00186707 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_ENABLE_OBJC_GC = supported; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; + VALID_ARCHS = "i386 ppc x86_64"; }; name = Release; }; diff --git a/src/platform/DARWIN/AFSPreference/global.h b/src/platform/DARWIN/AFSPreference/global.h index d695592..4e3fe51 100644 --- a/src/platform/DARWIN/AFSPreference/global.h +++ b/src/platform/DARWIN/AFSPreference/global.h @@ -36,6 +36,8 @@ #define PREFERENCE_START_AFS_AT_STARTUP @"PREFERENCE_START_AFS_AT_STARTUP" #define PREFERENCE_SHOW_STATUS_MENU @"PREFERENCE_SHOW_STATUS_MENU" #define PREFERENCE_AKLOG_TOKEN_AT_LOGIN @"PREFERENCE_AKLOG_TOKEN_AT_LOGIN" +#define PREFERENCE_USE_LINK @"PREFERENCE_USE_LINK" +#define PREFERENCE_LINK_CONFIGURATION @"PREFERENCE_LINK_CONFIGURATION" // AFSMENUEXTRA INFO #define kAFSMenuExtra [NSURL fileURLWithPath:[[self bundle] pathForResource:@"AFSBackgrounder" ofType:@"app" inDirectory:@""]] -- 1.9.4