10 * DEFINITIONS ________________________________________________________________
14 #define ID_REMIND_TIMER 1000
15 #define ID_SERVICE_TIMER 1001
17 #define cREALLOC_TABS 4
19 #define dwTABPARAM_MOUNT (LPTSTR)0
20 #define dwTABPARAM_ADVANCED (LPTSTR)1
21 #define ISCELLTAB(_psz) ((HIWORD((LONG)(_psz))) != 0)
25 * PROTOTYPES _________________________________________________________________
29 void Main_OnInitDialog (HWND hDlg);
30 void Main_OnCheckMenuRemind (void);
31 void Main_OnRemindTimer (void);
32 void Main_OnMouseOver (void);
33 void Main_OnSelectTab (void);
34 void Main_OnCheckTerminate (void);
35 HWND Main_CreateTabDialog (HWND hTab, size_t iTab);
37 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
38 void Terminate_OnInitDialog (HWND hDlg);
39 void Terminate_OnOK (HWND hDlg);
43 * ROUTINES ___________________________________________________________________
47 BOOL CALLBACK Main_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
49 static UINT msgCheckTerminate = 0;
50 if (msgCheckTerminate == 0)
51 msgCheckTerminate = RegisterWindowMessage (TEXT("AfsCredsCheckTerminate"));
53 if (msg == msgCheckTerminate)
55 Main_OnCheckTerminate();
61 Main_OnInitDialog (hDlg);
65 Creds_CloseLibraries();
66 ChangeTrayIcon (NIM_DELETE);
72 Main_RepopulateTabs (FALSE);
85 if (g.fIsWinNT || IsServiceRunning())
87 if (!lp) // Got here from "/show" parameter? switch tabs.
89 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
90 TabCtrl_SetCurSel (hTab, 0);
97 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
102 if (g.fIsWinNT && IsServiceRunning())
103 ModalDialog (IDD_TERMINATE, NULL, (DLGPROC)Terminate_DlgProc);
105 ModalDialog (IDD_TERMINATE_SMALL, NULL, (DLGPROC)Terminate_DlgProc);
106 else // (!g.fIsWinNT)
107 ModalDialog (IDD_TERMINATE_SMALL_95, NULL, (DLGPROC)Terminate_DlgProc);
110 case M_TERMINATE_NOW:
115 Main_OnCheckMenuRemind();
121 Main_OnRemindTimer();
125 switch (((NMHDR*)lp)->code)
137 if (IsServiceRunning() || !IsServiceConfigured())
139 else if (!g.fIsWinNT)
140 Message (MB_ICONHAND, IDS_UNCONFIG_TITLE_95, IDS_UNCONFIG_DESC_95);
147 if ((hm = TaLocale_LoadMenu (MENU_TRAYICON)) != 0)
152 HMENU hmDummy = CreateMenu();
153 InsertMenu (hmDummy, 0, MF_POPUP, (UINT)hm, NULL);
155 BOOL fRemind = FALSE;
156 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
158 if (g.aCreds[ iCreds ].fRemind)
161 CheckMenuItem (hm, M_REMIND, MF_BYCOMMAND | ((fRemind) ? MF_CHECKED : MF_UNCHECKED));
163 TrackPopupMenu (GetSubMenu (hmDummy, 0),
164 TPM_RIGHTALIGN | TPM_RIGHTBUTTON,
165 pt.x, pt.y, NULL, hDlg, NULL);
167 DestroyMenu (hmDummy);
182 void Main_Show (BOOL fShow)
186 ShowWindow (g.hMain, SW_SHOW);
187 SetWindowPos (g.hMain, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
188 SetForegroundWindow (g.hMain);
192 SetWindowPos (g.hMain, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
197 void Main_OnInitDialog (HWND hDlg)
202 GetString (szTitle, IDS_TITLE_95);
203 SetWindowText (hDlg, szTitle);
206 TCHAR szVersion[256];
209 GetString (szVersion, IDS_UNKNOWN);
210 GetString (szUser, IDS_UNKNOWN);
213 if (RegOpenKey (HKEY_LOCAL_MACHINE, REGSTR_PATH_AFS, &hk) == 0)
215 DWORD dwSize = sizeof(szVersion);
216 DWORD dwType = REG_SZ;
217 RegQueryValueEx (hk, REGVAL_AFS_VERSION, NULL, &dwType, (PBYTE)szVersion, &dwSize);
219 dwSize = sizeof(dwPatch);
221 RegQueryValueEx (hk, REGVAL_AFS_PATCH, NULL, &dwType, (PBYTE)&dwPatch, &dwSize);
225 BOOL fFoundUserName = FALSE;
226 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
228 DWORD dwSize = sizeof(szUser);
229 DWORD dwType = REG_SZ;
230 if (RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
231 fFoundUserName = TRUE;
236 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Network\\Logon"), &hk) == 0)
238 DWORD dwSize = sizeof(szUser);
239 DWORD dwType = REG_SZ;
240 if (RegQueryValueEx (hk, TEXT("UserName"), NULL, &dwType, (PBYTE)szUser, &dwSize) == 0)
241 fFoundUserName = TRUE;
246 TCHAR szSource[ cchRESOURCE ];
247 TCHAR szTarget[ cchRESOURCE ];
249 GetString (szSource, (dwPatch) ? IDS_TITLE_VERSION : IDS_TITLE_VERSION_NOPATCH);
250 wsprintf (szTarget, szSource, szVersion, dwPatch);
251 SetDlgItemText (hDlg, IDC_TITLE_VERSION, szTarget);
253 GetDlgItemText (hDlg, IDC_TITLE_NT, szSource, cchRESOURCE);
254 wsprintf (szTarget, szSource, szUser);
255 SetDlgItemText (hDlg, IDC_TITLE_NT, szTarget);
259 void Main_OnCheckMenuRemind (void)
261 BOOL fRemind = FALSE;
262 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
264 if (g.aCreds[ iCreds ].fRemind)
269 for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
271 if (g.aCreds[ iCreds ].fRemind != fRemind)
273 g.aCreds[ iCreds ].fRemind = fRemind;
278 // Check the active tab, and fix its checkbox if necessary
280 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
281 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
282 if (ISCELLTAB(pszTab) && (*pszTab))
284 HWND hDlg = GetTabChild (hTab);
286 CheckDlgButton (hDlg, IDC_CREDS_REMIND, fRemind);
289 // Make sure the reminder timer is going
291 Main_EnableRemindTimer (TRUE);
295 void Main_OnRemindTimer (void)
297 Main_RepopulateTabs (TRUE);
299 // See if anything is close to expiring; if so, display a warning
300 // dialog. Make sure we never display a warning more than once.
303 if ((iExpired = Main_FindExpiredCreds()) != -1)
305 if (InterlockedIncrement (&g.fShowingMessage) != 1)
306 InterlockedDecrement (&g.fShowingMessage);
308 ShowObtainCreds (TRUE, g.aCreds[ iExpired ].szCell);
313 void Main_OnMouseOver (void)
315 if ((GetTickCount() - g.tickLastRetest) > cmsecMOUSEOVER)
317 Main_RepopulateTabs (TRUE);
322 void Main_OnSelectTab (void)
324 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
325 size_t iTab = TabCtrl_GetCurSel (hTab);
327 HWND hDlgOld = GetTabChild (hTab);
330 if ((hDlgNew = Main_CreateTabDialog (hTab, iTab)) != NULL)
331 ShowWindow (hDlgNew, SW_SHOW);
334 DestroyWindow (hDlgOld);
338 void Main_OnCheckTerminate (void)
341 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
343 DWORD dwSize = sizeof(g.fStartup);
344 DWORD dwType = REG_DWORD;
345 RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
349 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
356 HWND Main_CreateTabDialog (HWND hTab, size_t iTab)
362 memset (&Item, 0x00, sizeof(Item));
363 Item.mask = TCIF_PARAM;
364 if (TabCtrl_GetItem (hTab, iTab, &Item))
366 psz = (LPTSTR)(Item.lParam);
369 if (psz == dwTABPARAM_ADVANCED) // Advanced tab
371 hDlg = ModelessDialog (IDD_TAB_ADVANCED, hTab, (DLGPROC)Advanced_DlgProc);
373 else if (psz == dwTABPARAM_MOUNT) // Mount Points tab
375 hDlg = ModelessDialog (IDD_TAB_MOUNT, hTab, (DLGPROC)Mount_DlgProc);
377 else if (ISCELLTAB(psz) && !*psz) // No Creds tab
379 hDlg = ModelessDialogParam (IDD_TAB_NOCREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
381 else if (ISCELLTAB(psz) && *psz) // Creds tab for a particular cell
383 hDlg = ModelessDialogParam (IDD_TAB_CREDS, hTab, (DLGPROC)Creds_DlgProc, (LPARAM)psz);
390 void Main_RepopulateTabs (BOOL fDestroyInvalid)
392 static BOOL fInHere = FALSE;
397 if (IsWindowVisible (g.hMain))
398 fDestroyInvalid = FALSE;
399 Main_EnableRemindTimer (FALSE);
401 // First we'll have to look around and see what credentials we currently
402 // have. This call just updates g.aCreds[]; it doesn't do anything else.
404 (void)GetCurrentCredentials();
406 // We want one tab on the main dialog for each g.aCredentials entry,
407 // and one tab for Advanced.
409 HWND hTab = GetDlgItem (g.hMain, IDC_TABS);
411 // Generate a list of the lParams we'll be giving tabs...
413 LPTSTR *aTabs = NULL;
418 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
420 if (g.aCreds[ iCreds ].szCell[0])
425 fDestroyInvalid = TRUE;
428 if (!fDestroyInvalid)
430 int nTabs = TabCtrl_GetItemCount(hTab);
431 for (int iTab = 0; iTab < nTabs; ++iTab)
433 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
434 if (ISCELLTAB(pszTab) && (*pszTab))
436 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
437 aTabs[ iTabOut++ ] = CloneString(pszTab);
444 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
445 aTabs[ iTabOut++ ] = CloneString (TEXT(""));
447 else for (iCreds = 0; iCreds < g.cCreds; ++iCreds)
449 if (g.aCreds[ iCreds ].szCell[0])
451 for (size_t ii = 0; ii < iTabOut; ++ii)
453 if (!ISCELLTAB (aTabs[ii]))
455 if (!lstrcmpi (g.aCreds[ iCreds ].szCell, aTabs[ ii ]))
460 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
461 aTabs[ iTabOut++ ] = CloneString (g.aCreds[ iCreds ].szCell);
466 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
467 aTabs[ iTabOut++ ] = dwTABPARAM_MOUNT;
471 if (REALLOC (aTabs, cTabs, 1+iTabOut, cREALLOC_TABS))
472 aTabs[ iTabOut++ ] = dwTABPARAM_ADVANCED;
475 // Now erase the current tabs, and re-add new ones. Remember which tab is
476 // currently selected, so we can try to go back to it later.
479 if (TabCtrl_GetItemCount(hTab))
481 LPTSTR pszTabSel = (LPTSTR)GetTabParam (hTab, TabCtrl_GetCurSel(hTab));
482 for (size_t iSel = 0; iSel < iTabOut; ++iSel)
484 if ((!ISCELLTAB(pszTabSel)) && (!ISCELLTAB(aTabs[iSel])) && (pszTabSel == aTabs[iSel]))
486 else if (ISCELLTAB(pszTabSel) && ISCELLTAB(aTabs[iSel]) && !lstrcmpi (pszTabSel, aTabs[iSel]))
491 int nTabs = TabCtrl_GetItemCount(hTab);
492 for (int iTab = 0; iTab < nTabs; ++iTab)
494 LPTSTR pszTab = (LPTSTR)GetTabParam (hTab, iTab);
495 if (ISCELLTAB(pszTab))
498 TabCtrl_DeleteAllItems (hTab);
500 for (size_t ii = 0; ii < iTabOut; ++ii)
502 TCHAR szTitle[cchRESOURCE];
503 if (aTabs[ii] == dwTABPARAM_ADVANCED)
504 GetString (szTitle, IDS_ADVANCED);
505 else if (aTabs[ii] == dwTABPARAM_MOUNT)
506 GetString (szTitle, IDS_MOUNT);
507 else if ((nCreds <= 1) || (aTabs[ii][0] == TEXT('\0')))
508 GetString (szTitle, IDS_CREDENTIALS);
510 lstrcpy (szTitle, aTabs[ii]);
513 memset (&Item, 0x00, sizeof(Item));
514 Item.mask = TCIF_PARAM | TCIF_TEXT;
515 Item.pszText = szTitle;
516 Item.cchTextMax = cchRESOURCE;
517 Item.lParam = (LPARAM)(aTabs[ii]);
519 TabCtrl_InsertItem (hTab, ii, &Item);
525 TabCtrl_SetCurSel (hTab, iTabSel);
527 Main_EnableRemindTimer (TRUE);
534 void Main_EnableRemindTimer (BOOL fEnable)
536 KillTimer (g.hMain, ID_REMIND_TIMER);
539 SetTimer (g.hMain, ID_REMIND_TIMER, (ULONG)cmsec1MINUTE * cminREMIND_TEST, NULL);
543 size_t Main_FindExpiredCreds (void)
545 for (size_t iCreds = 0; iCreds < g.cCreds; ++iCreds)
547 if (!g.aCreds[ iCreds ].szCell[0])
549 if (!g.aCreds[ iCreds ].fRemind)
553 GetLocalTime (&stNow);
556 SystemTimeToFileTime (&stNow, &ftNow);
559 SystemTimeToFileTime (&g.aCreds[ iCreds ].stExpires, &ftExpires);
561 LONGLONG llNow = (((LONGLONG)ftNow.dwHighDateTime) << 32) + (LONGLONG)(ftNow.dwLowDateTime);
562 LONGLONG llExpires = (((LONGLONG)ftExpires.dwHighDateTime) << 32) + (LONGLONG)(ftExpires.dwLowDateTime);
564 llNow /= c100ns1SECOND;
565 llExpires /= c100ns1SECOND;
567 if (llExpires <= (llNow + (LONGLONG)cminREMIND_WARN * csec1MINUTE))
575 BOOL CALLBACK Terminate_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
580 Terminate_OnInitDialog (hDlg);
587 Terminate_OnOK (hDlg);
591 EndDialog (hDlg, IDCANCEL);
601 void Terminate_OnInitDialog (HWND hDlg)
603 BOOL fPersistent = IsServicePersistent();
605 CheckDlgButton (hDlg, IDC_STARTUP, g.fStartup);
606 CheckDlgButton (hDlg, IDC_LEAVE, fPersistent);
607 CheckDlgButton (hDlg, IDC_STOP, !fPersistent);
611 void Terminate_OnOK (HWND hDlg)
613 if (IsServiceRunning())
615 if (IsDlgButtonChecked (hDlg, IDC_STOP))
618 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL)
621 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), SERVICE_ALL_ACCESS)) != NULL)
623 SERVICE_STATUS Status;
624 ControlService (hService, SERVICE_CONTROL_STOP, &Status);
626 CloseServiceHandle (hService);
629 CloseServiceHandle (hManager);
634 g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
637 if (RegCreateKey (HKEY_LOCAL_MACHINE, TEXT("System\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters"), &hk) == 0)
639 DWORD dwSize = sizeof(g.fStartup);
640 DWORD dwType = REG_DWORD;
641 RegSetValueEx (hk, TEXT("ShowTrayIcon"), NULL, dwType, (PBYTE)&g.fStartup, dwSize);
645 Shortcut_FixStartup (cszSHORTCUT_NAME, g.fStartup);
648 EndDialog (hDlg, IDOK);