2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 #include <afs/param.h>
19 * DEFINITIONS ________________________________________________________________
23 #define ID_REMIND_TIMER 1000
24 #define ID_SERVICE_TIMER 1001
26 #define cREALLOC_TABS 4
28 #define dwTABPARAM_MOUNT (LPTSTR)0
29 #define dwTABPARAM_ADVANCED (LPTSTR)1
30 #define ISCELLTAB(_psz) ((HIWORD((LONG)(_psz))) != 0)
34 * PROTOTYPES _________________________________________________________________
38 void Main_OnInitDialog (HWND hDlg);
39 void Main_OnCheckMenuRemind (void);
40 void Main_OnRemindTimer (void);
41 void Main_OnMouseOver (void);
42 void Main_OnSelectTab (void);
43 void Main_OnCheckTerminate (void);
44 HWND Main_CreateTabDialog (HWND hTab, size_t iTab);
46 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
47 void Terminate_OnInitDialog (HWND hDlg);
48 void Terminate_OnOK (HWND hDlg);
52 * ROUTINES ___________________________________________________________________
56 BOOL CALLBACK Main_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
58 static UINT msgCheckTerminate = 0;
59 if (msgCheckTerminate == 0)
60 msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
62 if (msg == msgCheckTerminate)
64 Main_OnCheckTerminate();
70 Main_OnInitDialog (hDlg);
74 Creds_CloseLibraries();
75 ChangeTrayIcon (NIM_DELETE);
81 Main_RepopulateTabs (FALSE);
94 if (g.fIsWinNT || IsServiceRunning())
96 if (!lp) // Got here from "/show" parameter? switch tabs.
98 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
99 TabCtrl_SetCurSel (hTab, 0);
106 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
111 if (g.fIsWinNT && IsServiceRunning())
112 ModalDialog (IDD_TERMINATE, NULL, (DLGPROC)Terminate_DlgProc);
114 ModalDialog (IDD_TERMINATE_SMALL, NULL, (DLGPROC)Terminate_DlgProc);
115 else // (!g.fIsWinNT)
116 ModalDialog (IDD_TERMINATE_SMALL_95, NULL, (DLGPROC)Terminate_DlgProc);
119 case M_TERMINATE_NOW:
124 Main_OnCheckMenuRemind();
130 Main_OnRemindTimer();
134 switch (((NMHDR*)lp)->code)
146 if (IsServiceRunning() || !IsServiceConfigured())
148 else if (!g.fIsWinNT)
149 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
156 if ((hm = TaLocale_LoadMenu (MENU_TRAYICON)) != 0)
161 HMENU hmDummy = CreateMenu();
162 InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL);
164 BOOL fRemind = FALSE;
165 lock_ObtainMutex(&g.credsLock);
166 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
168 if (g.aCreds[ iCreds ].fRemind)
171 lock_ReleaseMutex(&g.credsLock);
172 CheckMenuItem (hm, M_REMIND, MF_BYCOMMAND | ((fRemind) ? MF_CHECKED : MF_UNCHECKED));
174 TrackPopupMenu (GetSubMenu (hmDummy, 0),
175 TPM_RIGHTALIGN | TPM_RIGHTBUTTON,
176 pt.x, pt.y, NULL, hDlg, NULL);
178 DestroyMenu (hmDummy);
193 void Main_Show (BOOL fShow)
197 ShowWindow (g.hMain, SW_SHOW);
198 SetWindowPos (g.hMain, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
199 SetForegroundWindow (g.hMain);
203 SetWindowPos (g.hMain, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
208 void Main_OnInitDialog (HWND hDlg)
213 GetString (szTitle, IDS_TITLE_95);
214 SetWindowText (hDlg, szTitle);
217 TCHAR szVersion[256];
220 GetString (szVersion, IDS_UNKNOWN);
221 GetString (szUser, IDS_UNKNOWN);
224 if (RegOpenKey (HKEY_LOCAL_MACHINE, REGSTR_PATH_AFS, &hk) == 0)
226 DWORD dwSize = sizeof(szVersion);
227 DWORD dwType = REG_SZ;
228 RegQueryValueEx (hk, REGVAL_AFS_VERSION, NULL, &dwType, (PBYTE)szVersion, &dwSize);
230 dwSize = sizeof(dwPatch);
232 RegQueryValueEx (hk, REGVAL_AFS_PATCH, NULL, &dwType, (PBYTE)&dwPatch, &dwSize);
236 BOOL fFoundUserName = FALSE;
237 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
239 DWORD dwSize = sizeof(szUser);
240 DWORD dwType = REG_SZ;
241 if (RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
242 fFoundUserName = TRUE;
247 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Network\\Logon"), &hk) == 0)
249 DWORD dwSize = sizeof(szUser);
250 DWORD dwType = REG_SZ;
251 if (RegQueryValueEx (hk, TEXT("UserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
252 fFoundUserName = TRUE;
257 TCHAR szSource[ cchRESOURCE ];
258 TCHAR szTarget[ cchRESOURCE ];
260 GetString (szSource, (dwPatch) ? IDS_TITLE_VERSION : IDS_TITLE_VERSION_NOPATCH);
261 wsprintf (szTarget, szSource, szVersion, dwPatch);
262 SetDlgItemText (hDlg, IDC_TITLE_VERSION, szTarget);
264 GetDlgItemText (hDlg, IDC_TITLE_NT, szSource, cchRESOURCE);
265 wsprintf (szTarget, szSource, szUser);
266 SetDlgItemText (hDlg, IDC_TITLE_NT, szTarget);
270 void Main_OnCheckMenuRemind (void)
272 BOOL fRemind = FALSE;
273 lock_ObtainMutex(&g.credsLock);
274 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
276 if (g.aCreds[ iCreds ].fRemind)
281 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
283 if (g.aCreds[ iCreds ].fRemind != fRemind)
285 g.aCreds[ iCreds ].fRemind = fRemind;
289 lock_ReleaseMutex(&g.credsLock);
291 // Check the active tab, and fix its checkbox if necessary
293 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
294 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
295 if (ISCELLTAB(pszTab) && (*pszTab))
297 HWND hDlg = GetTabChild (hTab);
299 CheckDlgButton (hDlg, IDC_CREDS_REMIND, fRemind);
302 // Make sure the reminder timer is going
304 Main_EnableRemindTimer (fRemind);
308 void Main_OnRemindTimer (void)
310 Main_RepopulateTabs (TRUE);
312 // See if anything is close to expiring; if so, display a warning
313 // dialog. Make sure we never display a warning more than once.
316 if ((iExpired = Main_FindExpiredCreds()) != -1)
318 if (InterlockedIncrement (&g.fShowingMessage) != 1)
319 InterlockedDecrement (&g.fShowingMessage);
321 ShowObtainCreds (TRUE, g.aCreds[ iExpired ].szCell);
326 void Main_OnMouseOver (void)
328 if ((GetTickCount() - g.tickLastRetest) > cmsecMOUSEOVER)
330 Main_RepopulateTabs (TRUE);
335 void Main_OnSelectTab (void)
337 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
338 size_t iTab = TabCtrl_GetCurSel (hTab);
340 HWND hDlgOld = GetTabChild (hTab);
343 if ((hDlgNew = Main_CreateTabDialog (hTab, iTab)) != NULL)
344 ShowWindow (hDlgNew, SW_SHOW);
347 DestroyWindow (hDlgOld);
351 void Main_OnCheckTerminate (void)
354 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
356 DWORD dwSize = sizeof(g.fStartup);
357 DWORD dwType = REG_DWORD;
358 RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
362 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
369 HWND Main_CreateTabDialog (HWND hTab, size_t iTab)
375 memset (&Item, 0x00, sizeof(Item));
376 Item.mask = TCIF_PARAM;
377 if (TabCtrl_GetItem (hTab, iTab, &Item))
379 psz = (LPTSTR)(Item.lParam);
382 if (psz == dwTABPARAM_ADVANCED) // Advanced tab
384 hDlg = ModelessDialog (IDD_TAB_ADVANCED, hTab, (DLGPROC)Advanced_DlgProc);
386 else if (psz == dwTABPARAM_MOUNT) // Mount Points tab
388 hDlg = ModelessDialog (IDD_TAB_MOUNT, hTab, (DLGPROC)Mount_DlgProc);
390 else if (ISCELLTAB(psz) && !*psz) // No Creds tab
392 hDlg = ModelessDialogParam (IDD_TAB_NOCREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
394 else if (ISCELLTAB(psz) && *psz) // Creds tab for a particular cell
396 hDlg = ModelessDialogParam (IDD_TAB_CREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
403 void Main_RepopulateTabs (BOOL fDestroyInvalid)
405 static BOOL fInHere = FALSE;
410 if (IsWindowVisible (g.hMain))
411 fDestroyInvalid = FALSE;
413 // First we'll have to look around and see what credentials we currently
414 // have. This call just updates g.aCreds[]; it doesn't do anything else.
416 (void)GetCurrentCredentials();
418 // We want one tab on the main dialog for each g.aCredentials entry,
419 // and one tab for Advanced.
421 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
423 // Generate a list of the lParams we'll be giving tabs...
425 LPTSTR *aTabs = NULL;
430 lock_ObtainMutex(&g.credsLock);
431 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
433 if (g.aCreds[ iCreds ].szCell[0])
438 fDestroyInvalid = TRUE;
441 if (!fDestroyInvalid)
443 int nTabs = TabCtrl_GetItemCount(hTab);
444 for (int iTab = 0; iTab < nTabs; ++iTab)
446 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
447 if (ISCELLTAB(pszTab) && (*pszTab))
449 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
450 aTabs[ iTabOut++ ] = CloneString(pszTab);
457 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
458 aTabs[ iTabOut++ ] = CloneString (TEXT(""));
460 else for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
462 if (g.aCreds[ iCreds ].szCell[0])
464 for (size_t ii = 0; ii < iTabOut; ++ii)
466 if (!ISCELLTAB (aTabs[ii]))
468 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, aTabs[ ii ]))
473 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
474 aTabs[ iTabOut++ ] = CloneString (g.aCreds[ iCreds ].szCell);
478 lock_ReleaseMutex(&g.credsLock);
480 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
481 aTabs[ iTabOut++ ] = dwTABPARAM_MOUNT;
485 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
486 aTabs[ iTabOut++ ] = dwTABPARAM_ADVANCED;
489 // Now erase the current tabs, and re-add new ones. Remember which tab is
490 // currently selected, so we can try to go back to it later.
493 if (TabCtrl_GetItemCount(hTab))
495 LPTSTR pszTabSel = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
496 for (size_t iSel = 0; iSel < iTabOut; ++iSel)
498 if ((!ISCELLTAB(pszTabSel)) && (!ISCELLTAB(aTabs[iSel])) && (pszTabSel == aTabs[iSel]))
500 else if (ISCELLTAB(pszTabSel) && ISCELLTAB(aTabs[iSel]) && !lstrcmpi (pszTabSel, aTabs[iSel]))
505 int nTabs = TabCtrl_GetItemCount(hTab);
506 for (int iTab = 0; iTab < nTabs; ++iTab)
508 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
509 if (ISCELLTAB(pszTab))
512 TabCtrl_DeleteAllItems (hTab);
514 for (size_t ii = 0; ii < iTabOut; ++ii)
516 TCHAR szTitle[cchRESOURCE];
517 if (aTabs[ii] == dwTABPARAM_ADVANCED)
518 GetString (szTitle, IDS_ADVANCED);
519 else if (aTabs[ii] == dwTABPARAM_MOUNT)
520 GetString (szTitle, IDS_MOUNT);
521 else if ((nCreds <= 1) || (aTabs[ii][0] == TEXT('\0')))
522 GetString (szTitle, IDS_CREDENTIALS);
524 lstrcpy (szTitle, aTabs[ii]);
527 memset (&Item, 0x00, sizeof(Item));
528 Item.mask = TCIF_PARAM | TCIF_TEXT;
529 Item.pszText = szTitle;
530 Item.cchTextMax = cchRESOURCE;
531 Item.lParam = (LPARAM)(aTabs[ii]);
533 TabCtrl_InsertItem (hTab, ii, &Item);
539 TabCtrl_SetCurSel (hTab, iTabSel);
547 void Main_EnableRemindTimer (BOOL fEnable)
549 static BOOL bEnabled = FALSE;
551 if ( fEnable == FALSE && bEnabled == TRUE ) {
552 KillTimer (g.hMain, ID_REMIND_TIMER);
554 } else if ( fEnable == TRUE && bEnabled == FALSE ) {
555 SetTimer (g.hMain, ID_REMIND_TIMER, (ULONG)cmsec1MINUTE * cminREMIND_TEST, NULL);
561 size_t Main_FindExpiredCreds (void)
563 size_t retval = (size_t) -1;
564 lock_ObtainMutex(&g.expirationCheckLock);
565 lock_ObtainMutex(&g.credsLock);
566 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
568 if (!g.aCreds[ iCreds ].szCell[0])
570 if (!g.aCreds[ iCreds ].fRemind)
574 GetLocalTime (&stNow);
577 SystemTimeToFileTime (&stNow, &ftNow);
580 SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftExpires);
582 LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
583 LONGLONG llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime);
585 llNow /= c100ns1SECOND;
586 llExpires /= c100ns1SECOND;
588 if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE))
589 retval = (size_t) iCreds;
593 lock_ReleaseMutex(&g.credsLock);
594 lock_ReleaseMutex(&g.expirationCheckLock);
600 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
605 Terminate_OnInitDialog (hDlg);
612 Terminate_OnOK (hDlg);
616 EndDialog (hDlg, IDCANCEL);
626 void Terminate_OnInitDialog (HWND hDlg)
628 BOOL fPersistent = IsServicePersistent();
630 CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup);
631 CheckDlgButton (hDlg, IDC_LEAVE, fPersistent);
632 CheckDlgButton (hDlg, IDC_STOP, !fPersistent);
636 void Terminate_OnOK (HWND hDlg)
638 if (IsServiceRunning())
640 if (IsDlgButtonChecked (hDlg, IDC_STOP))
643 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL)
646 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), SERVICE_ALL_ACCESS)) != NULL)
648 SERVICE_STATUS Status;
649 ControlService (hService, SERVICE_CONTROL_STOP, &Status);
651 CloseServiceHandle (hService);
654 CloseServiceHandle (hManager);
659 g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
662 if (RegCreateKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
664 DWORD dwSize = sizeof(g.fStartup);
665 DWORD dwType = REG_DWORD;
666 RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
670 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
673 EndDialog (hDlg, IDOK);