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