f3b6c259c7e4b4d5d562ce47bea13d4881b8bbd0
[openafs.git] / src / WINNT / client_config / tab_drives.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
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  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 #include <afs/fs_utils.h>
14 }
15
16 #include "afs_config.h"
17 #include "tab_drives.h"
18 #include <lanahelper.h>
19
20 /*
21  * PROTOTYPES _________________________________________________________________
22  *
23  */
24
25 void DrivesTab_OnInitDialog (HWND hDlg);
26 void DrivesTab_OnSelect (HWND hDlg);
27 void DrivesTab_OnCheck (HWND hDlg);
28 void DrivesTab_OnAdd (HWND hDlg);
29 void DrivesTab_OnEdit (HWND hDlg);
30 void DrivesTab_OnRemove (HWND hDlg);
31 void DrivesTab_OnAdvanced (HWND hDlg);
32
33 void DrivesTab_Enable (HWND hDlg);
34 int DrivesTab_DriveFromItem (HWND hDlg, int iItem);
35 void DrivesTab_FillList (HWND hDlg);
36 void DrivesTab_EditMapping (HWND hDlg, int iDrive);
37
38 BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
39 void DriveEdit_OnInitDialog (HWND hDlg);
40 void DriveEdit_OnOK (HWND hDlg);
41 void DriveEdit_Enable (HWND hDlg);
42
43 BOOL CALLBACK Submounts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
44 void Submounts_OnInitDialog (HWND hDlg);
45 void Submounts_OnApply (HWND hDlg);
46 void Submounts_OnSelect (HWND hDlg);
47 void Submounts_OnAdd (HWND hDlg);
48 void Submounts_OnEdit (HWND hDlg);
49 void Submounts_OnRemove (HWND hDlg);
50 void Submounts_EditSubmount (HWND hDlg, PSUBMOUNT pSubmount);
51
52 BOOL CALLBACK SubEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
53 void SubEdit_OnInitDialog (HWND hDlg);
54 void SubEdit_OnOK (HWND hDlg);
55 void SubEdit_Enable (HWND hDlg);
56
57
58 /*
59  * ROUTINES ___________________________________________________________________
60  *
61  */
62
63 BOOL CALLBACK DrivesTab_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
64 {
65    switch (msg)
66       {
67       case WM_INITDIALOG:
68          DrivesTab_OnInitDialog (hDlg);
69          break;
70
71       case WM_COMMAND:
72          switch (LOWORD(wp))
73             {
74             case IDC_REFRESH:
75                DrivesTab_Enable (hDlg);
76                break;
77
78             case IDC_LIST:
79                if (HIWORD(wp) == LBN_CLICKED)
80                   DrivesTab_OnCheck (hDlg);
81                else if ((HIWORD(wp) == LBN_SELCHANGE) || (HIWORD(wp) == LBN_SELCANCEL))
82                   DrivesTab_OnSelect (hDlg);
83                break;
84
85             case IDC_ADD:
86                DrivesTab_OnAdd (hDlg);
87                break;
88
89             case IDC_EDIT:
90                DrivesTab_OnEdit (hDlg);
91                break;
92
93             case IDC_REMOVE:
94                DrivesTab_OnRemove (hDlg);
95                break;
96
97             case IDC_ADVANCED:
98                DrivesTab_OnAdvanced (hDlg);
99                break;
100
101             case IDHELP:
102                DrivesTab_DlgProc (hDlg, WM_HELP, 0, 0);
103                break;
104             }
105          break;
106
107       case WM_HELP:
108          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_DRIVES);
109          break;
110       }
111
112    return FALSE;
113 }
114
115
116 void DrivesTab_OnInitDialog (HWND hDlg)
117 {
118    ShowWindow (GetDlgItem (hDlg, IDC_ADVANCED), g.fIsWinNT);
119
120    DrivesTab_FillList (hDlg);
121 }
122
123
124 void DrivesTab_OnSelect (HWND hDlg)
125 {
126    if (IsWindowEnabled (GetDlgItem (hDlg, IDC_LIST)))
127       {
128       UINT iSel = SendDlgItemMessage (hDlg, IDC_LIST, LB_GETCURSEL, 0, 0);
129
130       EnableWindow (GetDlgItem (hDlg, IDC_EDIT), (iSel != -1));
131       EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), (iSel != -1));
132       }
133 }
134
135
136 void DrivesTab_OnCheck (HWND hDlg)
137 {
138    HWND hList = GetDlgItem (hDlg, IDC_LIST);
139    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
140    int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
141    BOOL fChecked = SendMessage (hList, LB_GETITEMDATA, iItemSel, 0);
142
143    if (iDriveSel != -1)
144       {
145       DWORD dwStatus;
146       if (fChecked && g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0] && !g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive)
147          {
148          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))
149             Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
150          DrivesTab_FillList (hDlg);
151          }
152       else if (!fChecked && g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive)
153          {
154          if (!InactivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
155             Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
156          DrivesTab_FillList (hDlg);
157          }
158       WriteActiveMap(g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, fChecked && 
159                      g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fPersistent );
160
161       }
162 }
163
164
165 void DrivesTab_OnAdd (HWND hDlg)
166 {
167    DrivesTab_EditMapping (hDlg, -1);
168 }
169
170
171 void DrivesTab_OnEdit (HWND hDlg)
172 {
173    HWND hList = GetDlgItem (hDlg, IDC_LIST);
174    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
175    int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
176
177    DrivesTab_EditMapping (hDlg, iDriveSel);
178 }
179
180
181 void DrivesTab_OnRemove (HWND hDlg)
182 {
183    HWND hList = GetDlgItem (hDlg, IDC_LIST);
184    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
185    int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
186
187    if (iDriveSel != -1)
188       {
189       if (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0])
190          {
191          if (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].fActive)
192             {
193             DWORD dwStatus;
194             if (!InactivateDriveMap (g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
195                {
196                Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
197                return;
198                }
199             }
200          g.Configuration.NetDrives.aDriveMap[ iDriveSel ].szMapping[0] = TEXT('\0');
201          WriteDriveMappings (&g.Configuration.NetDrives);
202
203          DrivesTab_FillList (hDlg);
204          }
205       WriteActiveMap(g.Configuration.NetDrives.aDriveMap[ iDriveSel ].chDrive, FALSE );
206       }
207 }
208
209
210 void DrivesTab_OnAdvanced (HWND hDlg)
211 {
212    TCHAR szTitle[ cchRESOURCE ];
213    GetString (szTitle, IDS_SUBMOUNTS_TITLE);
214
215    LPPROPSHEET psh = PropSheet_Create (szTitle, FALSE, GetParent(hDlg), 0);
216    psh->sh.dwFlags |= PSH_NOAPPLYNOW;  // Remove the Apply button
217    psh->sh.dwFlags |= PSH_HASHELP;     // Add a Help button instead
218    PropSheet_AddTab (psh, szTitle, IDD_SUBMOUNTS, (DLGPROC)Submounts_DlgProc, 0, TRUE);
219    PropSheet_ShowModal (psh);
220 }
221
222
223 void DrivesTab_Enable (HWND hDlg)
224 {
225    BOOL fRunning = (Config_GetServiceState() == SERVICE_RUNNING);
226
227    EnableWindow (GetDlgItem (hDlg, IDC_LIST), fRunning);
228    EnableWindow (GetDlgItem (hDlg, IDC_ADD), fRunning);
229    EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fRunning);
230    EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), fRunning);
231
232    TCHAR szText[ cchRESOURCE ];
233    GetString (szText, (fRunning) ? IDS_TIP_DRIVES : IDS_WARN_STOPPED);
234    SetDlgItemText (hDlg, IDC_WARN, szText);
235 }
236
237
238 int DrivesTab_DriveFromItem (HWND hDlg, int iItem)
239 {
240    TCHAR szItem[ 1024 ] = TEXT("");
241    SendDlgItemMessage (hDlg, IDC_LIST, LB_GETTEXT, iItem, (LPARAM)szItem);
242
243    LPTSTR pch;
244    if ((pch = (LPTSTR)lstrchr (szItem, TEXT(':'))) != NULL)
245       {
246       if (pch > szItem)
247          {
248          pch--;
249          if ((*pch >= TEXT('A')) && (*pch <= TEXT('Z')))
250             return (*pch) - TEXT('A');
251          }
252       }
253
254    return -1;
255 }
256
257
258 void DrivesTab_FillList (HWND hDlg)
259 {
260    FreeDriveMapList (&g.Configuration.NetDrives);
261    QueryDriveMapList (&g.Configuration.NetDrives);
262
263    HWND hList = GetDlgItem (hDlg, IDC_LIST);
264    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
265    int iDriveSel = DrivesTab_DriveFromItem (hDlg, iItemSel);
266    SendMessage (hList, WM_SETREDRAW, FALSE, 0);
267    SendMessage (hList, LB_RESETCONTENT, 0, 0);
268
269    iItemSel = -1;
270
271    for (int iDrive = 0; iDrive < 26; ++iDrive)
272       {
273       if (!g.Configuration.NetDrives.aDriveMap[ iDrive ].szMapping[0])
274          continue;
275
276       TCHAR szAfsPath[ MAX_PATH ];
277       AdjustAfsPath (szAfsPath, g.Configuration.NetDrives.aDriveMap[ iDrive ].szMapping, TRUE, FALSE);
278
279       LPTSTR psz = FormatString (IDS_DRIVE_MAP, TEXT("%c%s"), g.Configuration.NetDrives.aDriveMap[ iDrive ].chDrive, szAfsPath);
280       int iItem = SendMessage (hList, LB_ADDSTRING, 0, (LPARAM)psz);
281       SendMessage (hList, LB_SETITEMDATA, iItem, g.Configuration.NetDrives.aDriveMap[ iDrive ].fActive);
282
283       if (iDrive == iDriveSel)
284          iItemSel = iItem;
285       }
286
287    SendMessage (hList, WM_SETREDRAW, TRUE, 0);
288    if (iItemSel != -1)
289       SendMessage (hList, LB_SETCURSEL, iItemSel, 0);
290
291    DrivesTab_Enable (hDlg);
292    DrivesTab_OnSelect (hDlg);
293 }
294
295
296 void DrivesTab_EditMapping (HWND hDlg, int iDrive)
297 {
298    DRIVEMAP DriveMapOrig;
299    memset (&DriveMapOrig, 0x00, sizeof(DRIVEMAP));
300
301    if (iDrive != -1)
302       {
303       memcpy (&DriveMapOrig, &g.Configuration.NetDrives.aDriveMap[ iDrive ], sizeof(DRIVEMAP));
304       }
305
306    DRIVEMAP DriveMap;
307    memcpy (&DriveMap, &DriveMapOrig, sizeof(DRIVEMAP));
308
309    if (ModalDialogParam (IDD_DRIVE_EDIT, GetParent(hDlg), (DLGPROC)DriveEdit_DlgProc, (LPARAM)&DriveMap) == IDOK)
310       {
311       TCHAR szAfsPathOrig[ MAX_PATH ] = TEXT("");
312       if (iDrive != -1)
313          AdjustAfsPath (szAfsPathOrig, DriveMapOrig.szMapping, TRUE, TRUE);
314
315       TCHAR szAfsPathNew[ MAX_PATH ];
316       AdjustAfsPath (szAfsPathNew, DriveMap.szMapping, TRUE, TRUE);
317
318       if ( (lstrcmpi (szAfsPathOrig, szAfsPathNew)) ||
319            (DriveMapOrig.chDrive != DriveMap.chDrive) ||
320            (DriveMapOrig.fPersistent != DriveMap.fPersistent) )
321          {
322          DWORD dwStatus;
323
324          if ((iDrive != -1) && (DriveMapOrig.fActive))
325             {
326             if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus))
327                {
328                Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
329                DrivesTab_FillList (hDlg);
330                return;
331                }
332             }
333
334          if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, "", DriveMap.fPersistent, &dwStatus))
335             {
336             Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
337             DrivesTab_FillList (hDlg);
338             return;
339             }
340
341          if (iDrive != -1)
342             memset (&g.Configuration.NetDrives.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP));
343          memcpy (&g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP));
344          lstrcpy (g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew);
345          WriteDriveMappings (&g.Configuration.NetDrives);
346
347          if (iDrive == -1) {
348              WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent);
349          } else if ( (chDRIVE_A + iDrive) != DriveMap.chDrive ) {
350              WriteActiveMap(chDRIVE_A+iDrive, FALSE);
351              WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent);
352          }
353
354          DrivesTab_FillList (hDlg);
355          }
356       }
357 }
358
359
360 BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
361 {
362    switch (msg)
363       {
364       case WM_INITDIALOG:
365          SetWindowLong (hDlg, DWL_USER, lp);
366          DriveEdit_OnInitDialog (hDlg);
367          break;
368
369       case WM_COMMAND:
370          switch (LOWORD(wp))
371             {
372             case IDOK:
373                DriveEdit_OnOK (hDlg);
374                break;
375
376             case IDCANCEL:
377                EndDialog (hDlg, IDCANCEL);
378                break;
379
380             case IDC_PATH:
381                DriveEdit_Enable (hDlg);
382                break;
383
384             case IDHELP:
385                DriveEdit_DlgProc (hDlg, WM_HELP, 0, 0);
386                break;
387             }
388          break;
389
390       case WM_HELP:
391          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_DRIVES_ADDEDIT);
392          break;
393       }
394    return FALSE;
395 }
396
397 void DriveEdit_OnInitDialog (HWND hDlg)
398 {
399    PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
400
401    // Fill in the combo box
402    //
403    DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
404
405    if (pMap->chDrive != 0)
406       dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
407
408    int iItemSel = -1;
409    HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE);
410    SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
411
412    for (int ii = 0; ii < 26; ++ii)
413       {
414       if (!(dwDrives & (1<<ii)))
415          {
416          TCHAR szText[ cchRESOURCE ];
417          GetString (szText, IDS_MAP_LETTER);
418
419          LPTSTR pch;
420          if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
421             *pch = TEXT('A') + ii;
422
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))
426             iItemSel = iItem;
427          else if ((!pMap->chDrive) && (iItemSel == -1))
428             iItemSel = iItem;
429          }
430       }
431
432    SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
433    SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
434
435    TCHAR szMapping[ MAX_PATH ];
436    AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
437    
438    CHAR msg[256], msgf[256];
439    if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
440    {
441        wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
442        SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
443    }
444    SetDlgItemText (hDlg, IDC_PATH, szMapping);
445
446    CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
447
448    DriveEdit_Enable (hDlg);
449 }
450
451
452 void DriveEdit_OnOK (HWND hDlg)
453 {
454    PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
455
456    int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0);
457    int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0);
458
459    pMap->chDrive = chDRIVE_A + iDrive;
460    GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH);
461    pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT);
462
463     if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) &&
464          (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) )
465     {
466       Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
467       return;
468       }
469
470    EndDialog (hDlg, IDOK);
471 }
472
473
474 void DriveEdit_Enable (HWND hDlg)
475 {
476    TCHAR szPath[ MAX_PATH ];
477    GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH);
478    EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));
479 }
480
481
482 BOOL CALLBACK Submounts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
483 {
484    switch (msg)
485       {
486       case WM_INITDIALOG:
487          Submounts_OnInitDialog (hDlg);
488          break;
489
490       case WM_COMMAND:
491          switch (LOWORD(wp))
492             {
493             case IDAPPLY:
494                Submounts_OnApply (hDlg);
495                break;
496
497             case IDC_ADD:
498                Submounts_OnAdd (hDlg);
499                break;
500
501             case IDC_EDIT:
502                Submounts_OnEdit (hDlg);
503                break;
504
505             case IDC_REMOVE:
506                Submounts_OnRemove (hDlg);
507                break;
508
509             case IDHELP:
510                Submounts_DlgProc (hDlg, WM_HELP, 0, 0);
511                break;
512             }
513          break;
514
515       case WM_HELP:
516          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT);
517          break;
518
519       case WM_NOTIFY:
520          switch (((LPNMHDR)lp)->code)
521             {
522             case FLN_ITEMSELECT:
523                Submounts_OnSelect (hDlg);
524                break;
525
526             case FLN_LDBLCLICK:
527                if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
528                   Submounts_OnEdit (hDlg);
529                break;
530             }
531          break;
532       }
533
534    return FALSE;
535 }
536
537
538 void Submounts_OnInitDialog (HWND hDlg)
539 {
540    // Prepare the columns on the server list
541    //
542    HWND hList = GetDlgItem (hDlg, IDC_LIST);
543
544    FASTLISTCOLUMN Column;
545    Column.dwFlags = FLCF_JUSTIFY_LEFT;
546    Column.cxWidth = 100;
547    GetString (Column.szText, IDS_SUBCOL_SHARE);
548    FastList_SetColumn (hList, 0, &Column);
549
550    Column.dwFlags = FLCF_JUSTIFY_LEFT;
551    Column.cxWidth = 200;
552    GetString (Column.szText, IDS_SUBCOL_PATH);
553    FastList_SetColumn (hList, 1, &Column);
554
555    // Remove the Context Help [?] thing from the title bar
556    //
557    DWORD dwStyle = GetWindowLong (GetParent (hDlg), GWL_STYLE);
558    dwStyle &= ~DS_CONTEXTHELP;
559    SetWindowLong (GetParent (hDlg), GWL_STYLE, dwStyle);
560
561    dwStyle = GetWindowLong (GetParent (hDlg), GWL_EXSTYLE);
562    dwStyle &= ~WS_EX_CONTEXTHELP;
563    SetWindowLong (GetParent (hDlg), GWL_EXSTYLE, dwStyle);
564
565    // Fill in the list of submounts
566    //
567    FastList_Begin (hList);
568
569    for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
570       {
571       if (!g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount[0])
572          continue;
573
574       FASTLISTADDITEM ai;
575       memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
576       ai.iFirstImage = IMAGE_NOIMAGE;
577       ai.iSecondImage = IMAGE_NOIMAGE;
578       ai.pszText = g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount;
579       ai.lParam = 0;
580       HLISTITEM hItem = FastList_AddItem (hList, &ai);
581
582       TCHAR szMapping[ MAX_PATH ];
583       AdjustAfsPath (szMapping, g.Configuration.NetDrives.aSubmounts[ ii ].szMapping, TRUE, FALSE);
584       FastList_SetItemText (hList, hItem, 1, szMapping);
585       }
586
587    FastList_End (hList);
588    Submounts_OnSelect (hDlg);
589 }
590
591
592 void Submounts_OnApply (HWND hDlg)
593 {
594    HWND hList = GetDlgItem (hDlg, IDC_LIST);
595
596    // Remove our current list of submounts
597    //
598    for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
599       {
600       RemoveSubMount (g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount);
601       }
602
603    // Add back all our new submounts
604    //
605    HLISTITEM hItem;
606    for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
607       {
608       LPCTSTR pszSubmount;
609       if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL)
610          continue;
611       LPCTSTR pszMapping;
612       if ((pszMapping = FastList_GetItemText (hList, hItem, 1)) == NULL)
613          continue;
614
615       AddSubMount ((LPTSTR)pszSubmount, (LPTSTR)pszMapping);
616       }
617
618    FreeDriveMapList (&g.Configuration.NetDrives);
619    QueryDriveMapList (&g.Configuration.NetDrives);
620    if (g.Configuration.fLogonAuthent)
621            DoMapShareChange();
622 }
623
624
625 void Submounts_OnSelect (HWND hDlg)
626 {
627    HWND hList = GetDlgItem (hDlg, IDC_LIST);
628
629    size_t cSelected = 0;
630    size_t cSelectedInUse = 0;
631
632    HLISTITEM hItem;
633    for (hItem = FastList_FindFirstSelected (hList); hItem; hItem = FastList_FindNextSelected (hList, hItem))
634       {
635       cSelected++;
636
637       LPCTSTR pszSubmount;
638       if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) != NULL)
639          {
640          for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
641             {
642             if (!lstrcmpi (pszSubmount, g.Configuration.NetDrives.aSubmounts[ii].szSubmount))
643                {
644                if (g.Configuration.NetDrives.aSubmounts[ii].fInUse)
645                   cSelectedInUse++;
646                }
647             }
648          }
649       }
650
651    EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), (cSelected != 0) && (!cSelectedInUse));
652    EnableWindow (GetDlgItem (hDlg, IDC_EDIT), (cSelected == 1) && (!cSelectedInUse));
653 }
654
655
656 void Submounts_OnAdd (HWND hDlg)
657 {
658    HWND hList = GetDlgItem (hDlg, IDC_LIST);
659
660    SUBMOUNT Submount;
661    memset (&Submount, 0x00, sizeof(Submount));
662
663    Submounts_EditSubmount (hDlg, &Submount);
664 }
665
666
667 void Submounts_OnEdit (HWND hDlg)
668 {
669    HWND hList = GetDlgItem (hDlg, IDC_LIST);
670
671    HLISTITEM hItem;
672    if ((hItem = FastList_FindFirstSelected (hList)) != NULL)
673       {
674       LPCTSTR pszSubmount = FastList_GetItemText (hList, hItem, 0);
675       LPCTSTR pszMapping = FastList_GetItemText (hList, hItem, 1);
676
677       SUBMOUNT Submount;
678       memset (&Submount, 0x00, sizeof(Submount));
679       lstrcpy (Submount.szSubmount, pszSubmount);
680       lstrcpy (Submount.szMapping, pszMapping);
681
682       Submounts_EditSubmount (hDlg, &Submount);
683       }
684 }
685
686 // Action - On Remove submount item
687
688 void Submounts_OnRemove (HWND hDlg)
689 {
690    HWND hList = GetDlgItem (hDlg, IDC_LIST);
691    FastList_Begin (hList);
692
693    HLISTITEM hItem;
694    while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
695       {
696       FastList_RemoveItem (hList, hItem);
697       }
698
699    FastList_End (hList);
700 }
701
702
703 // Action - On Add or On Edit a submount item
704 void Submounts_EditSubmount (HWND hDlg, PSUBMOUNT pSubmount)
705 {
706    HWND hList = GetDlgItem (hDlg, IDC_LIST);
707
708    if (ModalDialogParam (IDD_SUBMOUNT_EDIT, GetParent(hDlg), (DLGPROC)SubEdit_DlgProc, (LPARAM)pSubmount) == IDOK)
709       {
710       TCHAR szMapping[ MAX_PATH ];
711       AdjustAfsPath (szMapping, pSubmount->szMapping, TRUE, FALSE);
712
713       HLISTITEM hItem;
714       for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
715          {
716          LPCTSTR pszSubmount;
717          if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL)
718             continue;
719
720          if (!lstrcmpi (pszSubmount, pSubmount->szSubmount))
721             break;
722          }
723
724       if (!hItem)
725          {
726          FASTLISTADDITEM ai;
727          memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
728          ai.iFirstImage = IMAGE_NOIMAGE;
729          ai.iSecondImage = IMAGE_NOIMAGE;
730          ai.pszText = pSubmount->szSubmount;
731          ai.lParam = 0;
732          hItem = FastList_AddItem (hList, &ai);
733          }
734
735       FastList_SetItemText (hList, hItem, 1, szMapping);
736       }
737 }
738
739
740 BOOL CALLBACK SubEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
741 {
742    switch (msg)
743       {
744       case WM_INITDIALOG:
745          SetWindowLong (hDlg, DWL_USER, lp);
746          SubEdit_OnInitDialog (hDlg);
747          SubEdit_Enable (hDlg);
748          break;
749
750       case WM_COMMAND:
751          switch (LOWORD(wp))
752             {
753             case IDOK:
754                SubEdit_OnOK (hDlg);
755                break;
756
757             case IDCANCEL:
758                EndDialog (hDlg, IDCANCEL);
759                break;
760
761             case IDC_SUBMOUNT:
762             case IDC_MAPPING:
763                SubEdit_Enable (hDlg);
764                break;
765
766             case IDHELP:
767                SubEdit_DlgProc (hDlg, WM_HELP, 0, 0);
768                break;
769             }
770          break;
771
772       case WM_HELP:
773          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT_ADDEDIT);
774          break;
775       }
776
777    return 0;
778 }
779
780
781 void SubEdit_OnInitDialog (HWND hDlg)
782 {
783     CHAR msg[256], msgf[256];
784     PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLong (hDlg, DWL_USER);
785     if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
786     {
787                 wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
788                 SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
789    }
790
791    SetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount);
792    
793    SetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping);
794 }
795
796
797 void SubEdit_OnOK (HWND hDlg)
798 {
799    PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLong (hDlg, DWL_USER);
800    GetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount, MAX_PATH);
801    GetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping, MAX_PATH);
802    EndDialog (hDlg, IDOK);
803 }
804
805
806 void SubEdit_Enable (HWND hDlg)
807 {
808    BOOL fEnable = TRUE;
809
810    TCHAR szText[ MAX_PATH ];
811    GetDlgItemText (hDlg, IDC_SUBMOUNT, szText, MAX_PATH);
812    if (!szText[0])
813       fEnable = FALSE;
814
815    GetDlgItemText (hDlg, IDC_MAPPING, szText, MAX_PATH);
816    if (!szText[0])
817       fEnable = FALSE;
818
819    EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
820 }
821