//
// JAPI API(JmssThrowJob֐)
// JAPI I҂API(JmssWaitJobExit֐)
// JAPI WuL[ꗗ_CAO\API(JmssDispQueueDialog֐) TvvO
//  (C)NEC Corporation/NEC Soft, Ltd. 1995,2003
//
//    2003.7.26 Create by NEC Software
//

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mbstring.h>

#include "JMSS.H"

//
//  R}hFJCMD95EX
//  @\FWu𓊓Aɓłꍇ͓
//        WũWuԌ\AYWȕI҂
//        s܂B
//        eAPIŃG[ꍇɂ́AG[R[h
//        \܂B
//        ܂AWuL[ȗꂽɂ́AWuL[ꗗ
//        _CAO\܂B
//  FJCMD95EX [IvV] Wut@C [p[^]
//    EIvV ()͋Kl
//      /O[:̧ٖ]      Wo͊Ďw[㏑Ӱ](ĎȂ)
//      /A[:̧ٖ]      Wo͊Ďw[ǉӰ](ĎȂ)
//      /R:WuIʒm
//                   WuIƉʂɏIʒm\܂
//      /L:soߎԃ^CAEg()
//                   soߎԃ^CAEgw(lF܂)
//      /K:N/S/L     WűNw肵܂(lFwȂ)
//                     N wȂ
//                     S T[rXAJEgŋN
//                     L OI[UAJEgŋN
//      /Q:WuL[
//                   WuL[w肵܂
//                    (}V̎}VL[)
//      /P:R/H/N/I   Wus̗D揇ʂw肵܂
//                    (N:ʏs)
//                     R REALTIMEs
//                     H Ds
//                     N ʏs
//                     I IDLÊݎs
//      /T:Ɩ    Ɩw肵܂
//                    (Wut@CpXъgq
//                     )
//      /W:sfBNg
//                   WusƂ̃fBNg
//                   w肵܂(݂̃JgfBNg)
//      /?           ȈՃwv\܂B
//
//   IlF 0 I
//            1 ُI
//

//////////////////////////////////////////////////////////////
//  萔錾
//////////////////////////////////////////////////////////////

// R}hC̍ő咷
#define MAX_LINE_LENGTH             1024
// pX
#define MAX_PATH_LENGTH             256
// Ɩ
#define MAX_BUSINESSNAME_LENGTH     32
// Rs[^
#define MAX_COMPUTERNAME_LENGTH     15

//     g[N͗p萔
#define TOKEN_SEPARETOR1    ' '     // g[ÑZp[^P()
#define TOKEN_SEPARETOR2    '\t'    // g[ÑZp[^Q(^u)
#define TOKEN1              '\"'    // g[N͂ޕ

// IvV͗p萔
#define OPTION_PREFIX       '/'     // IvVw蕶
#define OPTION_SEPARETER    ':'     // IvVp[^Ƃ̃Zp[^

// IvV
#define OPTION_QUEUE        "Q"     // L[
#define OPTION_PRIORITY     "P"     // D揇
#define OPTION_WORK_DIR     "W"     // JgfBNg
#define OPTION_JOBNAME      "T"     // Ɩ
#define OPTION_REDIRECT     "O"     // Wo͊Ď
#define OPTION_VERBOSE      "V"     // Wu\
#define OPTION_HELP         "/?"        // wvIvV
#define OPTION_LIMIT        "L"     // ^CAEg
#define OPTION_APPEND       "A"     // Wo͊Ď(ǉ)
#define OPTION_OUTPUT       "O"     // Wo͊Ď(㏑)
#define OPTION_CODEFILE     "C"     // IR[ht@Cw
#define OPTION_TERMREPORT   "R"     // WuIʒm

//WuN
#define OPTION_EXECTYPE      "K"
#define EXECTYPE_NONE        "N"
#define EXECTYPE_SERVICE     "S"
#define EXECTYPE_LOGON       "L"

// D揇
#define PRIORITY_REAL       "R"     // D揇(REAL)
#define PRIORITY_HIGH       "H"     // D揇(HIGH)
#define PRIORITY_NORMAL     "N"     // D揇(NORMAL)
#define PRIORITY_IDLE       "I"     // D揇(IDLE)

// ֐̃G[R[h
#define JTHROW_ERROR_BADOPTION      2
#define JTHROW_ERROR_NOCOMMAND      3


//////////////////////////////////////////////////////////////
//  vg^Cv錾
//////////////////////////////////////////////////////////////

DWORD JSetOptionInfo(LPJMSSJOBTHROWINFOEX);
DWORD JAddDirSepareter(LPSTR, DWORD);
BOOL  PutStdOut(LPSTR);
char* JGetToken(char*, char**);
void  JShortenString(char*, DWORD);
BOOL  JCheckChildJob(VOID);
void  JPrintUsage(void);


//////////////////////////////////////////////////////////////
//  
//////////////////////////////////////////////////////////////

//
// C֐
//
//@F int  argc; R}hC̐
//         char argv; R}hC̕ւ
//                    |C^z
//
//@ԂlF 0 I
//           1 ُI
//
int main(
    int     argc,
    char    *argv[])
{
    JMSSJOBTHROWINFOEX    stJmssJobThrowInfo;         // Wu
    long                lJobNo;                     // WũWuԍ
    char                caJobNo[25];                // Wuԍ()
    DWORD               dwResult;                   // ֐߂l
    char                caMessage[MAX_PATH_LENGTH]; // bZ[W\pobt@

    // p[^Ȃ͊ȈՃwv\ďI
    if (argc == 1)
     {
        JPrintUsage();
        return 1;
      }

    // wvIvVw肳ꂽȈՃwv\
    if (argc == 2)
      {
        if (stricmp(argv[1], OPTION_HELP) == 0)
          {
            JPrintUsage();
            return JMSS_PARAM_ERROR;
          }
      }

    // Wȕ
    memset(&stJmssJobThrowInfo, 0, sizeof(JMSSJOBTHROWINFO));

    // IvVWJ
    dwResult = JSetOptionInfo(&stJmssJobThrowInfo);
    switch (dwResult)
      {
        case 0:                             // I
            break;
        case JTHROW_ERROR_BADOPTION:        // IvVG[
            PutStdOut("IvV̎w肪Ⴂ܂B\r\n");
            return 1;
        case JTHROW_ERROR_NOCOMMAND:        // WuwȂ
            PutStdOut("Wuw肳Ă܂B\r\n");
            return 1;
        default :
            return 1;
      }

    // WuNv
    dwResult = JmssThrowJobEx(
                NULL,                       // JMSST[o(gp)
                &stJmssJobThrowInfo,        // Wu\
                &lJobNo);                   // Wuԍi[GA

    // ֐̕ԋpR[h̔
    switch (dwResult)
      {
        case 0:                             // I
            break;
        case JMSS_SECURITY_NO_USE:          // JMSSpȂ
            wsprintf(caMessage, "݂̃[UJMSSp܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_NOGET_SERVERNAME:         // ftHgT[o擾s
            wsprintf(caMessage, "̃}VJMSST[o擾ł܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_SECURITY_NO_THROW:        // WuȂ
            wsprintf(caMessage, "݂̃[UɃWǔ܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_SECURITY_ERROR:           // ZLeB擾s
            wsprintf(caMessage, "WuɃZLeB̎擾Ɏs܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_NO_CONNECT:               // T[oڑs
            wsprintf(caMessage, "WuJMSST[oƐڑɎs܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_PARAM_ERROR:              // p[^G[
            wsprintf(caMessage, "w肵p[^słB(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_QUEUE_NOTFOUND:           // w肵WuL[Ȃ
            wsprintf(caMessage, "̃WuL[܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_QUEUE_FULL:               // ő哊I[o[(WuL[t)
            wsprintf(caMessage, "WuL[̍ő哊Wuz܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_QUEUE_CLOSED:             // L[N[Y
            wsprintf(caMessage, "WuL[Ă܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_NOT_ENOUGH_MEMORY:        // s
            wsprintf(caMessage, "WuɃs܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_PARENTJOB_TERMINATE:      // eWuI
            wsprintf(caMessage, "eWuÎߓł܂łB(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_POWEROFF_TERMINATE:       // dؒf
            wsprintf(caMessage, "dؒf̂ߓł܂łB(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_EXCLUSIVE_ERROR:      // r҂G[
            wsprintf(caMessage, "r҂̂ߓł܂łB(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        default:                            // ُ̑̈
            wsprintf(caMessage, "WuɎs܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
      }

    // Wu(Wuԍ)\
    wsprintf(caJobNo, "WuԍF%ld\r\n", lJobNo);
    PutStdOut(caJobNo);

    // WuI҂v
    dwResult = JmssWaitJobExit(
                NULL,                       // JMSST[o(gp)
                lJobNo,                     // I҂WũWuԍ
                NULL,                       // Wu\(gp)
                INFINITE);                  // ^CAEg(mS)

    // ֐̕ԋpR[h̔
    switch (dwResult)
      {
        case 0:                             // I
            break;
        case JMSS_NOGET_SERVERNAME:         // ftHgT[o擾s
            wsprintf(caMessage, "̃}VJMSST[o擾ł܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_NO_CONNECT:               // T[oڑs
            wsprintf(caMessage, "WuJMSST[oƐڑɎs܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_PARAM_ERROR:              // w肵p[^s
            wsprintf(caMessage, "w肵p[^słB(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_NO_JOB:                   // wWuԍȂ
            wsprintf(caMessage, "w肵Wuԍ̃Wu݂͑܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_SECURITY_NO_USE:          // JMSSpȂ
            wsprintf(caMessage, "݂̃[UJMSSp܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_SECURITY_NO_STOP:         // [UWuĎȂ
            wsprintf(caMessage, "݂̃[Uɑ[UĎ߁A[UWuI邱Ƃ͂ł܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_SECURITY_ERROR:           // ZLeB擾s
            wsprintf(caMessage, "WuɃZLeB̎擾Ɏs܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        case JMSS_TIMEOUT:                  // ^CAEg
            wsprintf(caMessage, "WuI҂Ƀ^CAEg܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
        default:                            // ُ̑̈
            wsprintf(caMessage, "WuI҂Ɏs܂B(G[R[h:%08lx)\r\n", dwResult);
            PutStdOut(caMessage);
            return 1;
      }

    return 0;
}

//
// ȈՃwv\
//
//@F Ȃ
//
//@ԂlF Ȃ
//
void JPrintUsage()
{
    PutStdOut("\r\ngp@FJCMD95EX.EXE [IvV] Wu [p[^ ...]\r\n\r\n");
    PutStdOut("@IvVFȉ̃IvVw\łB\r\n");
    PutStdOut("@@[/O[:̧ٖ]]      Wo͊Ďw(㏑Ӱ)\r\n");
    PutStdOut("@@[/A[:̧ٖ]]      Wo͊Ďw(ǉӰ)\r\n");
    PutStdOut("@@[/R]               WuIʒm(lFʒm܂)\r\n");
    PutStdOut("@@[/L:soߎԃ^CAEg()]\r\n");
    PutStdOut("@@                   soߎԃ^CAEgw(lF܂)\r\n");
    PutStdOut("    [/K:WuNw]@WűN\r\n");
    PutStdOut("@@@@@@@@@@S@T[rXAJEgŋN\r\n");
    PutStdOut("@@@@@@@@@@L@OI[UAJEgŋN\r\n");
    PutStdOut("@@[/Q:L[]  Wu𓊓L[(lFftHgL[)\r\n");
    PutStdOut("@@[/P:D揇]@@@Wu̗D揇\r\n");
    PutStdOut("@@@@@@@@@@@@@@@R@@A^CɎs\r\n");
    PutStdOut("@@@@@@@@@@@@@@@H@@Ds\r\n");
    PutStdOut("@@@@@@@@@@@@@@@N@@ʏs(l)\r\n");
    PutStdOut("@@@@@@@@@@@@@@@I@@ACĥݎs\r\n");
    PutStdOut("@@[/T:Ɩ]@@@@WűƖ(lFpXAgqȂ̃Wu)\r\n");
    PutStdOut("@@[/W:sfBNg]\r\n");
    PutStdOut("@@                 @Wus̃fBNg\r\n");
    PutStdOut("@@                   (lF݂̃JgfBNg)\r\n");
    PutStdOut("@Wu  F^pĎsWuw肵Ă\r\n");
    PutStdOut("@p[^FWuɗ^p[^w肵Ă\r\n");
    PutStdOut("@@@@@@@pXy[X^u܂߂Ƃ̓_uNH[g(\")ň͂ł\r\n");
    return;
}

//
// R}hC͂AIvVAR}h{p[^
// āAΉ郁oɊi[B
//
//@F
//      LPJMSSJOBTHROWINFO  lpJmssJobThrowInfo; Wu
//
//@ԂlF DWORD
//      TRUE  
//      FALSE G[
//
DWORD JSetOptionInfo(LPJMSSJOBTHROWINFOEX lpJmssJobThrowInfo)
{
    char    CommandLine[MAX_LINE_LENGTH+1];             // R}hCꎞi[p
    char*   lpcaNewToken;                               // Vg[Nւ̃|C^
    char*   lpcaNextToken;                              // ̃g[Nւ̃|C^
    char*   lpcaOptionParam;                            // IvṼp[^
    char    caJobQueueName[MAX_COMPUTERNAME_LENGTH+1];  // WuL[
    char    caMessage[MAX_PATH_LENGTH];                 // bZ[W\pobt@
    DWORD   dwResult;                                   // ֐߂l
    DWORD   dwValue;            // wl

    // lݒ
    lpJmssJobThrowInfo->dwPriority = JMSS_PRIORITY_NORMAL;
    lpJmssJobThrowInfo->dwSize     = sizeof(JMSSJOBTHROWINFO);

    // R}hC擾
    strcpy(CommandLine, GetCommandLine());

    // g[N؂o
    lpcaNewToken = CommandLine;

    // ŏ̃g[N͂̃R}h̃R}hȂ̂ŃpX
    lpcaNewToken = JGetToken(lpcaNewToken, &lpcaNextToken);
    lpcaNewToken = lpcaNextToken;

    // p[^w肳Ă
    if (lpcaNewToken != NULL)
      {

        // g[N؂oăIvVAR}h{p[^𔻕ʂ
        while ((lpcaNewToken = JGetToken(lpcaNewToken, &lpcaNextToken)) != NULL)
          {

            // IvVǂ̔
            if (lpcaNewToken[0] == OPTION_PREFIX)
              {

                // IvVp[^̕
                if ((lpcaOptionParam = _mbschr(&lpcaNewToken[1], OPTION_SEPARETER)) != NULL)
                  {
                    *lpcaOptionParam = '\0';
                    ++lpcaOptionParam;
                  }


                // eIvV̔
                // L[
                if (stricmp(&lpcaNewToken[1], OPTION_QUEUE) == 0)
                  {

                    if (lpcaOptionParam == NULL || *lpcaOptionParam == '\0') // L[NULLȂ
                      {
                        memset(&caJobQueueName, 0x00, MAX_COMPUTERNAME_LENGTH+1);

                        // WuL[ꗗ_CAO\
                        dwResult = JmssDispQueueDialog(
                                        NULL,               // JMSST[o(gp)
                                        NULL,               // eEBhEnh
                                        &caJobQueueName[0], // IL[
                                        "JTHROW");          // G[bZ[W\^Cg
                        // ֐߂l`FbN

                        switch (dwResult)
                          {
                            case 0:                         // I
                                break;

                            case JMSS_SECURITY_NO_USE:      // JMSSpȂ
                                wsprintf(caMessage, "݂̃[UJMSSp܂B(G[R[h:%08lx)\r\n", dwResult);
                                PutStdOut(caMessage);
                                return 1;

                            case JMSS_NOGET_SERVERNAME:     // ftHgT[o擾s
                                wsprintf(caMessage, "̃}VJMSST[o擾ł܂B(G[R[h:%08lx)\r\n", dwResult);
                                PutStdOut(caMessage);
                                return 1;

                            case JMSS_NO_CONNECT:           // T[oڑs
                                wsprintf(caMessage, "WuJMSST[oƐڑɎs܂B(G[R[h:%08lx)\r\n", dwResult);
                                PutStdOut(caMessage);
                                return 1;

                            case JMSS_PARAM_ERROR:          // w肵p[^s
                                wsprintf(caMessage, "w肵p[^słB(G[R[h:%08lx)\r\n", dwResult);
                                PutStdOut(caMessage);
                                return 1;

                            default:                        // ُ̑̈
                                wsprintf(caMessage, "WuL[ꗗ_CAO\Ɏs܂B(G[R[h:%08lx)\r\n", dwResult);
                                PutStdOut(caMessage);
                                return 1;
                          }
                        strcpy(lpJmssJobThrowInfo->caQueueName, caJobQueueName);
                      }

                    else
                      {
                        // L[̒`FbN
                        if (strlen(lpcaOptionParam) == 0
                            || strlen(lpcaOptionParam) > MAX_COMPUTERNAME_LENGTH)
                          {
                            return JTHROW_ERROR_BADOPTION;
                          }
                        strcpy(lpJmssJobThrowInfo->caQueueName, lpcaOptionParam);
                      }
                }
                //D揇
                else if (stricmp(&lpcaNewToken[1], OPTION_PRIORITY) == 0){
                        if (lpcaOptionParam == NULL)
                          {
                            return JTHROW_ERROR_BADOPTION;
                          }
                        if (stricmp(lpcaOptionParam, PRIORITY_REAL) == 0)
                          {
                            lpJmssJobThrowInfo->dwPriority = JMSS_PRIORITY_REAL;
                          }
                        else
                          {
                            if (stricmp(lpcaOptionParam, PRIORITY_HIGH) == 0)
                              {
                                lpJmssJobThrowInfo->dwPriority = JMSS_PRIORITY_HIGH;
                              }
                            else
                              {
                                if (stricmp(lpcaOptionParam, PRIORITY_NORMAL) == 0)
                                  {
                                    lpJmssJobThrowInfo->dwPriority = JMSS_PRIORITY_NORMAL;
                                  }
                                else
                                  {
                                    if (stricmp(lpcaOptionParam, PRIORITY_IDLE) == 0)
                                      {
                                        lpJmssJobThrowInfo->dwPriority = JMSS_PRIORITY_IDLE;
                                      }
                                    else
                                      {
                                        return JTHROW_ERROR_BADOPTION;
                                      }
                                  }
                              }
                          }
                      }
                // JgfBNg
                else if (stricmp(&lpcaNewToken[1], OPTION_WORK_DIR) == 0){
                            if (lpcaOptionParam == NULL)
                              {
                                return JTHROW_ERROR_BADOPTION;
                              }
                            // JgfBNg̒`FbN
                            if (strlen(lpcaOptionParam) == 0
                                || strlen(lpcaOptionParam) > MAX_PATH_LENGTH)
                              {
                                return JTHROW_ERROR_BADOPTION;
                              }
                            strcpy(lpJmssJobThrowInfo->caExecDir, lpcaOptionParam);

                            JAddDirSepareter(
                                        lpJmssJobThrowInfo->caExecDir,
                                        sizeof(lpJmssJobThrowInfo->caExecDir));
                     }
                // Wu(Ɩ)
                else if (stricmp(&lpcaNewToken[1], OPTION_JOBNAME) == 0){
                        if (lpcaOptionParam == NULL)
                          {
                            return JTHROW_ERROR_BADOPTION;
                          }
                        // Wu(Ɩ)̒`FbN
                        if (strlen(lpcaOptionParam) == 0
                            || strlen(lpcaOptionParam) > MAX_BUSINESSNAME_LENGTH)
                          {
                            return JTHROW_ERROR_BADOPTION;
                          }
                        strcpy(lpJmssJobThrowInfo->caJobName, lpcaOptionParam);
                     }
                // Wo͊Ďw(㏑[h)
                else if (stricmp(&lpcaNewToken[1], OPTION_OUTPUT) == 0) {         //"O"
                        if (lpJmssJobThrowInfo->fWatchStdout == 0) {
                            if (lpcaOptionParam == NULL) {
                                lpJmssJobThrowInfo->fWatchStdout = 1;
                            } else {
                                if (lstrlen(lpcaOptionParam) == 0) {
                                    lpJmssJobThrowInfo->fWatchStdout = 1;
                                } else {
                                    if (lstrlen(lpcaOptionParam) <= 256) {          //  256 ȉH
                                        lpJmssJobThrowInfo->fWatchStdout = 3;
                                        strcpy(lpJmssJobThrowInfo->caStdoutFile, lpcaOptionParam);
                                    } else {
                                        return JTHROW_ERROR_BADOPTION;
                                    }
                                }
                            }
                        }
                     }
                // Wo͊Ďw(ǉ[h)
                else if (stricmp(&lpcaNewToken[1], OPTION_APPEND) == 0) {         //"A"
                        if (lpJmssJobThrowInfo->fWatchStdout == 0) {
                            if (lpcaOptionParam == NULL) {
                                lpJmssJobThrowInfo->fWatchStdout = 2;
                            } else {
                                if (lstrlen(lpcaOptionParam) == 0) {
                                    lpJmssJobThrowInfo->fWatchStdout = 2;
                                } else {
                                    if (lstrlen(lpcaOptionParam) <= 256) {          //  256 ȉH
                                        lpJmssJobThrowInfo->fWatchStdout = 4;
                                        strcpy(lpJmssJobThrowInfo->caStdoutFile, lpcaOptionParam);
                                    } else {
                                        return JTHROW_ERROR_BADOPTION;
                                    }
                                }
                            }
                        }
                     }
                // ^CAEg
                else if (stricmp(&lpcaNewToken[1], OPTION_LIMIT) == 0) {        //"L"
                        if (lpcaOptionParam == NULL) {
                            return JTHROW_ERROR_BADOPTION;
                        }
                        if (strlen(lpcaOptionParam) == 0                           // `FbN
                            || strlen(lpcaOptionParam) > 10) {                     //  10 𒴁H
                            return JTHROW_ERROR_BADOPTION;
                        }
                        if (lpJmssJobThrowInfo->dwMaxElapseTime == 0) {
                            sscanf(lpcaOptionParam, "%lu", &dwValue);
                            if (dwValue > 32767) {                                 // l 32767 𒴁H
                                return JTHROW_ERROR_BADOPTION;
                            }
                            lpJmssJobThrowInfo->dwMaxElapseTime = dwValue;
                        }
                     }
                // WuN	Add for Ver7.1 2008.05.12
                else if (stricmp(&lpcaNewToken[1], OPTION_EXECTYPE) == 0) {        //"K"
                        if (lpcaOptionParam == NULL) {
                            lpJmssJobThrowInfo->wExecType = 0;
                        }
                        else if (strlen(lpcaOptionParam) == 0  ) {                     // `FbN
                            lpJmssJobThrowInfo->wExecType = 0;
                        }
                        else if (stricmp(lpcaOptionParam, EXECTYPE_NONE) == 0){
                            lpJmssJobThrowInfo->wExecType = 0;
                        }
                        else if (stricmp(lpcaOptionParam, EXECTYPE_SERVICE) == 0){
                            lpJmssJobThrowInfo->wExecType = 1;
                        }
                        else if ( stricmp(lpcaOptionParam, EXECTYPE_LOGON) == 0){
                            lpJmssJobThrowInfo->wExecType = 2;
                        }
                        else{
	                        return JTHROW_ERROR_BADOPTION;
                        }
                     }
                // WuIʒm
                else if (stricmp(&lpcaNewToken[1], OPTION_TERMREPORT) == 0) {        //"R"
                        lpJmssJobThrowInfo->dwTermReport = 1;
                     }
                else
                    {
                        return JTHROW_ERROR_BADOPTION;
                    }
              }
            else
              {
                // WuȂ̂Ŏc̕Wuƃp[^
                // Ċi[

                // g[NWuƂ
                if (strlen(lpcaNewToken) == 0
                    || strlen(lpcaNewToken) > MAX_PATH_LENGTH)
                  {
                    return JTHROW_ERROR_NOCOMMAND;
                  }
                strcpy(lpJmssJobThrowInfo->caJobPath, lpcaNewToken);

                // ̃g[Nȍ~͑Săp[^ƔfĊi[
                if (lpcaNextToken != NULL)
                  {
                    strcpy(lpJmssJobThrowInfo->caJobParam, lpcaNextToken);
                  }
                return 0;
              }

            // ̃g[N̐擪؂og[N̐擪Ƃ
            lpcaNewToken = lpcaNextToken;
        }
    }

    // R}hw肳ĂȂ
    return JTHROW_ERROR_NOCOMMAND;
}

//
// JgfBNgA_CNgfBNg̍Ō'\\'
// ǉB
//
//@F
//      LPSTR   pDir;       fBNgi[̈ւ̃|C^
//      DWORD   dwBufSize;  fBNgi[̈̑傫
//
//@ԂlF DWORD
//      TRUE  
//      FALSE G[
//
DWORD JAddDirSepareter(LPSTR pDir, DWORD dwBufSize)
{
    DWORD   dwDirLen;

    if (pDir != NULL)
      {
        dwDirLen = strlen(pDir);
        if (dwDirLen > 0 && dwDirLen < dwBufSize)
          {
            if (pDir[dwDirLen-1] != '\\')
              {
                strcat(pDir, "\\");
              }
          }
      }
    return TRUE;
}

//
// g[N؂oÃg[Nւ̃|C^ԂB
//
//@F
//      char*   String; g[N؂o
//      char**  String; ̃g[Nւ̃|C^
//
//@ԂlF char *
//      NULL        ̃g[N͂Ȃ(̍Ō)
//      ̑      ݂̃g[Nւ̃|C^
//
char* JGetToken(char* String, char** NextString)
{
    char*   pToken; // g[N̐擪

    if (String == NULL)
      {
        *NextString = NULL;
        return NULL;
      }

    // ̃g[No܂Ŕ΂
    while (*String != '\0' && (*String == TOKEN_SEPARETOR1 || *String == TOKEN_SEPARETOR2))
        ++String;

    // g[N̍ŏ̕'\0'ȂNULLŏI
    if (*String == '\0')
      {
        return NULL;
      }

    pToken = String;    // g[N̐擪ۑ

    // g[ÑZp[^o܂ŕ΂
    while (*String != '\0' && *String != TOKEN_SEPARETOR1 && *String != TOKEN_SEPARETOR2)
      {
        if (*String == TOKEN1)
          {
            JShortenString(String, 1);  // TOKEN1̕A߂
            while (*String != '\0' && *String != TOKEN1)
              {
                ++String;
              }
            if (*String == TOKEN1)
              {
                JShortenString(String, 1);  // TOKEN1̕A߂
                continue;                   // ߂̂ŁACNgKv
              }
          }
        ++String;
      }

    switch (*String)
      {
        case    '\0':
            if (NextString != NULL)
                *NextString = NULL;
            return pToken;
        case    TOKEN_SEPARETOR1:
        case    TOKEN_SEPARETOR2:
            *String = '\0';
            if (NextString != NULL)
                *NextString = String+1;
            return pToken;
        default:
            return pToken;
      }
}

//
// w蕶A擪當߂
//
//@F
//      char *  String; 
//      DWORD   count;  ߂镶
//
//@ԂlF Ȃ
//
void JShortenString(char* pStr, DWORD Count)
{
    while(*pStr = *(pStr+Count))
        ++pStr;
}

//
// Wo͂Ɏw肳ꂽo͂
//
//@F
//      LPSTR   pStr;   
//
//@ԂlF TRUE  I
//           FALSE ُI
//
BOOL PutStdOut(LPSTR pStr)
{
    DWORD   WriteLength;

    if (WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),      // Wo̓nh
                    (LPVOID)pStr,                       // f[^obt@AhX
                    strlen(pStr),                       // f[^
                    &WriteLength,                       // ܂ꂽoCg
                    NULL) == FALSE)                     // dI/OɕKvȍ\̂̃AhX
        return FALSE;

    if (strlen(pStr) != WriteLength)
        return FALSE;

    return TRUE;
}
