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