91d63c93e2541892f3a4a71057d4c24602eb0c75
[openafs.git] / src / WINNT / afssvrmgr / agg_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 <afs/param.h>
15 #include <afs/stds.h>
16 }
17
18 #include "svrmgr.h"
19 #include "agg_prop.h"
20 #include "agg_general.h"
21 #include "svr_general.h"
22 #include "propcache.h"
23 #include "problems.h"
24
25
26 /*
27  * PROTOTYPES _________________________________________________________________
28  *
29  */
30
31 BOOL CALLBACK Aggregates_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32
33 void Aggregates_General_OnInitDialog (HWND hDlg);
34 void Aggregates_General_OnApply (HWND hDlg);
35 void Aggregates_General_OnWarnings (HWND hDlg);
36 void Aggregates_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp);
37 void Aggregates_General_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp);
38
39
40 /*
41  * ROUTINES ___________________________________________________________________
42  *
43  */
44
45 void Aggregates_ShowProperties (LPIDENT lpiAggregate, size_t nAlerts, BOOL fJumpToThreshold, HWND hParentModal)
46 {
47    HWND hCurrent;
48
49    if ((hCurrent = PropCache_Search (pcAGG_PROP, lpiAggregate)) != 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 szSvrName[ cchNAME ];
72       TCHAR szAggName[ cchNAME ];
73       lpiAggregate->GetServerName (szSvrName);
74       lpiAggregate->GetAggregateName (szAggName);
75       LPTSTR pszTitle = FormatString (IDS_AGG_PROP_TITLE, TEXT("%s%s"), szSvrName, szAggName);
76
77       LPPROPSHEET psh = PropSheet_Create (pszTitle, FALSE);
78       psh->fMadeCaption = TRUE;
79       psh->sh.hwndParent = hParentModal;
80
81       if (PropSheet_AddProblemsTab (psh, IDD_AGG_PROBLEMS, lpiAggregate, nAlerts) &&
82           PropSheet_AddTab (psh, IDS_AGG_GENERAL_TAB, IDD_AGG_GENERAL, (DLGPROC)Aggregates_General_DlgProc, (LPARAM)lpiAggregate, TRUE, FALSE))
83          {
84          if (fJumpToThreshold)
85             psh->sh.nStartPage = psh->sh.nPages-1;
86
87          if (hParentModal)
88             PropSheet_ShowModal (psh, PumpMessage);
89          else
90             PropSheet_ShowModeless (psh);
91          }
92       }
93 }
94
95
96 BOOL CALLBACK Aggregates_General_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
97 {
98    if (AfsAppLib_HandleHelp (IDD_AGG_GENERAL, hDlg, msg, wp, lp))
99       return TRUE;
100
101    if (msg == WM_INITDIALOG)
102       SetWindowLongPtr (hDlg, DWLP_USER, ((LPPROPSHEETPAGE)lp)->lParam);
103
104    LPIDENT lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER);
105
106    switch (msg)
107       {
108       case WM_INITDIALOG_SHEET:
109          PropCache_Add (pcAGG_PROP, (LPIDENT)lp, hDlg);
110          break;
111
112       case WM_DESTROY_SHEET:
113          PropCache_Delete (hDlg);
114          break;
115
116       case WM_INITDIALOG:
117          Aggregates_General_OnInitDialog (hDlg);
118          StartTask (taskAGG_PROP_INIT, hDlg, lpi);
119          break;
120
121       case WM_ENDTASK:
122          LPTASKPACKET ptp;
123          if ((ptp = (LPTASKPACKET)lp) != NULL)
124             {
125             if (ptp->idTask == taskAGG_PROP_INIT)
126                Aggregates_General_OnEndTask_InitDialog (hDlg, ptp);
127             else if (ptp->idTask == taskAGG_PROP_APPLY)
128                Aggregates_General_OnEndTask_Apply (hDlg, ptp);
129             FreeTaskPacket (ptp);
130             }
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                Aggregates_General_OnApply (hDlg);
142                break;
143
144             case IDC_AGG_WARNALLOC:
145                PropSheetChanged (hDlg);
146                break;
147
148             case IDC_AGG_WARN:
149             case IDC_AGG_WARN_AGGFULL:
150             case IDC_AGG_WARN_AGGFULL_DEF:
151                Aggregates_General_OnWarnings (hDlg);
152                PropSheetChanged (hDlg);
153                break;
154
155             case IDC_AGG_WARN_AGGFULL_PERCENT:
156                PropSheetChanged (hDlg);
157                break;
158             }
159          break;
160       }
161
162    return FALSE;
163 }
164
165
166 void Aggregates_General_OnInitDialog (HWND hDlg)
167 {
168    LPIDENT lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER);
169
170    TCHAR szSvrName[ cchNAME ];
171    TCHAR szAggName[ cchNAME ];
172    lpi->GetServerName (szSvrName);
173    lpi->GetAggregateName (szAggName);
174
175    TCHAR szText[ cchRESOURCE ];
176    GetDlgItemText (hDlg, IDC_AGG_NAME, szText, cchRESOURCE);
177    LPTSTR pszText = FormatString (szText, TEXT("%s%s"), szSvrName, szAggName);
178    SetDlgItemText (hDlg, IDC_AGG_NAME, pszText);
179    FreeString (pszText);
180
181    EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARNALLOC), FALSE);
182    EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN), FALSE);
183    EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), FALSE);
184    EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), FALSE);
185    EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), FALSE);
186 }
187
188
189 void Aggregates_General_OnApply (HWND hDlg)
190 {
191    LPAGG_PROP_APPLY_PACKET lpp;
192    if ((lpp = New (AGG_PROP_APPLY_PACKET)) != NULL)
193       {
194       lpp->lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER);
195       lpp->fIDC_AGG_WARNALLOC = IsDlgButtonChecked (hDlg, IDC_AGG_WARNALLOC);
196       lpp->fIDC_AGG_WARN = IsDlgButtonChecked (hDlg, IDC_AGG_WARN);
197       lpp->fIDC_AGG_WARN_AGGFULL_DEF = IsDlgButtonChecked (hDlg, IDC_AGG_WARN_AGGFULL_DEF);
198       lpp->wIDC_AGG_WARN_AGGFULL_PERCENT = (short)SP_GetPos (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT));
199
200       StartTask (taskAGG_PROP_APPLY, hDlg, lpp);
201       }
202 }
203
204
205 void Aggregates_General_OnWarnings (HWND hDlg)
206 {
207    if (!IsDlgButtonChecked (hDlg, IDC_AGG_WARN))
208       {
209       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), FALSE);
210       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), FALSE);
211       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), FALSE);
212       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DESC), FALSE);
213       }
214    else if (IsDlgButtonChecked (hDlg, IDC_AGG_WARN_AGGFULL))
215       {
216       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), TRUE);
217       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), TRUE);
218       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), TRUE);
219       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DESC), TRUE);
220       }
221    else // (IsDlgButtonChecked (hDlg, IDC_AGG_WARN_AGGFULL_DEF))
222       {
223       CheckDlgButton (hDlg, IDC_AGG_WARN_AGGFULL_DEF, TRUE);
224       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DEF), TRUE);
225       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL), TRUE);
226       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT), FALSE);
227       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_DESC), FALSE);
228       }
229 }
230
231
232 void Aggregates_General_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp)
233 {
234    LPIDENT lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER);
235
236    if (!ptp->rc)
237       {
238       TCHAR szUnknown[ cchRESOURCE ];
239       GetString (szUnknown, IDS_UNKNOWN);
240       SetDlgItemText (hDlg, IDC_AGG_ID,       szUnknown);
241       SetDlgItemText (hDlg, IDC_AGG_DEVICE,   szUnknown);
242       SetDlgItemText (hDlg, IDC_AGG_FILESETS, szUnknown);
243       SetDlgItemText (hDlg, IDC_AGG_USAGE,    szUnknown);
244
245       TCHAR szSvrName[ cchNAME ];
246       TCHAR szAggName[ cchNAME ];
247       lpi->GetServerName (szSvrName);
248       lpi->GetAggregateName (szAggName);
249       ErrorDialog (ptp->status, IDS_ERROR_REFRESH_AGGREGATE_STATUS, TEXT("%s%s"), szSvrName, szAggName);
250       }
251    else
252       {
253       TCHAR szText[ cchRESOURCE ];
254       wsprintf (szText, TEXT("%lu"), TASKDATA(ptp)->as.dwID);
255       SetDlgItemText (hDlg, IDC_AGG_ID, szText);
256
257       SetDlgItemText (hDlg, IDC_AGG_DEVICE, TASKDATA(ptp)->pszText1);
258
259       LPTSTR pszText = FormatString (IDS_AGG_FILESETS, TEXT("%lu%.1B"), TASKDATA(ptp)->nFilesets, (double)cb1KB * (double)(TASKDATA(ptp)->as.ckStorageAllocated));
260       SetDlgItemText (hDlg, IDC_AGG_FILESETS, pszText);
261       FreeString (pszText);
262
263       double dUsed  = 1024.0 * (TASKDATA(ptp)->as.ckStorageTotal - TASKDATA(ptp)->as.ckStorageFree);
264       double dTotal = 1024.0 * TASKDATA(ptp)->as.ckStorageTotal;
265       DWORD dwPer   = 100;
266       if (TASKDATA(ptp)->as.ckStorageTotal != 0)
267          {
268          dwPer = (DWORD)( 100.0 * (TASKDATA(ptp)->as.ckStorageTotal - TASKDATA(ptp)->as.ckStorageFree) / TASKDATA(ptp)->as.ckStorageTotal );
269          dwPer = limit( 0, dwPer, 100 );
270          }
271
272       LPTSTR pszUsage = FormatString (IDS_USAGE_AGGREGATE, TEXT("%.1B%.1B%lu"), dUsed, dTotal, dwPer);
273       SetDlgItemText (hDlg, IDC_AGG_USAGE, pszUsage);
274       FreeString (pszUsage);
275
276       SendDlgItemMessage (hDlg, IDC_AGG_USAGEBAR, PBM_SETRANGE, 0, MAKELPARAM(0,100));
277       SendDlgItemMessage (hDlg, IDC_AGG_USAGEBAR, PBM_SETPOS, (WPARAM)dwPer, 0);
278
279       if (TASKDATA(ptp)->lpsp->fWarnAggAlloc)
280          {
281          EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARNALLOC), TRUE);
282          CheckDlgButton (hDlg, IDC_AGG_WARNALLOC, TASKDATA(ptp)->lpap->fWarnAggAlloc);
283          }
284
285       EnableWindow (GetDlgItem (hDlg, IDC_AGG_WARN), TRUE);
286
287       if (TASKDATA(ptp)->lpsp->perWarnAggFull == 0)
288          {
289          GetString (szText, IDS_AGGFULL_WARN_OFF);
290          SetDlgItemText (hDlg, IDC_AGG_WARN_AGGFULL_DEF, szText);
291          }
292       else
293          {
294          pszText = FormatString (IDS_AGGFULL_WARN_ON, TEXT("%lu"), TASKDATA(ptp)->lpsp->perWarnAggFull);
295          SetDlgItemText (hDlg, IDC_AGG_WARN_AGGFULL_DEF, pszText);
296          FreeString (pszText);
297          }
298
299       CheckDlgButton (hDlg, IDC_AGG_WARN, (TASKDATA(ptp)->lpap->perWarnAggFull != 0));
300       if (TASKDATA(ptp)->lpap->perWarnAggFull != 0)
301          {
302          if (TASKDATA(ptp)->lpap->perWarnAggFull != -1)
303             CheckDlgButton (hDlg, IDC_AGG_WARN_AGGFULL, TRUE);
304          else
305             CheckDlgButton (hDlg, IDC_AGG_WARN_AGGFULL_DEF, TRUE);
306          }
307
308       CreateSpinner (GetDlgItem (hDlg, IDC_AGG_WARN_AGGFULL_PERCENT),
309                      10, FALSE,   // base, signed
310                      1,
311                      (TASKDATA(ptp)->lpap->perWarnAggFull == 0 || TASKDATA(ptp)->lpap->perWarnAggFull == -1) ? perDEFAULT_AGGFULL_WARNING : TASKDATA(ptp)->lpap->perWarnAggFull,
312                      100); // min, default, max
313
314       Aggregates_General_OnWarnings (hDlg);
315       }
316 }
317
318
319 void Aggregates_General_OnEndTask_Apply (HWND hDlg, LPTASKPACKET ptp)
320 {
321    if (!ptp->rc)
322       {
323       LPIDENT lpi = (LPIDENT)GetWindowLongPtr (hDlg, DWLP_USER);
324
325       TCHAR szSvrName[ cchNAME ];
326       TCHAR szAggName[ cchNAME ];
327       lpi->GetServerName (szSvrName);
328       lpi->GetAggregateName (szAggName);
329       ErrorDialog (ptp->status, IDS_ERROR_CHANGE_AGGREGATE_STATUS, TEXT("%s%s"), szSvrName, szAggName);
330       }
331 }
332