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>
15 #include "afs_config.h"
19 * DEFINITIONS ________________________________________________________________
22 static DRIVEMAPLIST GlobalDrives;
23 static TCHAR szHostName[128];
25 // DefineDosDrive actions
26 enum DDDACTION { DDD_ADD, DDD_REMOVE };
28 #define DRIVE_LETTER_INDEX 2
32 * PROTOTYPES _________________________________________________________________
36 void AutoMap_OnInitDialog (HWND hDlg);
37 void AutoMap_OnAdd (HWND hDlg);
38 void AutoMap_OnSelect (HWND hDlg);
39 void AutoMap_OnEdit (HWND hDlg);
40 void AutoMap_OnRemove (HWND hDlg);
42 void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives);
43 void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap);
44 void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap);
45 DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem = 0);
46 BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction = DDD_ADD);
48 BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
49 void AutoMapEdit_OnInitDialog (HWND hDlg);
50 void AutoMapEdit_OnOK (HWND hDlg);
51 void AutoMapEdit_Enable (HWND hDlg);
55 * ROUTINES ___________________________________________________________________
59 BOOL CALLBACK AutoMap_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
64 AutoMap_OnInitDialog (hDlg);
67 case WM_CTLCOLORSTATIC:
68 if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE))
70 if (IsWindowEnabled ((HWND)lp))
72 static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
73 SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT));
74 SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
75 return (BOOL)hbrStatic;
84 AutoMap_DlgProc (hDlg, WM_HELP, 0, 0);
88 EndDialog(hDlg, IDOK);
92 EndDialog(hDlg, IDCANCEL);
100 AutoMap_OnEdit(hDlg);
104 AutoMap_OnRemove(hDlg);
110 switch (((LPNMHDR)lp)->code)
113 AutoMap_OnSelect (hDlg);
117 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
118 AutoMap_OnEdit (hDlg);
124 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP);
132 void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap)
134 int nCurDrive = DriveMap.chDrive - TEXT('A');
136 memcpy(&DriveMapList.aDriveMap[nCurDrive], &DriveMap, sizeof(DRIVEMAP));
140 void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap)
142 int nCurDrive = DriveMap.chDrive - TEXT('A');
144 memset(&DriveMapList.aDriveMap[nCurDrive], 0, sizeof(DRIVEMAP));
148 void AutoMap_OnInitDialog (HWND hDlg)
150 // Prepare the columns
151 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
153 FASTLISTCOLUMN Column;
154 Column.dwFlags = FLCF_JUSTIFY_LEFT;
156 GetString (Column.szText, IDS_DRIVE);
157 FastList_SetColumn (hList, 0, &Column);
159 Column.dwFlags = FLCF_JUSTIFY_LEFT;
160 Column.cxWidth = 266;
161 GetString (Column.szText, IDS_SUBCOL_PATH);
162 FastList_SetColumn (hList, 1, &Column);
164 gethostname(szHostName, sizeof(szHostName));
166 Config_GetGlobalDriveList(&GlobalDrives);
168 ShowDriveList(hDlg, GlobalDrives);
172 void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives)
174 // Prepare the columns
175 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
177 // Fill in the list of drives
178 FastList_Begin (hList);
180 FastList_RemoveAll(hList);
182 for (size_t ii = 0; ii < 26; ++ii) {
183 if (!GlobalDrives.aDriveMap[ ii ].chDrive)
186 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
189 memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
190 ai.iFirstImage = IMAGE_NOIMAGE;
191 ai.iSecondImage = IMAGE_NOIMAGE;
192 // There must be DRIVE_LETTER_INDEX number of spaces before the ? character
193 ai.pszText = _tcsdup(TEXT(" ?:"));
194 ai.pszText[DRIVE_LETTER_INDEX] = GlobalDrives.aDriveMap[ ii ].chDrive;
197 HLISTITEM hItem = FastList_AddItem (hList, &ai);
199 TCHAR szAfsPath[ MAX_PATH ];
200 AdjustAfsPath (szAfsPath, GlobalDrives.aDriveMap[ ii ].szMapping, TRUE, FALSE);
202 FastList_SetItemText (hList, hItem, 1, szAfsPath);
205 FastList_End (hList);
209 BOOL UpdateRegistry(DRIVEMAP *pDrive, BOOL bRemove)
211 TCHAR szKeyName[128];
212 TCHAR szValueName[128];
219 _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), AFSConfigKeyName);
221 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_SET_VALUE, &hKey) != ERROR_SUCCESS)
224 _stprintf(szValueName, TEXT("%c:"), pDrive->chDrive);
227 result = RegDeleteValue(hKey, szValueName);
229 result = RegSetValueEx(hKey, szValueName, 0, REG_SZ, (BYTE *)pDrive->szSubmount, lstrlen(pDrive->szSubmount) + 1);
233 return (result == ERROR_SUCCESS);
237 BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction)
239 TCHAR szAfsPath[MAX_PATH];
240 TCHAR szDrive[3] = TEXT("?:");
241 BOOL fResult = FALSE;
246 szDrive[0] = pDrive->chDrive;
247 _stprintf(szAfsPath, TEXT("\\Device\\LanmanRedirector\\%s\\%s-AFS\\%s"), szDrive, szHostName, pDrive->szSubmount);
249 if (dddAction == DDD_REMOVE) {
250 fResult = DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, szDrive, szAfsPath);
252 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError());
253 } else if (dddAction == DDD_ADD) {
254 fResult = DefineDosDevice(DDD_RAW_TARGET_PATH, szDrive, szAfsPath);
256 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError());
260 UpdateRegistry(pDrive, dddAction == DDD_REMOVE);
266 void AutoMap_OnAdd(HWND hDlg)
269 memset(&DriveMap, 0, sizeof(DRIVEMAP));
271 if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&DriveMap) != IDOK)
274 if (DriveMap.chDrive) {
275 if (DefineDosDrive(&DriveMap)) {
276 AddToDriveList(GlobalDrives, DriveMap);
277 ShowDriveList(hDlg, GlobalDrives);
281 AutoMap_OnSelect(hDlg);
285 void AutoMap_OnSelect (HWND hDlg)
287 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
289 BOOL bEnable = FastList_FindFirstSelected (hList) != NULL;
291 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), bEnable);
292 EnableWindow (GetDlgItem (hDlg, IDC_CHANGE), bEnable);
296 DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem)
298 static DRIVEMAP DriveMap;
301 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
306 if ((*pItem = FastList_FindFirstSelected (hList)) == NULL)
309 LPCTSTR pszDrive = FastList_GetItemText (hList, *pItem, 0);
310 int nCurDrive = pszDrive[DRIVE_LETTER_INDEX] - TEXT('A');
312 memcpy(&DriveMap, &GlobalDrives.aDriveMap[nCurDrive], sizeof(DRIVEMAP));
318 void AutoMap_OnEdit (HWND hDlg)
320 DRIVEMAP *pOldDrive = GetSelectedDrive(hDlg);
325 memcpy(&NewDrive, pOldDrive, sizeof(DRIVEMAP));
327 if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&NewDrive) != IDOK)
330 if (DefineDosDrive(pOldDrive, DDD_REMOVE)) {
331 RemoveFromDriveList(GlobalDrives, *pOldDrive);
333 if (DefineDosDrive(&NewDrive))
334 AddToDriveList(GlobalDrives, NewDrive);
336 ShowDriveList(hDlg, GlobalDrives);
339 AutoMap_OnSelect(hDlg);
343 void AutoMap_OnRemove (HWND hDlg)
347 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
349 DRIVEMAP *pDrive = GetSelectedDrive(hDlg, &hItem);
353 if (DefineDosDrive(pDrive, DDD_REMOVE)) {
354 RemoveFromDriveList(GlobalDrives, *pDrive);
355 FastList_RemoveItem (hList, hItem);
358 AutoMap_OnSelect(hDlg);
362 BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
367 SetWindowLong (hDlg, DWL_USER, lp);
368 AutoMapEdit_OnInitDialog (hDlg);
375 AutoMapEdit_OnOK (hDlg);
379 EndDialog (hDlg, IDCANCEL);
383 AutoMapEdit_Enable (hDlg);
387 AutoMapEdit_DlgProc (hDlg, WM_HELP, 0, 0);
393 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP_ADDEDIT);
400 void AutoMapEdit_OnInitDialog (HWND hDlg)
402 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
404 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
406 // Fill in the combo box
409 if (pMap->chDrive != 0)
410 dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
413 HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE);
414 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
416 for (int ii = 0; ii < 26; ++ii)
418 if (!(dwDrives & (1<<ii)))
420 TCHAR szText[ cchRESOURCE ];
421 GetString (szText, IDS_MAP_LETTER);
424 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
425 *pch = TEXT('A') + ii;
427 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
428 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
429 if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
431 else if ((!pMap->chDrive) && (iItemSel == -1))
436 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
437 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
439 TCHAR szMapping[ MAX_PATH ];
440 AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : TEXT("/afs")), TRUE, FALSE);
441 SetDlgItemText (hDlg, IDC_PATH, szMapping);
442 SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount);
444 CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
446 AutoMapEdit_Enable (hDlg);
450 void AutoMapEdit_OnOK (HWND hDlg)
452 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
454 int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0);
455 int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0);
457 pMap->chDrive = chDRIVE_A + iDrive;
458 GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH);
459 GetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount, MAX_PATH);
460 pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT);
462 if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
464 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADSUB_DESC);
468 if ( (lstrncmpi (pMap->szMapping, TEXT("/afs"), lstrlen(TEXT("/afs")))) &&
469 (lstrncmpi (pMap->szMapping, TEXT("\\afs"), lstrlen(TEXT("\\afs")))) )
471 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
475 // First get a proper submount
476 if (pMap->szSubmount[0]) {
477 TCHAR szNewSubmount[MAX_PATH];
478 PathToSubmount (szNewSubmount, pMap->szMapping, pMap->szSubmount, 0);
479 if (lstrcmp(szNewSubmount, pMap->szSubmount) != 0) {
480 Message (MB_OK | MB_ICONASTERISK, GetCautionTitle(), IDS_NEWSUB_DESC);
483 } else { // If no submount was specified, then get a new one
484 if (!PathToSubmount (pMap->szSubmount, pMap->szMapping, 0, 0)) {
489 EndDialog (hDlg, IDOK);
493 void AutoMapEdit_Enable (HWND hDlg)
495 TCHAR szPath[ MAX_PATH ];
496 GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH);
497 EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));