undo-patch-windows-20041025
[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            (lstrcmpi (DriveMapOrig.szSubmount, DriveMap.szSubmount)) ||
320            (DriveMapOrig.chDrive != DriveMap.chDrive) ||
321            (DriveMapOrig.fPersistent != DriveMap.fPersistent) )
322          {
323          DWORD dwStatus;
324
325          if ((iDrive != -1) && (DriveMapOrig.fActive))
326             {
327             if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus))
328                {
329                Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
330                DrivesTab_FillList (hDlg);
331                return;
332                }
333             }
334
335          if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, DriveMap.szSubmount, DriveMap.fPersistent, &dwStatus))
336             {
337             Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
338             DrivesTab_FillList (hDlg);
339             return;
340             }
341
342          if (DriveMap.szSubmount[0])
343             {
344             TCHAR szSubmountNow[ MAX_PATH ];
345             if (GetDriveSubmount (DriveMap.chDrive, szSubmountNow))
346                {
347                if (lstrcmpi (DriveMap.szSubmount, szSubmountNow))
348                   Message (MB_OK | MB_ICONASTERISK, GetCautionTitle(), IDS_NEWSUB_DESC);
349                }
350             }
351
352          if (iDrive != -1)
353             memset (&g.Configuration.NetDrives.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP));
354          memcpy (&g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP));
355          lstrcpy (g.Configuration.NetDrives.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew);
356          WriteDriveMappings (&g.Configuration.NetDrives);
357
358          if (iDrive == -1) {
359              WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent);
360          } else if ( (chDRIVE_A + iDrive) != DriveMap.chDrive ) {
361              WriteActiveMap(chDRIVE_A+iDrive, FALSE);
362              WriteActiveMap(DriveMap.chDrive, DriveMap.fPersistent);
363          }
364
365          DrivesTab_FillList (hDlg);
366          }
367       }
368 }
369
370
371 BOOL CALLBACK DriveEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
372 {
373    switch (msg)
374       {
375       case WM_INITDIALOG:
376          SetWindowLong (hDlg, DWL_USER, lp);
377          DriveEdit_OnInitDialog (hDlg);
378          break;
379
380       case WM_COMMAND:
381          switch (LOWORD(wp))
382             {
383             case IDOK:
384                DriveEdit_OnOK (hDlg);
385                break;
386
387             case IDCANCEL:
388                EndDialog (hDlg, IDCANCEL);
389                break;
390
391             case IDC_PATH:
392                DriveEdit_Enable (hDlg);
393                break;
394
395             case IDHELP:
396                DriveEdit_DlgProc (hDlg, WM_HELP, 0, 0);
397                break;
398             }
399          break;
400
401       case WM_HELP:
402          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_DRIVES_ADDEDIT);
403          break;
404       }
405    return FALSE;
406 }
407
408 void DriveEdit_OnInitDialog (HWND hDlg)
409 {
410    PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
411
412    // Fill in the combo box
413    //
414    DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
415
416    if (pMap->chDrive != 0)
417       dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
418
419    int iItemSel = -1;
420    HWND hCombo = GetDlgItem (hDlg, IDC_DRIVE);
421    SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
422
423    for (int ii = 0; ii < 26; ++ii)
424       {
425       if (!(dwDrives & (1<<ii)))
426          {
427          TCHAR szText[ cchRESOURCE ];
428          GetString (szText, IDS_MAP_LETTER);
429
430          LPTSTR pch;
431          if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
432             *pch = TEXT('A') + ii;
433
434          int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
435          SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
436          if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
437             iItemSel = iItem;
438          else if ((!pMap->chDrive) && (iItemSel == -1))
439             iItemSel = iItem;
440          }
441       }
442
443    SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
444    SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
445
446    TCHAR szMapping[ MAX_PATH ];
447    AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
448    
449    CHAR msg[256], msgf[256];
450    if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
451    {
452        wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
453        SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
454    }
455    SetDlgItemText (hDlg, IDC_PATH, szMapping);
456    SetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount);
457
458    CheckDlgButton (hDlg, IDC_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
459
460    DriveEdit_Enable (hDlg);
461 }
462
463
464 void DriveEdit_OnOK (HWND hDlg)
465 {
466    PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
467
468    int iItem = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETCURSEL, 0, 0);
469    int iDrive = SendDlgItemMessage (hDlg, IDC_DRIVE, CB_GETITEMDATA, iItem, 0);
470
471    pMap->chDrive = chDRIVE_A + iDrive;
472    GetDlgItemText (hDlg, IDC_PATH, pMap->szMapping, MAX_PATH);
473    GetDlgItemText (hDlg, IDC_DESC, pMap->szSubmount, MAX_PATH);
474    pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_PERSISTENT);
475
476    if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
477       {
478       Message (MB_ICONHAND, GetErrorTitle(), IDS_BADSUB_DESC);
479       return;
480       }
481
482     if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) &&
483          (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) )
484     {
485       Message (MB_ICONHAND, GetErrorTitle(), IDS_BADMAP_DESC);
486       return;
487       }
488
489    EndDialog (hDlg, IDOK);
490 }
491
492
493 void DriveEdit_Enable (HWND hDlg)
494 {
495    TCHAR szPath[ MAX_PATH ];
496    GetDlgItemText (hDlg, IDC_PATH, szPath, MAX_PATH);
497    EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));
498 }
499
500
501 BOOL CALLBACK Submounts_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
502 {
503    switch (msg)
504       {
505       case WM_INITDIALOG:
506          Submounts_OnInitDialog (hDlg);
507          break;
508
509       case WM_COMMAND:
510          switch (LOWORD(wp))
511             {
512             case IDAPPLY:
513                Submounts_OnApply (hDlg);
514                break;
515
516             case IDC_ADD:
517                Submounts_OnAdd (hDlg);
518                break;
519
520             case IDC_EDIT:
521                Submounts_OnEdit (hDlg);
522                break;
523
524             case IDC_REMOVE:
525                Submounts_OnRemove (hDlg);
526                break;
527
528             case IDHELP:
529                Submounts_DlgProc (hDlg, WM_HELP, 0, 0);
530                break;
531             }
532          break;
533
534       case WM_HELP:
535          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT);
536          break;
537
538       case WM_NOTIFY:
539          switch (((LPNMHDR)lp)->code)
540             {
541             case FLN_ITEMSELECT:
542                Submounts_OnSelect (hDlg);
543                break;
544
545             case FLN_LDBLCLICK:
546                if (IsWindowEnabled (GetDlgItem (hDlg, IDC_EDIT)))
547                   Submounts_OnEdit (hDlg);
548                break;
549             }
550          break;
551       }
552
553    return FALSE;
554 }
555
556
557 void Submounts_OnInitDialog (HWND hDlg)
558 {
559    // Prepare the columns on the server list
560    //
561    HWND hList = GetDlgItem (hDlg, IDC_LIST);
562
563    FASTLISTCOLUMN Column;
564    Column.dwFlags = FLCF_JUSTIFY_LEFT;
565    Column.cxWidth = 100;
566    GetString (Column.szText, IDS_SUBCOL_SHARE);
567    FastList_SetColumn (hList, 0, &Column);
568
569    Column.dwFlags = FLCF_JUSTIFY_LEFT;
570    Column.cxWidth = 200;
571    GetString (Column.szText, IDS_SUBCOL_PATH);
572    FastList_SetColumn (hList, 1, &Column);
573
574    // Remove the Context Help [?] thing from the title bar
575    //
576    DWORD dwStyle = GetWindowLong (GetParent (hDlg), GWL_STYLE);
577    dwStyle &= ~DS_CONTEXTHELP;
578    SetWindowLong (GetParent (hDlg), GWL_STYLE, dwStyle);
579
580    dwStyle = GetWindowLong (GetParent (hDlg), GWL_EXSTYLE);
581    dwStyle &= ~WS_EX_CONTEXTHELP;
582    SetWindowLong (GetParent (hDlg), GWL_EXSTYLE, dwStyle);
583
584    // Fill in the list of submounts
585    //
586    FastList_Begin (hList);
587
588    for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
589       {
590       if (!g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount[0])
591          continue;
592
593       FASTLISTADDITEM ai;
594       memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
595       ai.iFirstImage = IMAGE_NOIMAGE;
596       ai.iSecondImage = IMAGE_NOIMAGE;
597       ai.pszText = g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount;
598       ai.lParam = 0;
599       HLISTITEM hItem = FastList_AddItem (hList, &ai);
600
601       TCHAR szMapping[ MAX_PATH ];
602       AdjustAfsPath (szMapping, g.Configuration.NetDrives.aSubmounts[ ii ].szMapping, TRUE, FALSE);
603       FastList_SetItemText (hList, hItem, 1, szMapping);
604       }
605
606    FastList_End (hList);
607    Submounts_OnSelect (hDlg);
608 }
609
610
611 void Submounts_OnApply (HWND hDlg)
612 {
613    HWND hList = GetDlgItem (hDlg, IDC_LIST);
614
615    // Remove our current list of submounts
616    //
617    for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
618       {
619       RemoveSubMount (g.Configuration.NetDrives.aSubmounts[ ii ].szSubmount);
620       }
621
622    // Add back all our new submounts
623    //
624    HLISTITEM hItem;
625    for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
626       {
627       LPCTSTR pszSubmount;
628       if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL)
629          continue;
630       LPCTSTR pszMapping;
631       if ((pszMapping = FastList_GetItemText (hList, hItem, 1)) == NULL)
632          continue;
633
634       AddSubMount ((LPTSTR)pszSubmount, (LPTSTR)pszMapping);
635       }
636
637    FreeDriveMapList (&g.Configuration.NetDrives);
638    QueryDriveMapList (&g.Configuration.NetDrives);
639    if (g.Configuration.fLogonAuthent)
640            DoMapShareChange();
641 }
642
643
644 void Submounts_OnSelect (HWND hDlg)
645 {
646    HWND hList = GetDlgItem (hDlg, IDC_LIST);
647
648    size_t cSelected = 0;
649    size_t cSelectedInUse = 0;
650
651    HLISTITEM hItem;
652    for (hItem = FastList_FindFirstSelected (hList); hItem; hItem = FastList_FindNextSelected (hList, hItem))
653       {
654       cSelected++;
655
656       LPCTSTR pszSubmount;
657       if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) != NULL)
658          {
659          for (size_t ii = 0; ii < g.Configuration.NetDrives.cSubmounts; ++ii)
660             {
661             if (!lstrcmpi (pszSubmount, g.Configuration.NetDrives.aSubmounts[ii].szSubmount))
662                {
663                if (g.Configuration.NetDrives.aSubmounts[ii].fInUse)
664                   cSelectedInUse++;
665                }
666             }
667          }
668       }
669
670    EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), (cSelected != 0) && (!cSelectedInUse));
671    EnableWindow (GetDlgItem (hDlg, IDC_EDIT), (cSelected == 1) && (!cSelectedInUse));
672 }
673
674
675 void Submounts_OnAdd (HWND hDlg)
676 {
677    HWND hList = GetDlgItem (hDlg, IDC_LIST);
678
679    SUBMOUNT Submount;
680    memset (&Submount, 0x00, sizeof(Submount));
681
682    Submounts_EditSubmount (hDlg, &Submount);
683 }
684
685
686 void Submounts_OnEdit (HWND hDlg)
687 {
688    HWND hList = GetDlgItem (hDlg, IDC_LIST);
689
690    HLISTITEM hItem;
691    if ((hItem = FastList_FindFirstSelected (hList)) != NULL)
692       {
693       LPCTSTR pszSubmount = FastList_GetItemText (hList, hItem, 0);
694       LPCTSTR pszMapping = FastList_GetItemText (hList, hItem, 1);
695
696       SUBMOUNT Submount;
697       memset (&Submount, 0x00, sizeof(Submount));
698       lstrcpy (Submount.szSubmount, pszSubmount);
699       lstrcpy (Submount.szMapping, pszMapping);
700
701       Submounts_EditSubmount (hDlg, &Submount);
702       }
703 }
704
705 // Action - On Remove submount item
706
707 void Submounts_OnRemove (HWND hDlg)
708 {
709    HWND hList = GetDlgItem (hDlg, IDC_LIST);
710    FastList_Begin (hList);
711
712    HLISTITEM hItem;
713    while ((hItem = FastList_FindFirstSelected (hList)) != NULL)
714       {
715       FastList_RemoveItem (hList, hItem);
716       }
717
718    FastList_End (hList);
719 }
720
721
722 // Action - On Add or On Edit a submount item
723 void Submounts_EditSubmount (HWND hDlg, PSUBMOUNT pSubmount)
724 {
725    HWND hList = GetDlgItem (hDlg, IDC_LIST);
726
727    if (ModalDialogParam (IDD_SUBMOUNT_EDIT, GetParent(hDlg), (DLGPROC)SubEdit_DlgProc, (LPARAM)pSubmount) == IDOK)
728       {
729       TCHAR szMapping[ MAX_PATH ];
730       AdjustAfsPath (szMapping, pSubmount->szMapping, TRUE, FALSE);
731
732       HLISTITEM hItem;
733       for (hItem = FastList_FindFirst (hList); hItem; hItem = FastList_FindNext (hList, hItem))
734          {
735          LPCTSTR pszSubmount;
736          if ((pszSubmount = FastList_GetItemText (hList, hItem, 0)) == NULL)
737             continue;
738
739          if (!lstrcmpi (pszSubmount, pSubmount->szSubmount))
740             break;
741          }
742
743       if (!hItem)
744          {
745          FASTLISTADDITEM ai;
746          memset (&ai, 0x00, sizeof(FASTLISTADDITEM));
747          ai.iFirstImage = IMAGE_NOIMAGE;
748          ai.iSecondImage = IMAGE_NOIMAGE;
749          ai.pszText = pSubmount->szSubmount;
750          ai.lParam = 0;
751          hItem = FastList_AddItem (hList, &ai);
752          }
753
754       FastList_SetItemText (hList, hItem, 1, szMapping);
755       }
756 }
757
758
759 BOOL CALLBACK SubEdit_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
760 {
761    switch (msg)
762       {
763       case WM_INITDIALOG:
764          SetWindowLong (hDlg, DWL_USER, lp);
765          SubEdit_OnInitDialog (hDlg);
766          SubEdit_Enable (hDlg);
767          break;
768
769       case WM_COMMAND:
770          switch (LOWORD(wp))
771             {
772             case IDOK:
773                SubEdit_OnOK (hDlg);
774                break;
775
776             case IDCANCEL:
777                EndDialog (hDlg, IDCANCEL);
778                break;
779
780             case IDC_SUBMOUNT:
781             case IDC_MAPPING:
782                SubEdit_Enable (hDlg);
783                break;
784
785             case IDHELP:
786                SubEdit_DlgProc (hDlg, WM_HELP, 0, 0);
787                break;
788             }
789          break;
790
791       case WM_HELP:
792          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCONFIG_SUBMOUNTS_NT_ADDEDIT);
793          break;
794       }
795
796    return 0;
797 }
798
799
800 void SubEdit_OnInitDialog (HWND hDlg)
801 {
802     CHAR msg[256], msgf[256];
803     PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLong (hDlg, DWL_USER);
804     if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
805     {
806                 wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
807                 SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
808    }
809
810    SetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount);
811    
812    SetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping);
813 }
814
815
816 void SubEdit_OnOK (HWND hDlg)
817 {
818    PSUBMOUNT pSubmount = (PSUBMOUNT)GetWindowLong (hDlg, DWL_USER);
819    GetDlgItemText (hDlg, IDC_SUBMOUNT, pSubmount->szSubmount, MAX_PATH);
820    GetDlgItemText (hDlg, IDC_MAPPING, pSubmount->szMapping, MAX_PATH);
821    EndDialog (hDlg, IDOK);
822 }
823
824
825 void SubEdit_Enable (HWND hDlg)
826 {
827    BOOL fEnable = TRUE;
828
829    TCHAR szText[ MAX_PATH ];
830    GetDlgItemText (hDlg, IDC_SUBMOUNT, szText, MAX_PATH);
831    if (!szText[0])
832       fEnable = FALSE;
833
834    GetDlgItemText (hDlg, IDC_MAPPING, szText, MAX_PATH);
835    if (!szText[0])
836       fEnable = FALSE;
837
838    EnableWindow (GetDlgItem (hDlg, IDOK), fEnable);
839 }
840