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