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