5 // Created by Claudio on
10/07/07.
6 // Copyright
2007 INFN
- National Institute of Nuclear Physics.
All rights reserved.
9 #import "AFSMenuExtra.h"
10 #import "AFSMenuExtraView.h"
11 #import "AFSPropertyManager.h"
13 #import "TokenCredentialController.h"
14 #include
<sys
/param.h
>
17 #include
<sys
/types.h
>
18 #include
<sys
/fcntl.h
>
19 #include
<sys
/errno.h
>
24 @implementation AFSMenuExtra
25 // -------------------------------------------------------------------------------
26 // -(id
) initWithBundle
27 // -------------------------------------------------------------------------------
28 - (id
) initWithBundle
:(NSBundle
*)bundle
30 self
= [super initWithBundle
:bundle
];
35 tokensLock
= [[NSLock alloc
] init
];
36 // inizialize the afspath
38 credentialMenuController
= nil
;
40 theView
= [[AFSMenuExtraView alloc
] initWithFrame
:[[self
view] frame
]
42 [self setView
:theView
];
45 // Get the imge
for menu
46 //Load image for menu rappresentation
47 hasTokenImage
= [self getImageFromBundle
:@"hasToken"
50 noTokenImage
= [self getImageFromBundle
:@"noToken"
53 theMenu
= [[NSMenu alloc
] initWithTitle
: @""
];
54 [theMenu setAutoenablesItems
: NO
];
55 startStopMenu
= [theMenu addItemWithTitle
: kAfsOff action
: @selector
(startStopAfs
:) keyEquivalent
: @""
];
56 [startStopMenu setTarget
:self
];
58 loginMenu
= [theMenu addItemWithTitle
: kMenuLogin action
: @selector
(getToken
:) keyEquivalent
: @""
];
59 [loginMenu setTarget
:self
];
61 unlogMenu
= [theMenu addItemWithTitle
: kMenuUnlog action
: @selector
(releaseToken
:) keyEquivalent
: @""
];
62 [unlogMenu setTarget
:self
];
64 // Register
for preference user change
65 [[NSDistributedNotificationCenter defaultCenter
] addObserver
:self selector
:@selector
(readPreferenceFile
:)
66 name
:kAFSMenuExtraID object
:kPrefChangeNotification
];
68 // Register
for afs state change
69 [[NSDistributedNotificationCenter defaultCenter
] addObserver
:self selector
:@selector
(afsVolumeMountChange
:)
70 name
:kAFSMenuExtraID object
:kMExtraAFSStateChange
];
73 //Register
for mount
/unmount afs volume
74 [[[NSWorkspace sharedWorkspace
] notificationCenter
] addObserver
:self
75 selector
:@selector
(afsVolumeMountChange
:)
76 name
:NSWorkspaceDidMountNotification object
:nil
];
78 [[[NSWorkspace sharedWorkspace
] notificationCenter
] addObserver
:self
79 selector
:@selector
(afsVolumeMountChange
:)
80 name
:NSWorkspaceDidUnmountNotification object
:nil
];
81 //Start to read the afs
path
82 [self readPreferenceFile
:nil
];
87 // -------------------------------------------------------------------------------
89 // -------------------------------------------------------------------------------
94 if(hasTokenImage
) [hasTokenImage release
];
95 if(noTokenImage
) [noTokenImage release
];
97 // Unregister
for preference change
98 [[NSDistributedNotificationCenter defaultCenter
] removeObserver
:self name
:kAFSMenuExtraID object
:kPrefChangeNotification
];
99 [[NSDistributedNotificationCenter defaultCenter
] removeObserver
:self name
:kAFSMenuExtraID object
:kMExtraAFSStateChange
];
100 [[[NSWorkspace sharedWorkspace
] notificationCenter
] removeObserver
:self name
:NSWorkspaceDidMountNotification object
:nil
];
101 [[[NSWorkspace sharedWorkspace
] notificationCenter
] removeObserver
:self name
:NSWorkspaceDidUnmountNotification object
:nil
];
104 [tokensLock release
];
107 // -------------------------------------------------------------------------------
109 // -------------------------------------------------------------------------------
111 //start the time
for check tokens validity
112 if(timerForCheckTokensList
) return;
113 timerForCheckTokensList
= [NSTimer scheduledTimerWithTimeInterval
:TOKENS_REFRESH_TIME_IN_SEC
115 selector
:@selector
(updateAfsStatus
:)
118 [timerForCheckTokensList fire
];
121 // -------------------------------------------------------------------------------
123 // -------------------------------------------------------------------------------
125 if(!timerForCheckTokensList
) return;
126 [timerForCheckTokensList invalidate
];
127 timerForCheckTokensList
= nil
;
129 // -------------------------------------------------------------------------------
131 // -------------------------------------------------------------------------------
136 if(afsSysPath
) [afsSysPath release
];
137 // send notify that menuextra has closed
138 [[NSDistributedNotificationCenter defaultCenter
] postNotificationName
:afsCommanderID object
:kPrefChangeNotification
];
142 // -------------------------------------------------------------------------------
144 // -------------------------------------------------------------------------------
151 // -------------------------------------------------------------------------------
152 // -(void
) readPreferenceFile
153 // -------------------------------------------------------------------------------
154 - (void
) readPreferenceFile
:(NSNotification
*)notification
156 NSLog
(@"Reading preference file"
);
157 //CFPreferencesSynchronize
((CFStringRef
)afsCommanderID
, kCFPreferencesAnyUser
, kCFPreferencesAnyHost
);
158 //CFPreferencesSynchronize
((CFStringRef
)afsCommanderID
, kCFPreferencesCurrentUser
, kCFPreferencesAnyHost
);
161 [afsSysPath release
];
165 afsSysPath
= PREFERENCE_AFS_SYS_PAT_STATIC
;
167 // read the preference
for aklog use
169 useAklogPrefValue
= [[NSUserDefaults standardUserDefaults
] boolForKey
:PREFERENCE_USE_AKLOG
];
170 NSLog
(@"NSUserDefaults
:%d", useAklogPrefValue);
171 useAklogPrefValue
= (NSNumber
*)CFPreferencesCopyValue
((CFStringRef
)PREFERENCE_USE_AKLOG
,
172 (CFStringRef
)afsCommanderID
,
173 kCFPreferencesCurrentUser
,
174 kCFPreferencesAnyHost
);
175 NSLog
(@"CFPreferencesCopyValue
:%d", useAklogPrefValue);
176 [self updateAfsStatus
:nil
];
179 // -------------------------------------------------------------------------------
181 // -------------------------------------------------------------------------------
182 - (void
)getToken
:(id
)sender
186 globalRect.origin
= [[[self
view] window
] convertBaseToScreen
:[[self
view] frame
].origin
];
187 globalRect.
size = [[self
view] frame
].
size;
188 AFSPropertyManager
*afsPropMngr
= [[AFSPropertyManager alloc
] initWithAfsPath
:afsSysPath
];
189 [afsPropMngr loadConfiguration
];
192 if([useAklogPrefValue intValue
]==NSOnState
) {
193 [afsPropMngr getTokens
:false
196 [self klogUserEven
:nil
];
198 // register
for user event
199 [[NSDistributedNotificationCenter defaultCenter
] addObserver
:self
200 selector
:@selector
(klogUserEven
:)
202 object
:kLogWindowClosed
];
204 credentialMenuController
= [[AFSMenuCredentialContoller alloc
] initWhitRec
:globalRect
205 afsPropManager
:afsPropMngr
];
206 [credentialMenuController showWindow
];
209 //Dispose afs manager
210 [afsPropMngr release
];
213 // -------------------------------------------------------------------------------
214 // -(void
) releaseToken
215 // -------------------------------------------------------------------------------
216 - (void
)releaseToken
:(id
)sender
218 AFSPropertyManager
*afsMngr
= [[AFSPropertyManager alloc
] initWithAfsPath
:afsSysPath
];
221 [self updateAfsStatus
:nil
];
225 // -------------------------------------------------------------------------------
226 // -(void
) afsVolumeMountChange
- Track
for mount unmount afs volume
227 // -------------------------------------------------------------------------------
228 - (void
) afsVolumeMountChange
:(NSNotification
*)notification
{
229 [self updateAfsStatus
:nil
];
232 // -------------------------------------------------------------------------------
233 // -(void
) updateAfsStatus
234 // -------------------------------------------------------------------------------
235 - (void
)updateAfsStatus
:(NSTimer
*)timer
238 if(![tokensLock tryLock
]) return;
240 // check the afs state in esclusive mode
241 AFSPropertyManager
*afsMngr
= [[AFSPropertyManager alloc
] initWithAfsPath
:afsSysPath
];
242 afsState
= [afsMngr checkAfsStatus
];
244 NSArray
*tokens
= [afsMngr getTokenList
];
246 gotToken
= [tokens count
] > 0;
248 // update the
menu item
title
249 [startStopMenu setTitle
:afsState?kAfsButtonShutdown
:kAfsButtonStartup
];
253 [theView setNeedsDisplay
:YES
];
259 // -------------------------------------------------------------------------------
260 // -(void
) klogUserEven
261 // -------------------------------------------------------------------------------
262 -(void
) klogUserEven
:(NSNotification
*)notification
264 if(credentialMenuController
) {
265 [[NSDistributedNotificationCenter defaultCenter
] removeObserver
:self name
:kAFSMenuExtraID object
:kLogWindowClosed
];
266 [credentialMenuController closeWindow
];
267 [credentialMenuController release
];
268 credentialMenuController
= nil
;
270 //Send notification to PreferencePane
271 [[NSDistributedNotificationCenter defaultCenter
] postNotificationName
:afsCommanderID object
:kMenuExtraEventOccured
];
273 [self updateAfsStatus
:nil
];
276 // -------------------------------------------------------------------------------
277 // -(void
) getImageFromBundle
278 // -------------------------------------------------------------------------------
279 - (NSImage
*)getImageFromBundle
:(NSString
*)fileName fileExt
:(NSString
*)ext
281 return [[NSImage alloc
]initWithContentsOfFile
:[[self bundle
] pathForResource
:fileName
285 // -------------------------------------------------------------------------------
286 // -(void
) imageToRender
287 // -------------------------------------------------------------------------------
288 - (NSImage
*)imageToRender
291 return hasTokenImage
;
298 // -------------------------------------------------------------------------------
299 // -(void
) updateMenu
300 // -------------------------------------------------------------------------------
302 [loginMenu setEnabled
:afsState
];
303 [unlogMenu setEnabled
:afsState
];
307 // -------------------------------------------------------------------------------
308 // -(void
) useAklogPrefValue
309 // -------------------------------------------------------------------------------
310 - (BOOL
)useAklogPrefValue
312 if(useAklogPrefValue
) return [useAklogPrefValue intValue
] == NSOnState
;
313 else return NSOffState
;