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>
19 * VARIABLES __________________________________________________________________
30 * PROTOTYPES _________________________________________________________________
34 void Mount_OnInitDialog (HWND hDlg);
35 void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog = FALSE);
36 void Mount_OnSelect (HWND hDlg);
37 void Mount_OnCheck (HWND hDlg);
38 void Mount_OnRemove (HWND hDlg);
39 void Mount_OnAdd (HWND hDlg);
40 void Mount_OnEdit (HWND hDlg);
42 void Mount_AdjustMapping (HWND hDlg, int iDrive);
43 int Mount_DriveFromItem (HWND hDlg, int iItem);
45 BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
46 void Mapping_OnInitDialog (HWND hDlg);
47 void Mapping_OnOK (HWND hDlg);
48 void Mapping_OnEnable (HWND hDlg);
52 * ROUTINES ___________________________________________________________________
56 BOOL CALLBACK Mount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
62 GetClientRect (GetParent(hDlg), &rTab);
63 TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab);
64 SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
66 Mount_OnInitDialog (hDlg);
81 Mount_OnRemove (hDlg);
85 if (HIWORD(wp) == LBN_CLICKED)
87 else if ((HIWORD(wp) == LBN_SELCHANGE) || (HIWORD(wp) == LBN_SELCANCEL))
88 Mount_OnSelect (hDlg);
92 Mount_DlgProc (hDlg, WM_HELP, 0, 0);
98 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_DRIVES);
105 void Mount_OnInitDialog (HWND hDlg)
108 SendDlgItemMessage (hDlg, IDC_LIST, LB_SETTABSTOPS, 1, (LPARAM)&xTabStop);
110 Mount_OnUpdate (hDlg, TRUE);
114 void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog)
117 QueryDriveMapList (&List);
119 HWND hList = GetDlgItem (hDlg, IDC_LIST);
120 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
121 int iDataSel = Mount_DriveFromItem (hDlg, iItemSel);
124 if (fOnInitDialog && (iDataSel == -1))
125 iDataSel = l.iDriveSelectLast;
127 SendMessage (hList, WM_SETREDRAW, FALSE, 0);
128 SendMessage (hList, LB_RESETCONTENT, 0, 0);
130 for (int iDrive = 0; iDrive < 26; ++iDrive)
132 if (!List.aDriveMap[ iDrive ].szMapping[0])
135 TCHAR szAfsPath[ MAX_PATH ];
136 AdjustAfsPath (szAfsPath, List.aDriveMap[ iDrive ].szMapping, TRUE, FALSE);
138 LPTSTR psz = FormatString (IDS_DRIVE_MAP, TEXT("%c%s"), List.aDriveMap[ iDrive ].chDrive, szAfsPath);
139 int iItem = SendMessage (hList, LB_ADDSTRING, 0, (LPARAM)psz);
140 SendMessage (hList, LB_SETITEMDATA, iItem, List.aDriveMap[ iDrive ].fActive);
143 if (iDrive == iDataSel)
147 SendMessage (hList, WM_SETREDRAW, TRUE, 0);
148 SendMessage (hList, LB_SETCURSEL, iItemSel, 0);
150 Mount_OnSelect (hDlg);
151 FreeDriveMapList (&List);
155 void Mount_OnSelect (HWND hDlg)
157 BOOL fServiceRunning = IsServiceRunning();
159 HWND hList = GetDlgItem (hDlg, IDC_LIST);
160 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
161 int iDataSel = Mount_DriveFromItem (hDlg, iItemSel);
163 l.iDriveSelectLast = iDataSel;
165 EnableWindow (GetDlgItem (hDlg, IDC_ADD), fServiceRunning);
166 EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fServiceRunning && (iDataSel != -1));
167 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), fServiceRunning && (iDataSel != -1));
171 void Mount_OnCheck (HWND hDlg)
174 QueryDriveMapList (&List);
176 HWND hList = GetDlgItem (hDlg, IDC_LIST);
177 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
178 int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
179 BOOL fChecked = SendMessage (hList, LB_GETITEMDATA, iItemSel, 0);
184 if (fChecked && List.aDriveMap[ iDriveSel ].szMapping[0] && !List.aDriveMap[ iDriveSel ].fActive)
186 if (!ActivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, List.aDriveMap[ iDriveSel ].szMapping, List.aDriveMap[ iDriveSel ].szSubmount, List.aDriveMap[ iDriveSel ].fPersistent, &dwStatus))
187 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
188 Mount_OnUpdate (hDlg);
190 else if (!fChecked && List.aDriveMap[ iDriveSel ].fActive)
192 if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
193 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
194 Mount_OnUpdate (hDlg);
198 FreeDriveMapList (&List);
202 void Mount_OnRemove (HWND hDlg)
204 HWND hList = GetDlgItem (hDlg, IDC_LIST);
205 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
206 int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
211 QueryDriveMapList (&List);
213 if (List.aDriveMap[ iDriveSel ].szMapping[0])
215 if (List.aDriveMap[ iDriveSel ].fActive)
218 if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
220 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
224 List.aDriveMap[ iDriveSel ].szMapping[0] = TEXT('\0');
225 WriteDriveMappings (&List);
227 Mount_OnUpdate (hDlg);
230 FreeDriveMapList (&List);
235 void Mount_OnAdd (HWND hDlg)
237 Mount_AdjustMapping (hDlg, -1);
241 void Mount_OnEdit (HWND hDlg)
243 HWND hList = GetDlgItem (hDlg, IDC_LIST);
244 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
245 int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
247 Mount_AdjustMapping (hDlg, iDriveSel);
251 void Mount_AdjustMapping (HWND hDlg, int iDrive)
254 QueryDriveMapList (&List);
256 DRIVEMAP DriveMapOrig;
257 memset (&DriveMapOrig, 0x00, sizeof(DRIVEMAP));
261 memcpy (&DriveMapOrig, &List.aDriveMap[ iDrive ], sizeof(DRIVEMAP));
265 memcpy (&DriveMap, &DriveMapOrig, sizeof(DRIVEMAP));
267 if (ModalDialogParam (IDD_MAPPING, hDlg, (DLGPROC)Mapping_DlgProc, (LPARAM)&DriveMap) == IDOK)
269 TCHAR szAfsPathOrig[ MAX_PATH ];
271 AdjustAfsPath (szAfsPathOrig, DriveMapOrig.szMapping, TRUE, TRUE);
273 TCHAR szAfsPathNew[ MAX_PATH ];
274 AdjustAfsPath (szAfsPathNew, DriveMap.szMapping, TRUE, TRUE);
276 if ( (lstrcmpi (szAfsPathOrig, szAfsPathNew)) ||
277 (lstrcmpi (DriveMapOrig.szSubmount, DriveMap.szSubmount)) ||
278 (DriveMapOrig.chDrive != DriveMap.chDrive) ||
279 (DriveMapOrig.fPersistent != DriveMap.fPersistent) )
283 if ((iDrive != -1) && (DriveMapOrig.fActive))
285 if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus))
287 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
288 Mount_OnUpdate (hDlg);
293 if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, DriveMap.szSubmount, DriveMap.fPersistent, &dwStatus))
295 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
296 Mount_OnUpdate (hDlg);
300 if (DriveMap.szSubmount[0])
302 TCHAR szSubmountNow[ MAX_PATH ];
303 if (GetDriveSubmount (DriveMap.chDrive, szSubmountNow))
305 if (lstrcmpi (DriveMap.szSubmount, szSubmountNow))
307 int idsTitle = (g.fIsWinNT) ? IDS_NEWSUB_TITLE : IDS_NEWSUB_TITLE_95;
308 Message (MB_OK | MB_ICONASTERISK, idsTitle, IDS_NEWSUB_DESC);
314 memset (&List.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP));
315 memcpy (&List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP));
316 lstrcpy (List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew);
317 WriteDriveMappings (&List);
319 Mount_OnUpdate (hDlg);
325 int Mount_DriveFromItem (HWND hDlg, int iItem)
327 TCHAR szItem[ 1024 ] = TEXT("");
328 SendDlgItemMessage (hDlg, IDC_LIST, LB_GETTEXT, iItem, (LPARAM)szItem);
331 if ((pch = (LPTSTR)lstrchr (szItem, TEXT(':'))) != NULL)
336 if ((*pch >= TEXT('A')) && (*pch <= TEXT('Z')))
337 return (*pch) - TEXT('A');
345 BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
350 SetWindowLong (hDlg, DWL_USER, lp);
351 Mapping_OnInitDialog (hDlg);
362 EndDialog (hDlg, IDCANCEL);
366 Mapping_OnEnable (hDlg);
370 Mapping_DlgProc (hDlg, WM_HELP, 0, 0);
376 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_MAPDRIVE);
383 void Mapping_OnInitDialog (HWND hDlg)
385 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
387 // Fill in the combo box
389 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
391 if (pMap->chDrive != 0)
392 dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
395 HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
396 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
398 for (int ii = 0; ii < 26; ++ii)
400 if (!(dwDrives & (1<<ii)))
402 TCHAR szText[ cchRESOURCE ];
403 GetString (szText, IDS_MAP_LETTER);
406 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
407 *pch = TEXT('A') + ii;
409 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
410 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
411 if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
413 else if ((!pMap->chDrive) && (iItemSel == -1))
418 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
419 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
421 TCHAR szMapping[ MAX_PATH ];
422 AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : TEXT("/afs")), TRUE, FALSE);
423 SetDlgItemText (hDlg, IDC_MAP_PATH, szMapping);
424 SetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount);
426 CheckDlgButton (hDlg, IDC_MAP_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
428 Mapping_OnEnable (hDlg);
432 void Mapping_OnOK (HWND hDlg)
434 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
436 int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
437 int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
439 pMap->chDrive = chDRIVE_A + iDrive;
440 GetDlgItemText (hDlg, IDC_MAP_PATH, pMap->szMapping, MAX_PATH);
441 GetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount, MAX_PATH);
442 pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_MAP_PERSISTENT);
444 if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
446 int idsTitle = (g.fIsWinNT) ? IDS_BADSUB_TITLE : IDS_BADSUB_TITLE_95;
447 Message (MB_ICONHAND, idsTitle, IDS_BADSUB_DESC);
451 if ( (lstrncmpi (pMap->szMapping, TEXT("/afs"), lstrlen(TEXT("/afs")))) &&
452 (lstrncmpi (pMap->szMapping, TEXT("\\afs"), lstrlen(TEXT("\\afs")))) )
454 Message (MB_ICONHAND, IDS_BADMAP_TITLE, IDS_BADMAP_DESC);
458 EndDialog (hDlg, IDOK);
462 void Mapping_OnEnable (HWND hDlg)
464 TCHAR szPath[ MAX_PATH ];
465 GetDlgItemText (hDlg, IDC_MAP_PATH, szPath, MAX_PATH);
466 EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));