rx: Remove RX_CALL_BUSY
[openafs.git] / src / WINNT / afssvrmgr / helpfunc.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 <afsconfig.h>
15 #include <afs/param.h>
16 #include <roken.h>
17 }
18
19 #include "svrmgr.h"
20 #include "helpfunc.h"
21 #include <stdlib.h>
22
23 #ifndef iswhite
24 #define iswhite(_ch) ( ((_ch) == TEXT(' ')) || ((_ch) == TEXT('\t')) )
25 #endif
26
27
28 /*
29  * VARIABLES ________________________________________________________________
30  *
31  */
32
33 typedef enum {
34    uuUNSPECIFIED,
35    uuVOS,       // VOS commands
36    uuBOS,       // BOS commands
37    uuKAS,       // KAS commands
38    uuFS // FS commands
39 } UNIXUTIL;
40
41 // One entry per help context
42 static struct {
43    UNIXUTIL uu;
44    int ids;
45    int hid;
46 } aCOMMANDS[] = {
47    { uuVOS, IDS_COMMAND_VOS_ADDSITE,         IDH_SVRMGR_COMMAND_VOS_ADDSITE },
48    { uuVOS, IDS_COMMAND_VOS_BACKUP,          IDH_SVRMGR_COMMAND_VOS_BACKUP },
49    { uuVOS, IDS_COMMAND_VOS_BACKUPSYS,       IDH_SVRMGR_COMMAND_VOS_BACKUPSYS },
50    { uuVOS, IDS_COMMAND_VOS_CREATE,          IDH_SVRMGR_COMMAND_VOS_CREATE },
51    { uuVOS, IDS_COMMAND_VOS_DELENTRY,        IDH_SVRMGR_COMMAND_VOS_DELENTRY },
52    { uuVOS, IDS_COMMAND_VOS_DUMP,            IDH_SVRMGR_COMMAND_VOS_DUMP },
53    { uuVOS, IDS_COMMAND_VOS_EXAMINE,         IDH_SVRMGR_COMMAND_VOS_EXAMINE },
54    { uuVOS, IDS_COMMAND_VOS_LISTPART,        IDH_SVRMGR_COMMAND_VOS_LISTPART },
55    { uuVOS, IDS_COMMAND_VOS_LISTVLDB,        IDH_SVRMGR_COMMAND_VOS_LISTVLDB },
56    { uuVOS, IDS_COMMAND_VOS_LISTVOL,         IDH_SVRMGR_COMMAND_VOS_LISTVOL },
57    { uuVOS, IDS_COMMAND_VOS_LOCK,            IDH_SVRMGR_COMMAND_VOS_LOCK },
58    { uuVOS, IDS_COMMAND_VOS_MOVE,            IDH_SVRMGR_COMMAND_VOS_MOVE },
59    { uuVOS, IDS_COMMAND_VOS_PARTINFO,        IDH_SVRMGR_COMMAND_VOS_PARTINFO },
60    { uuVOS, IDS_COMMAND_VOS_RELEASE,         IDH_SVRMGR_COMMAND_VOS_RELEASE },
61    { uuVOS, IDS_COMMAND_VOS_REMOVE,          IDH_SVRMGR_COMMAND_VOS_REMOVE },
62    { uuVOS, IDS_COMMAND_VOS_REMSITE,         IDH_SVRMGR_COMMAND_VOS_REMSITE },
63    { uuVOS, IDS_COMMAND_VOS_RENAME,          IDH_SVRMGR_COMMAND_VOS_RENAME },
64    { uuVOS, IDS_COMMAND_VOS_RESTORE,         IDH_SVRMGR_COMMAND_VOS_RESTORE },
65    { uuVOS, IDS_COMMAND_VOS_SYNCVLDB,        IDH_SVRMGR_COMMAND_VOS_SYNCVLDB },
66    { uuVOS, IDS_COMMAND_VOS_UNLOCK,          IDH_SVRMGR_COMMAND_VOS_UNLOCK },
67    { uuVOS, IDS_COMMAND_VOS_UNLOCKVLDB,      IDH_SVRMGR_COMMAND_VOS_UNLOCKVLDB },
68    { uuVOS, IDS_COMMAND_VOS_ZAP,             IDH_SVRMGR_COMMAND_VOS_ZAP },
69    { uuBOS, IDS_COMMAND_BOS_ADDHOST,         IDH_SVRMGR_COMMAND_BOS_ADDHOST },
70    { uuBOS, IDS_COMMAND_BOS_ADDKEY,          IDH_SVRMGR_COMMAND_BOS_ADDKEY },
71    { uuBOS, IDS_COMMAND_BOS_ADDUSER,         IDH_SVRMGR_COMMAND_BOS_ADDUSER },
72    { uuBOS, IDS_COMMAND_BOS_CREATE,          IDH_SVRMGR_COMMAND_BOS_CREATE },
73    { uuBOS, IDS_COMMAND_BOS_DELETE,          IDH_SVRMGR_COMMAND_BOS_DELETE },
74    { uuBOS, IDS_COMMAND_BOS_EXEC,            IDH_SVRMGR_COMMAND_BOS_EXEC },
75    { uuBOS, IDS_COMMAND_BOS_GETDATE,         IDH_SVRMGR_COMMAND_BOS_GETDATE },
76    { uuBOS, IDS_COMMAND_BOS_GETLOG,          IDH_SVRMGR_COMMAND_BOS_GETLOG },
77    { uuBOS, IDS_COMMAND_BOS_GETRESTART,      IDH_SVRMGR_COMMAND_BOS_GETRESTART },
78    { uuBOS, IDS_COMMAND_BOS_INSTALL,         IDH_SVRMGR_COMMAND_BOS_INSTALL },
79    { uuBOS, IDS_COMMAND_BOS_LISTHOSTS,       IDH_SVRMGR_COMMAND_BOS_LISTHOSTS },
80    { uuBOS, IDS_COMMAND_BOS_LISTKEYS,        IDH_SVRMGR_COMMAND_BOS_LISTKEYS },
81    { uuBOS, IDS_COMMAND_BOS_LISTUSERS,       IDH_SVRMGR_COMMAND_BOS_LISTUSERS },
82    { uuBOS, IDS_COMMAND_BOS_PRUNE,           IDH_SVRMGR_COMMAND_BOS_PRUNE },
83    { uuBOS, IDS_COMMAND_BOS_REMOVEHOST,      IDH_SVRMGR_COMMAND_BOS_REMOVEHOST },
84    { uuBOS, IDS_COMMAND_BOS_REMOVEKEY,       IDH_SVRMGR_COMMAND_BOS_REMOVEKEY },
85    { uuBOS, IDS_COMMAND_BOS_REMOVEUSER,      IDH_SVRMGR_COMMAND_BOS_REMOVEUSER },
86    { uuBOS, IDS_COMMAND_BOS_RESTART,         IDH_SVRMGR_COMMAND_BOS_RESTART },
87    { uuBOS, IDS_COMMAND_BOS_SALVAGE,         IDH_SVRMGR_COMMAND_BOS_SALVAGE },
88    { uuBOS, IDS_COMMAND_BOS_SETAUTH,         IDH_SVRMGR_COMMAND_BOS_SETAUTH },
89    { uuBOS, IDS_COMMAND_BOS_SETRESTART,      IDH_SVRMGR_COMMAND_BOS_SETRESTART },
90    { uuBOS, IDS_COMMAND_BOS_SHUTDOWN,        IDH_SVRMGR_COMMAND_BOS_SHUTDOWN },
91    { uuBOS, IDS_COMMAND_BOS_START,           IDH_SVRMGR_COMMAND_BOS_START },
92    { uuBOS, IDS_COMMAND_BOS_STARTUP,         IDH_SVRMGR_COMMAND_BOS_STARTUP },
93    { uuBOS, IDS_COMMAND_BOS_STATUS,          IDH_SVRMGR_COMMAND_BOS_STATUS },
94    { uuBOS, IDS_COMMAND_BOS_STOP,            IDH_SVRMGR_COMMAND_BOS_STOP },
95    { uuBOS, IDS_COMMAND_BOS_UNINSTALL,       IDH_SVRMGR_COMMAND_BOS_UNINSTALL },
96    { uuKAS, IDS_COMMAND_KAS_GETRANDOMKEY,    IDH_SVRMGR_COMMAND_KAS_GETRANDOMKEY },
97    { uuFS,  IDS_COMMAND_FS_LISTQUOTA,        IDH_SVRMGR_COMMAND_FS_LISTQUOTA },
98    { uuFS,  IDS_COMMAND_FS_QUOTA,            IDH_SVRMGR_COMMAND_FS_QUOTA },
99    { uuFS,  IDS_COMMAND_FS_SETQUOTA,         IDH_SVRMGR_COMMAND_FS_SETQUOTA },
100 };
101
102 // Precalculated hashing values for faster searching through help topics
103 static DWORD aSEARCHVALUES[] = {
104    0x16765627, 0x02D416E6, 0x27675627, 0x35023556,
105    0x36021464, 0xE6371627, 0x02452716, 0x00458656,
106    0x16E6B300, 0x27E69676, 0x4602A456, 0x36861627,
107    0x97022596, 0x56E60226, 0x27964747, 0x97E20075,
108    0xD4F67727, 0x24F62602, 0x02269702, 0x27965637,
109    0x96262716, 0x675602C6, 0x27164796, 0xE6963747,
110    0x1446D696, 0x97000000, 0x96C69647, 0x37025747,
111    0x02478696, 0x0266F627, 0x66163656, 0xE6475627,
112    0x56270296, 0x56025737, 0xA3004586, 0x7796E676,
113    0xF6C6C6F6, 0x86560266, 0x26970247, 0x77564602,
114    0x56679656, 0xE6460227, 0x56460216, 0x379676E6,
115    0x37024656, 0x00007716, 0x74271697, 0x16E65602,
116    0xE65602A4, 0x560014E6, 0xB4565666, 0xE602F472,
117    0x24279616, 0x3716C600, 0x86D65627, 0xE6023536,
118    0x24279716, 0x4756B600, 0x02A416E6, 0x9616E656,
119    0x56C60044, 0x02642756, 0xB6005446, 0x26573756,
120    0x374702F4, 0x5427E656, 0xC696E600, 0x02645627,
121    0x96369616, 0x006456C6, 0xD4573796, 0x27567602,
122    0x27460074, 0x96368616, 0x47860225, 0x27564696,
123    0x2700D456, 0x34F6D656, 0x1656C602, 0xD4963686,
124    0x77169700, 0xC4162716, 0x5696C602, 0x16E600E4,
125    0x27E69676, 0x4602A456, 0x36861627, 0x27002596,
126    0xC6B6E656, 0x02641657, 0x0025F6E6, 0x56765627,
127    0xE6024527, 0x3716C697, 0x160025F6, 0xB4F647C6,
128    0x67163702, 0x2796E696, 0xE6960035, 0x24969716,
129    0x2716D602, 0x006596B6, 0x00000000
130 };
131
132 #define nCOMMANDS (sizeof(aCOMMANDS)/sizeof(aCOMMANDS[0]))
133 #define nSEARCHVALUES (sizeof(aSEARCHVALUES)/sizeof(aSEARCHVALUES[0]))
134
135
136 /*
137  * ROUTINES _________________________________________________________________
138  *
139  */
140
141 LPCTSTR lstrstr (LPCTSTR pszBuffer, LPCTSTR pszFind)
142 {
143    if (!pszBuffer || !pszFind || !*pszFind)
144       return pszBuffer;
145
146    for ( ; *pszBuffer; ++pszBuffer)
147       {
148       if (*pszBuffer == *pszFind)
149          {
150          if (!lstrncmpi (pszBuffer, pszFind, lstrlen(pszFind)))
151             return pszBuffer;
152          }
153       }
154
155    return NULL;
156 }
157
158
159 /*
160  * FIND COMMAND _____________________________________________________________
161  *
162  */
163
164 BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
165 void Help_FindCommand_OnInitDialog (HWND hDlg);
166 BOOL Help_FindCommand_OnOK (HWND hDlg);
167
168
169 void Help_FindCommand (void)
170 {
171    ModalDialog (IDD_HELP_FIND, g.hMain, (DLGPROC)Help_FindCommand_DlgProc);
172 }
173
174
175 BOOL CALLBACK Help_FindCommand_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
176 {
177    switch (msg)
178       {
179       case WM_INITDIALOG:
180          Help_FindCommand_OnInitDialog (hDlg);
181          break;
182
183       case WM_COMMAND:
184          switch (LOWORD(wp))
185             {
186             case IDOK:
187                if (Help_FindCommand_OnOK (hDlg))
188                   EndDialog (hDlg, LOWORD(wp));
189                break;
190
191             case IDCANCEL:
192                EndDialog (hDlg, LOWORD(wp));
193                break;
194             }
195          break;
196       }
197
198    return FALSE;
199 }
200
201
202 void Help_FindCommand_OnInitDialog (HWND hDlg)
203 {
204    HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND);
205    CB_StartChange (hCombo, TRUE);
206
207    for (size_t ii = 0; ii < nCOMMANDS; ++ii)
208       {
209       CB_AddItem (hCombo, aCOMMANDS[ii].ids, 0);
210       }
211
212    CB_EndChange (hCombo, -1);
213 }
214
215
216 LPTSTR Help_FindCommand_Search (UNIXUTIL *puu, LPTSTR pszKeyword)
217 {
218    // search for a usable keyword--skip "vos" or "bos" (etc).
219    //
220    while (*pszKeyword)
221       {
222       // strip any initial whitespace
223       while (iswhite(*pszKeyword))
224          ++pszKeyword;
225
226       // find the end of this word
227       LPTSTR pszNext;
228       for (pszNext = pszKeyword; *pszNext && !iswhite(*pszNext); )
229          ++pszNext;
230       if (!*pszNext)  // last word?  Gotta use it.
231          break;
232       *pszNext = TEXT('\0');
233
234       BOOL fSkip = FALSE;
235       if (!lstrcmpi (pszKeyword, TEXT("vos")))
236          {
237          fSkip = TRUE;
238          *puu = uuVOS;
239          }
240       if (!lstrcmpi (pszKeyword, TEXT("bos")))
241          {
242          fSkip = TRUE;
243          *puu = uuBOS;
244          }
245       if (!lstrcmpi (pszKeyword, TEXT("kas")))
246          {
247          fSkip = TRUE;
248          *puu = uuKAS;
249          }
250       if (!lstrcmpi (pszKeyword, TEXT("fs")))
251          {
252          fSkip = TRUE;
253          *puu = uuFS;
254          }
255
256       if (fSkip)
257          pszKeyword = 1+pszNext;
258       else
259          break;
260       }
261
262    return pszKeyword;
263 }
264
265
266 DWORD NextSearch (int &ii)
267 {
268    ii = ((ii>>2) == nSEARCHVALUES) ? 1 : ii+1;
269    return ( (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))>>4)&15) |
270             (DWORD)(((aSEARCHVALUES[(ii-1)>>2]>>(((ii-1)%4)<<3))<<4)&240) );
271 }
272
273
274 BOOL Help_FindCommand_OnOK (HWND hDlg)
275 {
276    HWND hCombo = GetDlgItem (hDlg, IDC_FIND_COMMAND);
277    int iiDisplay = -1;
278
279    UNIXUTIL uu = uuUNSPECIFIED;
280    TCHAR szText[ cchRESOURCE ];
281    GetWindowText (hCombo, szText, cchRESOURCE);
282
283    if (!szText[0])
284       {
285       Message (MB_ICONASTERISK | MB_OK, IDS_FIND_NOTHING_TITLE, IDS_FIND_NOTHING_DESC);
286       return FALSE;
287       }
288
289    LPTSTR pszKeyword = Help_FindCommand_Search (&uu, szText);
290
291    for (int ii = 0; (iiDisplay == -1) && ii < nCOMMANDS; ++ii)
292       {
293       TCHAR szCommand[ cchRESOURCE ];
294       GetString (szCommand, aCOMMANDS[ ii ].ids);
295
296       if (lstrstr (szCommand, pszKeyword) != NULL)
297          {
298          if ((uu == uuUNSPECIFIED) || (uu == aCOMMANDS[ ii ].uu))
299             iiDisplay = ii;
300          }
301       }
302
303    if (iiDisplay == -1)
304       {
305       Message (MB_ICONASTERISK | MB_OK, IDS_FIND_UNKNOWN_TITLE, IDS_FIND_UNKNOWN_DESC, TEXT("%s"), pszKeyword);
306       return FALSE;
307       }
308
309    WinHelp (g.hMain, cszHELPFILENAME, HELP_CONTEXT, aCOMMANDS[ iiDisplay ].hid);
310    return TRUE;
311 }
312
313
314 /*
315  * FIND ERROR _______________________________________________________________
316  *
317  */
318
319 BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
320 void Help_FindError_OnInitDialog (HWND hDlg);
321 void Help_FindError_OnTranslate (HWND hDlg);
322 void Help_FindError_Shrink (HWND hDlg, BOOL fShrink);
323
324 void Help_FindError (void)
325 {
326    ModalDialog (IDD_HELP_ERROR, g.hMain, (DLGPROC)Help_FindError_DlgProc);
327 }
328
329
330 BOOL CALLBACK Help_FindError_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
331 {
332    switch (msg)
333       {
334       case WM_INITDIALOG:
335          Help_FindError_OnInitDialog (hDlg);
336          break;
337
338       case WM_COMMAND:
339          switch (LOWORD(wp))
340             {
341             case IDC_ERROR_TRANSLATE:
342                Help_FindError_OnTranslate (hDlg);
343                break;
344
345             case IDOK:
346             case IDCANCEL:
347                EndDialog (hDlg, LOWORD(wp));
348                break;
349             }
350          break;
351       }
352
353    return FALSE;
354 }
355
356
357 void Help_FindError_OnInitDialog (HWND hDlg)
358 {
359    Help_FindError_Shrink (hDlg, TRUE);
360
361    SetDlgItemText (hDlg, IDC_ERROR_NUMBER, TEXT(""));
362 }
363
364
365 void Help_FindError_OnTranslate (HWND hDlg)
366 {
367    TCHAR szText[ cchRESOURCE ];
368    GetDlgItemText (hDlg, IDC_ERROR_NUMBER, szText, cchRESOURCE);
369
370    LPSTR pszTextA = StringToAnsi (szText);
371    DWORD dwError = strtoul (pszTextA, NULL, 0);
372    FreeString (pszTextA, szText);
373
374    TCHAR szDesc[ cchRESOURCE ];
375    FormatError (szDesc, TEXT("%s"), dwError);
376
377    // The output string either looks like this (if successful):
378    //    successful completion (0x00000000)
379    // Or like this:
380    //    0x00000000
381    // Since we list the error code elsewhere, remove it from the
382    // former case. In the latter case, empty the string entirely
383    // so we'll know there was no translation.
384    //
385    LPTSTR pszTruncate;
386    if ((pszTruncate = (LPTSTR)lstrrchr (szDesc, TEXT('('))) == NULL)
387       pszTruncate = szDesc;
388    else if ((pszTruncate > szDesc) && (*(pszTruncate-1) == TEXT(' ')))
389       --pszTruncate;
390    *pszTruncate = TEXT('\0');
391
392    LPTSTR pszText;
393    if (szDesc[0] == TEXT('\0'))
394       pszText = FormatString (IDS_ERROR_NOTTRANSLATED, TEXT("%08lX%lu"), dwError, dwError);
395    else
396       pszText = FormatString (IDS_ERROR_TRANSLATED, TEXT("%08lX%lu%s"), dwError, dwError, szDesc);
397    SetDlgItemText (hDlg, IDC_ERROR_DESC, pszText);
398    FreeString (pszText);
399
400    Help_FindError_Shrink (hDlg, FALSE);
401 }
402
403
404 void Help_FindError_Shrink (HWND hDlg, BOOL fShrink)
405 {
406    static BOOL fShrunk = FALSE;
407    static LONG cyShrunk = 0;
408
409    if (fShrink)
410       {
411       fShrunk = TRUE;
412
413       // shrink the window--move the IDCANCEL button up so that its
414       // top edge is where the IDC_ADVANCED_BOX line's top edge is, and
415       // hide IDC_ADVANCED_BOX and IDC_ERROR_DESC.
416       //
417       RECT rAdvanced;
418       GetRectInParent (GetDlgItem (hDlg, IDC_ADVANCED_BOX), &rAdvanced);
419
420       RECT rClose;
421       GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose);
422
423       cyShrunk = rClose.top - rAdvanced.top - 9;
424
425       ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_HIDE);
426
427       SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL,
428                     rClose.left, rClose.top -cyShrunk, 0, 0,
429                     SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
430
431       RECT rDialog;
432       GetWindowRect (hDlg, &rDialog);
433       SetWindowPos (hDlg, NULL,
434                     0, 0, cxRECT(rDialog), cyRECT(rDialog) -cyShrunk,
435                     SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
436       }
437    else if (fShrunk)
438       {
439       fShrunk = FALSE;
440
441       // expand the window--move the IDCANCEL button down, and
442       // show IDC_ADVANCED_BOX and IDC_ERROR_DESC.
443       //
444       RECT rClose;
445       GetRectInParent (GetDlgItem (hDlg, IDCANCEL), &rClose);
446
447       RECT rDialog;
448       GetWindowRect (hDlg, &rDialog);
449       SetWindowPos (hDlg, NULL,
450                     0, 0, cxRECT(rDialog), cyRECT(rDialog) +cyShrunk,
451                     SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
452
453       SetWindowPos (GetDlgItem (hDlg, IDCANCEL), NULL,
454                     rClose.left, rClose.top +cyShrunk, 0, 0,
455                     SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER);
456
457       ShowWindow (GetDlgItem (hDlg, IDC_ERROR_DESC), SW_SHOW);
458       }
459 }
460
461
462 /*
463  * HELP ABOUT _______________________________________________________________
464  *
465  */
466
467
468 BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
469 void Help_About_OnInitDialog (HWND hDlg);
470 void Help_About_OnSysCommand (HWND hDlg, int &cmd);
471 LONG_PTR procAbout;
472
473 void Help_About (void)
474 {
475    ModalDialog (IDD_HELP_ABOUT, g.hMain, (DLGPROC)Help_About_DlgProc);
476 }
477
478
479 BOOL CALLBACK Help_About_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
480 {
481    static int cmd;
482    switch (msg)
483       {
484       case WM_INITDIALOG:
485          cmd = 0;
486          Help_About_OnInitDialog (hDlg);
487          break;
488
489       case WM_COMMAND:
490          switch (LOWORD(wp))
491             {
492             case IDOK:
493             case IDCANCEL:
494                EndDialog (hDlg, LOWORD(wp));
495                break;
496             }
497          break;
498
499       case WM_SYSCOMMAND+1:
500          Help_About_OnSysCommand (hDlg, cmd);
501          break;
502       }
503
504    return FALSE;
505 }
506
507
508 BOOL CALLBACK Help_About_Proc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
509 {
510    if (msg == WM_DESTROY)
511       {
512       KillTimer (GetParent(hDlg), 1000);
513       }
514    else if (msg == WM_DESTROY+0x200)
515       {
516       RECT rr;
517       GetWindowRect(GetDlgItem(GetParent(hDlg),0x051E),&rr);
518       DWORD dw = GetMessagePos();
519       POINT pt = { LOWORD(dw), HIWORD(dw) };
520       if (PtInRect (&rr, pt))
521          {
522          SetDlgItemText (GetParent(hDlg), 0x051F, TEXT("\n\n\n\n\n\n\n"));
523          SetTimer (GetParent(hDlg), 1000, 1000/8, NULL);
524          }
525       }
526    return CallWindowProc ((WNDPROC)procAbout, hDlg, msg, wp, lp)?TRUE:FALSE;
527 }
528
529
530 void Help_About_OnInitDialog (HWND hDlg)
531 {
532    HWND hAbout = GetDlgItem (hDlg, IDOK);
533    procAbout = GetWindowLongPtr (hAbout, GWLP_WNDPROC);
534    SetWindowLongPtr (hAbout, GWLP_WNDPROC, (LONG_PTR)Help_About_Proc);
535
536    LPTSTR pszText = FormatString (IDS_HELPABOUT_DESC1);
537    SetDlgItemText (hDlg, IDC_HELPABOUT_DESC, pszText);
538    FreeString (pszText);
539 }
540
541
542 void Help_About_OnSysCommand (HWND hDlg, int &cmd)
543 {
544    DWORD dw;
545    TCHAR szSys[cchRESOURCE];
546    TCHAR szSys2[cchRESOURCE];
547    GetDlgItemText (hDlg, 0x051F, szSys, cchRESOURCE);
548    if ((dw = NextSearch (cmd)) != 0)
549       {
550       LPTSTR psz;
551       for (psz = &szSys[ lstrlen(szSys)-1 ]; *(psz-1) != TEXT('\n'); --psz);
552       lstrcpy (szSys2, psz);
553       wsprintf (psz, TEXT("%c%s"), (TCHAR)dw, szSys2);
554       SetDlgItemText (hDlg, 0x051F, szSys);
555       }
556    else // (dw == 0)
557       {
558       LPTSTR psz;
559       for (psz = szSys; *psz && (*psz != TEXT('\n')); ++psz);
560       wsprintf (szSys2, TEXT("%s\n"), 1+psz);
561       SetDlgItemText (hDlg, 0x051F, szSys2);
562       }
563 }
564
565
566
567 /*
568  * CONTEXT HELP _____________________________________________________________
569  *
570  */
571
572 static DWORD IDD_SVR_LISTS_HELP[] = {
573    IDC_LIST_LIST,                    IDH_SVRMGR_LIST_LIST,
574    IDC_LIST_ADD,                     IDH_SVRMGR_LIST_ADD,
575    IDC_LIST_REMOVE,                  IDH_SVRMGR_LIST_REMOVE,
576    IDC_LIST_NAME,                    IDH_SVRMGR_LIST_NAME,
577    0, 0
578 };
579
580 static DWORD IDD_AGG_GENERAL_HELP[] = {
581    IDC_AGG_NAME,                     IDH_SVRMGR_AGGPROP_NAME,
582    IDC_AGG_ID,                       IDH_SVRMGR_AGGPROP_ID,
583    IDC_AGG_DEVICE,                   IDH_SVRMGR_AGGPROP_DEVICE,
584    IDC_AGG_USAGE,                    IDH_SVRMGR_AGGPROP_USAGE,
585    IDC_AGG_USAGEBAR,                 IDH_SVRMGR_AGGPROP_USAGEBAR,
586    IDC_AGG_WARN,                     IDH_SVRMGR_AGGPROP_WARN,
587    IDC_AGG_WARN_AGGFULL_DEF,         IDH_SVRMGR_AGGPROP_WARN_AGGFULL_DEF,
588    IDC_AGG_WARN_AGGFULL,             IDH_SVRMGR_AGGPROP_WARN_AGGFULL,
589    IDC_AGG_WARN_AGGFULL_PERCENT,     IDH_SVRMGR_AGGPROP_WARN_AGGFULL_PERCENT,
590    IDC_AGG_FILESETS,                 IDH_SVRMGR_AGGPROP_NUMFILESETS,
591    IDC_AGG_WARNALLOC,                IDH_SVRMGR_AGGPROP_WARNALLOC,
592    0, 0
593 };
594
595 static DWORD IDD_SVR_GENERAL_HELP[] = {
596    IDC_SVR_NAME,                     IDH_SVRMGR_SVRPROP_NAME,
597    IDC_SVR_ADDRESSES,                IDH_SVRMGR_SVRPROP_ADDRESSES,
598    IDC_SVR_NUMAGGREGATES,            IDH_SVRMGR_SVRPROP_NUMAGGREGATES,
599    IDC_SVR_AUTH_YES,                 IDH_SVRMGR_SVRPROP_AUTH_YES,
600    IDC_SVR_AUTH_NO,                  IDH_SVRMGR_SVRPROP_AUTH_NO,
601    IDC_SVR_CAPACITY,                 IDH_SVRMGR_SVRPROP_CAPACITY,
602    IDC_SVR_ALLOCATION,               IDH_SVRMGR_SVRPROP_ALLOCATION,
603    IDC_SVR_CHANGEADDR,               IDH_SVRMGR_SVRPROP_CHANGEADDR,
604    0, 0
605 };
606
607 static DWORD IDD_SVR_SCOUT_HELP[] = {
608    IDC_SVR_WARN_AGGFULL,             IDH_SVRMGR_SVRPROP_WARN_AGGFULL,
609    IDC_SVR_WARN_AGGFULL_PERCENT,     IDH_SVRMGR_SVRPROP_WARN_AGGFULL_PERCENT,
610    IDC_SVR_WARN_SETFULL,             IDH_SVRMGR_SVRPROP_WARN_SETFULL,
611    IDC_SVR_WARN_SETFULL_PERCENT,     IDH_SVRMGR_SVRPROP_WARN_SETFULL_PERCENT,
612    IDC_SVR_WARN_SVCSTOP,             IDH_SVRMGR_SVRPROP_WARN_SVCSTOP,
613    IDC_SVR_WARN_SETNOVLDB,           IDH_SVRMGR_SVRPROP_WARN_SETNOVLDB,
614    IDC_SVR_WARN_AGGNOSERV,           IDH_SVRMGR_SVRPROP_WARN_AGGNOSERV,
615    IDC_SVR_WARN_SETNOSERV,           IDH_SVRMGR_SVRPROP_WARN_SETNOSERV,
616    IDC_SVR_AUTOREFRESH,              IDH_SVRMGR_SVRPROP_AUTOREFRESH,
617    IDC_SVR_AUTOREFRESH_MINUTES,      IDH_SVRMGR_SVRPROP_AUTOREFRESH_MINUTES,
618    IDC_SVR_WARN_AGGALLOC,            IDH_SVRMGR_SVRPROP_WARNALLOC,
619    0, 0
620 };
621
622 static DWORD IDD_SVC_GENERAL_HELP[] = {
623    IDC_SVC_NAME,                     IDH_SVRMGR_SVCPROP_NAME,
624    IDC_SVC_TYPE,                     IDH_SVRMGR_SVCPROP_TYPE,
625    IDC_SVC_PARAMS,                   IDH_SVRMGR_SVCPROP_PARAMS,
626    IDC_SVC_STARTDATE,                IDH_SVRMGR_SVCPROP_STARTDATE,
627    IDC_SVC_STOPDATE,                 IDH_SVRMGR_SVCPROP_STOPDATE,
628    IDC_SVC_LASTERROR,                IDH_SVRMGR_SVCPROP_LASTERROR,
629    IDC_SVC_STATUS,                   IDH_SVRMGR_SVCPROP_STATUS,
630    IDC_SVC_NOTIFIER,                 IDH_SVRMGR_SVCPROP_NOTIFIER,
631    IDC_SVC_WARNSTOP,                 IDH_SVRMGR_SVCPROP_WARNSTOP,
632    IDC_SVC_VIEWLOG,                  IDH_SVRMGR_SVCPROP_VIEWLOG,
633    IDC_SVC_START,                    IDH_SVRMGR_SVCPROP_START,
634    IDC_SVC_STOP,                     IDH_SVRMGR_SVCPROP_STOP,
635    0, 0
636 };
637
638 static DWORD IDD_SET_GENERAL_HELP[] = {
639    IDC_SET_NAME,                     IDH_SVRMGR_SETPROP_NAME,
640    IDC_SET_ID,                       IDH_SVRMGR_SETPROP_ID,
641    IDC_SET_CREATEDATE,               IDH_SVRMGR_SETPROP_CREATEDATE,
642    IDC_SET_UPDATEDATE,               IDH_SVRMGR_SETPROP_UPDATEDATE,
643    IDC_SET_ACCESSDATE,               IDH_SVRMGR_SETPROP_ACCESSDATE,
644    IDC_SET_BACKUPDATE,               IDH_SVRMGR_SETPROP_BACKUPDATE,
645    IDC_SET_STATUS,                   IDH_SVRMGR_SETPROP_STATUS,
646    IDC_SET_LOCK,                     IDH_SVRMGR_SETPROP_LOCK,
647    IDC_SET_UNLOCK,                   IDH_SVRMGR_SETPROP_UNLOCK,
648    IDC_SET_USAGE,                    IDH_SVRMGR_SETPROP_USAGE,
649    IDC_SET_QUOTA,                    IDH_SVRMGR_SETPROP_QUOTA,
650    IDC_SET_USAGEBAR,                 IDH_SVRMGR_SETPROP_USAGEBAR,
651    IDC_SET_WARN,                     IDH_SVRMGR_SETPROP_WARN,
652    IDC_SET_WARN_SETFULL_DEF,         IDH_SVRMGR_SETPROP_WARN_SETFULL_DEF,
653    IDC_SET_WARN_SETFULL,             IDH_SVRMGR_SETPROP_WARN_SETFULL,
654    IDC_SET_WARN_SETFULL_PERCENT,     IDH_SVRMGR_SETPROP_WARN_SETFULL_PERCENT,
655    IDC_SET_FILES,                    IDH_SVRMGR_SETPROP_FILES,
656    0, 0
657 };
658
659 static DWORD IDD_SVC_CREATE_HELP[] = {
660    IDC_SVC_SERVER,                   IDH_SVRMGR_SVCCREATE_SERVER,
661    IDC_SVC_NAME,                     IDH_SVRMGR_SVCCREATE_NAME,
662    IDC_SVC_COMMAND,                  IDH_SVRMGR_SVCCREATE_COMMAND,
663    IDC_SVC_PARAMS,                   IDH_SVRMGR_SVCCREATE_PARAMS,
664    IDC_SVC_NOTIFIER,                 IDH_SVRMGR_SVCCREATE_NOTIFIER,
665    IDC_SVC_LOGFILE,                  IDH_SVRMGR_SVCCREATE_LOGFILE,
666    IDC_SVC_TYPE_SIMPLE,              IDH_SVRMGR_SVCCREATE_SIMPLE,
667    IDC_SVC_RUNNOW,                   IDH_SVRMGR_SVCCREATE_SIMPLE_RUNNOW,
668    IDC_SVC_TYPE_FS,                  IDH_SVRMGR_SVCCREATE_FS,
669    IDC_SVC_TYPE_CRON,                IDH_SVRMGR_SVCCREATE_CRON,
670    IDC_SVC_RUNDAY,                   IDH_SVRMGR_SVCCREATE_CRON_RUNDAY,
671    IDC_SVC_RUNTIME,                  IDH_SVRMGR_SVCCREATE_CRON_RUNTIME,
672    0, 0
673 };
674
675 static DWORD IDD_SET_RELEASE_HELP[] = {
676    IDOK,                             IDH_SVRMGR_SETRELEASE_OK,
677    IDCANCEL,                         IDH_SVRMGR_SETRELEASE_CANCEL,
678    IDC_RELSET_NORMAL,                IDH_SVRMGR_SETRELEASE_NORMAL,
679    IDC_RELSET_FORCE,                 IDH_SVRMGR_SETRELEASE_FORCE,
680    0, 0
681 };
682
683 static DWORD IDD_SET_REPSITES_HELP[] = {
684    IDC_SET_NAME,                     IDH_SVRMGR_SETREPSITES_NAME,
685    IDC_SET_SERVER,                   IDH_SVRMGR_SETREPSITES_RW_SERVER,
686    IDC_SET_AGGREGATE,                IDH_SVRMGR_SETREPSITES_RW_AGGREGATE,
687    IDC_SET_REP_LIST,                 IDH_SVRMGR_SETREPSITES_REPSITES,
688    IDC_SET_REPSITE_ADD,              IDH_SVRMGR_SETREPSITES_REPSITE_ADD,
689    IDC_SET_REPSITE_DELETE,           IDH_SVRMGR_SETREPSITES_REPSITE_DELETE,
690    IDC_SET_RELEASE,                  IDH_SVRMGR_SETREPSITES_REPSITE_RELEASE,
691    0, 0
692 };
693
694 static DWORD IDD_DCE_NEWCELL_HELP[] = {
695    IDC_OPENCELL_CELL,                IDH_SVRMGR_NEWCELL_CELL,
696    IDC_OPENCELL_OLDCREDS,            IDH_SVRMGR_NEWCELL_CURRENTID,
697    IDC_OPENCELL_ID,                  IDH_SVRMGR_NEWCELL_ID,
698    IDC_OPENCELL_PASSWORD,            IDH_SVRMGR_NEWCELL_PASSWORD,
699    IDC_ADVANCED,                     IDH_SVRMGR_NEWCELL_ADVANCED,
700    IDC_MON_ALL,                      IDH_SVRMGR_NEWCELL_MONALL,
701    IDC_MON_ONE,                      IDH_SVRMGR_NEWCELL_MONONE,
702    IDC_MON_SERVER,                   IDH_SVRMGR_NEWCELL_MONSERVER,
703    IDC_MON_SOME,                     IDH_SVRMGR_NEWCELL_MONSOME,
704    IDC_MON_SUBSET,                   IDH_SVRMGR_NEWCELL_MONSUBSET,
705    0, 0
706 };
707
708 static DWORD IDD_DCE_NEWCREDS_HELP[] = {
709    IDC_CREDS_CELL,                   IDH_SVRMGR_NEWCREDS_CELL,
710    IDC_CREDS_CURRENTID,              IDH_SVRMGR_NEWCREDS_CURRENTID,
711    IDC_CREDS_EXPDATE,                IDH_SVRMGR_NEWCREDS_EXPDATE,
712    IDC_CREDS_LOGIN,                  IDH_SVRMGR_NEWCREDS_LOGIN,
713    IDC_CREDS_ID,                     IDH_SVRMGR_NEWCREDS_ID,
714    IDC_CREDS_PASSWORD,               IDH_SVRMGR_NEWCREDS_PASSWORD,
715    (DWORD)IDC_STATIC,                0,
716    0, 0
717 };
718
719 static DWORD IDD_COLUMNS_HELP[] = {
720    IDC_COLUMNS,                      IDH_SVRMGR_COLUMNS_WHICH,
721    IDC_COL_AVAIL,                    IDH_SVRMGR_COLUMNS_AVAIL,
722    IDC_COL_SHOWN,                    IDH_SVRMGR_COLUMNS_SHOWN,
723    IDC_COL_INSERT,                   IDH_SVRMGR_COLUMNS_INSERT,
724    IDC_COL_DELETE,                   IDH_SVRMGR_COLUMNS_DELETE,
725    IDC_COL_UP,                       IDH_SVRMGR_COLUMNS_MOVEUP,
726    IDC_COL_DOWN,                     IDH_SVRMGR_COLUMNS_MOVEDOWN,
727    0, 0
728 };
729
730 static DWORD IDD_SET_CREATE_HELP[] = {
731    IDC_SET_NAME,                     IDH_SVRMGR_SETCREATE_NAME,
732    IDC_SET_QUOTA,                    IDH_SVRMGR_SETCREATE_QUOTA,
733    IDC_SET_QUOTA_UNITS,              IDH_SVRMGR_SETCREATE_QUOTA_UNITS,
734    IDC_SET_CLONE,                    IDH_SVRMGR_SETCREATE_CLONE,
735    IDC_SET_SERVER,                   IDH_SVRMGR_SETCREATE_SERVER,
736    IDC_AGG_LIST,                     IDH_SVRMGR_SETCREATE_AGGLIST,
737    0, 0
738 };
739
740 static DWORD IDD_SET_DELETE_HELP[] = {
741    IDOK,                             IDH_SVRMGR_SETDELETE_OK,
742    IDCANCEL,                         IDH_SVRMGR_SETDELETE_CANCEL,
743    IDC_DELSET_SERVER,                IDH_SVRMGR_SETDELETE_DELFROM_SERVER,
744    IDC_DELSET_VLDB,                  IDH_SVRMGR_SETDELETE_DELFROM_VLDB,
745    0, 0
746 };
747
748 static DWORD IDD_SET_DELREP_HELP[] = {
749    IDOK,                             IDH_SVRMGR_SETDELREP_OK,
750    IDCANCEL,                         IDH_SVRMGR_SETDELREP_CANCEL,
751    0, 0
752 };
753
754 static DWORD IDD_SET_DELCLONE_HELP[] = {
755    IDOK,                             IDH_SVRMGR_SETDELCLONE_OK,
756    IDCANCEL,                         IDH_SVRMGR_SETDELCLONE_CANCEL,
757    0, 0
758 };
759
760 static DWORD IDD_SET_CLONE_HELP[] = {
761    IDOK,                             IDH_SVRMGR_SETCLONE_OK,
762    IDCANCEL,                         IDH_SVRMGR_SETCLONE_CANCEL,
763    0, 0
764 };
765
766 static DWORD IDD_PROBLEMS_HELP[] = {
767    IDC_PROBLEM_TEXT,                 IDH_SVRMGR_PROBLEMS_TEXT,
768    IDC_PROBLEM_REMEDY,               IDH_SVRMGR_PROBLEMS_REMEDY,
769    IDC_PROBLEM_SCROLL,               IDH_SVRMGR_PROBLEMS_SCROLL,
770    0, 0
771 };
772
773 static DWORD IDD_SET_MOVETO_HELP[] = {
774    IDC_AGG_LIST,                     IDH_SVRMGR_SETMOVE_AGGLIST,
775    IDC_MOVESET_SERVER,               IDH_SVRMGR_SETMOVE_SERVER,
776    0, 0
777 };
778
779 static DWORD IDD_SVC_LOGNAME_HELP[] = {
780    IDC_VIEWLOG_SERVER,               IDH_SVRMGR_LOGNAME_SERVER,
781    IDC_VIEWLOG_FILENAME,             IDH_SVRMGR_LOGNAME_FILENAME,
782    IDOK,                             IDH_SVRMGR_LOGNAME_OK,
783    IDCANCEL,                         IDH_SVRMGR_LOGNAME_CANCEL,
784    0, 0
785 };
786
787 static DWORD IDD_SVC_VIEWLOG_HELP[] = {
788    IDC_SVC_VIEWLOG_FILENAME,         IDH_SVRMGR_VIEWLOG_FILENAME,
789    IDC_VIEWLOG_TEXT,                 IDH_SVRMGR_VIEWLOG_TEXT,
790    IDC_VIEWLOG_SAVEAS,               IDH_SVRMGR_VIEWLOG_SAVEAS,
791    0, 0
792 };
793
794 static DWORD IDD_SET_SETQUOTA_HELP[] = {
795    IDC_SET_NAME,                     IDH_SVRMGR_SETQUOTA_NAME,
796    IDC_SET_AGGREGATE,                IDH_SVRMGR_SETQUOTA_AGGREGATE,
797    IDC_AGG_PROPERTIES,               IDH_SVRMGR_SETQUOTA_AGGPROPERTIES,
798    IDC_SET_USAGE,                    IDH_SVRMGR_SETQUOTA_USAGE,
799    IDC_SET_USAGEBAR,                 IDH_SVRMGR_SETQUOTA_USAGEBAR,
800    IDC_SET_QUOTA,                    IDH_SVRMGR_SETQUOTA_VALUE,
801    IDC_SET_QUOTA_UNITS,              IDH_SVRMGR_SETQUOTA_UNITS,
802    IDOK,                             IDH_SVRMGR_SETQUOTA_OK,
803    IDCANCEL,                         IDH_SVRMGR_SETQUOTA_CANCEL,
804    0, 0
805 };
806
807 static DWORD IDD_SVR_SYNCVLDB_HELP[] = {
808    IDOK,                             IDH_SVRMGR_SYNCVLDB_OK,
809    IDCANCEL,                         IDH_SVRMGR_SYNCVLDB_CANCEL,
810    0, 0
811 };
812
813 static DWORD IDD_SET_CREATEREP_HELP[] = {
814    IDC_SET_NAME,                     IDH_SVRMGR_SETCREATEREP_NAME,
815    IDC_AGG_LIST,                     IDH_SVRMGR_SETCREATEREP_AGGLIST,
816    IDC_SET_SERVER,                   IDH_SVRMGR_SETCREATEREP_SERVER,
817    0, 0
818 };
819
820 static DWORD IDD_SVR_INSTALL_HELP[] = {
821    IDC_FILENAME,                     IDH_SVRMGR_INSTALL_SOURCE,
822    IDC_BROWSE,                       IDH_SVRMGR_INSTALL_BROWSE,
823    IDC_SERVER,                       IDH_SVRMGR_INSTALL_SERVER,
824    IDC_DIRECTORY,                    IDH_SVRMGR_INSTALL_TARGET,
825    0, 0
826 };
827
828 static DWORD IDD_SVR_UNINSTALL_HELP[] = {
829    IDC_SERVER,                       IDH_SVRMGR_UNINSTALL_SERVER,
830    IDC_FILENAME,                     IDH_SVRMGR_UNINSTALL_FILENAME,
831    0, 0
832 };
833
834 static DWORD IDD_SVR_PRUNE_HELP[] = {
835    IDC_SERVER,                       IDH_SVRMGR_PRUNE_SERVER,
836    IDC_OP_DELETE_CORE,               IDH_SVRMGR_PRUNE_OP_DELETE_CORE,
837    IDC_OP_DELETE_BAK,                IDH_SVRMGR_PRUNE_OP_DELETE_BAK,
838    IDC_OP_DELETE_OLD,                IDH_SVRMGR_PRUNE_OP_DELETE_OLD,
839    0, 0
840 };
841
842 static DWORD IDD_SET_RENAME_HELP[] = {
843    IDC_RENSET_OLD,                   IDH_SVRMGR_RENAMESET_OLDNAME,
844    IDC_RENSET_NEW,                   IDH_SVRMGR_RENAMESET_NEWNAME,
845    0, 0
846 };
847
848 static DWORD IDD_SVC_DELETE_HELP[] = {
849    IDCANCEL,                         IDH_SVRMGR_DELETESERVICE_CANCEL,
850    IDOK,                             IDH_SVRMGR_DELETESERVICE_OK,
851    0, 0
852 };
853
854 static DWORD IDD_SVR_GETDATES_HELP[] = {
855    IDC_SERVER,                       IDH_SVRMGR_GETDATES_SERVER,
856    IDC_FILENAME,                     IDH_SVRMGR_GETDATES_FILENAME,
857    0, 0
858 };
859
860 static DWORD IDD_SVR_GETDATES_RESULTS_HELP[] = {
861    IDC_SERVER,                       IDH_SVRMGR_GETDATES_SERVER,
862    IDC_FILENAME,                     IDH_SVRMGR_GETDATES_FILENAME,
863    IDC_DATE_FILE,                    IDH_SVRMGR_GETDATES_DATE_FILE,
864    IDC_DATE_BAK,                     IDH_SVRMGR_GETDATES_DATE_BAK,
865    IDC_DATE_OLD,                     IDH_SVRMGR_GETDATES_DATE_OLD,
866    0, 0
867 };
868
869 static DWORD IDD_SET_DUMP_HELP[] = {
870    IDC_DUMP_FILENAME,                IDH_SVRMGR_SETDUMP_FILENAME,
871    IDC_DUMP_FULL,                    IDH_SVRMGR_SETDUMP_FULL,
872    IDC_DUMP_LIMIT_TIME,              IDH_SVRMGR_SETDUMP_BYTIME,
873    IDC_DUMP_TIME,                    IDH_SVRMGR_SETDUMP_BYTIME_TIME,
874    IDC_DUMP_DATE,                    IDH_SVRMGR_SETDUMP_BYTIME_DATE,
875    0, 0
876 };
877
878 static DWORD IDD_SET_RESTORE_HELP[] = {
879    IDC_RESTORE_FILENAME,             IDH_SVRMGR_SETRESTORE_FILENAME,
880    IDC_RESTORE_BROWSE,               IDH_SVRMGR_SETRESTORE_BROWSE,
881    IDC_RESTORE_SETNAME,              IDH_SVRMGR_SETRESTORE_SETNAME,
882    IDC_RESTORE_SERVER,               IDH_SVRMGR_SETRESTORE_SERVER,
883    IDC_AGG_LIST,                     IDH_SVRMGR_SETRESTORE_AGGLIST,
884    IDC_RESTORE_INCREMENTAL,          IDH_SVRMGR_SETRESTORE_INCREMENTAL,
885    0, 0
886 };
887
888 static DWORD IDD_SVC_BOS_HELP[] = {
889    IDC_SVC_NAME,                     IDH_SVRMGR_SVCPROP_BOS_NAME,
890    IDC_BOS_GENRES,                   IDH_SVRMGR_SVCPROP_BOS_GENRES,
891    IDC_BOS_GENRES_DATE,              IDH_SVRMGR_SVCPROP_BOS_GENRES_DATE,
892    IDC_BOS_GENRES_TIME,              IDH_SVRMGR_SVCPROP_BOS_GENRES_TIME,
893    IDC_BOS_BINRES,                   IDH_SVRMGR_SVCPROP_BOS_BINRES,
894    IDC_BOS_BINRES_DATE,              IDH_SVRMGR_SVCPROP_BOS_BINRES_DATE,
895    IDC_BOS_BINRES_TIME,              IDH_SVRMGR_SVCPROP_BOS_BINRES_TIME,
896    0, 0
897 };
898
899 static DWORD IDD_SET_CLONESYS_HELP[] = {
900    IDC_CLONE_ALL,                    IDH_SVRMGR_CLONESYS_ALL,
901    IDC_CLONE_SOME,                   IDH_SVRMGR_CLONESYS_SOME,
902    IDC_CLONE_SVR_LIMIT,              IDH_SVRMGR_CLONESYS_BYSERVER,
903    IDC_CLONE_SVR,                    IDH_SVRMGR_CLONESYS_BYSERVER_SERVER,
904    IDC_CLONE_AGG_LIMIT,              IDH_SVRMGR_CLONESYS_BYAGG,
905    IDC_CLONE_AGG,                    IDH_SVRMGR_CLONESYS_BYAGG_AGGREGATE,
906    IDC_CLONE_PREFIX_LIMIT,           IDH_SVRMGR_CLONESYS_BYPREFIX,
907    IDC_CLONE_PREFIX,                 IDH_SVRMGR_CLONESYS_BYPREFIX_PREFIX,
908    0, 0
909 };
910
911 static DWORD IDD_SUBSETS_HELP[] = {
912    IDC_SUBSET_NAME,                  IDH_SVRMGR_SUBSET_NAME,
913    IDC_SUBSET_LOAD,                  IDH_SVRMGR_SUBSET_LOAD,
914    IDC_SUBSET_SAVE,                  IDH_SVRMGR_SUBSET_SAVE,
915    IDC_SUBSET_LIST,                  IDH_SVRMGR_SUBSET_SERVERLIST,
916    IDC_SUBSET_ALL,                   IDH_SVRMGR_SUBSET_MONITORALL,
917    IDC_SUBSET_NONE,                  IDH_SVRMGR_SUBSET_MONITORNONE,
918    0, 0
919 };
920
921 static DWORD IDD_SUBSET_LOADSAVE_HELP[] = {
922    IDC_SUBSET_NAME,                  IDH_SVRMGR_SUBSET_NAME,
923    IDC_SUBSET_LIST,                  IDH_SVRMGR_SUBSET_SUBSETLIST,
924    IDC_SUBSET_DELETE,                IDH_SVRMGR_SUBSET_DELETE,
925    IDC_SUBSET_RENAME,                IDH_SVRMGR_SUBSET_RENAME,
926    0, 0
927 };
928
929 static DWORD IDD_OPTIONS_GENERAL_HELP[] = {
930    IDC_OPT_SVR_LONGNAMES,            IDH_SVRMGR_OPT_SVR_LONGNAMES,
931    IDC_OPT_SVR_DBL_PROP,             IDH_SVRMGR_OPT_SVR_DBL_PROP,
932    IDC_OPT_SVR_DBL_DEPENDS,          IDH_SVRMGR_OPT_SVR_DBL_DEPENDS,
933    IDC_OPT_SVR_DBL_OPEN,             IDH_SVRMGR_OPT_SVR_DBL_OPEN,
934    IDC_OPT_SVR_OPENMON,              IDH_SVRMGR_OPT_SVR_OPENMON,
935    IDC_OPT_SVR_CLOSEUNMON,           IDH_SVRMGR_OPT_SVR_CLOSEUNMON,
936    IDC_OPT_WARN_BADCREDS,            IDH_SVRMGR_OPT_WARN_BADCREDS,
937    0, 0
938 };
939
940 static DWORD IDD_BADCREDS_HELP[] = {
941    IDC_BADCREDS_SHUTUP,              IDH_SVRMGR_BADCREDS_SHUTUP,
942    IDOK,                             IDH_SVRMGR_BADCREDS_YES,
943    IDCANCEL,                         IDH_SVRMGR_BADCREDS_NO,
944    0, 0
945 };
946
947 static DWORD IDD_SVR_KEYS_HELP[] = {
948    IDC_KEY_LIST,                     IDH_SVRMGR_KEY_LIST,
949    IDC_KEY_ADD,                      IDH_SVRMGR_KEY_ADD,
950    IDC_KEY_REMOVE,                   IDH_SVRMGR_KEY_REMOVE,
951    IDC_KEY_NAME,                     IDH_SVRMGR_KEY_NAME,
952    0, 0
953 };
954
955 static DWORD IDD_SVC_START_HELP[] = {
956    IDC_STARTSTOP_TEMPORARY,          IDH_SVRMGR_STARTSERVICE_TEMPORARY,
957    IDC_STARTSTOP_PERMANENT,          IDH_SVRMGR_STARTSERVICE_PERMANENT,
958    0, 0
959 };
960
961 static DWORD IDD_SVC_STOP_HELP[] = {
962    IDC_STARTSTOP_TEMPORARY,          IDH_SVRMGR_STOPSERVICE_TEMPORARY,
963    IDC_STARTSTOP_PERMANENT,          IDH_SVRMGR_STOPSERVICE_PERMANENT,
964    0, 0
965 };
966
967 static DWORD IDD_SVR_EXECUTE_HELP[] = {
968    IDC_SERVER,                       IDH_SVRMGR_EXECUTECOMMAND_SERVER,
969    IDC_COMMAND,                      IDH_SVRMGR_EXECUTECOMMAND_COMMAND,
970    0, 0
971 };
972
973 static DWORD IDD_SVR_SALVAGE_HELP[] = {
974    IDC_SERVER,                       IDH_SVRMGR_SALVAGE_SERVER,
975    IDC_AGGREGATE,                    IDH_SVRMGR_SALVAGE_AGGREGATE,
976    IDC_AGGREGATE_ALL,                IDH_SVRMGR_SALVAGE_AGGREGATE_ALL,
977    IDC_FILESET,                      IDH_SVRMGR_SALVAGE_FILESET,
978    IDC_FILESET_ALL,                  IDH_SVRMGR_SALVAGE_FILESET_ALL,
979    IDC_ADVANCED,                     IDH_SVRMGR_SALVAGE_ADVANCED,
980    IDC_SALVAGE_TEMPDIR,              IDH_SVRMGR_SALVAGE_TEMPDIR,
981    IDC_SALVAGE_SIMUL,                IDH_SVRMGR_SALVAGE_SIMUL,
982    IDC_SALVAGE_NUM,                  IDH_SVRMGR_SALVAGE_NUM,
983    IDC_SALVAGE_READONLY,             IDH_SVRMGR_SALVAGE_READONLY,
984    IDC_SALVAGE_BLOCK,                IDH_SVRMGR_SALVAGE_BLOCK,
985    IDC_SALVAGE_FORCE,                IDH_SVRMGR_SALVAGE_FORCE,
986    IDC_SALVAGE_FIXDIRS,              IDH_SVRMGR_SALVAGE_FIXDIRS,
987    IDC_SALVAGE_LOG_FILE,             IDH_SVRMGR_SALVAGE_LOG_FILE,
988    IDC_SALVAGE_LOG_INODES,           IDH_SVRMGR_SALVAGE_LOG_INODES,
989    IDC_SALVAGE_LOG_ROOT,             IDH_SVRMGR_SALVAGE_LOG_ROOT,
990    0, 0
991 };
992
993 static DWORD IDD_SVR_SALVAGE_RESULTS_HELP[] = {
994    IDC_SALVAGE_DETAILS,              IDH_SVRMGR_SALVAGE_DETAILS,
995    0, 0
996 };
997
998 static DWORD IDD_SVR_HOSTS_HELP[] = {
999    IDC_HOST_LIST,                    IDH_SVRMGR_HOST_LIST,
1000    IDC_HOST_ADD,                     IDH_SVRMGR_HOST_ADD,
1001    IDC_HOST_REMOVE,                  IDH_SVRMGR_HOST_REMOVE,
1002    IDC_HOST_TITLE,                   IDH_SVRMGR_HOST_TITLE,
1003    0, 0
1004 };
1005
1006 static DWORD IDD_SVR_ADDHOST_HELP[] = {
1007    IDC_ADDHOST_HOST,                 IDH_SVRMGR_ADDHOST_HOST,
1008    IDOK,                             IDH_SVRMGR_ADDHOST_OK,
1009    0, 0
1010 };
1011
1012 static DWORD IDD_SVR_ADDRESS_HELP[] = {
1013    IDC_SVR_ADDRESSES,                IDH_SVRMGR_ADDRESS_LIST,
1014    IDC_ADDR_CHANGE,                  IDH_SVRMGR_ADDRESS_CHANGE,
1015    IDC_ADDR_REMOVE,                  IDH_SVRMGR_ADDRESS_REMOVE,
1016    0, 0
1017 };
1018
1019 static DWORD IDD_SVR_NEWADDR_HELP[] = {
1020    IDC_ADDRESS,                      IDH_SVRMGR_CHANGEADDR_ADDRESS,
1021    0, 0
1022 };
1023
1024
1025 void Main_ConfigureHelp (void)
1026 {
1027    AfsAppLib_RegisterHelpFile (cszHELPFILENAME);
1028
1029    AfsAppLib_RegisterHelp (IDD_SVR_LISTS, IDD_SVR_LISTS_HELP, IDH_SVRMGR_ADMINLIST_EDIT_OVERVIEW);
1030    AfsAppLib_RegisterHelp (IDD_AGG_GENERAL, IDD_AGG_GENERAL_HELP, IDH_SVRMGR_PROP_AGGREGATE_OVERVIEW);
1031    AfsAppLib_RegisterHelp (IDD_SVR_GENERAL, IDD_SVR_GENERAL_HELP, IDH_SVRMGR_PROP_SERVER_OVERVIEW);
1032    AfsAppLib_RegisterHelp (IDD_SVR_SCOUT, IDD_SVR_SCOUT_HELP, IDH_SVRMGR_PROP_SERVER_WARNINGS_OVERVIEW);
1033    AfsAppLib_RegisterHelp (IDD_SVC_GENERAL, IDD_SVC_GENERAL_HELP, IDH_SVRMGR_PROP_SERVICE_OVERVIEW);
1034    AfsAppLib_RegisterHelp (IDD_SET_GENERAL, IDD_SET_GENERAL_HELP, IDH_SVRMGR_PROP_FILESET_OVERVIEW);
1035    AfsAppLib_RegisterHelp (IDD_SVC_CREATE, IDD_SVC_CREATE_HELP, IDH_SVRMGR_CREATESERVICE_OVERVIEW);
1036    AfsAppLib_RegisterHelp (IDD_SET_RELEASE, IDD_SET_RELEASE_HELP, IDH_SVRMGR_RELEASEFILESET_OVERVIEW);
1037    AfsAppLib_RegisterHelp (IDD_SET_REPSITES, IDD_SET_REPSITES_HELP, IDH_SVRMGR_PROP_REPSITES_OVERVIEW);
1038    AfsAppLib_RegisterHelp (IDD_OPENCELL, IDD_DCE_NEWCELL_HELP, IDH_SVRMGR_NEWCELL_OVERVIEW);
1039    AfsAppLib_RegisterHelp (IDD_APPLIB_CREDENTIALS, IDD_DCE_NEWCREDS_HELP, IDH_SVRMGR_NEWCREDS_OVERVIEW);
1040    AfsAppLib_RegisterHelp (IDD_COLUMNS, IDD_COLUMNS_HELP, IDH_SVRMGR_COLUMNS_OVERVIEW);
1041    AfsAppLib_RegisterHelp (IDD_SET_CREATE, IDD_SET_CREATE_HELP, IDH_SVRMGR_CREATEFILESET_OVERVIEW);
1042    AfsAppLib_RegisterHelp (IDD_SET_DELETE, IDD_SET_DELETE_HELP, IDH_SVRMGR_DELETEFILESET_OVERVIEW);
1043    AfsAppLib_RegisterHelp (IDD_SET_DELREP, IDD_SET_DELREP_HELP, IDH_SVRMGR_DELETEREPLICA_OVERVIEW);
1044    AfsAppLib_RegisterHelp (IDD_SET_DELCLONE, IDD_SET_DELCLONE_HELP, IDH_SVRMGR_DELETECLONE_OVERVIEW);
1045    AfsAppLib_RegisterHelp (IDD_SET_CLONE, IDD_SET_CLONE_HELP, IDH_SVRMGR_CLONE_OVERVIEW);
1046    AfsAppLib_RegisterHelp (IDD_SVR_PROBLEMS, IDD_PROBLEMS_HELP, IDH_SVRMGR_PROBLEMS_OVERVIEW);
1047    AfsAppLib_RegisterHelp (IDD_SET_MOVETO, IDD_SET_MOVETO_HELP, IDH_SVRMGR_PROP_MOVEFILESET_OVERVIEW);
1048    AfsAppLib_RegisterHelp (IDD_SVC_LOGNAME, IDD_SVC_LOGNAME_HELP, 0);
1049    AfsAppLib_RegisterHelp (IDD_SVC_VIEWLOG, IDD_SVC_VIEWLOG_HELP, 0);
1050    AfsAppLib_RegisterHelp (IDD_SET_SETQUOTA, IDD_SET_SETQUOTA_HELP, IDH_SVRMGR_SETFILESETQUOTA_OVERVIEW);
1051    AfsAppLib_RegisterHelp (IDD_SVR_SYNCVLDB, IDD_SVR_SYNCVLDB_HELP, IDH_SVRMGR_SYNCVLDB_OVERVIEW);
1052    AfsAppLib_RegisterHelp (IDD_SET_CREATEREP, IDD_SET_CREATEREP_HELP, IDH_SVRMGR_CREATEREPLICA_OVERVIEW);
1053    AfsAppLib_RegisterHelp (IDD_SVR_INSTALL, IDD_SVR_INSTALL_HELP, IDH_SVRMGR_INSTALLFILE_OVERVIEW);
1054    AfsAppLib_RegisterHelp (IDD_SVR_UNINSTALL, IDD_SVR_UNINSTALL_HELP, IDH_SVRMGR_UNINSTALLFILE_OVERVIEW);
1055    AfsAppLib_RegisterHelp (IDD_SVR_PRUNE, IDD_SVR_PRUNE_HELP, IDH_SVRMGR_PRUNEFILES_OVERVIEW);
1056    AfsAppLib_RegisterHelp (IDD_SET_RENAME, IDD_SET_RENAME_HELP, IDH_SVRMGR_RENAMEFILESET_OVERVIEW);
1057    AfsAppLib_RegisterHelp (IDD_SVC_DELETE, IDD_SVC_DELETE_HELP, IDH_SVRMGR_DELETESERVICE_OVERVIEW);
1058    AfsAppLib_RegisterHelp (IDD_SVR_GETDATES, IDD_SVR_GETDATES_HELP, IDH_SVRMGR_GETDATES_OVERVIEW);
1059    AfsAppLib_RegisterHelp (IDD_SVR_GETDATES_RESULTS, IDD_SVR_GETDATES_RESULTS_HELP, IDH_SVRMGR_GETDATES_RESULTS_OVERVIEW);
1060    AfsAppLib_RegisterHelp (IDD_SET_DUMP, IDD_SET_DUMP_HELP, IDH_SVRMGR_DUMPFILESET_OVERVIEW);
1061    AfsAppLib_RegisterHelp (IDD_SET_RESTORE, IDD_SET_RESTORE_HELP, IDH_SVRMGR_RESTOREFILESET_OVERVIEW);
1062    AfsAppLib_RegisterHelp (IDD_SVC_BOS, IDD_SVC_BOS_HELP, IDH_SVRMGR_PROP_SERVICE_BOS_OVERVIEW);
1063    AfsAppLib_RegisterHelp (IDD_SET_CLONESYS, IDD_SET_CLONESYS_HELP, IDH_SVRMGR_CLONESYS_OVERVIEW);
1064    AfsAppLib_RegisterHelp (IDD_SUBSETS, IDD_SUBSETS_HELP, IDH_SVRMGR_SUBSETS_OVERVIEW);
1065    AfsAppLib_RegisterHelp (IDD_SUBSET_LOADSAVE, IDD_SUBSET_LOADSAVE_HELP, 0);
1066    AfsAppLib_RegisterHelp (IDD_OPTIONS_GENERAL, IDD_OPTIONS_GENERAL_HELP, IDH_SVRMGR_OPTIONS_GENERAL_OVERVIEW);
1067    AfsAppLib_RegisterHelp (IDD_APPLIB_BADCREDS, IDD_BADCREDS_HELP, IDH_SVRMGR_BADCREDS_OVERVIEW);
1068    AfsAppLib_RegisterHelp (IDD_SVR_KEYS, IDD_SVR_KEYS_HELP, IDH_SVRMGR_SERVERKEY_EDIT_OVERVIEW);
1069    AfsAppLib_RegisterHelp (IDD_SVC_START, IDD_SVC_START_HELP, IDH_SVRMGR_STARTSERVICE_OVERVIEW);
1070    AfsAppLib_RegisterHelp (IDD_SVC_STOP, IDD_SVC_STOP_HELP, IDH_SVRMGR_STOPSERVICE_OVERVIEW);
1071    AfsAppLib_RegisterHelp (IDD_SVR_EXECUTE, IDD_SVR_EXECUTE_HELP, IDH_SVRMGR_EXECUTECOMMAND_OVERVIEW);
1072    AfsAppLib_RegisterHelp (IDD_SVR_SALVAGE, IDD_SVR_SALVAGE_HELP, IDH_SVRMGR_SALVAGE_OVERVIEW);
1073    AfsAppLib_RegisterHelp (IDD_SVR_SALVAGE_RESULTS, IDD_SVR_SALVAGE_RESULTS_HELP, IDH_SVRMGR_SALVAGE_RESULTS_OVERVIEW);
1074    AfsAppLib_RegisterHelp (IDD_SVR_HOSTS, IDD_SVR_HOSTS_HELP, IDH_SVRMGR_HOSTS_EDIT_OVERVIEW);
1075    AfsAppLib_RegisterHelp (IDD_SVR_ADDHOST, IDD_SVR_ADDHOST_HELP, IDH_SVRMGR_HOSTS_ADD_OVERVIEW);
1076    AfsAppLib_RegisterHelp (IDD_SVR_ADDRESS, IDD_SVR_ADDRESS_HELP, IDH_SVRMGR_SERVERADDRESSES_OVERVIEW);
1077    AfsAppLib_RegisterHelp (IDD_SVR_NEWADDR, IDD_SVR_NEWADDR_HELP, IDH_SVRMGR_CHANGEADDRESS_OVERVIEW);
1078 }
1079