723578df873635f1a8b7b6598bc008cbf1145ecc
[openafs.git] / src / WINNT / afssvrmgr / set_prop.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 "svrmgr.h"
16 #include "set_prop.h"
17 #include "set_quota.h"
18 #include "svr_general.h"
19 #include "propcache.h"
20 #include "problems.h"
21
22
23 /*
24  * PROTOTYPES _________________________________________________________________
25  *
26  */
27
28 BOOL CALLBACK Filesets_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
29
30 void Filesets_General_OnInitDialog (HWND hDlg, LPIDENT lpiFileset);
31 void Filesets_General_OnApply (HWND hDlg, LPIDENT lpiFileset);
32 void Filesets_General_OnWarnings (HWND hDlg, LPIDENT lpiFileset);
33
34 void Filesets_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPIDENT lpi);
35
36
37 /*
38  * ROUTINES ___________________________________________________________________
39  *
40  */
41
42 void Filesets_ShowProperties (LPIDENT lpiFileset, size_t nAlerts, BOOL fJumpToThreshold)
43 {
44    HWND hCurrent;
45    if ((hCurrent = PropCache_Search (pcSET_PROP, lpiFileset)) != NULL)
46       {
47       SetFocus (hCurrent);
48
49       if (fJumpToThreshold)
50          {
51          HWND hTab;
52          if ((hTab = GetDlgItem (hCurrent, IDC_PROPSHEET_TABCTRL)) != NULL)
53             {
54             int nTabs = TabCtrl_GetItemCount (hTab);
55             TabCtrl_SetCurSel (hTab, nTabs-1);
56
57             NMHDR nm;
58             nm.hwndFrom = hTab;
59             nm.idFrom = IDC_PROPSHEET_TABCTRL;
60             nm.code = TCN_SELCHANGE;
61             SendMessage (hCurrent, WM_NOTIFY, 0, (LPARAM)&nm);
62             }
63          }
64       }
65    else
66       {
67       TCHAR szCell[ cchNAME ];
68       lpiFileset->GetCellName (szCell);
69
70       TCHAR szFileset[ cchNAME ];
71       lpiFileset->GetFilesetName (szFileset);
72
73       LPTSTR pszTitle = FormatString (IDS_SET_PROP_TITLE, TEXT("%s"), szFileset);
74       LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE);
75       psh->fMadeCaption = TRUE;
76
77       if (PropSheet_AddProblemsTab (psh, IDD_SET_PROBLEMS, lpiFileset, nAlerts) &&
78           PropSheet_AddTab (psh, IDS_SET_GENERAL_TAB, IDD_SET_GENERAL, (DLGPROC)Filesets_General_DlgProc, (LPARAM)lpiFileset, TRUE))
79          {
80          if (fJumpToThreshold)
81             psh->sh.nStartPage = psh->sh.nPages-1;
82          PropSheet_ShowModeless (psh);
83          }
84       }
85 }
86
87
88 BOOL CALLBACK Filesets_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
89 {
90    if (AfsAppLib_HandleHelp (IDD_SET_GENERAL, hDlg, msg, wp, lp))
91       return TRUE;
92
93    if (msg == WM_INITDIALOG)
94       SetWindowLongPtr (hDlg, DWLP_USER, ((LPPROPSHEETPAGE)lp)->lParam);
95
96    LPIDENT lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER);
97
98    switch (msg)
99       {
100       case WM_INITDIALOG_SHEET:
101          PropCache_Add (pcSET_PROP, (LPIDENT)lp, hDlg);
102          break;
103
104       case WM_DESTROY_SHEET:
105          PropCache_Delete (hDlg);
106          break;
107
108       case WM_INITDIALOG:
109          Filesets_General_OnInitDialog (hDlg, lpi);
110          StartTask (taskSET_PROP_INIT, hDlg, lpi);
111          NotifyMe (WHEN_OBJECT_CHANGES, lpi, hDlg, 0);
112          break;
113
114       case WM_DESTROY:
115          DontNotifyMeEver (hDlg);
116          break;
117
118       case WM_ENDTASK:
119          LPTASKPACKET ptp;
120          if ((ptp = (LPTASKPACKET)lp) != NULL)
121             {
122             if (ptp->idTask == taskSET_PROP_INIT)
123                Filesets_General_OnEndTask_InitDialog (hDlg, ptp, lpi);
124             FreeTaskPacket (ptp);
125             }
126          break; 
127
128       case WM_NOTIFY_FROM_DISPATCH:
129          StartTask (taskSET_PROP_INIT, hDlg, lpi);
130          Delete ((LPNOTIFYSTRUCT)lp);
131          break;
132
133       case WM_COMMAND:
134          switch (LOWORD(wp))
135             {
136             case IDOK:
137             case IDCANCEL:
138                break;
139
140             case IDAPPLY:
141                Filesets_General_OnApply (hDlg, lpi);
142                break;
143
144             case IDC_SET_WARN:
145             case IDC_SET_WARN_SETFULL:
146             case IDC_SET_WARN_SETFULL_DEF:
147                Filesets_General_OnWarnings (hDlg, lpi);
148                PropSheetChanged (hDlg);
149                break;
150
151             case IDC_SET_WARN_SETFULL_PERCENT:
152                PropSheetChanged (hDlg);
153                break;
154
155             case IDC_SET_QUOTA:
156                if (Filesets_SetQuota (lpi))
157                   {
158                   // this new task will block until the setquota req is done
159                   StartTask (taskSET_PROP_INIT, hDlg, lpi);
160                   }
161                break;
162
163             case IDC_SET_LOCK:
164                StartTask (taskSET_LOCK, NULL, lpi);
165                break;
166
167             case IDC_SET_UNLOCK:
168                StartTask (taskSET_UNLOCK, NULL, lpi);
169                break;
170             }
171          break;
172       }
173
174    return FALSE;
175 }
176
177
178 void Filesets_General_OnInitDialog (HWND hDlg, LPIDENT lpi)
179 {
180    TCHAR szText[ cchRESOURCE ];
181    TCHAR szSvrName[ cchNAME ];
182    TCHAR szAggName[ cchNAME ];
183    TCHAR szSetName[ cchNAME ];
184    VOLUMEID vidFileset;
185    lpi->GetServerName (szSvrName);
186    lpi->GetAggregateName (szAggName);
187    lpi->GetFilesetName (szSetName);
188    lpi->GetFilesetID (&vidFileset);
189
190    GetDlgItemText (hDlg, IDC_SET_NAME, szText, cchRESOURCE);
191    LPTSTR pszText = FormatString (szText, TEXT("%s%s%s"), szSvrName, szAggName, szSetName);
192    SetDlgItemText (hDlg, IDC_SET_NAME, pszText);
193    FreeString (pszText);
194
195    pszText = FormatString (TEXT("%1"), TEXT("%lu"), vidFileset);
196    SetDlgItemText (hDlg, IDC_SET_ID, pszText);
197    FreeString (pszText);
198
199    EnableWindow (GetDlgItem (hDlg, IDC_SET_LOCK), FALSE);
200    EnableWindow (GetDlgItem (hDlg, IDC_SET_UNLOCK), FALSE);
201    EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), FALSE);
202    EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN), FALSE);
203    EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), FALSE);
204    EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), FALSE);
205    EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE);
206    EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE);
207 }
208
209
210 void Filesets_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPIDENT lpi)
211 {
212    LPTSTR pszText;
213
214    TCHAR szUnknown[ cchRESOURCE ];
215    GetString (szUnknown, IDS_UNKNOWN);
216
217    if (!ptp->rc)
218       {
219       SetDlgItemText (hDlg, IDC_SET_CREATEDATE, szUnknown);
220       SetDlgItemText (hDlg, IDC_SET_UPDATEDATE, szUnknown);
221       SetDlgItemText (hDlg, IDC_SET_ACCESSDATE, szUnknown);
222       SetDlgItemText (hDlg, IDC_SET_BACKUPDATE, szUnknown);
223       SetDlgItemText (hDlg, IDC_SET_USAGE, szUnknown);
224       SetDlgItemText (hDlg, IDC_SET_STATUS, szUnknown);
225       SetDlgItemText (hDlg, IDC_SET_FILES, szUnknown);
226
227       TCHAR szSvrName[ cchNAME ];
228       TCHAR szAggName[ cchNAME ];
229       TCHAR szSetName[ cchNAME ];
230       lpi->GetServerName (szSvrName);
231       lpi->GetAggregateName (szAggName);
232       lpi->GetFilesetName (szSetName);
233       ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szSvrName, szAggName, szSetName);
234       }
235    else
236       {
237       TCHAR szText[ cchRESOURCE ];
238
239       EnableWindow (GetDlgItem (hDlg, IDC_SET_LOCK), TRUE);
240       EnableWindow (GetDlgItem (hDlg, IDC_SET_UNLOCK), TRUE);
241       EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), TRUE);
242       EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN), TRUE);
243       EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), TRUE);
244       EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), TRUE);
245       EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), TRUE);
246       EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), TRUE);
247
248       if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeCreation))
249          SetDlgItemText (hDlg, IDC_SET_CREATEDATE, szUnknown);
250       else
251          SetDlgItemText (hDlg, IDC_SET_CREATEDATE, szText);
252
253       if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeLastUpdate))
254          SetDlgItemText (hDlg, IDC_SET_UPDATEDATE, szUnknown);
255       else
256          SetDlgItemText (hDlg, IDC_SET_UPDATEDATE, szText);
257
258       if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeLastAccess))
259          SetDlgItemText (hDlg, IDC_SET_ACCESSDATE, szUnknown);
260       else
261          SetDlgItemText (hDlg, IDC_SET_ACCESSDATE, szText);
262
263       if (!FormatTime (szText, TEXT("%s"), &TASKDATA(ptp)->fs.timeLastBackup))
264          SetDlgItemText (hDlg, IDC_SET_BACKUPDATE, szUnknown);
265       else
266          SetDlgItemText (hDlg, IDC_SET_BACKUPDATE, szText);
267
268       wsprintf (szText, TEXT("%lu"), TASKDATA(ptp)->fs.nFiles);
269       SetDlgItemText (hDlg, IDC_SET_FILES, szText);
270
271       size_t nAlerts = Alert_GetCount (lpi);
272       if (nAlerts == 1)
273          {
274          GetString (szText, IDS_SETSTATUS_1ALERT);
275          SetDlgItemText (hDlg, IDC_SET_STATUS, szText);
276          }
277       else if (nAlerts > 1)
278          {
279          pszText = FormatString (IDS_SETSTATUS_2ALERT, TEXT("%lu"), nAlerts);
280          SetDlgItemText (hDlg, IDC_SET_STATUS, pszText);
281          FreeString (pszText);
282          }
283       else // (nAlerts == 0)
284          {
285          if (TASKDATA(ptp)->fs.State & fsBUSY)
286             GetString (szText, IDS_SETSTATUS_BUSY);
287          else if (TASKDATA(ptp)->fs.State & fsSALVAGE)
288             GetString (szText, IDS_SETSTATUS_SALVAGE);
289          else if (TASKDATA(ptp)->fs.State & fsMOVED)
290             GetString (szText, IDS_SETSTATUS_MOVED);
291          else if (TASKDATA(ptp)->fs.State & fsLOCKED)
292             GetString (szText, IDS_SETSTATUS_LOCKED);
293          else if (TASKDATA(ptp)->fs.State & fsNO_VOL)
294             GetString (szText, IDS_SETSTATUS_NO_VOL);
295          else
296             GetString (szText, IDS_STATUS_NOALERTS);
297          SetDlgItemText (hDlg, IDC_SET_STATUS, szText);
298          }
299
300       if (TASKDATA(ptp)->fs.Type == ftREADWRITE)
301          {
302          Filesets_DisplayQuota (hDlg, &TASKDATA(ptp)->fs);
303          }
304       else
305          {
306          if (TASKDATA(ptp)->fs.Type == ftREPLICA)
307             GetString (szText, IDS_USAGE_REPLICA);
308          else // (TASKDATA(ptp)->fs.Type == ftCLONE)
309             GetString (szText, IDS_USAGE_CLONE);
310
311          pszText = FormatString (szText, TEXT("%.1B"), (double)TASKDATA(ptp)->fs.ckUsed * cb1KB);
312          SetDlgItemText (hDlg, IDC_SET_USAGE, pszText);
313          FreeString (pszText);
314
315          if (GetDlgItem (hDlg, IDC_SET_USAGEBAR))
316             {
317             RECT rUsagebar;
318             GetRectInParent (GetDlgItem (hDlg, IDC_SET_USAGEBAR), &rUsagebar);
319
320             HFONT hf = (HFONT)SendMessage (GetDlgItem (hDlg, IDC_SET_USAGEBAR), WM_GETFONT, 0, 0);
321             DestroyWindow (GetDlgItem (hDlg, IDC_SET_USAGEBAR));
322
323             if (TASKDATA(ptp)->fs.Type == ftREPLICA)
324                GetString (szText, IDS_NO_QUOTA_REPLICA);
325             else // (TASKDATA(ptp)->fs.Type == ftCLONE)
326                GetString (szText, IDS_NO_QUOTA_CLONE);
327
328             HWND hDesc = CreateWindow (TEXT("static"),
329                           szText,
330                           WS_CHILD | SS_SIMPLE,
331                           rUsagebar.left, rUsagebar.top,
332                           cxRECT(rUsagebar), cyRECT(rUsagebar),
333                           hDlg,
334                           (HMENU)-1,
335                           THIS_HINST,
336                           0);
337             SendMessage (hDesc, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE,0));
338             ShowWindow (hDesc, SW_SHOW);
339             }
340
341          EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), FALSE);
342          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN), FALSE);
343          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), FALSE);
344          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), FALSE);
345          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE);
346          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE);
347          }
348
349       if (TASKDATA(ptp)->lpsp->perWarnSetFull == 0)
350          {
351          GetString (szText, IDS_SETFULL_WARN_OFF);
352          SetDlgItemText (hDlg, IDC_SET_WARN_SETFULL_DEF, szText);
353          }
354       else
355          {
356          GetString (szText, IDS_SETFULL_WARN_ON);
357          pszText = FormatString (szText, TEXT("%lu"), TASKDATA(ptp)->lpsp->perWarnSetFull);
358          SetDlgItemText (hDlg, IDC_SET_WARN_SETFULL_DEF, pszText);
359          FreeString (pszText);
360          }
361
362       CheckDlgButton (hDlg, IDC_SET_WARN, (TASKDATA(ptp)->lpfp->perWarnSetFull != 0));
363       if (TASKDATA(ptp)->lpfp->perWarnSetFull != 0)
364          {
365          if (TASKDATA(ptp)->lpfp->perWarnSetFull != -1)
366             CheckDlgButton (hDlg, IDC_SET_WARN_SETFULL, TRUE);
367          else
368             CheckDlgButton (hDlg, IDC_SET_WARN_SETFULL_DEF, TRUE);
369          }
370
371       CreateSpinner (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT),
372                      10, FALSE,   // base, signed
373                      1,
374                      (TASKDATA(ptp)->lpfp->perWarnSetFull == 0 || TASKDATA(ptp)->lpfp->perWarnSetFull == -1) ? perDEFAULT_SETFULL_WARNING : TASKDATA(ptp)->lpfp->perWarnSetFull,
375                      100); // min, default, max
376
377       Filesets_General_OnWarnings (hDlg, lpi);
378       }
379 }
380
381
382 void Filesets_General_OnApply (HWND hDlg, LPIDENT lpi)
383 {
384    LPSET_PROP_APPLY_PARAMS lpp = New (SET_PROP_APPLY_PARAMS);
385
386    lpp->lpi = lpi;
387    lpp->fIDC_SET_WARN = IsDlgButtonChecked (hDlg, IDC_SET_WARN);
388    lpp->fIDC_SET_WARN_SETFULL_DEF = IsDlgButtonChecked (hDlg, IDC_SET_WARN_SETFULL_DEF);
389    lpp->wIDC_SET_WARN_SETFULL_PERCENT = (WORD)SP_GetPos (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT));
390
391    StartTask (taskSET_PROP_APPLY, hDlg, lpp);
392 }
393
394
395 void Filesets_General_OnWarnings (HWND hDlg, LPIDENT lpi)
396 {
397    if (IsWindowEnabled (GetDlgItem (hDlg, IDC_SET_WARN)))
398       {
399       if (!IsDlgButtonChecked (hDlg, IDC_SET_WARN))
400          {
401          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), FALSE);
402          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), FALSE);
403          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE);
404          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE);
405          }
406       else if (IsDlgButtonChecked (hDlg, IDC_SET_WARN_SETFULL))
407          {
408          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), TRUE);
409          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), TRUE);
410          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), TRUE);
411          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), TRUE);
412          }
413       else // (IsDlgButtonChecked (hDlg, IDC_SET_WARN_SETFULL_DEF))
414          {
415          CheckDlgButton (hDlg, IDC_SET_WARN_SETFULL_DEF, TRUE);
416          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DEF), TRUE);
417          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL), TRUE);
418          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_PERCENT), FALSE);
419          EnableWindow (GetDlgItem (hDlg, IDC_SET_WARN_SETFULL_DESC), FALSE);
420          }
421       }
422 }
423