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