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 <afsconfig.h>
15 #include <afs/param.h>
18 #include <afs/fs_utils.h>
25 * PROTOTYPES _________________________________________________________________
29 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
30 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
31 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
33 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
34 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
35 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
37 void WizStarting_OnInitDialog (HWND hDlg);
38 void WizStarting_OnTimer (HWND hDlg);
40 void WizCreds_OnInitDialog (HWND hDlg);
41 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
43 void WizMount_OnInitDialog (HWND hDlg);
44 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
45 BOOL WizMount_IsSubmountValid (HWND hDlg);
47 void WizMounting_OnInitDialog (HWND hDlg);
48 void WizMounting_OnFinish (HWND hDlg);
49 DWORD CALLBACK WizMounting_Thread (LPVOID lp);
53 * VARIABLES __________________________________________________________________
63 TCHAR szSubmountReq[ MAX_PATH ];
68 * WIZARD STATES ______________________________________________________________
82 static WIZARD_STATE aStates[] = {
83 { STEP_START, IDD_WIZ_START, (DLGPROC)WizStart_DlgProc, 0 },
84 { STEP_STARTING, IDD_WIZ_STARTING, (DLGPROC)WizStarting_DlgProc, 0 },
85 { STEP_CREDS, IDD_WIZ_CREDS, (DLGPROC)WizCreds_DlgProc, 0 },
86 { STEP_MOUNT, IDD_WIZ_MOUNT, (DLGPROC)WizMount_DlgProc, 0 },
87 { STEP_MOUNTING, IDD_WIZ_MOUNTING, (DLGPROC)WizMounting_DlgProc, 0 },
88 { STEP_FINISH, IDD_WIZ_FINISH, (DLGPROC)WizFinish_DlgProc, 0 }
91 static const int cStates = sizeof(aStates) / sizeof(aStates[0]);
95 * ROUTINES ___________________________________________________________________
99 void ShowStartupWizard (void)
101 if (g.pWizard != NULL) // Already showing the wizard? Stop here.
104 memset (&l, 0x00, sizeof(l));
106 g.pWizard = New(WIZARD);
108 g.pWizard->SetDialogTemplate (IDD_WIZARD, IDC_LHS, IDC_RHS, IDBACK, IDNEXT);
109 g.pWizard->SetGraphic (IDB_WIZ16, IDB_WIZ256);
110 g.pWizard->SetStates (aStates, cStates);
111 g.pWizard->SetState (STEP_START);
118 Main_RepopulateTabs (TRUE);
120 FreeDriveMapList (&l.List);
124 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
132 g.pWizard->Show(FALSE);
136 WizCommon_DlgProc (hDlg, WM_HELP, 0, 0);
143 WinHelp (GetParent(hDlg), g.szHelpFile, HELP_CONTEXT, l.idh);
150 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
152 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
157 g.pWizard->EnableButtons (NEXT_BUTTON);
158 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
159 g.pWizard->SetDefaultControl (IDNEXT);
160 l.idh = IDH_AFSCREDS_WIZ_START;
161 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
168 g.pWizard->SetState (STEP_STARTING);
174 case wcIS_STATE_DISABLED:
175 return IsServiceRunning();
187 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
189 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
194 g.pWizard->EnableButtons (0);
195 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
196 WizStarting_OnInitDialog (hDlg);
197 l.idh = IDH_AFSCREDS_WIZ_START_FAIL;
198 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
202 WizStarting_OnTimer (hDlg);
206 KillTimer (hDlg, ID_WIZARD_TIMER);
212 case wcIS_STATE_DISABLED:
213 return IsServiceRunning();
223 void WizStarting_OnInitDialog (HWND hDlg)
225 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_HIDE);
226 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_SHOW);
229 if ((hManager = OpenSCManager (NULL, NULL,
231 SC_MANAGER_ENUMERATE_SERVICE |
232 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
235 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
236 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
238 if (StartService (hService, 0, 0))
239 TestAndDoMapShare(SERVICE_START_PENDING);
241 CloseServiceHandle (hService);
244 CloseServiceHandle (hManager);
247 SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL);
249 WizStarting_OnTimer (hDlg);
253 void WizStarting_OnTimer (HWND hDlg)
255 SERVICE_STATUS Status;
256 memset (&Status, 0x00, sizeof(Status));
257 Status.dwCurrentState = SERVICE_STOPPED;
260 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
263 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
265 QueryServiceStatus (hService, &Status);
266 CloseServiceHandle (hService);
267 TestAndDoMapShare(Status.dwCurrentState);
270 CloseServiceHandle (hManager);
273 if (Status.dwCurrentState == SERVICE_RUNNING)
275 g.pWizard->SetState (STEP_CREDS);
277 else if (Status.dwCurrentState != SERVICE_START_PENDING)
279 KillTimer (hDlg, ID_WIZARD_TIMER);
281 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW);
282 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE);
283 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
288 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
290 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
295 g.pWizard->EnableButtons (NEXT_BUTTON);
296 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
297 l.idh = IDH_AFSCREDS_WIZ_CREDS;
298 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
299 WizCreds_OnInitDialog (hDlg);
306 if (!IsDlgButtonChecked (hDlg, IDC_YESCREDS))
308 g.pWizard->SetState (STEP_MOUNT);
312 TCHAR szCell[ cchRESOURCE ];
313 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
314 TCHAR szUser[ cchRESOURCE ];
315 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
316 TCHAR szPassword[ cchRESOURCE ];
317 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
319 WizCreds_OnEnable (hDlg, FALSE);
321 if (ObtainNewCredentials (szCell, szUser, szPassword, FALSE) == 0)
323 g.pWizard->SetState (STEP_MOUNT);
327 WizCreds_OnEnable (hDlg);
334 case IDC_NEWCREDS_CELL:
335 case IDC_NEWCREDS_USER:
336 case IDC_NEWCREDS_PASSWORD:
337 WizCreds_OnEnable (hDlg);
348 void WizCreds_OnInitDialog (HWND hDlg)
352 TCHAR szCell[ cchRESOURCE ] = TEXT("");
353 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
355 TCHAR szUser[ cchRESOURCE ] = TEXT("");
356 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
358 DWORD dwSize = sizeof(szUser);
359 DWORD dwType = REG_SZ;
360 RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize);
363 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser);
364 g.pWizard->SetDefaultControl (IDC_NEWCREDS_PASSWORD);
366 CheckDlgButton (hDlg, IDC_NOCREDS, FALSE);
367 CheckDlgButton (hDlg, IDC_YESCREDS, TRUE);
368 WizCreds_OnEnable (hDlg);
372 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable)
374 BOOL fEnable = fAllowEnable;
376 if (IsDlgButtonChecked (hDlg, IDC_YESCREDS))
378 TCHAR szText[ cchRESOURCE ];
379 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
383 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szText, cchRESOURCE);
387 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szText, cchRESOURCE);
392 g.pWizard->EnableButtons ((fEnable) ? NEXT_BUTTON : 0);
394 EnableWindow (GetDlgItem (hDlg, IDC_NOCREDS), fAllowEnable);
395 EnableWindow (GetDlgItem (hDlg, IDC_YESCREDS), fAllowEnable);
397 fEnable = fAllowEnable && IsDlgButtonChecked (hDlg, IDC_YESCREDS);
398 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), fEnable);
399 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), fEnable);
400 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), fEnable);
404 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
406 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
411 g.pWizard->EnableButtons (BACK_BUTTON | NEXT_BUTTON);
412 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
413 g.pWizard->SetDefaultControl (IDNEXT);
414 l.idh = IDH_AFSCREDS_WIZ_MOUNT;
415 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
417 WizMount_OnInitDialog (hDlg);
424 g.pWizard->SetState (STEP_CREDS);
428 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
430 if (!WizMount_IsSubmountValid (hDlg))
432 Message (MB_ICONHAND, IDS_BADSUB_TITLE, IDS_BADSUB_DESC);
435 int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
436 int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
437 l.List.aDriveMap[ iDrive ].chDrive = chDRIVE_A + iDrive;
438 l.List.aDriveMap[ iDrive ].fActive = FALSE;
439 l.List.aDriveMap[ iDrive ].fPersistent = TRUE;
440 GetDlgItemText (hDlg, IDC_MAP_PATH, l.List.aDriveMap[ iDrive ].szMapping, MAX_PATH);
441 GetDlgItemText (hDlg, IDC_MAP_DESC, l.szSubmountReq, MAX_PATH);
442 WriteDriveMappings (&l.List);
444 g.pWizard->SetState (STEP_MOUNTING);
450 WizMount_OnEnable (hDlg);
461 void WizMount_OnInitDialog (HWND hDlg)
463 QueryDriveMapList (&l.List);
466 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
468 if (l.List.aDriveMap[iDrive].szMapping[0])
474 g.pWizard->SetState (STEP_MOUNTING);
478 // Fill in the combo box
480 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
483 HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
484 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
486 for (int ii = 0; ii < 26; ++ii)
488 if (!(dwDrives & (1<<ii)))
490 TCHAR szText[ cchRESOURCE ];
491 GetString (szText, IDS_MAP_LETTER);
494 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
495 *pch = TEXT('A') + ii;
497 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
498 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
504 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
505 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
507 SetDlgItemText (hDlg, IDC_MAP_PATH, cm_slash_mount_root);
509 CheckDlgButton (hDlg, IDC_NOMAP, FALSE);
510 CheckDlgButton (hDlg, IDC_YESMAP, TRUE);
514 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable)
516 BOOL fEnable = fAllowEnable;
518 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
520 TCHAR szText[ cchRESOURCE ];
521 GetDlgItemText (hDlg, IDC_MAP_PATH, szText, cchRESOURCE);
526 EnableWindow (GetDlgItem (hDlg, IDC_NOMAP), fAllowEnable);
527 EnableWindow (GetDlgItem (hDlg, IDC_YESMAP), fAllowEnable);
529 EnableWindow (GetDlgItem (hDlg, IDNEXT), fEnable);
530 g.pWizard->EnableButtons ((fEnable) ? (BACK_BUTTON | NEXT_BUTTON) : (BACK_BUTTON));
532 fEnable = fAllowEnable && (!IsDlgButtonChecked (hDlg, IDC_NOMAP));
534 EnableWindow (GetDlgItem (hDlg, IDC_MAP_LETTER), fEnable);
535 EnableWindow (GetDlgItem (hDlg, IDC_MAP_PATH), fEnable);
539 BOOL WizMount_IsSubmountValid (HWND hDlg)
541 TCHAR szSubmount[ MAX_PATH ];
542 GetDlgItemText (hDlg, IDC_MAP_DESC, szSubmount, MAX_PATH);
547 return IsValidSubmountName (szSubmount);
551 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
553 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
558 g.pWizard->EnableButtons (0);
559 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
560 g.pWizard->SetDefaultControl (IDNEXT);
561 l.idh = IDH_AFSCREDS_WIZ_MOUNT_FAIL;
562 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
563 WizMounting_OnInitDialog (hDlg);
570 g.pWizard->SetState (STEP_FINISH);
574 WizMounting_OnFinish (hDlg);
580 WizMount_OnEnable (hDlg);
586 case wcIS_STATE_DISABLED:
588 for (ii = 0; ii < 26; ++ii)
590 if (!l.List.aDriveMap[ ii ].szMapping[0])
592 if (l.List.aDriveMap[ ii ].fActive)
608 void WizMounting_OnInitDialog (HWND hDlg)
611 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_SHOW);
612 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_HIDE);
615 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)WizMounting_Thread, (LPVOID)0, 0, &idThread);
619 void WizMounting_OnFinish (HWND hDlg)
621 FreeDriveMapList (&l.List);
622 QueryDriveMapList (&l.List);
624 size_t cInactive = 0;
625 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
627 if (!l.List.aDriveMap[iDrive].szMapping[0])
629 if (l.List.aDriveMap[iDrive].fActive)
636 g.pWizard->SetState (STEP_FINISH);
640 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_HIDE);
641 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_SHOW);
642 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
647 DWORD CALLBACK WizMounting_Thread (LPVOID lp)
649 size_t cInactive = 0;
650 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
652 if (!l.List.aDriveMap[iDrive].szMapping[0])
654 if (l.List.aDriveMap[iDrive].fActive)
658 (void)ActivateDriveMap (l.List.aDriveMap[iDrive].chDrive, l.List.aDriveMap[iDrive].szMapping, l.szSubmountReq, l.List.aDriveMap[iDrive].fPersistent, &status);
659 l.szSubmountReq[0] = TEXT('\0');
662 PostMessage (l.hDlg, WM_COMMAND, IDC_MAP_FINISH, 0);
667 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
669 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
674 g.pWizard->EnableButtons (NEXT_BUTTON);
675 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_FINISH);
676 g.pWizard->SetDefaultControl (IDNEXT);
677 EnableWindow (GetDlgItem (GetParent (hDlg), IDCANCEL), FALSE);
678 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
685 g.pWizard->Show (FALSE);