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