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