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, 0 },
79 { STEP_STARTING, IDD_WIZ_STARTING, WizStarting_DlgProc, 0 },
80 { STEP_CREDS, IDD_WIZ_CREDS, WizCreds_DlgProc, 0 },
81 { STEP_MOUNT, IDD_WIZ_MOUNT, WizMount_DlgProc, 0 },
82 { STEP_MOUNTING, IDD_WIZ_MOUNTING, WizMounting_DlgProc, 0 },
83 { STEP_FINISH, IDD_WIZ_FINISH, WizFinish_DlgProc, 0 }
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,
226 SC_MANAGER_ENUMERATE_SERVICE |
227 SC_MANAGER_QUERY_LOCK_STATUS)) != NULL)
230 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"),
231 SERVICE_QUERY_STATUS | SERVICE_START)) != NULL)
233 if (StartService (hService, 0, 0))
234 TestAndDoMapShare(SERVICE_START_PENDING);
236 CloseServiceHandle (hService);
239 CloseServiceHandle (hManager);
242 SetTimer (hDlg, ID_WIZARD_TIMER, (ULONG)cmsecSERVICE, NULL);
244 WizStarting_OnTimer (hDlg);
248 void WizStarting_OnTimer (HWND hDlg)
250 SERVICE_STATUS Status;
251 memset (&Status, 0x00, sizeof(Status));
252 Status.dwCurrentState = SERVICE_STOPPED;
255 if ((hManager = OpenSCManager (NULL, NULL, GENERIC_READ)) != NULL)
258 if ((hService = OpenService (hManager, TEXT("TransarcAFSDaemon"), GENERIC_READ)) != NULL)
260 QueryServiceStatus (hService, &Status);
261 CloseServiceHandle (hService);
262 TestAndDoMapShare(Status.dwCurrentState);
265 CloseServiceHandle (hManager);
268 if (Status.dwCurrentState == SERVICE_RUNNING)
270 g.pWizard->SetState (STEP_CREDS);
272 else if (Status.dwCurrentState != SERVICE_START_PENDING)
274 KillTimer (hDlg, ID_WIZARD_TIMER);
276 ShowWindow (GetDlgItem (hDlg, IDC_START_FAIL), SW_SHOW);
277 ShowWindow (GetDlgItem (hDlg, IDC_START_TRY), SW_HIDE);
278 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
283 BOOL CALLBACK WizCreds_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
285 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
290 g.pWizard->EnableButtons (NEXT_BUTTON);
291 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
292 l.idh = IDH_AFSCREDS_WIZ_CREDS;
293 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
294 WizCreds_OnInitDialog (hDlg);
301 if (!IsDlgButtonChecked (hDlg, IDC_YESCREDS))
303 g.pWizard->SetState (STEP_MOUNT);
307 TCHAR szCell[ cchRESOURCE ];
308 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell, cchRESOURCE);
309 TCHAR szUser[ cchRESOURCE ];
310 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser, cchRESOURCE);
311 TCHAR szPassword[ cchRESOURCE ];
312 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szPassword, cchRESOURCE);
314 WizCreds_OnEnable (hDlg, FALSE);
316 if (ObtainNewCredentials (szCell, szUser, szPassword, FALSE) == 0)
318 g.pWizard->SetState (STEP_MOUNT);
322 WizCreds_OnEnable (hDlg);
329 case IDC_NEWCREDS_CELL:
330 case IDC_NEWCREDS_USER:
331 case IDC_NEWCREDS_PASSWORD:
332 WizCreds_OnEnable (hDlg);
343 void WizCreds_OnInitDialog (HWND hDlg)
347 TCHAR szCell[ cchRESOURCE ] = TEXT("");
348 (void)GetDefaultCell (szCell);
349 SetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szCell);
351 TCHAR szUser[ cchRESOURCE ] = TEXT("");
352 if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"), &hk) == 0)
354 DWORD dwSize = sizeof(szUser);
355 DWORD dwType = REG_SZ;
356 RegQueryValueEx (hk, TEXT("DefaultUserName"), NULL, &dwType, (PBYTE)szUser, &dwSize);
359 SetDlgItemText (hDlg, IDC_NEWCREDS_USER, szUser);
360 g.pWizard->SetDefaultControl (IDC_NEWCREDS_PASSWORD);
362 CheckDlgButton (hDlg, IDC_NOCREDS, FALSE);
363 CheckDlgButton (hDlg, IDC_YESCREDS, TRUE);
364 WizCreds_OnEnable (hDlg);
368 void WizCreds_OnEnable (HWND hDlg, BOOL fAllowEnable)
370 BOOL fEnable = fAllowEnable;
372 if (IsDlgButtonChecked (hDlg, IDC_YESCREDS))
374 TCHAR szText[ cchRESOURCE ];
375 GetDlgItemText (hDlg, IDC_NEWCREDS_CELL, szText, cchRESOURCE);
379 GetDlgItemText (hDlg, IDC_NEWCREDS_USER, szText, cchRESOURCE);
383 GetDlgItemText (hDlg, IDC_NEWCREDS_PASSWORD, szText, cchRESOURCE);
388 g.pWizard->EnableButtons ((fEnable) ? NEXT_BUTTON : 0);
390 EnableWindow (GetDlgItem (hDlg, IDC_NOCREDS), fAllowEnable);
391 EnableWindow (GetDlgItem (hDlg, IDC_YESCREDS), fAllowEnable);
393 fEnable = fAllowEnable && IsDlgButtonChecked (hDlg, IDC_YESCREDS);
394 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_CELL), fEnable);
395 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_USER), fEnable);
396 EnableWindow (GetDlgItem (hDlg, IDC_NEWCREDS_PASSWORD), fEnable);
400 BOOL CALLBACK WizMount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
402 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
407 g.pWizard->EnableButtons (BACK_BUTTON | NEXT_BUTTON);
408 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
409 g.pWizard->SetDefaultControl (IDNEXT);
410 l.idh = IDH_AFSCREDS_WIZ_MOUNT;
411 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
413 WizMount_OnInitDialog (hDlg);
420 g.pWizard->SetState (STEP_CREDS);
424 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
426 if (!WizMount_IsSubmountValid (hDlg))
428 Message (MB_ICONHAND, IDS_BADSUB_TITLE, IDS_BADSUB_DESC);
431 int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
432 int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
433 l.List.aDriveMap[ iDrive ].chDrive = chDRIVE_A + iDrive;
434 l.List.aDriveMap[ iDrive ].fActive = FALSE;
435 l.List.aDriveMap[ iDrive ].fPersistent = TRUE;
436 GetDlgItemText (hDlg, IDC_MAP_PATH, l.List.aDriveMap[ iDrive ].szMapping, MAX_PATH);
437 GetDlgItemText (hDlg, IDC_MAP_DESC, l.szSubmountReq, MAX_PATH);
438 WriteDriveMappings (&l.List);
440 g.pWizard->SetState (STEP_MOUNTING);
446 WizMount_OnEnable (hDlg);
457 void WizMount_OnInitDialog (HWND hDlg)
459 QueryDriveMapList (&l.List);
462 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
464 if (l.List.aDriveMap[iDrive].szMapping[0])
470 g.pWizard->SetState (STEP_MOUNTING);
474 // Fill in the combo box
476 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
479 HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
480 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
482 for (int ii = 0; ii < 26; ++ii)
484 if (!(dwDrives & (1<<ii)))
486 TCHAR szText[ cchRESOURCE ];
487 GetString (szText, IDS_MAP_LETTER);
490 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
491 *pch = TEXT('A') + ii;
493 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
494 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
500 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
501 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
503 SetDlgItemText (hDlg, IDC_MAP_PATH, cm_slash_mount_root);
505 CheckDlgButton (hDlg, IDC_NOMAP, FALSE);
506 CheckDlgButton (hDlg, IDC_YESMAP, TRUE);
510 void WizMount_OnEnable (HWND hDlg, BOOL fAllowEnable)
512 BOOL fEnable = fAllowEnable;
514 if (IsDlgButtonChecked (hDlg, IDC_YESMAP))
516 TCHAR szText[ cchRESOURCE ];
517 GetDlgItemText (hDlg, IDC_MAP_PATH, szText, cchRESOURCE);
522 EnableWindow (GetDlgItem (hDlg, IDC_NOMAP), fAllowEnable);
523 EnableWindow (GetDlgItem (hDlg, IDC_YESMAP), fAllowEnable);
525 EnableWindow (GetDlgItem (hDlg, IDNEXT), fEnable);
526 g.pWizard->EnableButtons ((fEnable) ? (BACK_BUTTON | NEXT_BUTTON) : (BACK_BUTTON));
528 fEnable = fAllowEnable && (!IsDlgButtonChecked (hDlg, IDC_NOMAP));
530 EnableWindow (GetDlgItem (hDlg, IDC_MAP_LETTER), fEnable);
531 EnableWindow (GetDlgItem (hDlg, IDC_MAP_PATH), fEnable);
535 BOOL WizMount_IsSubmountValid (HWND hDlg)
537 TCHAR szSubmount[ MAX_PATH ];
538 GetDlgItemText (hDlg, IDC_MAP_DESC, szSubmount, MAX_PATH);
543 return IsValidSubmountName (szSubmount);
547 BOOL CALLBACK WizMounting_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
549 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
554 g.pWizard->EnableButtons (0);
555 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_NEXT);
556 g.pWizard->SetDefaultControl (IDNEXT);
557 l.idh = IDH_AFSCREDS_WIZ_MOUNT_FAIL;
558 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
559 WizMounting_OnInitDialog (hDlg);
566 g.pWizard->SetState (STEP_FINISH);
570 WizMounting_OnFinish (hDlg);
576 WizMount_OnEnable (hDlg);
582 case wcIS_STATE_DISABLED:
584 for (ii = 0; ii < 26; ++ii)
586 if (!l.List.aDriveMap[ ii ].szMapping[0])
588 if (l.List.aDriveMap[ ii ].fActive)
604 void WizMounting_OnInitDialog (HWND hDlg)
607 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_SHOW);
608 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_HIDE);
611 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)WizMounting_Thread, (LPVOID)0, 0, &idThread);
615 void WizMounting_OnFinish (HWND hDlg)
617 FreeDriveMapList (&l.List);
618 QueryDriveMapList (&l.List);
620 size_t cInactive = 0;
621 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
623 if (!l.List.aDriveMap[iDrive].szMapping[0])
625 if (l.List.aDriveMap[iDrive].fActive)
632 g.pWizard->SetState (STEP_FINISH);
636 ShowWindow (GetDlgItem (hDlg, IDC_MAP_TRY), SW_HIDE);
637 ShowWindow (GetDlgItem (hDlg, IDC_MAP_FAIL), SW_SHOW);
638 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), TRUE);
643 DWORD CALLBACK WizMounting_Thread (LPVOID lp)
645 size_t cInactive = 0;
646 for (size_t iDrive = 0; iDrive < 26; ++iDrive)
648 if (!l.List.aDriveMap[iDrive].szMapping[0])
650 if (l.List.aDriveMap[iDrive].fActive)
654 (void)ActivateDriveMap (l.List.aDriveMap[iDrive].chDrive, l.List.aDriveMap[iDrive].szMapping, l.szSubmountReq, l.List.aDriveMap[iDrive].fPersistent, &status);
655 l.szSubmountReq[0] = TEXT('\0');
658 PostMessage (l.hDlg, WM_COMMAND, IDC_MAP_FINISH, 0);
663 BOOL CALLBACK WizFinish_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
665 if (!WizCommon_DlgProc (hDlg, msg, wp, lp))
670 g.pWizard->EnableButtons (NEXT_BUTTON);
671 g.pWizard->SetButtonText (IDNEXT, IDS_WIZ_FINISH);
672 g.pWizard->SetDefaultControl (IDNEXT);
673 EnableWindow (GetDlgItem (GetParent (hDlg), IDCANCEL), FALSE);
674 EnableWindow (GetDlgItem (GetParent (hDlg), IDHELP), FALSE);
681 g.pWizard->Show (FALSE);