win32-name-event-objects-20040228
[openafs.git] / src / WINNT / afssvrmgr / set_quota.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_quota.h"
17 #include "agg_prop.h"
18
19
20 /*
21  * PROTOTYPES _________________________________________________________________
22  *
23  */
24
25 BOOL CALLBACK Filesets_SetQuota_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
26
27 void Filesets_SetQuota_OnInitDialog (HWND hDlg, LPIDENT lpi);
28 void Filesets_SetQuota_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSET_SETQUOTA_APPLY_PARAMS lpp);
29
30
31 /*
32  * ROUTINES ___________________________________________________________________
33  *
34  */
35
36 BOOL Filesets_SetQuota (LPIDENT lpiFileset, size_t ckQuota)
37 {
38    if (ckQuota == 0)
39       {
40       if ((ckQuota = Filesets_PickQuota (lpiFileset)) == 0)
41          return FALSE;
42       }
43
44    LPSET_SETQUOTA_APPLY_PARAMS lpp = New (SET_SETQUOTA_APPLY_PARAMS);
45    lpp->lpiFileset = lpiFileset;
46    lpp->ckQuota = ckQuota;
47    StartTask (taskSET_SETQUOTA_APPLY, NULL, lpp);
48    return TRUE;
49 }
50
51
52 size_t Filesets_PickQuota (LPIDENT lpiFileset)
53 {
54    SET_SETQUOTA_APPLY_PARAMS ssp;
55    memset (&ssp, 0x00, sizeof(ssp));
56    ssp.lpiFileset = lpiFileset;
57
58    int rc = ModalDialogParam (IDD_SET_SETQUOTA, GetActiveWindow(), (DLGPROC)Filesets_SetQuota_DlgProc, (LPARAM)&ssp);
59    if (rc != IDOK)
60       return 0;
61    else
62       return ssp.ckQuota;
63 }
64
65
66 BOOL CALLBACK Filesets_SetQuota_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
67 {
68    static LPSET_SETQUOTA_APPLY_PARAMS lpp = NULL;
69    if (msg == WM_INITDIALOG)
70       lpp = (LPSET_SETQUOTA_APPLY_PARAMS)lp;
71
72    if (AfsAppLib_HandleHelp (IDD_SET_SETQUOTA, hDlg, msg, wp, lp))
73       return TRUE;
74
75    if (lpp != NULL)
76       {
77       switch (msg)
78          {
79          case WM_INITDIALOG:
80             Filesets_SetQuota_OnInitDialog (hDlg, lpp->lpiFileset);
81             StartTask (taskSET_SETQUOTA_INIT, hDlg, lpp->lpiFileset);
82             break;
83
84          case WM_ENDTASK:
85             LPTASKPACKET ptp;
86             if ((ptp = (LPTASKPACKET)lp) != NULL)
87                {
88                if (ptp->idTask == taskSET_SETQUOTA_INIT)
89                   Filesets_SetQuota_OnEndTask_InitDialog (hDlg, ptp, lpp);
90                FreeTaskPacket (ptp);
91                }
92             break;
93
94          case WM_COMMAND:
95             switch (LOWORD(wp))
96                {
97                case IDOK:
98                case IDCANCEL:
99                   EndDialog (hDlg, LOWORD(wp));
100                   break;
101
102                case IDC_SET_QUOTA:
103                   if (HIWORD(wp) == SPN_UPDATE)
104                      {
105                      lpp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA));
106                      if (gr.cbQuotaUnits == cb1MB)
107                         lpp->ckQuota *= ck1MB;
108                      }
109                   break;
110
111                case IDC_SET_QUOTA_UNITS:
112                   if (HIWORD(wp) == CBN_SELCHANGE)
113                      {
114                      lpp->ckQuota = SP_GetPos (GetDlgItem (hDlg, IDC_SET_QUOTA));
115                      if (gr.cbQuotaUnits == cb1MB)
116                         lpp->ckQuota *= ck1MB;
117
118                      gr.cbQuotaUnits = (size_t)CB_GetSelectedData (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS));
119                      StartTask (taskSET_SETQUOTA_INIT, hDlg, lpp->lpiFileset);
120                      }
121                   break;
122
123                case IDC_AGG_PROPERTIES:
124                   size_t nAlerts;
125                   nAlerts = Alert_GetCount (lpp->lpiFileset->GetAggregate());
126                   Aggregates_ShowProperties (lpp->lpiFileset->GetAggregate(), nAlerts, TRUE, hDlg);
127                   break;
128                }
129             break;
130
131          case WM_DESTROY:
132             lpp = NULL;
133             break;
134          }
135       }
136
137    return FALSE;
138 }
139
140
141 void Filesets_SetQuota_OnInitDialog (HWND hDlg, LPIDENT lpi)
142 {
143    TCHAR szServer[ cchNAME ];
144    TCHAR szAggregate[ cchNAME ];
145    TCHAR szFileset[ cchNAME ];
146    lpi->GetServerName (szServer);
147    lpi->GetAggregateName (szAggregate);
148    lpi->GetFilesetName (szFileset);
149
150    TCHAR szText[ cchRESOURCE ];
151    GetDlgItemText (hDlg, IDC_SET_NAME, szText, cchRESOURCE);
152    LPTSTR pszNew = FormatString (szText, TEXT("%s"), szFileset);
153    SetDlgItemText (hDlg, IDC_SET_NAME, pszNew);
154    FreeString (pszNew);
155
156    GetDlgItemText (hDlg, IDC_SET_AGGREGATE, szText, cchRESOURCE);
157    pszNew = FormatString (szText, TEXT("%s%s"), szServer, szAggregate);
158    SetDlgItemText (hDlg, IDC_SET_AGGREGATE, pszNew);
159    FreeString (pszNew);
160
161    EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), FALSE);
162
163    CB_StartChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), TRUE);
164    CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_KB, (LPARAM)cb1KB);
165    CB_AddItem (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), IDS_QUOTAUNITS_MB, (LPARAM)cb1MB);
166    CB_EndChange (GetDlgItem (hDlg, IDC_SET_QUOTA_UNITS), (LPARAM)gr.cbQuotaUnits);
167 }
168
169
170 void Filesets_SetQuota_OnEndTask_InitDialog (HWND hDlg, LPTASKPACKET ptp, LPSET_SETQUOTA_APPLY_PARAMS lpp)
171 {
172    if (!ptp->rc)
173       {
174       TCHAR szSvrName[ cchNAME ];
175       TCHAR szAggName[ cchNAME ];
176       TCHAR szSetName[ cchNAME ];
177       lpp->lpiFileset->GetServerName (szSvrName);
178       lpp->lpiFileset->GetAggregateName (szAggName);
179       lpp->lpiFileset->GetFilesetName (szSetName);
180       ErrorDialog (ptp->status, IDS_ERROR_REFRESH_FILESET_STATUS, TEXT("%s%s%s"), szSvrName, szAggName, szSetName);
181       EndDialog (hDlg, IDCANCEL);
182       }
183    else
184       {
185       BOOL fBeenHereBefore = fHasSpinner (GetDlgItem (hDlg, IDC_SET_QUOTA));
186
187       size_t cMin = TASKDATA(ptp)->ckMin;
188       size_t cMax = TASKDATA(ptp)->ckMax;
189       size_t cNow = (fBeenHereBefore) ? lpp->ckQuota : TASKDATA(ptp)->fs.ckQuota;
190
191       if (gr.cbQuotaUnits == cb1MB)
192          {
193          cMin /= ck1MB;
194          cMax /= ck1MB;
195          cNow /= ck1MB;
196          }
197
198       EnableWindow (GetDlgItem (hDlg, IDC_SET_QUOTA), TRUE);
199
200       if (!fBeenHereBefore)
201          CreateSpinner (GetDlgItem (hDlg, IDC_SET_QUOTA), 10, FALSE, cMin, cNow, cMax);
202       else
203          {
204          SP_SetRange (GetDlgItem (hDlg, IDC_SET_QUOTA), cMin, cMax);
205          SP_SetPos (GetDlgItem (hDlg, IDC_SET_QUOTA), cNow);
206          }
207       Filesets_DisplayQuota (hDlg, &TASKDATA(ptp)->fs);
208       }
209 }
210
211
212 void Filesets_DisplayQuota (HWND hDlg, LPFILESETSTATUS lpfs)
213 {
214    double dUsed  = 1024.0 * lpfs->ckUsed;
215    double dTotal = 1024.0 * lpfs->ckQuota;
216    DWORD dwPer = 100;
217    if (lpfs->ckQuota != 0)
218       {
219       dwPer = (DWORD)( 100.0 * lpfs->ckUsed / lpfs->ckQuota );
220       dwPer = limit( 0, dwPer, 100 );
221       }
222
223    LPTSTR pszUsage = FormatString (IDS_USAGE_FILESET, TEXT("%.1B%.1B%lu"), dUsed, dTotal, dwPer);
224    SetDlgItemText (hDlg, IDC_SET_USAGE, pszUsage);
225    FreeString (pszUsage);
226
227    SendDlgItemMessage (hDlg, IDC_SET_USAGEBAR, PBM_SETRANGE, 0, MAKELPARAM(0,100));
228    SendDlgItemMessage (hDlg, IDC_SET_USAGEBAR, PBM_SETPOS, (WPARAM)dwPer, 0);
229 }
230