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>
17 #include <afs/fs_utils.h>
24 * PROTOTYPES _________________________________________________________________
28 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
29 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
30 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
31 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
33 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
34 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
36 void WizStarting_OnInitDialog (HWND hDlg);
37 void WizStarting_OnTimer (HWND hDlg);
39 void WizCreds_OnInitDialog (HWND hDlg);
40 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
42 void WizMount_OnInitDialog (HWND hDlg);
43 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable = TRUE);
44 BOOL WizMount_IsSubmountValid (HWND hDlg);
46 void WizMounting_OnInitDialog (HWND hDlg);
47 void WizMounting_OnFinish (HWND hDlg);
48 DWORD CALLBACK WizMounting_Thread (LPVOID lp);
52 * VARIABLES __________________________________________________________________
62 TCHAR szSubmountReq[ MAX_PATH ];
67 * WIZARD STATES ______________________________________________________________
81 static WIZARD_STATE aStates[] = {
82 { STEP_START, IDD_WIZ_START, (DLGPROC)WizStart_DlgProc, 0 },
83 { STEP_STARTING, IDD_WIZ_STARTING, (DLGPROC)WizStarting_DlgProc, 0 },
84 { STEP_CREDS, IDD_WIZ_CREDS, (DLGPROC)WizCreds_DlgProc, 0 },
85 { STEP_MOUNT, IDD_WIZ_MOUNT, (DLGPROC)WizMount_DlgProc, 0 },
86 { STEP_MOUNTING, IDD_WIZ_MOUNTING, (DLGPROC)WizMounting_DlgProc, 0 },
87 { STEP_FINISH, IDD_WIZ_FINISH, (DLGPROC)WizFinish_DlgProc, 0 }
90 static const int cStates = sizeof(aStates) / sizeof(aStates[0]);
94 * ROUTINES ___________________________________________________________________
98 void ShowStartupWizard (void)
100 if (g.pWizard != NULL) // Already showing the wizard? Stop here.
103 memset (&l, 0x00, sizeof(l));
105 g.pWizard = New(WIZARD);
107 g.pWizard->SetDialogTemplate (IDD_WIZARD, IDC_LHS, IDC_RHS, IDBACK, IDNEXT);
108 g.pWizard->SetGraphic (IDB_WIZ16, IDB_WIZ256);
109 g.pWizard->SetStates (aStates, cStates);
110 g.pWizard->SetState (STEP_START);
117 Main_RepopulateTabs (TRUE);
119 FreeDriveMapList (&l.List);
123 BOOL CALLBACK WizCommon_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
131 g.pWizard->Show(FALSE);
135 WizCommon_DlgProc (hDlg, WM_HELP, 0, 0);
144 BOOL CALLBACK WizStart_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
146 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
151 g.pWizard->EnableButtons (NEXT_BUTTON);
152 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
153 g.pWizard->SetDefaultControl (IDNEXT);
154 l.idh = IDH_AFSCREDS_WIZ_START;
155 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
162 g.pWizard->SetState (STEP_STARTING);
168 case wcIS_STATE_DISABLED:
169 return IsServiceRunning();
181 BOOL CALLBACK WizStarting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
183 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
188 g.pWizard->EnableButtons (0);
189 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
190 WizStarting_OnInitDialog (hDlg);
191 l.idh = IDH_AFSCREDS_WIZ_START_FAIL;
192 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
196 WizStarting_OnTimer (hDlg);
200 KillTimer (hDlg, ID_WIZARD_TIMER);
206 case wcIS_STATE_DISABLED:
207 return IsServiceRunning();
217 void WizStarting_OnInitDialog (HWND hDlg)
219 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_HIDE);
220 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_SHOW);
223 if ((hManager = OpenSCManager (NULL, NULL,
225 SC_MANAGER_ENUMERATE_SERVICE |
226 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
229 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
230 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
232 if (StartService (hService, 0, 0))
233 TestAndDoMapShare(SERVICE_START_PENDING);
235 CloseServiceHandle (hService);
238 CloseServiceHandle (hManager);
241 SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL);
243 WizStarting_OnTimer (hDlg);
247 void WizStarting_OnTimer (HWND hDlg)
249 SERVICE_STATUS Status;
250 memset (&Status, 0x00, sizeof(Status));
251 Status.dwCurrentState = SERVICE_STOPPED;
254 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
257 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
259 QueryServiceStatus (hService, &Status);
260 CloseServiceHandle (hService);
261 TestAndDoMapShare(Status.dwCurrentState);
264 CloseServiceHandle (hManager);
267 if (Status.dwCurrentState == SERVICE_RUNNING)
269 g.pWizard->SetState (STEP_CREDS);
271 else if (Status.dwCurrentState != SERVICE_START_PENDING)
273 KillTimer (hDlg, ID_WIZARD_TIMER);
275 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW);
276 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE);
277 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
282 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
284 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
289 g.pWizard->EnableButtons (NEXT_BUTTON);
290 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
291 l.idh = IDH_AFSCREDS_WIZ_CREDS;
292 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
293 WizCreds_OnInitDialog (hDlg);
300 if (!IsDlgButtonChecked (hDlg, IDC_YESCREDS))
302 g.pWizard->SetState (STEP_MOUNT);
306 TCHAR szCell[ cchRESOURCE ];
307 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
308 TCHAR szUser[ cchRESOURCE ];
309 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
310 TCHAR szPassword[ cchRESOURCE ];
311 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
313 WizCreds_OnEnable (hDlg, FALSE);
315 if (ObtainNewCredentials (szCell, szUser, szPassword, FALSE) == 0)
317 g.pWizard->SetState (STEP_MOUNT);
321 WizCreds_OnEnable (hDlg);
328 case IDC_NEWCREDS_CELL:
329 case IDC_NEWCREDS_USER:
330 case IDC_NEWCREDS_PASSWORD:
331 WizCreds_OnEnable (hDlg);
342 void WizCreds_OnInitDialog (HWND hDlg)
346 TCHAR szCell[ cchRESOURCE ] = TEXT("");
347 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
349 TCHAR szUser[ cchRESOURCE ] = TEXT("");
350 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
352 DWORD dwSize = sizeof(szUser);
353 DWORD dwType = REG_SZ;
354 RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize);
357 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser);
358 g.pWizard->SetDefaultControl (IDC_NEWCREDS_PASSWORD);
360 CheckDlgButton (hDlg, IDC_NOCREDS, FALSE);
361 CheckDlgButton (hDlg, IDC_YESCREDS, TRUE);
362 WizCreds_OnEnable (hDlg);
366 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable)
368 BOOL fEnable = fAllowEnable;
370 if (IsDlgButtonChecked (hDlg, IDC_YESCREDS))
372 TCHAR szText[ cchRESOURCE ];
373 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
377 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szText, cchRESOURCE);
381 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szText, cchRESOURCE);
386 g.pWizard->EnableButtons ((fEnable) ? NEXT_BUTTON : 0);
388 EnableWindow (GetDlgItem (hDlg, IDC_NOCREDS), fAllowEnable);
389 EnableWindow (GetDlgItem (hDlg, IDC_YESCREDS), fAllowEnable);
391 fEnable = fAllowEnable && IsDlgButtonChecked (hDlg, IDC_YESCREDS);
392 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), fEnable);
393 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), fEnable);
394 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), fEnable);
398 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
400 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
405 g.pWizard->EnableButtons (BACK_BUTTON | NEXT_BUTTON);
406 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
407 g.pWizard->SetDefaultControl (IDNEXT);
408 l.idh = IDH_AFSCREDS_WIZ_MOUNT;
409 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
411 WizMount_OnInitDialog (hDlg);
418 g.pWizard->SetState (STEP_CREDS);
422 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
424 if (!WizMount_IsSubmountValid (hDlg))
426 Message (MB_ICONHAND, IDS_BADSUB_TITLE, IDS_BADSUB_DESC);
429 int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
430 int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
431 l.List.aDriveMap[ iDrive ].chDrive = chDRIVE_A + iDrive;
432 l.List.aDriveMap[ iDrive ].fActive = FALSE;
433 l.List.aDriveMap[ iDrive ].fPersistent = TRUE;
434 GetDlgItemText (hDlg, IDC_MAP_PATH, l.List.aDriveMap[ iDrive ].szMapping, MAX_PATH);
435 GetDlgItemText (hDlg, IDC_MAP_DESC, l.szSubmountReq, MAX_PATH);
436 WriteDriveMappings (&l.List);
438 g.pWizard->SetState (STEP_MOUNTING);
444 WizMount_OnEnable (hDlg);
455 void WizMount_OnInitDialog (HWND hDlg)
457 QueryDriveMapList (&l.List);
460 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
462 if (l.List.aDriveMap[iDrive].szMapping[0])
468 g.pWizard->SetState (STEP_MOUNTING);
472 // Fill in the combo box
474 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
477 HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
478 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
480 for (int ii = 0; ii < 26; ++ii)
482 if (!(dwDrives & (1<<ii)))
484 TCHAR szText[ cchRESOURCE ];
485 GetString (szText, IDS_MAP_LETTER);
488 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
489 *pch = TEXT('A') + ii;
491 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
492 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
498 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
499 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
501 SetDlgItemText (hDlg, IDC_MAP_PATH, cm_slash_mount_root);
503 CheckDlgButton (hDlg, IDC_NOMAP, FALSE);
504 CheckDlgButton (hDlg, IDC_YESMAP, TRUE);
508 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable)
510 BOOL fEnable = fAllowEnable;
512 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
514 TCHAR szText[ cchRESOURCE ];
515 GetDlgItemText (hDlg, IDC_MAP_PATH, szText, cchRESOURCE);
520 EnableWindow (GetDlgItem (hDlg, IDC_NOMAP), fAllowEnable);
521 EnableWindow (GetDlgItem (hDlg, IDC_YESMAP), fAllowEnable);
523 EnableWindow (GetDlgItem (hDlg, IDNEXT), fEnable);
524 g.pWizard->EnableButtons ((fEnable) ? (BACK_BUTTON | NEXT_BUTTON) : (BACK_BUTTON));
526 fEnable = fAllowEnable && (!IsDlgButtonChecked (hDlg, IDC_NOMAP));
528 EnableWindow (GetDlgItem (hDlg, IDC_MAP_LETTER), fEnable);
529 EnableWindow (GetDlgItem (hDlg, IDC_MAP_PATH), fEnable);
533 BOOL WizMount_IsSubmountValid (HWND hDlg)
535 TCHAR szSubmount[ MAX_PATH ];
536 GetDlgItemText (hDlg, IDC_MAP_DESC, szSubmount, MAX_PATH);
541 return IsValidSubmountName (szSubmount);
545 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
547 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
552 g.pWizard->EnableButtons (0);
553 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
554 g.pWizard->SetDefaultControl (IDNEXT);
555 l.idh = IDH_AFSCREDS_WIZ_MOUNT_FAIL;
556 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
557 WizMounting_OnInitDialog (hDlg);
564 g.pWizard->SetState (STEP_FINISH);
568 WizMounting_OnFinish (hDlg);
574 WizMount_OnEnable (hDlg);
580 case wcIS_STATE_DISABLED:
582 for (ii = 0; ii < 26; ++ii)
584 if (!l.List.aDriveMap[ ii ].szMapping[0])
586 if (l.List.aDriveMap[ ii ].fActive)
602 void WizMounting_OnInitDialog (HWND hDlg)
605 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_SHOW);
606 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_HIDE);
609 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)WizMounting_Thread, (LPVOID)0, 0, &idThread);
613 void WizMounting_OnFinish (HWND hDlg)
615 FreeDriveMapList (&l.List);
616 QueryDriveMapList (&l.List);
618 size_t cInactive = 0;
619 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
621 if (!l.List.aDriveMap[iDrive].szMapping[0])
623 if (l.List.aDriveMap[iDrive].fActive)
630 g.pWizard->SetState (STEP_FINISH);
634 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_HIDE);
635 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_SHOW);
636 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
641 DWORD CALLBACK WizMounting_Thread (LPVOID lp)
643 size_t cInactive = 0;
644 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
646 if (!l.List.aDriveMap[iDrive].szMapping[0])
648 if (l.List.aDriveMap[iDrive].fActive)
652 (void)ActivateDriveMap (l.List.aDriveMap[iDrive].chDrive, l.List.aDriveMap[iDrive].szMapping, l.szSubmountReq, l.List.aDriveMap[iDrive].fPersistent, &status);
653 l.szSubmountReq[0] = TEXT('\0');
656 PostMessage (l.hDlg, WM_COMMAND, IDC_MAP_FINISH, 0);
661 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
663 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
668 g.pWizard->EnableButtons (NEXT_BUTTON);
669 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_FINISH);
670 g.pWizard->SetDefaultControl (IDNEXT);
671 EnableWindow (GetDlgItem (GetParent (hDlg), IDCANCEL), FALSE);
672 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
679 g.pWizard->Show (FALSE);