//
// JAPI sAPI(JmssControlJob֐) TvvO
//  (C)NEC Corporation/NEC Soft, Ltd. 1995,2003
//  
//    2003.7.26 Create by NEC Soft, Ltd.
//

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mbstring.h>
#include "JMSS.H"

//
//  R}hFJCONTROL
//  @\Fw肵Wuԍ̃Wu̎s(IAꎞ~AĊJ)
//        s܂B
//        ɐłꍇ͐IbZ[W\܂B
//        G[ꍇɂ́AG[R[h\܂B
//  FJCONTROL [IvV] Wuԍ
//@@EIvV ()͋Kl
//		/C:A/S/R/H/L/D/P/C     Wu̎s̎ނw肵܂
//					   A:I
//					   S ꎞ~
//					   R ĊJ
//					   H ۗ
//					   L ۗ
//					   D o^폜
//					   P ~
//					   C p
//
//	 IlF 0      I
//			  0 ȊO ُI
//

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

// R}hC̍ő咷
#define	MAX_LINE_LENGTH	1024

//     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_CONTROL		"C"		// s̎

// s̎
#define	CONTROL_TERMINATE	"T"		// s(I)
#define	CONTROL_SUSPEND		"S"		// s(ꎞ~)
#define	CONTROL_RESUME		"R"		// s(ĊJ)
#define	CONTROL_HOLD		"H"		// s(ۗ)
#define	CONTROL_RELEASE		"L"		// s(ۗ)
#define	CONTROL_DELETE		"D"		// s(o^폜)
#define	CONTROL_STOP		"P"		// s(~)
#define	CONTROL_CONTINUE	"C"		// s(p)

// ֐̃G[R[h
#define	JCTRL_ERROR_BADOPTION	2
#define	JCTRL_ERROR_NOCOMMAND	3


//////////////////////////////////////////////////////////////
//	\̐錾
//////////////////////////////////////////////////////////////
typedef	struct s_CtrlJobInfotag
  {
	DWORD		dwCtrlMode;			// vs̎
	LONG		lJobNo;				// Wuԍ
  } SS_CTRLJOBINFO, *SP_CTRLJOBINFO, far * SLP_CTRLJOBINFO;


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

DWORD JSetOptionInfo(SLP_CTRLJOBINFO); 
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[])
{
	SS_CTRLJOBINFO		ssCtrlJobInfo;	// s
	DWORD				dwResult;	// ֐l
	char				caMessage[256];

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

	// IvVWJ
	dwResult = JSetOptionInfo(&ssCtrlJobInfo);
	switch (dwResult) {
		case 0:		// I
			break;
		case JCTRL_ERROR_BADOPTION:
			PutStdOut("IvV̎w肪Ⴂ܂B\r\n");
			return 1;
		case JCTRL_ERROR_NOCOMMAND:
			PutStdOut("Wuԍw肳Ă܂B\r\n");
			return 1;
	}

	// Wus
	dwResult = JmssControlJob(
				"",
				ssCtrlJobInfo.dwCtrlMode,
				ssCtrlJobInfo.lJobNo);

	// ֐̕ԋpR[h̔
	switch (dwResult) {
		case 0:		// I
			switch (ssCtrlJobInfo.dwCtrlMode) {
				case JMSS_CONTROL_TERMINATE:	// I
					PutStdOut("WuI܂B\r\n");
					break;
				case JMSS_CONTROL_SUSPEND:		// ꎞ~
					PutStdOut("Wuꎞ~܂B\r\n");
					break;
				case JMSS_CONTROL_RESUME:		// ĊJ
					PutStdOut("WuĊJ܂B\r\n");
					break;
				case JMSS_CONTROL_HOLD:			// ۗ
					PutStdOut("Wuۗɂ܂B\r\n");
					break;
				case JMSS_CONTROL_RELEASE:		// ۗ
					PutStdOut("Wuۗ܂B\r\n");
					break;
				case JMSS_CONTROL_DELETE:		// o^폜
					PutStdOut("Wuo^폜܂B\r\n");
					break;
				case JMSS_CONTROL_STOP:			// ~
					PutStdOut("Wu~܂B\r\n");
					break;
				case JMSS_CONTROL_CONTINUE:		// p
					PutStdOut("Wup܂B\r\n");
					break;
			}
			break;
		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_NOGET_SERVERNAME:	// ftHgT[o擾s
			wsprintf(caMessage, "̃}VJMSST[o擾ł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_PARAM_ERROR:	// p[^s
			wsprintf(caMessage, "w肵p[^słB(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_JOB:		// ݂ȂWuԍ
			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:	// [UĎȂ
			wsprintf(caMessage, "݂̃[Uɑ[UĎ܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_TERMINATE:		// IłȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͋Ił܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NOT_JOBNET:		// WulbgłȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu̓Wulbgł͂܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_PAUSE:			// ꎞ~łȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͈ꎞ~ł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_RESTART:		// ĊJłȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͍ĊJł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_HOLD:			// ۗɂłȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͕ۗɂł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_RELEASE:		// ۗłȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͕ۗł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_DELETE:		// o^폜łȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͓o^폜ł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_STOP:			// ~łȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͒~ł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		case JMSS_NO_CONTINUE:		// płȂ
			wsprintf(caMessage, "w肵Wuԍ̃Wu͌pł܂B(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
		default:	// ُ̑̈
			wsprintf(caMessage, "Wusł܂łB(G[R[h:%08lx)\r\n", dwResult);
			PutStdOut(caMessage);
			return 1;
	}
	

	return 0;
}

//
// ȈՃwv\
//
//@F Ȃ
//
//@ԂlF Ȃ
//
void JPrintUsage()
{
	PutStdOut("\r\ngp@FJCONTROL.EXE [IvV] Wuԍ\r\n\r\n");
	PutStdOut("@IvVFȉ̃IvVw\łB\r\n");
	PutStdOut("@@[/C:s]@@Wu̎s\r\n");
	PutStdOut("@@@@@@@@@@@@@@@T@@@I(l)\r\n");
	PutStdOut("@@@@@@@@@@@@@@@S@@@ꎞ~\r\n");
	PutStdOut("@@@@@@@@@@@@@@@R@@@ĊJ\r\n");
	PutStdOut("@@@@@@@@@@@@@@@H@@@ۗ\r\n");
	PutStdOut("@@@@@@@@@@@@@@@L@@@ۗ\r\n");
	PutStdOut("@@@@@@@@@@@@@@@D@@@o^폜\r\n");
	PutStdOut("@@@@@@@@@@@@@@@P@@@~\r\n");
	PutStdOut("@@@@@@@@@@@@@@@C@@@p\r\n");
	PutStdOut("@WuԍFssWũWuԍw肵Ă\r\n");
}

//
// R}hC͂AIvVAR}h{p[^
// āAΉ郁oɊi[B
//
//@F Ȃ
//
//@ԂlF DWORD
//		TRUE  
//		FALSE G[
//
DWORD JSetOptionInfo(SLP_CTRLJOBINFO slpCtrlJobInfo)
{
	char	CommandLine[MAX_LINE_LENGTH+1];	// R}hCꎞi[p
	char*	lpcaNewToken;					// Vg[Nւ̃|C^
	char*	lpcaNextToken;					// ̃g[Nւ̃|C^
	char*	lpcaOptionParam;				// IvṼp[^

	// lݒ
	slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_TERMINATE;

	// 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ăIvVAWuԍ𔻕ʂ
		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̔
				// s
				if (stricmp(&lpcaNewToken[1], OPTION_CONTROL) == 0) {
					if (lpcaOptionParam == NULL) {
						return JCTRL_ERROR_BADOPTION;
					}
					if (stricmp(lpcaOptionParam, CONTROL_TERMINATE) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_TERMINATE;
					} else if (stricmp(lpcaOptionParam, CONTROL_SUSPEND) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_SUSPEND;
					} else if (stricmp(lpcaOptionParam, CONTROL_RESUME) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_RESUME;
					} else if (stricmp(lpcaOptionParam, CONTROL_HOLD) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_HOLD;
					} else if (stricmp(lpcaOptionParam, CONTROL_RELEASE) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_RELEASE;
					} else if (stricmp(lpcaOptionParam, CONTROL_DELETE) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_DELETE;
					} else if (stricmp(lpcaOptionParam, CONTROL_STOP) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_STOP;
					} else if (stricmp(lpcaOptionParam, CONTROL_CONTINUE) == 0) { 
						slpCtrlJobInfo->dwCtrlMode = JMSS_CONTROL_CONTINUE;
					} else {
						return JCTRL_ERROR_BADOPTION;
					}
				}
			} else {
				// WuԍȂ̂ŐlɕϊĊi[

				// g[NWuԍƂ
				if (strlen(lpcaNewToken) == 0
					|| strlen(lpcaNewToken) > 256) {
					return JCTRL_ERROR_NOCOMMAND;
				}
				slpCtrlJobInfo->lJobNo = atol(lpcaNewToken);

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

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

//
// 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;
	}
	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),
					(LPVOID)pStr,
					strlen(pStr),
					&WriteLength,
					NULL) == FALSE)
		return FALSE;

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

	return TRUE;
}
