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 <afs/param.h>
16 #include <afs/fs_utils.h>
19 #include "afs_config.h"
20 #include <WINNT\afsreg.h>
22 #include <lanahelper.h>
25 * DEFINITIONS ________________________________________________________________
28 static DRIVEMAPLIST GlobalDrives;
29 static TCHAR szHostName[128];
31 // DefineDosDrive actions
32 enum DDDACTION { DDD_ADD, DDD_REMOVE };
34 #define DRIVE_LETTER_INDEX 2
38 * PROTOTYPES _________________________________________________________________
41 void AutoMap_OnInitDialog (HWND hDlg);
42 void AutoMap_OnAdd (HWND hDlg);
43 void AutoMap_OnSelect (HWND hDlg);
44 void AutoMap_OnEdit (HWND hDlg);
45 void AutoMap_OnRemove (HWND hDlg);
47 void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives);
48 void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap);
49 void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap);
50 DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem = 0);
51 BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction = DDD_ADD);
53 BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
54 void AutoMapEdit_OnInitDialog (HWND hDlg);
55 void AutoMapEdit_OnOK (HWND hDlg);
56 void AutoMapEdit_Enable (HWND hDlg);
60 * ROUTINES ___________________________________________________________________
64 BOOL CALLBACK AutoMap_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
69 AutoMap_OnInitDialog (hDlg);
72 case WM_CTLCOLORSTATIC:
73 if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE))
75 if (IsWindowEnabled ((HWND)lp))
77 static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
78 SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT));
79 SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
80 return (BOOL)hbrStatic;
89 AutoMap_DlgProc (hDlg, WM_HELP, 0, 0);
93 EndDialog(hDlg, IDOK);
97 EndDialog(hDlg, IDCANCEL);
105 AutoMap_OnEdit(hDlg);
109 AutoMap_OnRemove(hDlg);
115 switch (((LPNMHDR)lp)->code)
118 AutoMap_OnSelect (hDlg);
122 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
123 AutoMap_OnEdit (hDlg);
129 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP);
137 void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap)
139 int nCurDrive = DriveMap.chDrive - TEXT('A');
141 memcpy(&DriveMapList.aDriveMap[nCurDrive], &DriveMap, sizeof(DRIVEMAP));
145 void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap)
147 int nCurDrive = DriveMap.chDrive - TEXT('A');
149 memset(&DriveMapList.aDriveMap[nCurDrive], 0, sizeof(DRIVEMAP));
153 void AutoMap_OnInitDialog (HWND hDlg)
155 // Prepare the columns
156 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
158 FASTLISTCOLUMN Column;
159 Column.dwFlags = FLCF_JUSTIFY_LEFT;
161 GetString (Column.szText, IDS_DRIVE);
162 FastList_SetColumn (hList, 0, &Column);
164 Column.dwFlags = FLCF_JUSTIFY_LEFT;
165 Column.cxWidth = 266;
166 GetString (Column.szText, IDS_SUBCOL_PATH);
167 FastList_SetColumn (hList, 1, &Column);
169 gethostname(szHostName, sizeof(szHostName));
171 Config_GetGlobalDriveList(&GlobalDrives);
173 ShowDriveList(hDlg, GlobalDrives);
177 void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives)
179 // Prepare the columns
180 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
182 // Fill in the list of drives
183 FastList_Begin (hList);
185 FastList_RemoveAll(hList);
187 for (size_t ii = 0; ii < 26; ++ii) {
188 if (!GlobalDrives.aDriveMap[ ii ].chDrive)
191 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
194 memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
195 ai.iFirstImage = IMAGE_NOIMAGE;
196 ai.iSecondImage = IMAGE_NOIMAGE;
197 // There must be DRIVE_LETTER_INDEX number of spaces before the ? character
198 ai.pszText = _tcsdup(TEXT(" ?:"));
199 ai.pszText[DRIVE_LETTER_INDEX] = GlobalDrives.aDriveMap[ ii ].chDrive;
202 HLISTITEM hItem = FastList_AddItem (hList, &ai);
204 TCHAR szAfsPath[ MAX_PATH ];
205 AdjustAfsPath (szAfsPath, GlobalDrives.aDriveMap[ ii ].szMapping, TRUE, FALSE);
207 FastList_SetItemText (hList, hItem, 1, szAfsPath);
210 FastList_End (hList);
214 BOOL UpdateRegistry(DRIVEMAP *pDrive, BOOL bRemove)
216 TCHAR szKeyName[128];
217 TCHAR szValueName[128];
225 _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY));
227 if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, &dwDispo) != ERROR_SUCCESS)
230 _stprintf(szValueName, TEXT("%c:"), pDrive->chDrive);
233 result = RegDeleteValue(hKey, szValueName);
235 result = RegSetValueEx(hKey, szValueName, 0, REG_SZ, (BYTE *)pDrive->szSubmount, lstrlen(pDrive->szSubmount) + 1);
239 return (result == ERROR_SUCCESS);
243 BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction)
245 // TCHAR szAfsPath[MAX_PATH];
246 // TCHAR szDrive[3] = TEXT("?:");
247 BOOL fResult = FALSE;
252 if (dddAction == DDD_REMOVE) {
253 if (!(fResult=(DisMountDOSDrive(pDrive->chDrive)==NO_ERROR)))
254 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError());
255 } else if (dddAction == DDD_ADD) {
256 if (!(fResult=(MountDOSDrive(pDrive->chDrive, pDrive->szSubmount,FALSE)==NO_ERROR)))
257 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError());
260 Replace this code with Drive mapping routine that doesn't require different formats for each OS
261 szDrive[0] = pDrive->chDrive;
262 _stprintf(szAfsPath, TEXT("\\Device\\LanmanRedirector\\%s\\%s-AFS\\%s"), szDrive, szHostName, pDrive->szSubmount);
264 if (dddAction == DDD_REMOVE) {
265 fResult = DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, szDrive, szAfsPath);
267 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError());
268 } else if (dddAction == DDD_ADD) {
269 fResult = DefineDosDevice(DDD_RAW_TARGET_PATH, szDrive, szAfsPath);
271 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError());
276 UpdateRegistry(pDrive, dddAction == DDD_REMOVE);
282 void AutoMap_OnAdd(HWND hDlg)
285 memset(&DriveMap, 0, sizeof(DRIVEMAP));
287 if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&DriveMap) != IDOK)
290 if (DriveMap.chDrive) {
291 if (DefineDosDrive(&DriveMap)) {
292 AddToDriveList(GlobalDrives, DriveMap);
293 ShowDriveList(hDlg, GlobalDrives);
297 AutoMap_OnSelect(hDlg);
301 void AutoMap_OnSelect (HWND hDlg)
303 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
305 BOOL bEnable = FastList_FindFirstSelected (hList) != NULL;
307 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), bEnable);
308 EnableWindow (GetDlgItem (hDlg, IDC_CHANGE), bEnable);
312 DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem)
314 static DRIVEMAP DriveMap;
317 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
322 if ((*pItem = FastList_FindFirstSelected (hList)) == NULL)
325 LPCTSTR pszDrive = FastList_GetItemText (hList, *pItem, 0);
326 int nCurDrive = pszDrive[DRIVE_LETTER_INDEX] - TEXT('A');
328 memcpy(&DriveMap, &GlobalDrives.aDriveMap[nCurDrive], sizeof(DRIVEMAP));
334 void AutoMap_OnEdit (HWND hDlg)
336 DRIVEMAP *pOldDrive = GetSelectedDrive(hDlg);
341 memcpy(&NewDrive, pOldDrive, sizeof(DRIVEMAP));
343 if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&NewDrive) != IDOK)
346 if (DefineDosDrive(pOldDrive, DDD_REMOVE)) {
347 RemoveFromDriveList(GlobalDrives, *pOldDrive);
349 if (DefineDosDrive(&NewDrive))
350 AddToDriveList(GlobalDrives, NewDrive);
352 ShowDriveList(hDlg, GlobalDrives);
355 AutoMap_OnSelect(hDlg);
359 void AutoMap_OnRemove (HWND hDlg)
363 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
365 DRIVEMAP *pDrive = GetSelectedDrive(hDlg, &hItem);
369 if (DefineDosDrive(pDrive, DDD_REMOVE)) {
370 RemoveFromDriveList(GlobalDrives, *pDrive);
371 FastList_RemoveItem (hList, hItem);
374 AutoMap_OnSelect(hDlg);
378 BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
383 SetWindowLongPtr (hDlg, DWLP_USER, lp);
384 AutoMapEdit_OnInitDialog (hDlg);
391 AutoMapEdit_OnOK (hDlg);
395 EndDialog (hDlg, IDCANCEL);
399 AutoMapEdit_Enable (hDlg);
403 AutoMapEdit_DlgProc (hDlg, WM_HELP, 0, 0);
409 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP_ADDEDIT);
416 void AutoMapEdit_OnInitDialog (HWND hDlg)
418 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLongPtr (hDlg, DWLP_USER);
420 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
422 // Fill in the combo box
425 if (pMap->chDrive != 0)
426 dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
429 HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE);
430 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
432 for (int ii = 0; ii < 26; ++ii)
434 if (!(dwDrives & (1<<ii)))
436 TCHAR szText[ cchRESOURCE ];
437 GetString (szText, IDS_MAP_LETTER);
440 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
441 *pch = TEXT('A') + ii;
443 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
444 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
445 if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
447 else if ((!pMap->chDrive) && (iItemSel == -1))
452 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
453 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
455 TCHAR szMapping[ MAX_PATH ];
456 AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
457 SetDlgItemText (hDlg, IDC_PATH, szMapping);
458 SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount);
460 CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
462 AutoMapEdit_Enable (hDlg);
466 void AutoMapEdit_OnOK (HWND hDlg)
468 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLongPtr (hDlg, DWLP_USER);
470 int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0);
471 int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0);
473 pMap->chDrive = chDRIVE_A + iDrive;
474 GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH);
475 GetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount, MAX_PATH);
476 pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT);
478 if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
480 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADSUB_DESC);
484 if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) &&
485 (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) )
487 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
491 // First get a proper submount
492 if (pMap->szSubmount[0]) {
493 TCHAR szNewSubmount[MAX_PATH];
494 PathToSubmount (szNewSubmount, pMap->szMapping, pMap->szSubmount, 0);
495 if (lstrcmp(szNewSubmount, pMap->szSubmount) != 0) {
496 Message (MB_OK | MB_ICONASTERISK, GetCautionTitle(), IDS_NEWSUB_DESC);
499 } else { // If no submount was specified, then get a new one
500 if (!PathToSubmount (pMap->szSubmount, pMap->szMapping, 0, 0)) {
505 EndDialog (hDlg, IDOK);
509 void AutoMapEdit_Enable (HWND hDlg)
511 TCHAR szPath[ MAX_PATH ];
512 GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH);
513 EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));