Initial IBM OpenAFS 1.0 tree
[openafs.git] / src / WINNT / afssvrmgr / problems.cpp
1 extern "C" {
2 #include <afs/param.h>
3 #include <afs/stds.h>
4 }
5
6 #include "svrmgr.h"
7 #include "problems.h"
8 #include "alert.h"
9 #include "svc_viewlog.h"
10 #include "set_prop.h"
11 #include "agg_prop.h"
12 #include "creds.h"
13
14
15 /*
16  * PROTOTYPES _________________________________________________________________
17  *
18  */
19
20 void Problems_OnInitDialog (HWND hDlg, LPIDENT lpi);
21 void Problems_OnRefresh (HWND hDlg, LPIDENT lpi);
22 void Problems_OnRedraw (HWND hDlg, LPIDENT lpi);
23 void Problems_OnRemedy (HWND hDlg, LPIDENT lpi);
24
25
26 /*
27  * ROUTINES ___________________________________________________________________
28  *
29  */
30
31 BOOL CALLBACK Problems_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
32 {
33    if (AfsAppLib_HandleHelp (IDD_SVR_PROBLEMS, hDlg, msg, wp, lp))
34       return TRUE;
35
36    if (msg == WM_INITDIALOG)
37       SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam);
38
39    LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_USER);
40
41    switch (msg)
42       {
43       case WM_INITDIALOG:
44          NotifyMe (WHEN_OBJECT_CHANGES, lpi, hDlg, 0);
45          Problems_OnInitDialog (hDlg, lpi);
46          Problems_OnRefresh (hDlg, lpi);
47          break;
48
49       case WM_NOTIFY_FROM_DISPATCH:
50          Problems_OnRefresh (hDlg, lpi);
51          Delete ((LPNOTIFYSTRUCT)lp);
52          break;
53
54       case WM_DESTROY:
55          DontNotifyMeEver (hDlg);
56          break;
57
58       case WM_COMMAND:
59          switch (LOWORD(wp))
60             {
61             case IDC_PROBLEM_REMEDY:
62                Problems_OnRemedy (hDlg, lpi);
63                break;
64             }
65          break;
66
67       case WM_CTLCOLORSTATIC:
68          if ((HWND)lp == GetDlgItem (hDlg, IDC_PROBLEM_TEXT))
69             {
70             SetBkColor ((HDC)wp, GetSysColor (COLOR_WINDOW));
71             return (BOOL)CreateSolidBrush (GetSysColor (COLOR_WINDOW));
72             }
73          break;
74
75       case WM_VSCROLL:
76          int posOld;
77          int posNew;
78          posOld = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL);
79          posNew = posOld;
80
81          switch (LOWORD(wp))
82             {
83             case SB_LINEUP:
84                --posNew;
85                break;
86             case SB_LINEDOWN:
87                ++posNew;
88                break;
89             case SB_PAGEUP:
90                --posNew;
91                break;
92             case SB_PAGEDOWN:
93                ++posNew;
94                break;
95             case SB_THUMBTRACK:
96                posNew = HIWORD(wp);
97                break;
98             case SB_TOP:
99                posNew = 0;
100                break;
101             case SB_BOTTOM:
102                posNew = nAlertsMAX;
103                break;
104             }
105
106          SCROLLINFO si;
107          memset (&si, 0x00, sizeof(si));
108          si.cbSize = sizeof(si);
109          si.fMask = SIF_RANGE;
110          GetScrollInfo (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL, &si);
111          posNew = limit (0, posNew, si.nMax);
112
113          if (posNew != posOld)
114             {
115             SetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL, posNew, (LOWORD(wp) == SB_THUMBTRACK) ? FALSE : TRUE);
116             Problems_OnRedraw (hDlg, lpi);
117             }
118          break;
119       }
120
121    return FALSE;
122 }
123
124
125 void Problems_OnInitDialog (HWND hDlg, LPIDENT lpi)
126 {
127    TCHAR szText[ cchRESOURCE ];
128    GetDlgItemText (hDlg, IDC_PROBLEM_TITLE, szText, cchRESOURCE);
129
130    LPTSTR pszTitle = NULL;
131
132    if (lpi->fIsServer())
133       {
134       TCHAR szServer[ cchNAME ];
135       lpi->GetServerName (szServer);
136       pszTitle = FormatString (szText, TEXT("%s"), szServer);
137       }
138    else if (lpi->fIsService())
139       {
140       TCHAR szServer[ cchNAME ];
141       TCHAR szService[ cchNAME ];
142       lpi->GetServerName (szServer);
143       lpi->GetServiceName (szService);
144       pszTitle = FormatString (szText, TEXT("%s%s"), szServer, szService);
145       }
146    else if (lpi->fIsAggregate())
147       {
148       TCHAR szServer[ cchNAME ];
149       TCHAR szAggregate[ cchNAME ];
150       lpi->GetServerName (szServer);
151       lpi->GetAggregateName (szAggregate);
152       pszTitle = FormatString (szText, TEXT("%s%s"), szServer, szAggregate);
153       }
154    else if (lpi->fIsFileset())
155       {
156       TCHAR szServer[ cchNAME ];
157       TCHAR szAggregate[ cchNAME ];
158       TCHAR szFileset[ cchNAME ];
159       lpi->GetServerName (szServer);
160       lpi->GetAggregateName (szAggregate);
161       lpi->GetFilesetName (szFileset);
162       pszTitle = FormatString (szText, TEXT("%s%s%s"), szServer, szAggregate, szFileset);
163       }
164
165    if (pszTitle == NULL)
166       SetDlgItemText (hDlg, IDC_PROBLEM_TITLE, TEXT(""));
167    else
168       {
169       SetDlgItemText (hDlg, IDC_PROBLEM_TITLE, pszTitle);
170       FreeString (pszTitle);
171       }
172
173    ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_HIDE);
174    ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_HIDE);
175    ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_HIDE);
176    SetDlgItemText (hDlg, IDC_PROBLEM_TEXT, TEXT(""));
177 }
178
179
180 void Problems_OnRefresh (HWND hDlg, LPIDENT lpi)
181 {
182    size_t nAlerts = Alert_GetCount (lpi);
183
184    LPTSTR pszText = FormatString (IDS_PROBLEM_BOX, TEXT("%lu"), nAlerts);
185    SetDlgItemText (hDlg, IDC_PROBLEM_BOX, pszText);
186    FreeString (pszText);
187
188    switch (nAlerts)
189       {
190       case 0:
191          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_HIDE);
192          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_HIDE);
193          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_HIDE);
194
195          TCHAR szText[ cchRESOURCE ];
196          if (lpi->fIsServer())
197             GetString (szText, IDS_SERVER_NO_PROBLEMS);
198          else if (lpi->fIsService())
199             GetString (szText, IDS_SERVICE_NO_PROBLEMS);
200          else if (lpi->fIsAggregate())
201             GetString (szText, IDS_AGGREGATE_NO_PROBLEMS);
202          else if (lpi->fIsFileset())
203             GetString (szText, IDS_FILESET_NO_PROBLEMS);
204
205          SetDlgItemText (hDlg, IDC_PROBLEM_TEXT, szText);
206          break;
207
208       case 1:
209          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_HIDE);
210          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_HIDE);
211          Problems_OnRedraw (hDlg, lpi);
212          break;
213
214       default: // two or more
215          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_SHOW);
216          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_SHOW);
217
218          SCROLLINFO si;
219          si.cbSize = sizeof(si);
220          si.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
221          si.nMin = 0;
222          si.nMax = nAlerts-1;
223          si.nPage = 1;
224          si.nPos = 0;
225          si.nTrackPos = 0;
226
227          SetScrollInfo (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL, &si, TRUE);
228          Problems_OnRedraw (hDlg, lpi);
229          break;
230       }
231 }
232
233
234 void Problems_OnRedraw (HWND hDlg, LPIDENT lpi)
235 {
236    int iAlert = 0;
237
238    if (IsWindowVisible (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL)))
239       {
240       iAlert = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL);
241       }
242
243    TCHAR szText[ cchRESOURCE ];
244    wsprintf (szText, TEXT("%lu:"), 1+iAlert);
245    SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), szText);
246
247    LPTSTR pszText1 = Alert_GetDescription (lpi, iAlert, TRUE);
248    LPTSTR pszText2 = Alert_GetRemedy (lpi, iAlert);
249    LPTSTR pszText3 = Alert_GetButton (lpi, iAlert);
250
251    LPTSTR pszProblem = FormatString (TEXT("%1\n\n%2"), TEXT("%s%s"),
252                                  (pszText1) ? pszText1 : TEXT(""),
253                                  (pszText2) ? pszText2 : TEXT(""));
254    SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_TEXT), pszProblem);
255    FreeString (pszProblem);
256
257    if (pszText3 == NULL)
258       ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_HIDE);
259    else
260       {
261       SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), pszText3);
262       ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_SHOW);
263       }
264
265    FreeString (pszText3);
266    FreeString (pszText2);
267    FreeString (pszText1);
268 }
269
270
271 void Problems_OnRemedy (HWND hDlg, LPIDENT lpi)
272 {
273    int iAlert = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL);
274
275    LPIDENT lpiTarget = Alert_GetIdent (lpi, iAlert);
276    ALERT alert = Alert_GetAlert (lpi, iAlert);
277
278    switch (alert)
279       {
280       case alertTIMEOUT:
281          if (lpiTarget && lpiTarget->fIsCell())
282             {
283             StartTask (taskREFRESH, NULL, lpiTarget);
284             }
285          else if (lpiTarget)
286             {
287             StartTask (taskREFRESH, NULL, lpiTarget->GetServer());
288             }
289          break;
290
291       case alertFULL:
292          if (lpiTarget && lpiTarget->fIsFileset())
293             {
294             size_t nAlerts = Alert_GetCount (lpiTarget);
295             Filesets_ShowProperties (lpiTarget, nAlerts, TRUE);
296             }
297          else if (lpiTarget && lpiTarget->fIsAggregate())
298             {
299             size_t nAlerts = Alert_GetCount (lpiTarget);
300             Aggregates_ShowProperties (lpiTarget, nAlerts, TRUE);
301             }
302          break;
303
304       case alertNO_VLDBENT:
305          // No button in this case
306          break;
307
308       case alertNO_SVRENT:
309          // No button in this case
310          break;
311
312       case alertSTOPPED:
313          Services_ShowServiceLog (lpiTarget);
314          break;
315
316       case alertBADCREDS:
317          NewCredsDialog();
318          break;
319
320       case alertOVERALLOC:
321          // No button in this case
322          break;
323
324       case alertSTATE_NO_VNODE:
325       case alertSTATE_NO_SERVICE:
326       case alertSTATE_OFFLINE:
327          // No button in these cases
328          break;
329       }
330 }
331
332
333 /*
334  * ParseFilesetName
335  *
336  */
337
338 void ParseFilesetName (LPIDENT lpiSearch, LPTSTR pszBase, LPTSTR pszEnding)
339 {
340    TCHAR szFileset[ cchNAME ];
341    lpiSearch->GetFilesetName (szFileset);
342
343    LPTSTR pszDot;
344    if ((pszDot = (LPTSTR)lstrrchr (szFileset, TEXT('.'))) != NULL)
345       {
346       if ( lstrcmpi (pszDot, cszENDING_CLONE) &&
347            lstrcmpi (pszDot, cszENDING_REPLICA) )
348          {
349          pszDot = NULL;
350          }
351       }
352
353    if (pszDot == NULL)
354       {
355       lstrcpy (pszBase, szFileset);
356       *pszEnding = NULL;
357       }
358    else // (pszDot != NULL)
359       {
360       lstrcpy (pszBase, szFileset);
361       lstrcpy (pszEnding, pszDot);
362       pszBase[ pszEnding - szFileset ] = TEXT('\0');
363       }
364 }
365