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>
19 #include <afs/fs_utils.h>
26 * VARIABLES __________________________________________________________________
37 * PROTOTYPES _________________________________________________________________
41 void Mount_OnInitDialog (HWND hDlg);
42 void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog = FALSE);
43 void Mount_OnSelect (HWND hDlg);
44 void Mount_OnCheck (HWND hDlg);
45 void Mount_OnRemove (HWND hDlg);
46 void Mount_OnAdd (HWND hDlg);
47 void Mount_OnEdit (HWND hDlg);
49 void Mount_AdjustMapping (HWND hDlg, int iDrive);
50 int Mount_DriveFromItem (HWND hDlg, int iItem);
52 BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
53 void Mapping_OnInitDialog (HWND hDlg);
54 void Mapping_OnOK (HWND hDlg);
55 void Mapping_OnEnable (HWND hDlg);
59 * ROUTINES ___________________________________________________________________
63 BOOL CALLBACK Mount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
69 GetClientRect (GetParent(hDlg), &rTab);
70 TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab);
71 SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
73 Mount_OnInitDialog (hDlg);
88 Mount_OnRemove (hDlg);
92 if (HIWORD(wp) == LBN_CLICKED)
94 else if ((HIWORD(wp) == LBN_SELCHANGE) || (HIWORD(wp) == LBN_SELCANCEL))
95 Mount_OnSelect (hDlg);
99 Mount_DlgProc (hDlg, WM_HELP, 0, 0);
105 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_DRIVES);
112 void Mount_OnInitDialog (HWND hDlg)
115 SendDlgItemMessage (hDlg, IDC_LIST, LB_SETTABSTOPS, 1, (LPARAM)&xTabStop);
117 Mount_OnUpdate (hDlg, TRUE);
121 void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog)
124 memset(&List, 0, sizeof(DRIVEMAPLIST));
125 QueryDriveMapList (&List);
127 HWND hList = GetDlgItem (hDlg, IDC_LIST);
128 int iItemSel = LB_GetSelected(hList);
129 int iDataSel = Mount_DriveFromItem (hDlg, iItemSel);
132 if (fOnInitDialog && (iDataSel == -1))
133 iDataSel = l.iDriveSelectLast;
135 LB_StartChange(hList, TRUE);
137 for (int iDrive = 25; iDrive >= 0; --iDrive)
139 if (!List.aDriveMap[ iDrive ].szMapping[0])
142 TCHAR szAfsPath[ MAX_PATH ];
143 AdjustAfsPath (szAfsPath, List.aDriveMap[ iDrive ].szMapping, TRUE, FALSE);
145 LPTSTR psz = FormatString (IDS_DRIVE_MAP, TEXT("%c%s"), List.aDriveMap[ iDrive ].chDrive, szAfsPath);
146 int iItem = LB_AddItem(hList, psz, List.aDriveMap[ iDrive ].fActive);
149 int iCount = SendMessage(hList, LB_GETCOUNT, 0, 0);
151 /* This really shouldn't work except that we are adding
152 * the strings in alphabetical order. Otherwise, we could
153 * identify an index value for a string that could then change.
155 if (iDrive == iDataSel)
159 LB_EndChange(hList, NULL);
161 LB_SetSelected(hList, iItemSel);
163 Mount_OnSelect (hDlg);
164 FreeDriveMapList (&List);
168 void Mount_OnSelect (HWND hDlg)
170 BOOL fServiceRunning = IsServiceRunning();
172 HWND hList = GetDlgItem (hDlg, IDC_LIST);
173 int iItemSel = LB_GetSelected(hList);
174 int iDataSel = Mount_DriveFromItem (hDlg, iItemSel);
176 l.iDriveSelectLast = iDataSel;
178 EnableWindow (GetDlgItem (hDlg, IDC_ADD), fServiceRunning);
179 EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fServiceRunning && (iDataSel != -1));
180 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), fServiceRunning && (iDataSel != -1));
184 void Mount_OnCheck (HWND hDlg)
187 QueryDriveMapList (&List);
189 HWND hList = GetDlgItem (hDlg, IDC_LIST);
190 int iItemSel = LB_GetSelected(hList);
191 int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
192 BOOL fChecked = SendMessage (hList, LB_GETITEMDATA, iItemSel, 0);
197 if (fChecked && List.aDriveMap[ iDriveSel ].szMapping[0] && !List.aDriveMap[ iDriveSel ].fActive)
199 if (!ActivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, List.aDriveMap[ iDriveSel ].szMapping, List.aDriveMap[ iDriveSel ].szSubmount, List.aDriveMap[ iDriveSel ].fPersistent, &dwStatus))
200 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
201 Mount_OnUpdate (hDlg);
203 else if (!fChecked && List.aDriveMap[ iDriveSel ].fActive)
205 if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
206 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
207 Mount_OnUpdate (hDlg);
209 WriteActiveMap(List.aDriveMap[ iDriveSel ].chDrive, fChecked && List.aDriveMap[ iDriveSel ].fPersistent );
212 FreeDriveMapList (&List);
216 void Mount_OnRemove (HWND hDlg)
218 HWND hList = GetDlgItem (hDlg, IDC_LIST);
219 int iItemSel = LB_GetSelected(hList);
220 int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
225 QueryDriveMapList (&List);
227 if (List.aDriveMap[ iDriveSel ].szMapping[0])
229 if (List.aDriveMap[ iDriveSel ].fActive)
232 if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
234 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
238 List.aDriveMap[ iDriveSel ].szMapping[0] = TEXT('\0');
239 WriteDriveMappings (&List);
241 Mount_OnUpdate (hDlg);
243 WriteActiveMap(List.aDriveMap[ iDriveSel ].chDrive, FALSE );
244 FreeDriveMapList (&List);
249 void Mount_OnAdd (HWND hDlg)
251 Mount_AdjustMapping (hDlg, -1);
255 void Mount_OnEdit (HWND hDlg)
257 HWND hList = GetDlgItem (hDlg, IDC_LIST);
258 int iItemSel = LB_GetSelected(hList);
259 int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
261 Mount_AdjustMapping (hDlg, iDriveSel);
265 void Mount_AdjustMapping (HWND hDlg, int iDrive)
268 QueryDriveMapList (&List);
270 DRIVEMAP DriveMapOrig;
271 memset (&DriveMapOrig, 0x00, sizeof(DRIVEMAP));
275 memcpy (&DriveMapOrig, &List.aDriveMap[ iDrive ], sizeof(DRIVEMAP));
279 memcpy (&DriveMap, &DriveMapOrig, sizeof(DRIVEMAP));
281 if (ModalDialogParam (IDD_MAPPING, hDlg, (DLGPROC)Mapping_DlgProc, (LPARAM)&DriveMap) == IDOK)
283 TCHAR szAfsPathOrig[ MAX_PATH ];
285 AdjustAfsPath (szAfsPathOrig, DriveMapOrig.szMapping, TRUE, TRUE);
287 TCHAR szAfsPathNew[ MAX_PATH ];
288 AdjustAfsPath (szAfsPathNew, DriveMap.szMapping, TRUE, TRUE);
290 if ( (lstrcmpi (szAfsPathOrig, szAfsPathNew)) ||
291 (lstrcmpi (DriveMapOrig.szSubmount, DriveMap.szSubmount)) ||
292 (DriveMapOrig.chDrive != DriveMap.chDrive) ||
293 (DriveMapOrig.fPersistent != DriveMap.fPersistent) )
297 if ((iDrive != -1) && (DriveMapOrig.fActive))
299 if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus))
301 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
302 Mount_OnUpdate (hDlg);
307 if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, DriveMap.szSubmount, DriveMap.fPersistent, &dwStatus))
309 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
310 Mount_OnUpdate (hDlg);
314 if (DriveMap.szSubmount[0])
316 TCHAR szSubmountNow[ MAX_PATH ];
317 if (GetDriveSubmount (DriveMap.chDrive, szSubmountNow))
319 if (lstrcmpi (DriveMap.szSubmount, szSubmountNow))
321 int idsTitle = (g.fIsWinNT) ? IDS_NEWSUB_TITLE : IDS_NEWSUB_TITLE_95;
322 Message (MB_OK | MB_ICONASTERISK, idsTitle, IDS_NEWSUB_DESC);
328 memset (&List.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP));
329 memcpy (&List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP));
330 lstrcpy (List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew);
331 WriteDriveMappings (&List);
333 Mount_OnUpdate (hDlg);
339 int Mount_DriveFromItem (HWND hDlg, int iItem)
341 TCHAR szItem[ 1024 ] = TEXT("");
342 SendDlgItemMessage (hDlg, IDC_LIST, LB_GETTEXT, iItem, (LPARAM)szItem);
345 if ((pch = (LPTSTR)lstrchr (szItem, TEXT(':'))) != NULL)
350 if ((*pch >= TEXT('A')) && (*pch <= TEXT('Z')))
351 return (*pch) - TEXT('A');
359 BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
364 SetWindowLongPtr (hDlg, DWLP_USER, lp);
365 Mapping_OnInitDialog (hDlg);
376 EndDialog (hDlg, IDCANCEL);
380 Mapping_OnEnable (hDlg);
384 Mapping_DlgProc (hDlg, WM_HELP, 0, 0);
390 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_MAPDRIVE);
397 void Mapping_OnInitDialog (HWND hDlg)
399 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLongPtr (hDlg, DWLP_USER);
401 // Fill in the combo box
403 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
405 if (pMap->chDrive != 0)
406 dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
409 HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
410 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
412 for (int ii = 0; ii < 26; ++ii)
414 if (!(dwDrives & (1<<ii)))
416 TCHAR szText[ cchRESOURCE ];
417 GetString (szText, IDS_MAP_LETTER);
420 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
421 *pch = TEXT('A') + ii;
423 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
424 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
425 if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
427 else if ((!pMap->chDrive) && (iItemSel == -1))
432 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
433 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
435 TCHAR szMapping[ MAX_PATH ];
436 AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
437 CHAR msg[256], msgf[256];
438 if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
440 wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
441 SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
443 SetDlgItemText (hDlg, IDC_MAP_PATH, szMapping);
444 SetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount);
446 CheckDlgButton (hDlg, IDC_MAP_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
448 Mapping_OnEnable (hDlg);
452 void Mapping_OnOK (HWND hDlg)
454 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLongPtr (hDlg, DWLP_USER);
456 int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
457 int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
459 pMap->chDrive = chDRIVE_A + iDrive;
460 GetDlgItemText (hDlg, IDC_MAP_PATH, pMap->szMapping, MAX_PATH);
461 GetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount, MAX_PATH);
462 pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_MAP_PERSISTENT);
464 if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
466 int idsTitle = (g.fIsWinNT) ? IDS_BADSUB_TITLE : IDS_BADSUB_TITLE_95;
467 Message (MB_ICONHAND, idsTitle, IDS_BADSUB_DESC);
471 if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) && /*TEXT("/afs")*/
472 (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) ) /*TEXT("\\afs")*/
474 Message (MB_ICONHAND, IDS_BADMAP_TITLE, IDS_BADMAP_DESC);
478 WriteActiveMap(pMap->chDrive, pMap->fPersistent);
479 EndDialog (hDlg, IDOK);
483 void Mapping_OnEnable (HWND hDlg)
485 TCHAR szPath[ MAX_PATH ];
486 GetDlgItemText (hDlg, IDC_MAP_PATH, szPath, MAX_PATH);
487 EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));