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