8249da39882e76e31aabdc5e0830954ae6e2d327
[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       SetWindowLong (hDlg, DWL_USER, ((LPPROPSHEETPAGE)lp)->lParam);
47
48    LPIDENT lpi = (LPIDENT)GetWindowLong (hDlg, DWL_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 (BOOL)CreateSolidBrush (GetSysColor (COLOR_WINDOW));
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
214          SetDlgItemText (hDlg, IDC_PROBLEM_TEXT, szText);
215          break;
216
217       case 1:
218          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_HIDE);
219          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_HIDE);
220          Problems_OnRedraw (hDlg, lpi);
221          break;
222
223       default: // two or more
224          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SW_SHOW);
225          ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), SW_SHOW);
226
227          SCROLLINFO si;
228          si.cbSize = sizeof(si);
229          si.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
230          si.nMin = 0;
231          si.nMax = nAlerts-1;
232          si.nPage = 1;
233          si.nPos = 0;
234          si.nTrackPos = 0;
235
236          SetScrollInfo (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL, &si, TRUE);
237          Problems_OnRedraw (hDlg, lpi);
238          break;
239       }
240 }
241
242
243 void Problems_OnRedraw (HWND hDlg, LPIDENT lpi)
244 {
245    int iAlert = 0;
246
247    if (IsWindowVisible (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL)))
248       {
249       iAlert = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL);
250       }
251
252    TCHAR szText[ cchRESOURCE ];
253    wsprintf (szText, TEXT("%lu:"), 1+iAlert);
254    SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_HEADER), szText);
255
256    LPTSTR pszText1 = Alert_GetDescription (lpi, iAlert, TRUE);
257    LPTSTR pszText2 = Alert_GetRemedy (lpi, iAlert);
258    LPTSTR pszText3 = Alert_GetButton (lpi, iAlert);
259
260    LPTSTR pszProblem = FormatString (TEXT("%1\n\n%2"), TEXT("%s%s"),
261                                  (pszText1) ? pszText1 : TEXT(""),
262                                  (pszText2) ? pszText2 : TEXT(""));
263    SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_TEXT), pszProblem);
264    FreeString (pszProblem);
265
266    if (pszText3 == NULL)
267       ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_HIDE);
268    else
269       {
270       SetWindowText (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), pszText3);
271       ShowWindow (GetDlgItem (hDlg, IDC_PROBLEM_REMEDY), SW_SHOW);
272       }
273
274    FreeString (pszText3);
275    FreeString (pszText2);
276    FreeString (pszText1);
277 }
278
279
280 void Problems_OnRemedy (HWND hDlg, LPIDENT lpi)
281 {
282    int iAlert = GetScrollPos (GetDlgItem (hDlg, IDC_PROBLEM_SCROLL), SB_CTL);
283
284    LPIDENT lpiTarget = Alert_GetIdent (lpi, iAlert);
285    ALERT alert = Alert_GetAlert (lpi, iAlert);
286
287    switch (alert)
288       {
289       case alertTIMEOUT:
290          if (lpiTarget && lpiTarget->fIsCell())
291             {
292             StartTask (taskREFRESH, NULL, lpiTarget);
293             }
294          else if (lpiTarget)
295             {
296             StartTask (taskREFRESH, NULL, lpiTarget->GetServer());
297             }
298          break;
299
300       case alertFULL:
301          if (lpiTarget && lpiTarget->fIsFileset())
302             {
303             size_t nAlerts = Alert_GetCount (lpiTarget);
304             Filesets_ShowProperties (lpiTarget, nAlerts, TRUE);
305             }
306          else if (lpiTarget && lpiTarget->fIsAggregate())
307             {
308             size_t nAlerts = Alert_GetCount (lpiTarget);
309             Aggregates_ShowProperties (lpiTarget, nAlerts, TRUE);
310             }
311          break;
312
313       case alertNO_VLDBENT:
314          // No button in this case
315          break;
316
317       case alertNO_SVRENT:
318          // No button in this case
319          break;
320
321       case alertSTOPPED:
322          Services_ShowServiceLog (lpiTarget);
323          break;
324
325       case alertBADCREDS:
326          NewCredsDialog();
327          break;
328
329       case alertOVERALLOC:
330          // No button in this case
331          break;
332
333       case alertSTATE_NO_VNODE:
334       case alertSTATE_NO_SERVICE:
335       case alertSTATE_OFFLINE:
336          // No button in these cases
337          break;
338       }
339 }
340
341
342 /*
343  * ParseFilesetName
344  *
345  */
346
347 void ParseFilesetName (LPIDENT lpiSearch, LPTSTR pszBase, LPTSTR pszEnding)
348 {
349    TCHAR szFileset[ cchNAME ];
350    lpiSearch->GetFilesetName (szFileset);
351
352    LPTSTR pszDot;
353    if ((pszDot = (LPTSTR)lstrrchr (szFileset, TEXT('.'))) != NULL)
354       {
355       if ( lstrcmpi (pszDot, cszENDING_CLONE) &&
356            lstrcmpi (pszDot, cszENDING_REPLICA) )
357          {
358          pszDot = NULL;
359          }
360       }
361
362    if (pszDot == NULL)
363       {
364       lstrcpy (pszBase, szFileset);
365       *pszEnding = NULL;
366       }
367    else // (pszDot != NULL)
368       {
369       lstrcpy (pszBase, szFileset);
370       lstrcpy (pszEnding, pszDot);
371       pszBase[ pszEnding - szFileset ] = TEXT('\0');
372       }
373 }
374