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>
13 #include <afs/fs_utils.h>
20 * PROTOTYPES _________________________________________________________________
24 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
25 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
26 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
27 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
28 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
29 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
30 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 void WizStarting_OnInitDialog (HWND hDlg);
33 void WizStarting_OnTimer (HWND hDlg);
35 void WizCreds_OnInitDialog (HWND hDlg);
36 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
38 void WizMount_OnInitDialog (HWND hDlg);
39 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
40 BOOL WizMount_IsSubmountValid (HWND hDlg);
42 void WizMounting_OnInitDialog (HWND hDlg);
43 void WizMounting_OnFinish (HWND hDlg);
44 DWORD CALLBACK WizMounting_Thread (LPVOID lp);
48 * VARIABLES __________________________________________________________________
58 TCHAR szSubmountReq[ MAX_PATH ];
63 * WIZARD STATES ______________________________________________________________
77 static WIZARD_STATE aStates[] = {
78 { STEP_START, IDD_WIZ_START, WizStart_DlgProc },
79 { STEP_STARTING, IDD_WIZ_STARTING, WizStarting_DlgProc },
80 { STEP_CREDS, IDD_WIZ_CREDS, WizCreds_DlgProc },
81 { STEP_MOUNT, IDD_WIZ_MOUNT, WizMount_DlgProc },
82 { STEP_MOUNTING, IDD_WIZ_MOUNTING, WizMounting_DlgProc },
83 { STEP_FINISH, IDD_WIZ_FINISH, WizFinish_DlgProc },
86 static const int cStates = sizeof(aStates) / sizeof(aStates[0]);
90 * ROUTINES ___________________________________________________________________
94 void ShowStartupWizard (void)
96 if (g.pWizard != NULL) // Already showing the wizard? Stop here.
99 memset (&l, 0x00, sizeof(l));
101 g.pWizard = New(WIZARD);
103 g.pWizard->SetDialogTemplate (IDD_WIZARD, IDC_LHS, IDC_RHS, IDBACK, IDNEXT);
104 g.pWizard->SetGraphic (IDB_WIZ16, IDB_WIZ256);
105 g.pWizard->SetStates (aStates, cStates);
106 g.pWizard->SetState (STEP_START);
113 Main_RepopulateTabs (TRUE);
115 FreeDriveMapList (&l.List);
119 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
127 g.pWizard->Show(FALSE);
131 WizCommon_DlgProc (hDlg, WM_HELP, 0, 0);
138 WinHelp (GetParent(hDlg), g.szHelpFile, HELP_CONTEXT, l.idh);
145 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
147 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
152 g.pWizard->EnableButtons (NEXT_BUTTON);
153 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
154 g.pWizard->SetDefaultControl (IDNEXT);
155 l.idh = IDH_AFSCREDS_WIZ_START;
156 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
163 g.pWizard->SetState (STEP_STARTING);
169 case wcIS_STATE_DISABLED:
170 return IsServiceRunning();
182 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
184 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
189 g.pWizard->EnableButtons (0);
190 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
191 WizStarting_OnInitDialog (hDlg);
192 l.idh = IDH_AFSCREDS_WIZ_START_FAIL;
193 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
197 WizStarting_OnTimer (hDlg);
201 KillTimer (hDlg, ID_WIZARD_TIMER);
207 case wcIS_STATE_DISABLED:
208 return IsServiceRunning();
218 void WizStarting_OnInitDialog (HWND hDlg)
220 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_HIDE);
221 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_SHOW);
224 if ((hManager = OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL)
227 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), SERVICE_ALL_ACCESS)) != NULL)
229 if (StartService (hService, 0, 0))
230 TestAndDoMapShare(SERVICE_START_PENDING);
232 CloseServiceHandle (hService);
235 CloseServiceHandle (hManager);
238 SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL);
240 WizStarting_OnTimer (hDlg);
244 void WizStarting_OnTimer (HWND hDlg)
246 SERVICE_STATUS Status;
247 memset (&Status, 0x00, sizeof(Status));
248 Status.dwCurrentState = SERVICE_STOPPED;
251 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
254 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
256 QueryServiceStatus (hService, &Status);
257 CloseServiceHandle (hService);
258 TestAndDoMapShare(Status.dwCurrentState);
261 CloseServiceHandle (hManager);
264 if (Status.dwCurrentState == SERVICE_RUNNING)
266 g.pWizard->SetState (STEP_CREDS);
268 else if (Status.dwCurrentState != SERVICE_START_PENDING)
270 KillTimer (hDlg, ID_WIZARD_TIMER);
272 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW);
273 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE);
274 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
279 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
281 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
286 g.pWizard->EnableButtons (NEXT_BUTTON);
287 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
288 l.idh = IDH_AFSCREDS_WIZ_CREDS;
289 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
290 WizCreds_OnInitDialog (hDlg);
297 if (!IsDlgButtonChecked (hDlg, IDC_YESCREDS))
299 g.pWizard->SetState (STEP_MOUNT);
303 TCHAR szCell[ cchRESOURCE ];
304 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
305 TCHAR szUser[ cchRESOURCE ];
306 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
307 TCHAR szPassword[ cchRESOURCE ];
308 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
310 WizCreds_OnEnable (hDlg, FALSE);
312 if (ObtainNewCredentials (szCell, szUser, szPassword) == 0)
314 g.pWizard->SetState (STEP_MOUNT);
318 WizCreds_OnEnable (hDlg);
325 case IDC_NEWCREDS_CELL:
326 case IDC_NEWCREDS_USER:
327 case IDC_NEWCREDS_PASSWORD:
328 WizCreds_OnEnable (hDlg);
339 void WizCreds_OnInitDialog (HWND hDlg)
343 TCHAR szCell[ cchRESOURCE ] = TEXT("");
344 (void)GetDefaultCell (szCell);
345 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
347 TCHAR szUser[ cchRESOURCE ] = TEXT("");
348 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
350 DWORD dwSize = sizeof(szUser);
351 DWORD dwType = REG_SZ;
352 RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize);
355 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser);
356 g.pWizard->SetDefaultControl (IDC_NEWCREDS_PASSWORD);
358 CheckDlgButton (hDlg, IDC_NOCREDS, FALSE);
359 CheckDlgButton (hDlg, IDC_YESCREDS, TRUE);
360 WizCreds_OnEnable (hDlg);
364 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable)
366 BOOL fEnable = fAllowEnable;
368 if (IsDlgButtonChecked (hDlg, IDC_YESCREDS))
370 TCHAR szText[ cchRESOURCE ];
371 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
375 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szText, cchRESOURCE);
379 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szText, cchRESOURCE);
384 g.pWizard->EnableButtons ((fEnable) ? NEXT_BUTTON : 0);
386 EnableWindow (GetDlgItem (hDlg, IDC_NOCREDS), fAllowEnable);
387 EnableWindow (GetDlgItem (hDlg, IDC_YESCREDS), fAllowEnable);
389 fEnable = fAllowEnable && IsDlgButtonChecked (hDlg, IDC_YESCREDS);
390 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), fEnable);
391 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), fEnable);
392 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), fEnable);
396 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
398 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
403 g.pWizard->EnableButtons (BACK_BUTTON | NEXT_BUTTON);
404 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
405 g.pWizard->SetDefaultControl (IDNEXT);
406 l.idh = IDH_AFSCREDS_WIZ_MOUNT;
407 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
409 WizMount_OnInitDialog (hDlg);
416 g.pWizard->SetState (STEP_CREDS);
420 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
422 if (!WizMount_IsSubmountValid (hDlg))
424 Message (MB_ICONHAND, IDS_BADSUB_TITLE, IDS_BADSUB_DESC);
427 int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
428 int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
429 l.List.aDriveMap[ iDrive ].chDrive = chDRIVE_A + iDrive;
430 l.List.aDriveMap[ iDrive ].fActive = FALSE;
431 l.List.aDriveMap[ iDrive ].fPersistent = TRUE;
432 GetDlgItemText (hDlg, IDC_MAP_PATH, l.List.aDriveMap[ iDrive ].szMapping, MAX_PATH);
433 GetDlgItemText (hDlg, IDC_MAP_DESC, l.szSubmountReq, MAX_PATH);
434 WriteDriveMappings (&l.List);
436 g.pWizard->SetState (STEP_MOUNTING);
442 WizMount_OnEnable (hDlg);
453 void WizMount_OnInitDialog (HWND hDlg)
455 QueryDriveMapList (&l.List);
458 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
460 if (l.List.aDriveMap[iDrive].szMapping[0])
466 g.pWizard->SetState (STEP_MOUNTING);
470 // Fill in the combo box
472 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
475 HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
476 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
478 for (int ii = 0; ii < 26; ++ii)
480 if (!(dwDrives & (1<<ii)))
482 TCHAR szText[ cchRESOURCE ];
483 GetString (szText, IDS_MAP_LETTER);
486 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
487 *pch = TEXT('A') + ii;
489 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
490 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
496 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
497 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
499 SetDlgItemText (hDlg, IDC_MAP_PATH, cm_slash_mount_root);
501 CheckDlgButton (hDlg, IDC_NOMAP, FALSE);
502 CheckDlgButton (hDlg, IDC_YESMAP, TRUE);
506 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable)
508 BOOL fEnable = fAllowEnable;
510 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
512 TCHAR szText[ cchRESOURCE ];
513 GetDlgItemText (hDlg, IDC_MAP_PATH, szText, cchRESOURCE);
518 EnableWindow (GetDlgItem (hDlg, IDC_NOMAP), fAllowEnable);
519 EnableWindow (GetDlgItem (hDlg, IDC_YESMAP), fAllowEnable);
521 EnableWindow (GetDlgItem (hDlg, IDNEXT), fEnable);
522 g.pWizard->EnableButtons ((fEnable) ? (BACK_BUTTON | NEXT_BUTTON) : (BACK_BUTTON));
524 fEnable = fAllowEnable && (!IsDlgButtonChecked (hDlg, IDC_NOMAP));
526 EnableWindow (GetDlgItem (hDlg, IDC_MAP_LETTER), fEnable);
527 EnableWindow (GetDlgItem (hDlg, IDC_MAP_PATH), fEnable);
531 BOOL WizMount_IsSubmountValid (HWND hDlg)
533 TCHAR szSubmount[ MAX_PATH ];
534 GetDlgItemText (hDlg, IDC_MAP_DESC, szSubmount, MAX_PATH);
539 return IsValidSubmountName (szSubmount);
543 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
545 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
550 g.pWizard->EnableButtons (0);
551 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
552 g.pWizard->SetDefaultControl (IDNEXT);
553 l.idh = IDH_AFSCREDS_WIZ_MOUNT_FAIL;
554 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
555 WizMounting_OnInitDialog (hDlg);
562 g.pWizard->SetState (STEP_FINISH);
566 WizMounting_OnFinish (hDlg);
572 WizMount_OnEnable (hDlg);
578 case wcIS_STATE_DISABLED:
580 for (ii = 0; ii < 26; ++ii)
582 if (!l.List.aDriveMap[ ii ].szMapping[0])
584 if (l.List.aDriveMap[ ii ].fActive)
600 void WizMounting_OnInitDialog (HWND hDlg)
603 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_SHOW);
604 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_HIDE);
607 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)WizMounting_Thread, (LPVOID)0, 0, &idThread);
611 void WizMounting_OnFinish (HWND hDlg)
613 FreeDriveMapList (&l.List);
614 QueryDriveMapList (&l.List);
616 size_t cInactive = 0;
617 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
619 if (!l.List.aDriveMap[iDrive].szMapping[0])
621 if (l.List.aDriveMap[iDrive].fActive)
628 g.pWizard->SetState (STEP_FINISH);
632 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_HIDE);
633 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_SHOW);
634 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
639 DWORD CALLBACK WizMounting_Thread (LPVOID lp)
641 size_t cInactive = 0;
642 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
644 if (!l.List.aDriveMap[iDrive].szMapping[0])
646 if (l.List.aDriveMap[iDrive].fActive)
650 (void)ActivateDriveMap (l.List.aDriveMap[iDrive].chDrive, l.List.aDriveMap[iDrive].szMapping, l.szSubmountReq, l.List.aDriveMap[iDrive].fPersistent, &status);
651 l.szSubmountReq[0] = TEXT('\0');
654 PostMessage (l.hDlg, WM_COMMAND, IDC_MAP_FINISH, 0);
659 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
661 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
666 g.pWizard->EnableButtons (NEXT_BUTTON);
667 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_FINISH);
668 g.pWizard->SetDefaultControl (IDNEXT);
669 EnableWindow (GetDlgItem (GetParent (hDlg), IDCANCEL), FALSE);
670 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
677 g.pWizard->Show (FALSE);