6 #include "afs_config.h"
10 * DEFINITIONS ________________________________________________________________
13 static DRIVEMAPLIST GlobalDrives;
14 static TCHAR szHostName[128];
16 // DefineDosDrive actions
17 enum DDDACTION { DDD_ADD, DDD_REMOVE };
19 #define DRIVE_LETTER_INDEX 2
23 * PROTOTYPES _________________________________________________________________
27 void AutoMap_OnInitDialog (HWND hDlg);
28 void AutoMap_OnAdd (HWND hDlg);
29 void AutoMap_OnSelect (HWND hDlg);
30 void AutoMap_OnEdit (HWND hDlg);
31 void AutoMap_OnRemove (HWND hDlg);
33 void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives);
34 void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap);
35 void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap);
36 DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem = 0);
37 BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction = DDD_ADD);
39 BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
40 void AutoMapEdit_OnInitDialog (HWND hDlg);
41 void AutoMapEdit_OnOK (HWND hDlg);
42 void AutoMapEdit_Enable (HWND hDlg);
46 * ROUTINES ___________________________________________________________________
50 BOOL CALLBACK AutoMap_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
55 AutoMap_OnInitDialog (hDlg);
58 case WM_CTLCOLORSTATIC:
59 if ((HWND)lp == GetDlgItem (hDlg, IDC_CHUNK_SIZE))
61 if (IsWindowEnabled ((HWND)lp))
63 static HBRUSH hbrStatic = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
64 SetTextColor ((HDC)wp, GetSysColor (COLOR_WINDOWTEXT));
65 SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
66 return (BOOL)hbrStatic;
75 AutoMap_DlgProc (hDlg, WM_HELP, 0, 0);
79 EndDialog(hDlg, IDOK);
83 EndDialog(hDlg, IDCANCEL);
95 AutoMap_OnRemove(hDlg);
101 switch (((LPNMHDR)lp)->code)
104 AutoMap_OnSelect (hDlg);
108 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
109 AutoMap_OnEdit (hDlg);
115 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP);
123 void AddToDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap)
125 int nCurDrive = DriveMap.chDrive - TEXT('A');
127 memcpy(&DriveMapList.aDriveMap[nCurDrive], &DriveMap, sizeof(DRIVEMAP));
131 void RemoveFromDriveList(DRIVEMAPLIST& DriveMapList, DRIVEMAP& DriveMap)
133 int nCurDrive = DriveMap.chDrive - TEXT('A');
135 memset(&DriveMapList.aDriveMap[nCurDrive], 0, sizeof(DRIVEMAP));
139 void AutoMap_OnInitDialog (HWND hDlg)
141 // Prepare the columns
142 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
144 FASTLISTCOLUMN Column;
145 Column.dwFlags = FLCF_JUSTIFY_LEFT;
147 GetString (Column.szText, IDS_DRIVE);
148 FastList_SetColumn (hList, 0, &Column);
150 Column.dwFlags = FLCF_JUSTIFY_LEFT;
151 Column.cxWidth = 266;
152 GetString (Column.szText, IDS_SUBCOL_PATH);
153 FastList_SetColumn (hList, 1, &Column);
155 gethostname(szHostName, sizeof(szHostName));
157 Config_GetGlobalDriveList(&GlobalDrives);
159 ShowDriveList(hDlg, GlobalDrives);
163 void ShowDriveList(HWND hDlg, DRIVEMAPLIST& drives)
165 // Prepare the columns
166 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
168 // Fill in the list of drives
169 FastList_Begin (hList);
171 FastList_RemoveAll(hList);
173 for (size_t ii = 0; ii < 26; ++ii) {
174 if (!GlobalDrives.aDriveMap[ ii ].chDrive)
177 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
180 memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
181 ai.iFirstImage = IMAGE_NOIMAGE;
182 ai.iSecondImage = IMAGE_NOIMAGE;
183 // There must be DRIVE_LETTER_INDEX number of spaces before the ? character
184 ai.pszText = _tcsdup(TEXT(" ?:"));
185 ai.pszText[DRIVE_LETTER_INDEX] = GlobalDrives.aDriveMap[ ii ].chDrive;
188 HLISTITEM hItem = FastList_AddItem (hList, &ai);
190 TCHAR szAfsPath[ MAX_PATH ];
191 AdjustAfsPath (szAfsPath, GlobalDrives.aDriveMap[ ii ].szMapping, TRUE, FALSE);
193 FastList_SetItemText (hList, hItem, 1, szAfsPath);
196 FastList_End (hList);
200 BOOL UpdateRegistry(DRIVEMAP *pDrive, BOOL bRemove)
202 TCHAR szKeyName[128];
203 TCHAR szValueName[128];
210 _stprintf(szKeyName, TEXT("%s\\GlobalAutoMapper"), AFSConfigKeyName);
212 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_SET_VALUE, &hKey) != ERROR_SUCCESS)
215 _stprintf(szValueName, TEXT("%c:"), pDrive->chDrive);
218 result = RegDeleteValue(hKey, szValueName);
220 result = RegSetValueEx(hKey, szValueName, 0, REG_SZ, (BYTE *)pDrive->szSubmount, lstrlen(pDrive->szSubmount) + 1);
224 return (result == ERROR_SUCCESS);
228 BOOL DefineDosDrive(DRIVEMAP *pDrive, DDDACTION dddAction)
230 TCHAR szAfsPath[MAX_PATH];
231 TCHAR szDrive[3] = TEXT("?:");
232 BOOL fResult = FALSE;
237 szDrive[0] = pDrive->chDrive;
238 _stprintf(szAfsPath, TEXT("\\Device\\LanmanRedirector\\%s\\%s-AFS\\%s"), szDrive, szHostName, pDrive->szSubmount);
240 if (dddAction == DDD_REMOVE) {
241 fResult = DefineDosDevice(DDD_RAW_TARGET_PATH | DDD_REMOVE_DEFINITION | DDD_EXACT_MATCH_ON_REMOVE, szDrive, szAfsPath);
243 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), GetLastError());
244 } else if (dddAction == DDD_ADD) {
245 fResult = DefineDosDevice(DDD_RAW_TARGET_PATH, szDrive, szAfsPath);
247 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), GetLastError());
251 UpdateRegistry(pDrive, dddAction == DDD_REMOVE);
257 void AutoMap_OnAdd(HWND hDlg)
260 memset(&DriveMap, 0, sizeof(DRIVEMAP));
262 if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&DriveMap) != IDOK)
265 if (DriveMap.chDrive) {
266 if (DefineDosDrive(&DriveMap)) {
267 AddToDriveList(GlobalDrives, DriveMap);
268 ShowDriveList(hDlg, GlobalDrives);
272 AutoMap_OnSelect(hDlg);
276 void AutoMap_OnSelect (HWND hDlg)
278 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
280 BOOL bEnable = FastList_FindFirstSelected (hList) != NULL;
282 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), bEnable);
283 EnableWindow (GetDlgItem (hDlg, IDC_CHANGE), bEnable);
287 DRIVEMAP *GetSelectedDrive(HWND hDlg, HLISTITEM *pItem)
289 static DRIVEMAP DriveMap;
292 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
297 if ((*pItem = FastList_FindFirstSelected (hList)) == NULL)
300 LPCTSTR pszDrive = FastList_GetItemText (hList, *pItem, 0);
301 int nCurDrive = pszDrive[DRIVE_LETTER_INDEX] - TEXT('A');
303 memcpy(&DriveMap, &GlobalDrives.aDriveMap[nCurDrive], sizeof(DRIVEMAP));
309 void AutoMap_OnEdit (HWND hDlg)
311 DRIVEMAP *pOldDrive = GetSelectedDrive(hDlg);
316 memcpy(&NewDrive, pOldDrive, sizeof(DRIVEMAP));
318 if (ModalDialogParam (IDD_GLOBAL_DRIVES_ADDEDIT, hDlg, (DLGPROC)AutoMapEdit_DlgProc, (LPARAM)&NewDrive) != IDOK)
321 if (DefineDosDrive(pOldDrive, DDD_REMOVE)) {
322 RemoveFromDriveList(GlobalDrives, *pOldDrive);
324 if (DefineDosDrive(&NewDrive))
325 AddToDriveList(GlobalDrives, NewDrive);
327 ShowDriveList(hDlg, GlobalDrives);
330 AutoMap_OnSelect(hDlg);
334 void AutoMap_OnRemove (HWND hDlg)
338 HWND hList = GetDlgItem (hDlg, IDC_GLOBAL_DRIVE_LIST);
340 DRIVEMAP *pDrive = GetSelectedDrive(hDlg, &hItem);
344 if (DefineDosDrive(pDrive, DDD_REMOVE)) {
345 RemoveFromDriveList(GlobalDrives, *pDrive);
346 FastList_RemoveItem (hList, hItem);
349 AutoMap_OnSelect(hDlg);
353 BOOL CALLBACK AutoMapEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
358 SetWindowLong (hDlg, DWL_USER, lp);
359 AutoMapEdit_OnInitDialog (hDlg);
366 AutoMapEdit_OnOK (hDlg);
370 EndDialog (hDlg, IDCANCEL);
374 AutoMapEdit_Enable (hDlg);
378 AutoMapEdit_DlgProc (hDlg, WM_HELP, 0, 0);
384 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_ADVANCED_AUTOMAP_ADDEDIT);
391 void AutoMapEdit_OnInitDialog (HWND hDlg)
393 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
395 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
397 // Fill in the combo box
400 if (pMap->chDrive != 0)
401 dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
404 HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE);
405 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
407 for (int ii = 0; ii < 26; ++ii)
409 if (!(dwDrives & (1<<ii)))
411 TCHAR szText[ cchRESOURCE ];
412 GetString (szText, IDS_MAP_LETTER);
415 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
416 *pch = TEXT('A') + ii;
418 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
419 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
420 if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
422 else if ((!pMap->chDrive) && (iItemSel == -1))
427 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
428 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
430 TCHAR szMapping[ MAX_PATH ];
431 AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : TEXT("/afs")), TRUE, FALSE);
432 SetDlgItemText (hDlg, IDC_PATH, szMapping);
433 SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount);
435 CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
437 AutoMapEdit_Enable (hDlg);
441 void AutoMapEdit_OnOK (HWND hDlg)
443 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
445 int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0);
446 int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0);
448 pMap->chDrive = chDRIVE_A + iDrive;
449 GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH);
450 GetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount, MAX_PATH);
451 pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT);
453 if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
455 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADSUB_DESC);
459 if ( (lstrncmpi (pMap->szMapping, TEXT("/afs"), lstrlen(TEXT("/afs")))) &&
460 (lstrncmpi (pMap->szMapping, TEXT("\\afs"), lstrlen(TEXT("\\afs")))) )
462 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
466 // First get a proper submount
467 if (pMap->szSubmount[0]) {
468 TCHAR szNewSubmount[MAX_PATH];
469 PathToSubmount (szNewSubmount, pMap->szMapping, pMap->szSubmount, 0);
470 if (lstrcmp(szNewSubmount, pMap->szSubmount) != 0) {
471 Message (MB_OK | MB_ICONASTERISK, GetCautionTitle(), IDS_NEWSUB_DESC);
474 } else { // If no submount was specified, then get a new one
475 if (!PathToSubmount (pMap->szSubmount, pMap->szMapping, 0, 0)) {
480 EndDialog (hDlg, IDOK);
484 void AutoMapEdit_Enable (HWND hDlg)
486 TCHAR szPath[ MAX_PATH ];
487 GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH);
488 EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));