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
14 #include <afs/param.h>
16 #include <afs/fs_utils.h>
23 * PROTOTYPES _________________________________________________________________
27 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
28 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
29 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
30 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
31 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
33 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
35 void WizStarting_OnInitDialog (HWND hDlg);
36 void WizStarting_OnTimer (HWND hDlg);
38 void WizCreds_OnInitDialog (HWND hDlg);
39 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
41 void WizMount_OnInitDialog (HWND hDlg);
42 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
43 BOOL WizMount_IsSubmountValid (HWND hDlg);
45 void WizMounting_OnInitDialog (HWND hDlg);
46 void WizMounting_OnFinish (HWND hDlg);
47 DWORD CALLBACK WizMounting_Thread (LPVOID lp);
51 * VARIABLES __________________________________________________________________
61 TCHAR szSubmountReq[ MAX_PATH ];
66 * WIZARD STATES ______________________________________________________________
80 static WIZARD_STATE aStates[] = {
81 { STEP_START, IDD_WIZ_START, (DLGPROC)WizStart_DlgProc, 0 },
82 { STEP_STARTING, IDD_WIZ_STARTING, (DLGPROC)WizStarting_DlgProc, 0 },
83 { STEP_CREDS, IDD_WIZ_CREDS, (DLGPROC)WizCreds_DlgProc, 0 },
84 { STEP_MOUNT, IDD_WIZ_MOUNT, (DLGPROC)WizMount_DlgProc, 0 },
85 { STEP_MOUNTING, IDD_WIZ_MOUNTING, (DLGPROC)WizMounting_DlgProc, 0 },
86 { STEP_FINISH, IDD_WIZ_FINISH, (DLGPROC)WizFinish_DlgProc, 0 }
89 static const int cStates = sizeof(aStates) / sizeof(aStates[0]);
93 * ROUTINES ___________________________________________________________________
97 void ShowStartupWizard (void)
99 if (g.pWizard != NULL) // Already showing the wizard? Stop here.
102 memset (&l, 0x00, sizeof(l));
104 g.pWizard = New(WIZARD);
106 g.pWizard->SetDialogTemplate (IDD_WIZARD, IDC_LHS, IDC_RHS, IDBACK, IDNEXT);
107 g.pWizard->SetGraphic (IDB_WIZ16, IDB_WIZ256);
108 g.pWizard->SetStates (aStates, cStates);
109 g.pWizard->SetState (STEP_START);
116 Main_RepopulateTabs (TRUE);
118 FreeDriveMapList (&l.List);
122 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
130 g.pWizard->Show(FALSE);
134 WizCommon_DlgProc (hDlg, WM_HELP, 0, 0);
141 WinHelp (GetParent(hDlg), g.szHelpFile, HELP_CONTEXT, l.idh);
148 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
150 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
155 g.pWizard->EnableButtons (NEXT_BUTTON);
156 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
157 g.pWizard->SetDefaultControl (IDNEXT);
158 l.idh = IDH_AFSCREDS_WIZ_START;
159 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
166 g.pWizard->SetState (STEP_STARTING);
172 case wcIS_STATE_DISABLED:
173 return IsServiceRunning();
185 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
187 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
192 g.pWizard->EnableButtons (0);
193 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
194 WizStarting_OnInitDialog (hDlg);
195 l.idh = IDH_AFSCREDS_WIZ_START_FAIL;
196 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
200 WizStarting_OnTimer (hDlg);
204 KillTimer (hDlg, ID_WIZARD_TIMER);
210 case wcIS_STATE_DISABLED:
211 return IsServiceRunning();
221 void WizStarting_OnInitDialog (HWND hDlg)
223 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_HIDE);
224 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_SHOW);
227 if ((hManager = OpenSCManager (NULL, NULL,
229 SC_MANAGER_ENUMERATE_SERVICE |
230 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
233 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
234 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
236 if (StartService (hService, 0, 0))
237 TestAndDoMapShare(SERVICE_START_PENDING);
239 CloseServiceHandle (hService);
242 CloseServiceHandle (hManager);
245 SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL);
247 WizStarting_OnTimer (hDlg);
251 void WizStarting_OnTimer (HWND hDlg)
253 SERVICE_STATUS Status;
254 memset (&Status, 0x00, sizeof(Status));
255 Status.dwCurrentState = SERVICE_STOPPED;
258 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
261 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
263 QueryServiceStatus (hService, &Status);
264 CloseServiceHandle (hService);
265 TestAndDoMapShare(Status.dwCurrentState);
268 CloseServiceHandle (hManager);
271 if (Status.dwCurrentState == SERVICE_RUNNING)
273 g.pWizard->SetState (STEP_CREDS);
275 else if (Status.dwCurrentState != SERVICE_START_PENDING)
277 KillTimer (hDlg, ID_WIZARD_TIMER);
279 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW);
280 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE);
281 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
286 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
288 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
293 g.pWizard->EnableButtons (NEXT_BUTTON);
294 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
295 l.idh = IDH_AFSCREDS_WIZ_CREDS;
296 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
297 WizCreds_OnInitDialog (hDlg);
304 if (!IsDlgButtonChecked (hDlg, IDC_YESCREDS))
306 g.pWizard->SetState (STEP_MOUNT);
310 TCHAR szCell[ cchRESOURCE ];
311 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
312 TCHAR szUser[ cchRESOURCE ];
313 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
314 TCHAR szPassword[ cchRESOURCE ];
315 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
317 WizCreds_OnEnable (hDlg, FALSE);
319 if (ObtainNewCredentials (szCell, szUser, szPassword, FALSE) == 0)
321 g.pWizard->SetState (STEP_MOUNT);
325 WizCreds_OnEnable (hDlg);
332 case IDC_NEWCREDS_CELL:
333 case IDC_NEWCREDS_USER:
334 case IDC_NEWCREDS_PASSWORD:
335 WizCreds_OnEnable (hDlg);
346 void WizCreds_OnInitDialog (HWND hDlg)
350 TCHAR szCell[ cchRESOURCE ] = TEXT("");
351 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
353 TCHAR szUser[ cchRESOURCE ] = TEXT("");
354 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
356 DWORD dwSize = sizeof(szUser);
357 DWORD dwType = REG_SZ;
358 RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize);
361 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser);
362 g.pWizard->SetDefaultControl (IDC_NEWCREDS_PASSWORD);
364 CheckDlgButton (hDlg, IDC_NOCREDS, FALSE);
365 CheckDlgButton (hDlg, IDC_YESCREDS, TRUE);
366 WizCreds_OnEnable (hDlg);
370 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable)
372 BOOL fEnable = fAllowEnable;
374 if (IsDlgButtonChecked (hDlg, IDC_YESCREDS))
376 TCHAR szText[ cchRESOURCE ];
377 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
381 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szText, cchRESOURCE);
385 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szText, cchRESOURCE);
390 g.pWizard->EnableButtons ((fEnable) ? NEXT_BUTTON : 0);
392 EnableWindow (GetDlgItem (hDlg, IDC_NOCREDS), fAllowEnable);
393 EnableWindow (GetDlgItem (hDlg, IDC_YESCREDS), fAllowEnable);
395 fEnable = fAllowEnable && IsDlgButtonChecked (hDlg, IDC_YESCREDS);
396 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), fEnable);
397 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), fEnable);
398 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), fEnable);
402 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
404 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
409 g.pWizard->EnableButtons (BACK_BUTTON | NEXT_BUTTON);
410 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
411 g.pWizard->SetDefaultControl (IDNEXT);
412 l.idh = IDH_AFSCREDS_WIZ_MOUNT;
413 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
415 WizMount_OnInitDialog (hDlg);
422 g.pWizard->SetState (STEP_CREDS);
426 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
428 if (!WizMount_IsSubmountValid (hDlg))
430 Message (MB_ICONHAND, IDS_BADSUB_TITLE, IDS_BADSUB_DESC);
433 int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
434 int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
435 l.List.aDriveMap[ iDrive ].chDrive = chDRIVE_A + iDrive;
436 l.List.aDriveMap[ iDrive ].fActive = FALSE;
437 l.List.aDriveMap[ iDrive ].fPersistent = TRUE;
438 GetDlgItemText (hDlg, IDC_MAP_PATH, l.List.aDriveMap[ iDrive ].szMapping, MAX_PATH);
439 GetDlgItemText (hDlg, IDC_MAP_DESC, l.szSubmountReq, MAX_PATH);
440 WriteDriveMappings (&l.List);
442 g.pWizard->SetState (STEP_MOUNTING);
448 WizMount_OnEnable (hDlg);
459 void WizMount_OnInitDialog (HWND hDlg)
461 QueryDriveMapList (&l.List);
464 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
466 if (l.List.aDriveMap[iDrive].szMapping[0])
472 g.pWizard->SetState (STEP_MOUNTING);
476 // Fill in the combo box
478 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
481 HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
482 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
484 for (int ii = 0; ii < 26; ++ii)
486 if (!(dwDrives & (1<<ii)))
488 TCHAR szText[ cchRESOURCE ];
489 GetString (szText, IDS_MAP_LETTER);
492 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
493 *pch = TEXT('A') + ii;
495 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
496 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
502 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
503 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
505 SetDlgItemText (hDlg, IDC_MAP_PATH, cm_slash_mount_root);
507 CheckDlgButton (hDlg, IDC_NOMAP, FALSE);
508 CheckDlgButton (hDlg, IDC_YESMAP, TRUE);
512 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable)
514 BOOL fEnable = fAllowEnable;
516 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
518 TCHAR szText[ cchRESOURCE ];
519 GetDlgItemText (hDlg, IDC_MAP_PATH, szText, cchRESOURCE);
524 EnableWindow (GetDlgItem (hDlg, IDC_NOMAP), fAllowEnable);
525 EnableWindow (GetDlgItem (hDlg, IDC_YESMAP), fAllowEnable);
527 EnableWindow (GetDlgItem (hDlg, IDNEXT), fEnable);
528 g.pWizard->EnableButtons ((fEnable) ? (BACK_BUTTON | NEXT_BUTTON) : (BACK_BUTTON));
530 fEnable = fAllowEnable && (!IsDlgButtonChecked (hDlg, IDC_NOMAP));
532 EnableWindow (GetDlgItem (hDlg, IDC_MAP_LETTER), fEnable);
533 EnableWindow (GetDlgItem (hDlg, IDC_MAP_PATH), fEnable);
537 BOOL WizMount_IsSubmountValid (HWND hDlg)
539 TCHAR szSubmount[ MAX_PATH ];
540 GetDlgItemText (hDlg, IDC_MAP_DESC, szSubmount, MAX_PATH);
545 return IsValidSubmountName (szSubmount);
549 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
551 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
556 g.pWizard->EnableButtons (0);
557 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
558 g.pWizard->SetDefaultControl (IDNEXT);
559 l.idh = IDH_AFSCREDS_WIZ_MOUNT_FAIL;
560 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
561 WizMounting_OnInitDialog (hDlg);
568 g.pWizard->SetState (STEP_FINISH);
572 WizMounting_OnFinish (hDlg);
578 WizMount_OnEnable (hDlg);
584 case wcIS_STATE_DISABLED:
586 for (ii = 0; ii < 26; ++ii)
588 if (!l.List.aDriveMap[ ii ].szMapping[0])
590 if (l.List.aDriveMap[ ii ].fActive)
606 void WizMounting_OnInitDialog (HWND hDlg)
609 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_SHOW);
610 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_HIDE);
613 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)WizMounting_Thread, (LPVOID)0, 0, &idThread);
617 void WizMounting_OnFinish (HWND hDlg)
619 FreeDriveMapList (&l.List);
620 QueryDriveMapList (&l.List);
622 size_t cInactive = 0;
623 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
625 if (!l.List.aDriveMap[iDrive].szMapping[0])
627 if (l.List.aDriveMap[iDrive].fActive)
634 g.pWizard->SetState (STEP_FINISH);
638 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_HIDE);
639 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_SHOW);
640 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
645 DWORD CALLBACK WizMounting_Thread (LPVOID lp)
647 size_t cInactive = 0;
648 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
650 if (!l.List.aDriveMap[iDrive].szMapping[0])
652 if (l.List.aDriveMap[iDrive].fActive)
656 (void)ActivateDriveMap (l.List.aDriveMap[iDrive].chDrive, l.List.aDriveMap[iDrive].szMapping, l.szSubmountReq, l.List.aDriveMap[iDrive].fPersistent, &status);
657 l.szSubmountReq[0] = TEXT('\0');
660 PostMessage (l.hDlg, WM_COMMAND, IDC_MAP_FINISH, 0);
665 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
667 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
672 g.pWizard->EnableButtons (NEXT_BUTTON);
673 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_FINISH);
674 g.pWizard->SetDefaultControl (IDNEXT);
675 EnableWindow (GetDlgItem (GetParent (hDlg), IDCANCEL), FALSE);
676 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
683 g.pWizard->Show (FALSE);