//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1994 - 1996.
//
//  File:       help.cxx
//
//  Contents:   Routines to display help info.
//
//  History:    04-04-95   DavidMun   Created
//
//  Notes:      TO CHANGE THE HELP TEXT FOR A COMMAND:
//                  - edit the command's RCDATA block in jt.rc.
//
//              TO ADD HELP FOR A NEW COMMAND:
//                  - Add a RC_<command_name> identifier to resource.h
//                  - Add an RCDATA block for RC_<command_name> in jt.rc
//                  - Add a case statement in the DoHelp() function (below)
//                    for the new command.
//
//----------------------------------------------------------------------------

#include <headers.hxx>
#pragma hdrstop
#include "jt.hxx"
#include "resource.h"




//+---------------------------------------------------------------------------
//
//  Function:   DisplayHelp
//
//  Synopsis:   Print help strings with RCDATA identifier [usResourceID] on
//              the console.
//
//  Arguments:  [usResourceID] - identifier for RCDATA block containing
//                               printf style string to print.
//              [...]          - arguments for vprintf
//
//  History:    03-11-96   DavidMun   Created
//
//----------------------------------------------------------------------------

VOID DisplayHelp(USHORT usResourceID, ...)
{
    va_list varArgs;
    HRSRC   hResource = NULL;
    HGLOBAL hgResource = NULL;
    LPSTR   psz = NULL;

    va_start(varArgs, usResourceID);
    do
    {
        hResource = FindResource(NULL, (LPCTSTR) usResourceID, RT_RCDATA);

        if (!hResource)
        {
            g_Log.Write(LOG_ERROR, "FindResource (%u)", GetLastError());
            break;
        }

        hgResource = LoadResource(NULL, hResource);

        if (!hgResource)
        {
            g_Log.Write(LOG_ERROR, "LoadResource (%u)", GetLastError());
            break;
        }

        psz = (LPSTR) LockResource(hgResource);

        if (!psz)
        {
            g_Log.Write(LOG_ERROR, "LockResource (%u)", GetLastError());
            break;
        }

        while (*psz)
        {
            vprintf(psz, varArgs);
            psz += lstrlenA(psz) + 1;
        }
    } while (0);
    va_end(varArgs);

    if (hgResource)
    {
        FreeResource(hgResource);
    }
}




//+---------------------------------------------------------------------------
//
//  Function:   DisplayUsage
//
//  Synopsis:   Print usage instructions for this exe on the console
//
//  History:    02-18-94   DavidMun   Created
//              03-31-95   DavidMun   Rewrite
//
//----------------------------------------------------------------------------

VOID DisplayUsage()
{
    DisplayHelp(
        RC_USAGE1,
#if (DBG == 1)
        "as a debug build",
#else
        "as a retail build",
#endif
#ifdef _CHICAGO_
        "Windows 95 or Windows 98"
#else
#ifndef RES_KIT
        "Windows NT"
#else
        "the Windows NT Resource Kit"
#endif
#endif
        );
    DisplayHelp(RC_USAGE2, NUM_ENUMERATOR_SLOTS - 1);
}




//+---------------------------------------------------------------------------
//
//  Function:   DoHelp
//
//  Synopsis:   Process the HELP command
//
//  Arguments:  [ppwsz] - token stream
//
//  Modifies:   *[ppwsz]
//
//  History:    04-10-95   DavidMun   Created
//
//----------------------------------------------------------------------------

VOID DoHelp(WCHAR **ppwsz)
{
    TOKEN   tkn;
    BOOL    fGotToken = FALSE;

    do
    {
        do
        {
            tkn = GetToken(ppwsz);
        } while (tkn != TKN_EOL &&
                 tkn != TKN_ATSIGN &&
                 !IsCommandToken(tkn));

#ifdef RES_KIT
       if ((tkn == TKN_ADDJOBTOQUEUE)              ||
             (tkn == TKN_REMOVEJOBFROMQUEUE)       ||
             (tkn == TKN_SETQUEUE)                 ||
             (tkn == TKN_ABORTQUEUE)               ||
             (tkn == TKN_CONVERTSAGETASKSTOJOBS)   ||
             (tkn == TKN_EDITJOB)                  ||
             (tkn == TKN_ENUMCLONE)                ||
             (tkn == TKN_ENUMNEXT)                 ||
             (tkn == TKN_ENUMRESET)                ||
             (tkn == TKN_ENUMSKIP)                 ||
             (tkn == TKN_CREATETRIGGERQUEUE)       ||
             (tkn == TKN_DELETETRIGGERQUEUE)       ||
             (tkn == TKN_EDITJOBINQUEUE)           ||
             (tkn == TKN_LOADQUEUE)                ||
             (tkn == TKN_PRINTQUEUE)               ||
             (tkn == TKN_PRINTRUNTIMEQUEUE)        ||
             (tkn == TKN_PRINTSTRINGQUEUE)         ||
             (tkn == TKN_PRINTTRIGGERQUEUE)        ||
             (tkn == TKN_RUNQUEUE)                 ||
             (tkn == TKN_SCHEDADDQUEUE)            ||
             (tkn == TKN_SCHEDCREATEENUM)          ||
             (tkn == TKN_SCHEDISJOBORQUEUE)        ||
             (tkn == TKN_SAVEQUEUE)                ||
             (tkn == TKN_SCHEDNEWQUEUE)            ||
             (tkn == TKN_SETTRIGGERQUEUE))
       {
          continue;
       }
#endif

        if (tkn != TKN_EOL)
        {
            fGotToken = TRUE;
        }

        switch (tkn)
        {
//        case TKN_ADDJOBTOQUEUE:
//        case TKN_REMOVEJOBFROMQUEUE:
//        case TKN_SETQUEUE:
//            DisplayHelp(RC_NOTIMPL);
//            break;

        case TKN_ABORTJOB:
//        case TKN_ABORTQUEUE:
            DisplayHelp(RC_ABORT);
            break;

        case TKN_ATSIGN:
            DisplayHelp(RC_ATSIGN);
            break;

#ifndef RES_KIT
        case TKN_CONVERTSAGETASKSTOJOBS:
            DisplayHelp(
                RC_CONVERTSAGE,
#ifdef _CHICAGO_
                "Win9x"
#else
                "Windows NT"
#endif
            );
            break;
#endif // RES_KIT not defined

        case TKN_CREATETRIGGERJOB:
//        case TKN_CREATETRIGGERQUEUE:
            DisplayHelp(RC_CREATETRIGGER1);
            DisplayHelp(RC_TRIGPROPS, TIME_NOW_INCREMENT);
            DisplayHelp(RC_CREATETRIGGER2);
            break;

        case TKN_DELETETRIGGERJOB:
//        case TKN_DELETETRIGGERQUEUE:
            DisplayHelp(RC_DELETETRIGGER);
            break;

#ifndef RES_KIT
        case TKN_EDITJOB:
//        case TKN_EDITJOBINQUEUE:
            DisplayHelp(RC_EDITJOB);
            break;

        case TKN_ENUMCLONE:
            DisplayHelp(RC_ENUMCLONE);
            break;

        case TKN_ENUMNEXT:
            DisplayHelp(RC_ENUMNEXT);
            break;

        case TKN_ENUMRESET:
            DisplayHelp(RC_ENUMRESET);
            break;

        case TKN_ENUMSKIP:
            DisplayHelp(RC_ENUMSKIP);
            break;
#endif // RES_KIT not defined

        case TKN_GETCREDENTIALS:
            DisplayHelp(RC_GETCREDENTIALS);
            break;

        case TKN_GETMACHINE:
            DisplayHelp(RC_GETMACHINE);
            break;

#ifndef RES_KIT
        case TKN_SCHEDISJOBORQUEUE:
            DisplayHelp(RC_ISJOBORQUEUE);
            break;
#endif // RES_KIT not defined

        case TKN_LOADJOB:
//        case TKN_LOADQUEUE:
            DisplayHelp(RC_LOAD);
            break;

        case TKN_PRINTJOB:
//        case TKN_PRINTQUEUE:
            DisplayHelp(RC_PRINT);
            break;

        case TKN_PRINTRUNTIMEJOB:
//        case TKN_PRINTRUNTIMEQUEUE:
            DisplayHelp(RC_PRINTRUNTIME);
            break;

        case TKN_PRINTSTRINGJOB:
//        case TKN_PRINTSTRINGQUEUE:
            DisplayHelp(RC_PRINTSTRING);
            break;

        case TKN_PRINTTRIGGERJOB:
//        case TKN_PRINTTRIGGERQUEUE:
            DisplayHelp(RC_PRINTTRIGGER);
            break;

        case TKN_RUNJOB:
//        case TKN_RUNQUEUE:
            DisplayHelp(RC_RUN);
            break;

        case TKN_SCHEDACTIVATE:
            DisplayHelp(RC_ACTIVATE);
            break;

        case TKN_SCHEDADDJOB:
//        case TKN_SCHEDADDQUEUE:
            DisplayHelp(RC_ADD);
            break;

#ifndef RES_KIT
        case TKN_SCHEDCREATEENUM:
            DisplayHelp(
                RC_CREATEENUM,
                NUM_ENUMERATOR_SLOTS - 1,
                NUM_ENUMERATOR_SLOTS,
                NUM_ENUMERATOR_SLOTS - 1);
            break;
#endif // RES_KIT not defined

        case TKN_SCHEDDELETE:
            DisplayHelp(RC_DELETE);
            break;

        case TKN_SCHEDENUM:
            DisplayHelp(RC_ENUM);
            break;

        case TKN_SETCREDENTIALS:
            DisplayHelp(RC_SETCREDENTIALS);
            break;

        case TKN_SETJOB:
            DisplayHelp(RC_SETJOB);
            break;

        case TKN_SAVEJOB:
//        case TKN_SAVEQUEUE:
            DisplayHelp(RC_SAVE);
            break;

        case TKN_SETMACHINE:
            DisplayHelp(RC_SETMACHINE);
            break;

        case TKN_SCHEDNEWJOB:
//        case TKN_SCHEDNEWQUEUE:
            DisplayHelp(RC_NEW);
            break;


        case TKN_SETTRIGGERJOB:
//        case TKN_SETTRIGGERQUEUE:
            DisplayHelp(RC_SETTRIGGER1);
            DisplayHelp(RC_TRIGPROPS, TIME_NOW_INCREMENT);
            DisplayHelp(RC_SETTRIGGER2);
            break;

        default:
            if (!fGotToken)
            {
                DisplayUsage();
            }
            break;
        }
    } while (tkn != TKN_EOL);
}