LINUX: afs_create infinite fetchStatus loop
[pkg-k5-afs_openafs.git] / src / WINNT / client_config / tab_drives.cpp
blob6ef465efe20521476a8a093de05fd14bb1ea8423
1 /*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
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
8 */
10 #include <winsock2.h>
11 #include <ws2tcpip.h>
13 extern "C" {
14 #include <afs/param.h>
15 #include <afs/stds.h>
16 #include <afs/fs_utils.h>
19 #include "afs_config.h"
20 #include "tab_drives.h"
21 #include <lanahelper.h>
24 * PROTOTYPES _________________________________________________________________
28 void DrivesTab_OnInitDialog (HWND hDlg);
29 void DrivesTab_OnSelect (HWND hDlg);
30 void DrivesTab_OnCheck (HWND hDlg);
31 void DrivesTab_OnAdd (HWND hDlg);
32 void DrivesTab_OnEdit (HWND hDlg);
33 void DrivesTab_OnRemove (HWND hDlg);
34 void DrivesTab_OnAdvanced (HWND hDlg);
36 void DrivesTab_Enable (HWND hDlg);
37 int DrivesTab_DriveFromItem (HWND hDlg, int iItem);
38 void DrivesTab_FillList (HWND hDlg);
39 void DrivesTab_EditMapping (HWND hDlg, int iDrive);
41 BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
42 void DriveEdit_OnInitDialog (HWND hDlg);
43 void DriveEdit_OnOK (HWND hDlg);
44 void DriveEdit_Enable (HWND hDlg);
46 BOOL CALLBACK Submounts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
47 void Submounts_OnInitDialog (HWND hDlg);
48 void Submounts_OnApply (HWND hDlg);
49 void Submounts_OnSelect (HWND hDlg);
50 void Submounts_OnAdd (HWND hDlg);
51 void Submounts_OnEdit (HWND hDlg);
52 void Submounts_OnRemove (HWND hDlg);
53 void Submounts_EditSubmount (HWND hDlg, PSUBMOUNT pSubmount);
55 BOOL CALLBACK SubEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
56 void SubEdit_OnInitDialog (HWND hDlg);
57 void SubEdit_OnOK (HWND hDlg);
58 void SubEdit_Enable (HWND hDlg);
62 * ROUTINES ___________________________________________________________________
66 BOOL CALLBACK DrivesTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
68 switch (msg)
70 case WM_INITDIALOG:
71 DrivesTab_OnInitDialog (hDlg);
72 break;
74 case WM_COMMAND:
75 switch (LOWORD(wp))
77 case IDC_REFRESH:
78 DrivesTab_Enable (hDlg);
79 break;
81 case IDC_LIST:
82 if (HIWORD(wp) == LBN_CLICKED)
83 DrivesTab_OnCheck (hDlg);
84 else if ((HIWORD(wp) == LBN_SELCHANGE) || (HIWORD(wp) == LBN_SELCANCEL))
85 DrivesTab_OnSelect (hDlg);
86 break;
88 case IDC_ADD:
89 DrivesTab_OnAdd (hDlg);
90 break;
92 case IDC_EDIT:
93 DrivesTab_OnEdit (hDlg);
94 break;
96 case IDC_REMOVE:
97 DrivesTab_OnRemove (hDlg);
98 break;
100 case IDC_ADVANCED:
101 DrivesTab_OnAdvanced (hDlg);
102 break;
104 case IDHELP:
105 DrivesTab_DlgProc (hDlg, WM_HELP, 0, 0);
106 break;
108 break;
110 case WM_HELP:
111 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_DRIVES);
112 break;
115 return FALSE;
119 void DrivesTab_OnInitDialog (HWND hDlg)
121 ShowWindow (GetDlgItem (hDlg, IDC_ADVANCED), g.fIsWinNT);
123 DrivesTab_FillList (hDlg);
127 void DrivesTab_OnSelect (HWND hDlg)
129 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_LIST)))
131 UINT iSel = SendDlgItemMessage (hDlg, IDC_LIST, LB_GETCURSEL, 0, 0);
133 EnableWindow (GetDlgItem (hDlg, IDC_EDIT), (iSel != -1));
134 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), (iSel != -1));
139 void DrivesTab_OnCheck (HWND hDlg)
141 HWND hList = GetDlgItem (hDlg, IDC_LIST);
142 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
143 int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
144 BOOL fChecked = SendMessage (hList, LB_GETITEMDATA, iItemSel, 0);
146 if (iDriveSel != -1)
148 DWORD dwStatus;
149 if (fChecked && g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0] && !g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive)
151 if (!ActivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping, g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szSubmount, g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fPersistent, &dwStatus))
152 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
153 DrivesTab_FillList (hDlg);
155 else if (!fChecked && g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive)
157 if (!InactivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
158 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
159 DrivesTab_FillList (hDlg);
161 WriteActiveMap(g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, fChecked &&
162 g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fPersistent );
168 void DrivesTab_OnAdd (HWND hDlg)
170 DrivesTab_EditMapping (hDlg, -1);
174 void DrivesTab_OnEdit (HWND hDlg)
176 HWND hList = GetDlgItem (hDlg, IDC_LIST);
177 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
178 int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
180 DrivesTab_EditMapping (hDlg, iDriveSel);
184 void DrivesTab_OnRemove (HWND hDlg)
186 HWND hList = GetDlgItem (hDlg, IDC_LIST);
187 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
188 int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
190 if (iDriveSel != -1)
192 if (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0])
194 if (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive)
196 DWORD dwStatus;
197 if (!InactivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
199 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
200 return;
203 g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0] = TEXT('\0');
204 WriteDriveMappings (&g.Configuration.NetDrives);
206 DrivesTab_FillList (hDlg);
208 WriteActiveMap(g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, FALSE );
213 void DrivesTab_OnAdvanced (HWND hDlg)
215 TCHAR szTitle[ cchRESOURCE ];
216 GetString (szTitle, IDS_SUBMOUNTS_TITLE);
218 LPPROPSHEET psh = PropSheet_Create (szTitle, FALSE, GetParent(hDlg), 0);
219 psh->sh.dwFlags |= PSH_NOAPPLYNOW; // Remove the Apply button
220 psh->sh.dwFlags |= PSH_HASHELP; // Add a Help button instead
221 PropSheet_AddTab (psh, szTitle, IDD_SUBMOUNTS, (DLGPROC)Submounts_DlgProc, 0, TRUE);
222 PropSheet_ShowModal (psh);
226 void DrivesTab_Enable (HWND hDlg)
228 BOOL fRunning = (Config_GetServiceState() == SERVICE_RUNNING);
230 EnableWindow (GetDlgItem (hDlg, IDC_LIST), fRunning);
231 EnableWindow (GetDlgItem (hDlg, IDC_ADD), fRunning);
232 EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fRunning);
233 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), fRunning);
235 TCHAR szText[ cchRESOURCE ];
236 GetString (szText, (fRunning) ? IDS_TIP_DRIVES : IDS_WARN_STOPPED);
237 SetDlgItemText (hDlg, IDC_WARN, szText);
241 int DrivesTab_DriveFromItem (HWND hDlg, int iItem)
243 TCHAR szItem[ 1024 ] = TEXT("");
244 SendDlgItemMessage (hDlg, IDC_LIST, LB_GETTEXT, iItem, (LPARAM)szItem);
246 LPTSTR pch;
247 if ((pch = (LPTSTR)lstrchr (szItem, TEXT(':'))) != NULL)
249 if (pch > szItem)
251 pch--;
252 if ((*pch >= TEXT('A')) && (*pch <= TEXT('Z')))
253 return (*pch) - TEXT('A');
257 return -1;
261 void DrivesTab_FillList (HWND hDlg)
263 FreeDriveMapList (&g.Configuration.NetDrives);
264 QueryDriveMapList (&g.Configuration.NetDrives);
266 HWND hList = GetDlgItem (hDlg, IDC_LIST);
267 int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
268 int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
269 SendMessage (hList, WM_SETREDRAW, FALSE, 0);
270 SendMessage (hList, LB_RESETCONTENT, 0, 0);
272 iItemSel = -1;
274 for (int iDrive = 0; iDrive < 26; ++iDrive)
276 if (!g.Configuration.NetDrives.aDriveMap[ iDrive ].szMapping[0])
277 continue;
279 TCHAR szAfsPath[ MAX_PATH ];
280 AdjustAfsPath (szAfsPath, g.Configuration.NetDrives.aDriveMap[ iDrive ].szMapping, TRUE, FALSE);
282 LPTSTR psz = FormatString (IDS_DRIVE_MAP, TEXT("%c%s"), g.Configuration.NetDrives.aDriveMap[ iDrive ].chDrive, szAfsPath);
283 int iItem = SendMessage (hList, LB_ADDSTRING, 0, (LPARAM)psz);
284 SendMessage (hList, LB_SETITEMDATA, iItem, g.Configuration.NetDrives.aDriveMap[ iDrive ].fActive);
286 if (iDrive == iDriveSel)
287 iItemSel = iItem;
290 SendMessage (hList, WM_SETREDRAW, TRUE, 0);
291 if (iItemSel != -1)
292 SendMessage (hList, LB_SETCURSEL, iItemSel, 0);
294 DrivesTab_Enable (hDlg);
295 DrivesTab_OnSelect (hDlg);
299 void DrivesTab_EditMapping (HWND hDlg, int iDrive)
301 DRIVEMAP DriveMapOrig;
302 memset (&DriveMapOrig, 0x00, sizeof(DRIVEMAP));
304 if (iDrive != -1)
306 memcpy (&DriveMapOrig, &g.Configuration.NetDrives.aDriveMap[ iDrive ], sizeof(DRIVEMAP));
309 DRIVEMAP DriveMap;
310 memcpy (&DriveMap, &DriveMapOrig, sizeof(DRIVEMAP));
312 if (ModalDialogParam (IDD_DRIVE_EDIT, GetParent(hDlg), (DLGPROC)DriveEdit_DlgProc, (LPARAM)&DriveMap) == IDOK)
314 TCHAR szAfsPathOrig[ MAX_PATH ] = TEXT("");
315 if (iDrive != -1)
316 AdjustAfsPath (szAfsPathOrig, DriveMapOrig.szMapping, TRUE, TRUE);
318 TCHAR szAfsPathNew[ MAX_PATH ];
319 AdjustAfsPath (szAfsPathNew, DriveMap.szMapping, TRUE, TRUE);
321 if ( (lstrcmpi (szAfsPathOrig, szAfsPathNew)) ||
322 (lstrcmpi (DriveMapOrig.szSubmount, DriveMap.szSubmount)) ||
323 (DriveMapOrig.chDrive != DriveMap.chDrive) ||
324 (DriveMapOrig.fPersistent != DriveMap.fPersistent) )
326 DWORD dwStatus;
328 if ((iDrive != -1) && (DriveMapOrig.fActive))
330 if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus))
332 Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
333 DrivesTab_FillList (hDlg);
334 return;
338 if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, DriveMap.szSubmount, DriveMap.fPersistent, &dwStatus))
340 Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
341 DrivesTab_FillList (hDlg);
342 return;
345 if (DriveMap.szSubmount[0])
347 TCHAR szSubmountNow[ MAX_PATH ];
348 if (GetDriveSubmount (DriveMap.chDrive, szSubmountNow))
350 if (lstrcmpi (DriveMap.szSubmount, szSubmountNow))
351 Message (MB_OK | MB_ICONASTERISK, GetCautionTitle(), IDS_NEWSUB_DESC);
355 if (iDrive != -1)
356 memset (&g.Configuration.NetDrives.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP));
357 memcpy (&g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP));
358 lstrcpy (g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew);
359 WriteDriveMappings (&g.Configuration.NetDrives);
361 if (iDrive == -1) {
362 WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent);
363 } else if ( (chDRIVE_A + iDrive) != DriveMap.chDrive ) {
364 WriteActiveMap(chDRIVE_A+iDrive, FALSE);
365 WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent);
368 DrivesTab_FillList (hDlg);
374 BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
376 switch (msg)
378 case WM_INITDIALOG:
379 SetWindowLongPtr (hDlg, DWLP_USER, lp);
380 DriveEdit_OnInitDialog (hDlg);
381 break;
383 case WM_COMMAND:
384 switch (LOWORD(wp))
386 case IDOK:
387 DriveEdit_OnOK (hDlg);
388 break;
390 case IDCANCEL:
391 EndDialog (hDlg, IDCANCEL);
392 break;
394 case IDC_PATH:
395 DriveEdit_Enable (hDlg);
396 break;
398 case IDHELP:
399 DriveEdit_DlgProc (hDlg, WM_HELP, 0, 0);
400 break;
402 break;
404 case WM_HELP:
405 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_DRIVES_ADDEDIT);
406 break;
408 return FALSE;
411 void DriveEdit_OnInitDialog (HWND hDlg)
413 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLongPtr (hDlg, DWLP_USER);
415 // Fill in the combo box
417 DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
419 if (pMap->chDrive != 0)
420 dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
422 int iItemSel = -1;
423 HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE);
424 SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
426 for (int ii = 0; ii < 26; ++ii)
428 if (!(dwDrives & (1<<ii)))
430 TCHAR szText[ cchRESOURCE ];
431 GetString (szText, IDS_MAP_LETTER);
433 LPTSTR pch;
434 if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
435 *pch = TEXT('A') + ii;
437 int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
438 SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
439 if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
440 iItemSel = iItem;
441 else if ((!pMap->chDrive) && (iItemSel == -1))
442 iItemSel = iItem;
446 SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
447 SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
449 TCHAR szMapping[ MAX_PATH ];
450 AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
452 CHAR msg[256], msgf[256];
453 if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
455 wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
456 SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
458 SetDlgItemText (hDlg, IDC_PATH, szMapping);
459 SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount);
461 CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
463 DriveEdit_Enable (hDlg);
467 void DriveEdit_OnOK (HWND hDlg)
469 PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLongPtr (hDlg, DWLP_USER);
471 int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0);
472 int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0);
474 pMap->chDrive = chDRIVE_A + iDrive;
475 GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH);
476 GetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount, MAX_PATH);
477 pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT);
479 if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
481 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADSUB_DESC);
482 return;
485 if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) &&
486 (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) )
488 Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
489 return;
492 EndDialog (hDlg, IDOK);
496 void DriveEdit_Enable (HWND hDlg)
498 TCHAR szPath[ MAX_PATH ];
499 GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH);
500 EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));
504 BOOL CALLBACK Submounts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
506 switch (msg)
508 case WM_INITDIALOG:
509 Submounts_OnInitDialog (hDlg);
510 break;
512 case WM_COMMAND:
513 switch (LOWORD(wp))
515 case IDAPPLY:
516 Submounts_OnApply (hDlg);
517 break;
519 case IDC_ADD:
520 Submounts_OnAdd (hDlg);
521 break;
523 case IDC_EDIT:
524 Submounts_OnEdit (hDlg);
525 break;
527 case IDC_REMOVE:
528 Submounts_OnRemove (hDlg);
529 break;
531 case IDHELP:
532 Submounts_DlgProc (hDlg, WM_HELP, 0, 0);
533 break;
535 break;
537 case WM_HELP:
538 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT);
539 break;
541 case WM_NOTIFY:
542 switch (((LPNMHDR)lp)->code)
544 case FLN_ITEMSELECT:
545 Submounts_OnSelect (hDlg);
546 break;
548 case FLN_LDBLCLICK:
549 if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
550 Submounts_OnEdit (hDlg);
551 break;
553 break;
556 return FALSE;
560 void Submounts_OnInitDialog (HWND hDlg)
562 // Prepare the columns on the server list
564 HWND hList = GetDlgItem (hDlg, IDC_LIST);
566 FASTLISTCOLUMN Column;
567 Column.dwFlags = FLCF_JUSTIFY_LEFT;
568 Column.cxWidth = 100;
569 GetString (Column.szText, IDS_SUBCOL_SHARE);
570 FastList_SetColumn (hList, 0, &Column);
572 Column.dwFlags = FLCF_JUSTIFY_LEFT;
573 Column.cxWidth = 200;
574 GetString (Column.szText, IDS_SUBCOL_PATH);
575 FastList_SetColumn (hList, 1, &Column);
577 // Remove the Context Help [?] thing from the title bar
579 DWORD dwStyle = GetWindowLong (GetParent (hDlg), GWL_STYLE);
580 dwStyle &= ~DS_CONTEXTHELP;
581 SetWindowLong (GetParent (hDlg), GWL_STYLE, dwStyle);
583 dwStyle = GetWindowLong (GetParent (hDlg), GWL_EXSTYLE);
584 dwStyle &= ~WS_EX_CONTEXTHELP;
585 SetWindowLong (GetParent (hDlg), GWL_EXSTYLE, dwStyle);
587 // Fill in the list of submounts
589 FastList_Begin (hList);
591 for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
593 if (!g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount[0])
594 continue;
596 FASTLISTADDITEM ai;
597 memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
598 ai.iFirstImage = IMAGE_NOIMAGE;
599 ai.iSecondImage = IMAGE_NOIMAGE;
600 ai.pszText = g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount;
601 ai.lParam = 0;
602 HLISTITEM hItem = FastList_AddItem (hList, &ai);
604 TCHAR szMapping[ MAX_PATH ];
605 AdjustAfsPath (szMapping, g.Configuration.NetDrives.aSubmounts[ ii ].szMapping, TRUE, FALSE);
606 FastList_SetItemText (hList, hItem, 1, szMapping);
609 FastList_End (hList);
610 Submounts_OnSelect (hDlg);
614 void Submounts_OnApply (HWND hDlg)
616 HWND hList = GetDlgItem (hDlg, IDC_LIST);
618 // Remove our current list of submounts
620 for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
622 RemoveSubMount (g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount);
625 // Add back all our new submounts
627 HLISTITEM hItem;
628 for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
630 LPCTSTR pszSubmount;
631 if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL)
632 continue;
633 LPCTSTR pszMapping;
634 if ((pszMapping = FastList_GetItemText (hList, hItem, 1)) == NULL)
635 continue;
637 AddSubMount ((LPTSTR)pszSubmount, (LPTSTR)pszMapping);
640 FreeDriveMapList (&g.Configuration.NetDrives);
641 QueryDriveMapList (&g.Configuration.NetDrives);
642 if (g.Configuration.fLogonAuthent)
643 DoMapShareChange();
647 void Submounts_OnSelect (HWND hDlg)
649 HWND hList = GetDlgItem (hDlg, IDC_LIST);
651 size_t cSelected = 0;
652 size_t cSelectedInUse = 0;
654 HLISTITEM hItem;
655 for (hItem = FastList_FindFirstSelected (hList); hItem; hItem = FastList_FindNextSelected (hList, hItem))
657 cSelected++;
659 LPCTSTR pszSubmount;
660 if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) != NULL)
662 for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
664 if (!lstrcmpi (pszSubmount, g.Configuration.NetDrives.aSubmounts[ii].szSubmount))
666 if (g.Configuration.NetDrives.aSubmounts[ii].fInUse)
667 cSelectedInUse++;
673 EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), (cSelected != 0) && (!cSelectedInUse));
674 EnableWindow (GetDlgItem (hDlg, IDC_EDIT), (cSelected == 1) && (!cSelectedInUse));
678 void Submounts_OnAdd (HWND hDlg)
680 HWND hList = GetDlgItem (hDlg, IDC_LIST);
682 SUBMOUNT Submount;
683 memset (&Submount, 0x00, sizeof(Submount));
685 Submounts_EditSubmount (hDlg, &Submount);
689 void Submounts_OnEdit (HWND hDlg)
691 HWND hList = GetDlgItem (hDlg, IDC_LIST);
693 HLISTITEM hItem;
694 if ((hItem = FastList_FindFirstSelected (hList)) != NULL)
696 LPCTSTR pszSubmount = FastList_GetItemText (hList, hItem, 0);
697 LPCTSTR pszMapping = FastList_GetItemText (hList, hItem, 1);
699 SUBMOUNT Submount;
700 memset (&Submount, 0x00, sizeof(Submount));
701 lstrcpy (Submount.szSubmount, pszSubmount);
702 lstrcpy (Submount.szMapping, pszMapping);
704 Submounts_EditSubmount (hDlg, &Submount);
708 // Action - On Remove submount item
710 void Submounts_OnRemove (HWND hDlg)
712 HWND hList = GetDlgItem (hDlg, IDC_LIST);
713 FastList_Begin (hList);
715 HLISTITEM hItem;
716 while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
718 FastList_RemoveItem (hList, hItem);
721 FastList_End (hList);
725 // Action - On Add or On Edit a submount item
726 void Submounts_EditSubmount (HWND hDlg, PSUBMOUNT pSubmount)
728 TCHAR szOrigSubmount[MAX_PATH];
729 _tcscpy(szOrigSubmount, pSubmount->szSubmount);
731 HWND hList = GetDlgItem (hDlg, IDC_LIST);
733 if (ModalDialogParam (IDD_SUBMOUNT_EDIT, GetParent(hDlg), (DLGPROC)SubEdit_DlgProc, (LPARAM)pSubmount) == IDOK)
735 TCHAR szMapping[ MAX_PATH ];
736 BOOL bNameChange = (szOrigSubmount[0] && _tcsicmp(szOrigSubmount, pSubmount->szSubmount));
738 AdjustAfsPath (szMapping, pSubmount->szMapping, TRUE, FALSE);
740 HLISTITEM hItem;
742 if ( bNameChange ) {
743 for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
745 LPCTSTR pszSubmount;
746 if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL)
747 continue;
749 if (!_tcsicmp(szOrigSubmount, pszSubmount) ) {
750 FastList_RemoveItem (hList, hItem);
751 break;
756 for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
758 LPCTSTR pszSubmount;
759 if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL)
760 continue;
762 if (!_tcsicmp(pszSubmount, pSubmount->szSubmount))
763 break;
766 if (!hItem)
768 FASTLISTADDITEM ai;
769 memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
770 ai.iFirstImage = IMAGE_NOIMAGE;
771 ai.iSecondImage = IMAGE_NOIMAGE;
772 ai.pszText = pSubmount->szSubmount;
773 ai.lParam = 0;
774 hItem = FastList_AddItem (hList, &ai);
777 FastList_SetItemText (hList, hItem, 1, szMapping);
782 BOOL CALLBACK SubEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
784 switch (msg)
786 case WM_INITDIALOG:
787 SetWindowLongPtr (hDlg, DWLP_USER, lp);
788 SubEdit_OnInitDialog (hDlg);
789 SubEdit_Enable (hDlg);
790 break;
792 case WM_COMMAND:
793 switch (LOWORD(wp))
795 case IDOK:
796 SubEdit_OnOK (hDlg);
797 break;
799 case IDCANCEL:
800 EndDialog (hDlg, IDCANCEL);
801 break;
803 case IDC_SUBMOUNT:
804 case IDC_MAPPING:
805 SubEdit_Enable (hDlg);
806 break;
808 case IDHELP:
809 SubEdit_DlgProc (hDlg, WM_HELP, 0, 0);
810 break;
812 break;
814 case WM_HELP:
815 WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT_ADDEDIT);
816 break;
819 return 0;
823 void SubEdit_OnInitDialog (HWND hDlg)
825 CHAR msg[256], msgf[256];
826 PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLongPtr (hDlg, DWLP_USER);
827 if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
829 wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
830 SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
833 SetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount);
835 SetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping);
839 void SubEdit_OnOK (HWND hDlg)
841 PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLongPtr (hDlg, DWLP_USER);
842 GetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount, MAX_PATH);
843 GetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping, MAX_PATH);
844 EndDialog (hDlg, IDOK);
848 void SubEdit_Enable (HWND hDlg)
850 BOOL fEnable = TRUE;
852 TCHAR szText[ MAX_PATH ];
853 GetDlgItemText (hDlg, IDC_SUBMOUNT, szText, MAX_PATH);
854 if (!szText[0])
855 fEnable = FALSE;
857 GetDlgItemText (hDlg, IDC_MAPPING, szText, MAX_PATH);
858 if (!szText[0])
859 fEnable = FALSE;
861 EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);