1fb6d431e1743fbfa1f1f370f008c8aafe2d1487
[openafs.git] / src / WINNT / client_creds / mounttab.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 "afscreds.h"
17
18
19 /*
20  * VARIABLES __________________________________________________________________
21  *
22  */
23
24 static struct l
25    {
26    int iDriveSelectLast;
27    } l;
28
29
30 /*
31  * PROTOTYPES _________________________________________________________________
32  *
33  */
34
35 void Mount_OnInitDialog (HWND hDlg);
36 void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog = FALSE);
37 void Mount_OnSelect (HWND hDlg);
38 void Mount_OnCheck (HWND hDlg);
39 void Mount_OnRemove (HWND hDlg);
40 void Mount_OnAdd (HWND hDlg);
41 void Mount_OnEdit (HWND hDlg);
42
43 void Mount_AdjustMapping (HWND hDlg, int iDrive);
44 int Mount_DriveFromItem (HWND hDlg, int iItem);
45
46 BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
47 void Mapping_OnInitDialog (HWND hDlg);
48 void Mapping_OnOK (HWND hDlg);
49 void Mapping_OnEnable (HWND hDlg);
50
51
52 /*
53  * ROUTINES ___________________________________________________________________
54  *
55  */
56
57 BOOL CALLBACK Mount_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
58 {
59    switch (msg)
60       {
61       case WM_INITDIALOG:
62          RECT rTab;
63          GetClientRect (GetParent(hDlg), &rTab);
64          TabCtrl_AdjustRect (GetParent (hDlg), FALSE, &rTab); 
65          SetWindowPos (hDlg, NULL, rTab.left, rTab.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
66
67          Mount_OnInitDialog (hDlg);
68          break;
69
70       case WM_COMMAND:
71          switch (LOWORD(wp))
72             {
73             case IDC_ADD:
74                Mount_OnAdd (hDlg);
75                break;
76
77             case IDC_EDIT:
78                Mount_OnEdit (hDlg);
79                break;
80
81             case IDC_REMOVE:
82                Mount_OnRemove (hDlg);
83                break;
84
85             case IDC_LIST:
86                if (HIWORD(wp) == LBN_CLICKED)
87                   Mount_OnCheck (hDlg);
88                else if ((HIWORD(wp) == LBN_SELCHANGE) || (HIWORD(wp) == LBN_SELCANCEL))
89                   Mount_OnSelect (hDlg);
90                break;
91
92             case IDHELP:
93                Mount_DlgProc (hDlg, WM_HELP, 0, 0);
94                break;
95             }
96          break;
97
98       case WM_HELP:
99          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_TAB_DRIVES);
100          break;
101       }
102    return FALSE;
103 }
104
105
106 void Mount_OnInitDialog (HWND hDlg)
107 {
108    int xTabStop = 250;
109    SendDlgItemMessage (hDlg, IDC_LIST, LB_SETTABSTOPS, 1, (LPARAM)&xTabStop);
110
111    Mount_OnUpdate (hDlg, TRUE);
112 }
113
114
115 void Mount_OnUpdate (HWND hDlg, BOOL fOnInitDialog)
116 {
117    DRIVEMAPLIST List;
118    memset(&List, 0, sizeof(DRIVEMAPLIST));
119    QueryDriveMapList (&List);
120
121    HWND hList = GetDlgItem (hDlg, IDC_LIST);
122    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
123    int iDataSel = Mount_DriveFromItem (hDlg, iItemSel);
124    iItemSel = -1;
125
126    if (fOnInitDialog && (iDataSel == -1))
127       iDataSel = l.iDriveSelectLast;
128
129    SendMessage (hList, WM_SETREDRAW, FALSE, 0);
130    SendMessage (hList, LB_RESETCONTENT, 0, 0);
131
132    for (int iDrive = 0; iDrive < 26; ++iDrive)
133       {
134       if (!List.aDriveMap[ iDrive ].szMapping[0])
135          continue;
136
137       TCHAR szAfsPath[ MAX_PATH ];
138       AdjustAfsPath (szAfsPath, List.aDriveMap[ iDrive ].szMapping, TRUE, FALSE);
139
140       LPTSTR psz = FormatString (IDS_DRIVE_MAP, TEXT("%c%s"), List.aDriveMap[ iDrive ].chDrive, szAfsPath);
141       int iItem = SendMessage (hList, LB_ADDSTRING, 0, (LPARAM)psz);
142       SendMessage (hList, LB_SETITEMDATA, iItem, List.aDriveMap[ iDrive ].fActive);
143       FreeString (psz);
144
145       if (iDrive == iDataSel)
146          iItemSel = iItem;
147       }
148
149    SendMessage (hList, WM_SETREDRAW, TRUE, 0);
150    SendMessage (hList, LB_SETCURSEL, iItemSel, 0);
151
152    Mount_OnSelect (hDlg);
153    FreeDriveMapList (&List);
154 }
155
156
157 void Mount_OnSelect (HWND hDlg)
158 {
159    BOOL fServiceRunning = IsServiceRunning();
160
161    HWND hList = GetDlgItem (hDlg, IDC_LIST);
162    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
163    int iDataSel = Mount_DriveFromItem (hDlg, iItemSel);
164
165    l.iDriveSelectLast = iDataSel;
166
167    EnableWindow (GetDlgItem (hDlg, IDC_ADD), fServiceRunning);
168    EnableWindow (GetDlgItem (hDlg, IDC_EDIT), fServiceRunning && (iDataSel != -1));
169    EnableWindow (GetDlgItem (hDlg, IDC_REMOVE), fServiceRunning && (iDataSel != -1));
170 }
171
172
173 void Mount_OnCheck (HWND hDlg)
174 {
175    DRIVEMAPLIST List;
176    QueryDriveMapList (&List);
177
178    HWND hList = GetDlgItem (hDlg, IDC_LIST);
179    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
180    int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
181    BOOL fChecked = SendMessage (hList, LB_GETITEMDATA, iItemSel, 0);
182
183    if (iDriveSel != -1)
184       {
185       DWORD dwStatus;
186       if (fChecked && List.aDriveMap[ iDriveSel ].szMapping[0] && !List.aDriveMap[ iDriveSel ].fActive)
187          {
188          if (!ActivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, List.aDriveMap[ iDriveSel ].szMapping, List.aDriveMap[ iDriveSel ].szSubmount, List.aDriveMap[ iDriveSel ].fPersistent, &dwStatus))
189             Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
190          Mount_OnUpdate (hDlg);
191          }
192       else if (!fChecked && List.aDriveMap[ iDriveSel ].fActive)
193          {
194          if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
195             Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
196          Mount_OnUpdate (hDlg);
197          }
198       }
199
200    WriteActiveMap(List.aDriveMap[ iDriveSel ].chDrive, fChecked && List.aDriveMap[ iDriveSel ].fPersistent );
201    FreeDriveMapList (&List);
202 }
203
204
205 void Mount_OnRemove (HWND hDlg)
206 {
207    HWND hList = GetDlgItem (hDlg, IDC_LIST);
208    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
209    int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
210
211    if (iDriveSel != -1)
212       {
213       DRIVEMAPLIST List;
214       QueryDriveMapList (&List);
215
216       if (List.aDriveMap[ iDriveSel ].szMapping[0])
217          {
218          if (List.aDriveMap[ iDriveSel ].fActive)
219             {
220             DWORD dwStatus;
221             if (!InactivateDriveMap (List.aDriveMap[ iDriveSel ].chDrive, &dwStatus))
222                {
223                Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
224                return;
225                }
226             }
227          List.aDriveMap[ iDriveSel ].szMapping[0] = TEXT('\0');
228          WriteDriveMappings (&List);
229
230          Mount_OnUpdate (hDlg);
231          }
232           WriteActiveMap(List.aDriveMap[ iDriveSel ].chDrive, FALSE );
233       FreeDriveMapList (&List);
234       }
235 }
236
237
238 void Mount_OnAdd (HWND hDlg)
239 {
240    Mount_AdjustMapping (hDlg, -1);
241 }
242
243
244 void Mount_OnEdit (HWND hDlg)
245 {
246    HWND hList = GetDlgItem (hDlg, IDC_LIST);
247    int iItemSel = SendMessage (hList, LB_GETCURSEL, 0, 0);
248    int iDriveSel = Mount_DriveFromItem (hDlg, iItemSel);
249
250    Mount_AdjustMapping (hDlg, iDriveSel);
251 }
252
253
254 void Mount_AdjustMapping (HWND hDlg, int iDrive)
255 {
256    DRIVEMAPLIST List;
257    QueryDriveMapList (&List);
258
259    DRIVEMAP DriveMapOrig;
260    memset (&DriveMapOrig, 0x00, sizeof(DRIVEMAP));
261
262    if (iDrive != -1)
263       {
264       memcpy (&DriveMapOrig, &List.aDriveMap[ iDrive ], sizeof(DRIVEMAP));
265       }
266
267    DRIVEMAP DriveMap;
268    memcpy (&DriveMap, &DriveMapOrig, sizeof(DRIVEMAP));
269
270    if (ModalDialogParam (IDD_MAPPING, hDlg, (DLGPROC)Mapping_DlgProc, (LPARAM)&DriveMap) == IDOK)
271       {
272       TCHAR szAfsPathOrig[ MAX_PATH ];
273       if (iDrive != -1)
274          AdjustAfsPath (szAfsPathOrig, DriveMapOrig.szMapping, TRUE, TRUE);
275
276       TCHAR szAfsPathNew[ MAX_PATH ];
277       AdjustAfsPath (szAfsPathNew, DriveMap.szMapping, TRUE, TRUE);
278
279       if ( (lstrcmpi (szAfsPathOrig, szAfsPathNew)) ||
280            (lstrcmpi (DriveMapOrig.szSubmount, DriveMap.szSubmount)) ||
281            (DriveMapOrig.chDrive != DriveMap.chDrive) ||
282            (DriveMapOrig.fPersistent != DriveMap.fPersistent) )
283          {
284          DWORD dwStatus;
285
286          if ((iDrive != -1) && (DriveMapOrig.fActive))
287             {
288             if (!InactivateDriveMap (DriveMapOrig.chDrive, &dwStatus))
289                {
290                Message (MB_OK | MB_ICONHAND, IDS_ERROR_UNMAP, IDS_ERROR_UNMAP_DESC, TEXT("%08lX"), dwStatus);
291                Mount_OnUpdate (hDlg);
292                return;
293                }
294             }
295
296          if (!ActivateDriveMap (DriveMap.chDrive, szAfsPathNew, DriveMap.szSubmount, DriveMap.fPersistent, &dwStatus))
297             {
298             Message (MB_OK | MB_ICONHAND, IDS_ERROR_MAP, IDS_ERROR_MAP_DESC, TEXT("%08lX"), dwStatus);
299             Mount_OnUpdate (hDlg);
300             return;
301             }
302
303          if (DriveMap.szSubmount[0])
304             {
305             TCHAR szSubmountNow[ MAX_PATH ];
306             if (GetDriveSubmount (DriveMap.chDrive, szSubmountNow))
307                {
308                if (lstrcmpi (DriveMap.szSubmount, szSubmountNow))
309                   {
310                   int idsTitle = (g.fIsWinNT) ? IDS_NEWSUB_TITLE : IDS_NEWSUB_TITLE_95;
311                   Message (MB_OK | MB_ICONASTERISK, idsTitle, IDS_NEWSUB_DESC);
312                   }
313                }
314             }
315
316          if (iDrive != -1)
317             memset (&List.aDriveMap[ iDrive ], 0x00, sizeof(DRIVEMAP));
318          memcpy (&List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ], &DriveMap, sizeof(DRIVEMAP));
319          lstrcpy (List.aDriveMap[ DriveMap.chDrive-chDRIVE_A ].szMapping, szAfsPathNew);
320          WriteDriveMappings (&List);
321
322          Mount_OnUpdate (hDlg);
323          }
324       }
325 }
326
327
328 int Mount_DriveFromItem (HWND hDlg, int iItem)
329 {
330    TCHAR szItem[ 1024 ] = TEXT("");
331    SendDlgItemMessage (hDlg, IDC_LIST, LB_GETTEXT, iItem, (LPARAM)szItem);
332
333    LPTSTR pch;
334    if ((pch = (LPTSTR)lstrchr (szItem, TEXT(':'))) != NULL)
335       {
336       if (pch > szItem)
337          {
338          pch--;
339          if ((*pch >= TEXT('A')) && (*pch <= TEXT('Z')))
340             return (*pch) - TEXT('A');
341          }
342       }
343
344    return -1;
345 }
346
347
348 BOOL CALLBACK Mapping_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
349 {
350    switch (msg)
351       {
352       case WM_INITDIALOG:
353          SetWindowLong (hDlg, DWL_USER, lp);
354          Mapping_OnInitDialog (hDlg);
355          break;
356
357       case WM_COMMAND:
358          switch (LOWORD(wp))
359             {
360             case IDOK:
361                Mapping_OnOK (hDlg);
362                break;
363
364             case IDCANCEL:
365                EndDialog (hDlg, IDCANCEL);
366                break;
367
368             case IDC_MAP_PATH:
369                Mapping_OnEnable (hDlg);
370                break;
371
372             case IDHELP:
373                Mapping_DlgProc (hDlg, WM_HELP, 0, 0);
374                break;
375             }
376          break;
377
378       case WM_HELP:
379          WinHelp (hDlg, g.szHelpFile, HELP_CONTEXT, IDH_AFSCREDS_MAPDRIVE);
380          break;
381       }
382    return FALSE;
383 }
384
385
386 void Mapping_OnInitDialog (HWND hDlg)
387 {
388    PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
389
390    // Fill in the combo box
391    //
392    DWORD dwDrives = GetLogicalDrives() | 0x07; // Always pretend A,B,C: are used
393
394    if (pMap->chDrive != 0)
395       dwDrives &= ~( 1 << (pMap->chDrive - chDRIVE_A) );
396
397    int iItemSel = -1;
398    HWND hCombo = GetDlgItem (hDlg, IDC_MAP_LETTER);
399    SendMessage (hCombo, WM_SETREDRAW, FALSE, 0);
400
401    for (int ii = 0; ii < 26; ++ii)
402       {
403       if (!(dwDrives & (1<<ii)))
404          {
405          TCHAR szText[ cchRESOURCE ];
406          GetString (szText, IDS_MAP_LETTER);
407
408          LPTSTR pch;
409          if ((pch = (LPTSTR)lstrchr (szText, TEXT('*'))) != NULL)
410             *pch = TEXT('A') + ii;
411
412          int iItem = SendMessage (hCombo, CB_ADDSTRING, 0, (LPARAM)szText);
413          SendMessage (hCombo, CB_SETITEMDATA, iItem, ii);
414          if (pMap->chDrive && (ii == pMap->chDrive - chDRIVE_A))
415             iItemSel = iItem;
416          else if ((!pMap->chDrive) && (iItemSel == -1))
417             iItemSel = iItem;
418          }
419       }
420
421    SendMessage (hCombo, WM_SETREDRAW, TRUE, 0);
422    SendMessage (hCombo, CB_SETCURSEL, iItemSel, 0);
423
424    TCHAR szMapping[ MAX_PATH ];
425     AdjustAfsPath (szMapping, ((pMap->szMapping[0]) ? pMap->szMapping : cm_slash_mount_root), TRUE, FALSE);
426     CHAR msg[256], msgf[256];
427     if (GetDlgItemText(hDlg,IDC_STATICSUBMOUNT,(LPSTR)msg,sizeof(msg)-1)>0)
428     {
429                 wsprintf(msgf,msg,cm_back_slash_mount_root,cm_back_slash_mount_root);
430                 SetDlgItemText (hDlg, IDC_STATICSUBMOUNT, msgf);
431    }
432    SetDlgItemText (hDlg, IDC_MAP_PATH, szMapping);
433    SetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount);
434
435    CheckDlgButton (hDlg, IDC_MAP_PERSISTENT, (pMap->chDrive == 0) ? TRUE : (pMap->fPersistent));
436
437    Mapping_OnEnable (hDlg);
438 }
439
440
441 void Mapping_OnOK (HWND hDlg)
442 {
443    PDRIVEMAP pMap = (PDRIVEMAP)GetWindowLong (hDlg, DWL_USER);
444
445    int iItem = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETCURSEL, 0, 0);
446    int iDrive = SendDlgItemMessage (hDlg, IDC_MAP_LETTER, CB_GETITEMDATA, iItem, 0);
447
448    pMap->chDrive = chDRIVE_A + iDrive;
449    GetDlgItemText (hDlg, IDC_MAP_PATH, pMap->szMapping, MAX_PATH);
450    GetDlgItemText (hDlg, IDC_MAP_DESC, pMap->szSubmount, MAX_PATH);
451    pMap->fPersistent = IsDlgButtonChecked (hDlg, IDC_MAP_PERSISTENT);
452
453    if (pMap->szSubmount[0] && !IsValidSubmountName (pMap->szSubmount))
454       {
455       int idsTitle = (g.fIsWinNT) ? IDS_BADSUB_TITLE : IDS_BADSUB_TITLE_95;
456       Message (MB_ICONHAND, idsTitle, IDS_BADSUB_DESC);
457       return;
458       }
459
460    if ( (lstrncmpi (pMap->szMapping, cm_slash_mount_root, lstrlen(cm_slash_mount_root))) &&     /*TEXT("/afs")*/
461         (lstrncmpi (pMap->szMapping, cm_back_slash_mount_root, lstrlen(cm_back_slash_mount_root))) ) /*TEXT("\\afs")*/
462    {
463      Message (MB_ICONHAND, IDS_BADMAP_TITLE, IDS_BADMAP_DESC);
464      return;
465    }
466
467    WriteActiveMap(pMap->chDrive, pMap->fPersistent);
468    EndDialog (hDlg, IDOK);
469 }
470
471
472 void Mapping_OnEnable (HWND hDlg)
473 {
474    TCHAR szPath[ MAX_PATH ];
475    GetDlgItemText (hDlg, IDC_MAP_PATH, szPath, MAX_PATH);
476    EnableWindow (GetDlgItem (hDlg, IDOK), (szPath[0] != TEXT('\0')));
477 }
478