//
// JAPI p[^tCxgMAPI(JmssSendEventEx֐) 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 <string.h>
#include <wchar.h>
#include "jmss.h"

//
//  R}hFJSNDEVNTEX
//  @\Fw肵hC̎w肵JMSST[oƂ̃NCAg
//        ɃCxg𑗐M܂B
//        Cxg̑M瑗MJMSST[oA
//        MWuL[ACxgIDAbZ[W
//        Wo͂ɏo͂܂B
//        (IvVɂ\Ȃł܂B)
//        APIŃG[ꍇɂ́AG[R[h
//        \܂B
//  FJRECEVNTEX [IvV] Cxghc
//    EIvV ()͊l
//      /N           Wo͂ɏo͂܂B
//		/S:JMSST[o
//                   MJMSST[ow肵܂B
//					  (ftHgJMSST[oƂȂ܂)
//		/Q:WuL[
//                   MWuL[w肵܂
//					  (JMSST[oɐڑĂSẴ}VɑM܂)
//		/P:ϐ=l
//                   JSchedulẽCxgNWu[Ɩ]A[p[^]
//                   ɐݒ肳Ăuu$ϐ$vulvɕϊ
//					 ܂Bݒ肷邱Ƃł܂B
//                   /PIvVŜ1024oCg܂Őݒ肷邱Ƃł܂B
//		/?           ȈՃwv\܂B
//
//	 IlF 0 I
//			  1 ُI
//

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

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

// IvV
#define	OPTION_NOLOGO		"/N"		// Wo͂Ȃ
#define	OPTION_SERVER		"/S"		// T[o
#define	OPTION_QUEUE		"/Q"		// WuL[
#define	OPTION_PARAM		"/P:"		// p[^
#define	OPTION_HELP			"/?"		// wvIvV

// CxgID
#define	MAX_EVENT_ID_LENGTH			4
// Rs[^
#define	MAX_COMPUTERNAME_LENGTH		15
// [U
#define	MAX_USERNAME_LENGTH			40
// bZ[W
#define	MAX_MESSAGE_LENGTH			128

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

BOOL  PutStdOut(LPSTR);
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)
{
	char		caServerName[MAX_COMPUTERNAME_LENGTH + 1]; 		// MJMSST[o
	char		caQueueName[MAX_COMPUTERNAME_LENGTH + 1];		// MWuL[
	char		caEventID[MAX_EVENT_ID_LENGTH + 1];             // CxgID
	char		caMessage[MAX_MESSAGE_LENGTH + 1];              // bZ[W
	char		caMsg[2048];                                    // Wo͗pobt@
	BOOL		bErr     = FALSE;	    // p[^G[tO
	BOOL		bNologo  = FALSE;		// Wo͂ȂtO
	BOOL		bServer  = FALSE;       // MT[owLtO
	BOOL		bQueue   = FALSE;       // MWuL[wLtO
	BOOL		bEvent   = FALSE;       // CxgwLtO
	BOOL		bMessage = FALSE;		// bZ[WwtO
	DWORD		dwResult;               // ֐߂l
	int			i;                  	// ėpJE^
	DWORD		j;                      // ėpJE^
	DWORD		dwLen;					// p[NGA
	LONG		lJobNo;                 // Wuԍ
	LPSTR		lpsp;                   // ėp|C^
	LPSTR		lpcaServerName;         // Wo͗pJMSST[oAhX
	LPSTR		lpcaQueueName;          // Wo͗pWuL[AhX
	LPSTR		lpcaMessage;            // Wo͗pbZ[WAhX
	char		caParam[1024];			// p[^
	LPSTR		lpcaParam = caParam;	// p[^ւ̃|C^
	BOOL		bParam	= FALSE;		// p[^tO

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

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

	// p[^
	for (i = 1; i < argc; i++)
	  {
		// Wo͎wIvV`FbN
		if (!stricmp(argv[i], OPTION_NOLOGO))
		  {
			bNologo = TRUE;
		  }
		else
		  {
			// MJMSST[o`FbN
			if (!strnicmp(argv[i], OPTION_SERVER, 2))
			  {
				lpsp = strchr(argv[i], OPTION_SEPARETER);
				if (lpsp == NULL)
				  {
				  	// p[^G[ݒ
					bErr = TRUE;
					break;
				  }
				lpsp++;
				// MJMSST[oݒ
				strcpy(caServerName, lpsp);
				// MJMSST[owL
				bServer = TRUE;
			  }
			else
			  {
				// ML[`FbN
				if (!strnicmp(argv[i], OPTION_QUEUE, 2))
				  {
					lpsp = strchr(argv[i], OPTION_SEPARETER);
					if (lpsp == NULL)
					  {
					  	// p[^G[ݒ
						bErr = TRUE;
						break;
					  }
					lpsp++;
					// MWuL[ݒ
					strcpy(caQueueName, lpsp);
					// MWuL[w肠
					bQueue = TRUE;
				  // p[^
				  } else if (!strnicmp(argv[i], OPTION_PARAM, 3)){
						lpsp = strchr(argv[i], ':');
						lpsp++;

						// `FbN
						if ((lpcaParam - caParam) + strlen(lpsp) >= 1024){
							bErr = TRUE;
							break;
						}

						strcpy(lpcaParam, lpsp);
						lpcaParam += strlen(lpcaParam) + 1;
						bParam = TRUE;
				  }	
				else
				  {
					// CxgID`FbN
					if (!bEvent)
					  {
						// `FbN
						dwLen = strlen(argv[i]);
						if (dwLen > MAX_EVENT_ID_LENGTH)
						  {
						  	// p[^G[ݒ
							bErr = TRUE;
							break;
						  }
						// p`FbN
						for (j = 0; j < dwLen; j++)
						  {
							if (!iswalnum(argv[i][j]))
							// p[^G[ݒ
							bErr = TRUE;
						  }
						if (bErr)
						  break;
						// CxgIDݒ
						caEventID[MAX_EVENT_ID_LENGTH] = 0;
						memset(caEventID, ' ', MAX_EVENT_ID_LENGTH);
						memcpy(caEventID, argv[i], dwLen);
						// CxgIDw肠
						bEvent = TRUE;
					  }
					else
					  {
						// bZ[W`FbN
						if (!bMessage)
						  {
							// `FbN
							dwLen = strlen(argv[i]);
							if (dwLen > MAX_MESSAGE_LENGTH)
							  dwLen = MAX_MESSAGE_LENGTH;
							// bZ[Wݒ
							caMessage[MAX_MESSAGE_LENGTH] = 0;
							memset(caMessage, ' ', MAX_MESSAGE_LENGTH);
							memcpy(caMessage, argv[i], dwLen);
							bMessage = TRUE;
						  }
						else
						  {
							// ]vȃp[^
							bErr = TRUE;
							break;
						  }
					  }
				  }
			  }
		  }
	  }

	if (bErr)
	  {
		caMsg[0] = 0;
		wsprintf(caMsg, "w肵p[^słB(G[R[h:%08lx)\r\n", JMSS_PARAM_ERROR);
		PutStdOut(caMsg);
		return 1;
	  }

	// CxgMAPIp[^ݒ
	// MJMSST[oݒȂH
	if (!bServer)
	  {		//YES
	  	// ftHgJMSST[o擾(JmssCurrentJobNo֐gp[Wo͂֕\邽])
		if (JmssCurrentJobNo(caServerName, &lJobNo) == JMSS_NOGET_SERVERNAME)
			bErr = TRUE;
		else
			lpcaServerName = caServerName;
	  }
	else	// NO
	  lpcaServerName = caServerName;

	if (bErr)
	  {
		caMsg[0] = 0;
		wsprintf(caMsg, "w肵p[^słB(G[R[h:%08lx)\r\n", JMSS_PARAM_ERROR);
		PutStdOut(caMsg);
		return 1;
	  }

	// MWuL[ݒ
	lpcaQueueName = (bQueue) ? caQueueName : NULL;
	// bZ[Wݒ
	lpcaMessage     = (bMessage) ? caMessage : NULL;
	// p[^ݒ
	lpcaParam     = (bParam) ? caParam : NULL;

	// CxgMAPIĂяo
	dwResult = JmssSendEventEx(
					lpcaServerName,			// MJMSST[o
					lpcaQueueName,          // MWuL[
					caEventID,              // MCxgID
					lpcaMessage,            // MbZ[W
					lpcaParam);				// p[^
	if (dwResult != 0)
	  {
		switch(dwResult)
		  {
			case JMSS_PARAM_ERROR:				// p[^G[
				wsprintf(caMsg, "w肵p[^słB(G[R[h:%08lx)\r\n", dwResult);
				PutStdOut(caMsg);
				break;
			case JMSS_NOGET_SERVERNAME:			// ftHgT[o擾s
				wsprintf(caMsg, "̃}VJMSST[o擾ł܂B(G[R[h:%08lx)\r\n", dwResult);
				PutStdOut(caMsg);
				break;
			case JMSS_NO_CONNECT:				// T[oڑs
				wsprintf(caMsg, "CxgMJMSST[oƂ̐ڑɎs܂B(G[R[h:%08lx)\r\n", dwResult);
				PutStdOut(caMsg);
				break;
			default:							// ُ̑̈
				wsprintf(caMsg, "CxgMɎs܂B(G[R[h:%08lx)\r\n", dwResult);
				PutStdOut(caMsg);
                   break;
			}
		return 1;
	  }

	// Wo
	if (!bNologo)
	  {
		strcpy(caMsg, "MJMSST[o   : ");
		strcat(caMsg, caServerName);
		strcat(caMsg, "\r\n");

		strcat(caMsg, "MWuL[ : ");
		strcat(caMsg, (bQueue) ? caQueueName : "ALL");
		strcat(caMsg, "\r\n");

		strcat(caMsg, "MCxgID       : ");
		strcat(caMsg, caEventID);
		strcat(caMsg, "\r\n");

		strcat(caMsg, "MbZ[W       : ");
		if (bMessage)
			strcat(caMsg, caMessage);
		strcat(caMsg, "\r\n");

		PutStdOut(caMsg);
	}

	return 0;
}

//
// ȈՃwv\
//
//@F Ȃ
//
//@ԂlF Ȃ
//
void JPrintUsage()
{
	PutStdOut("\r\ngp@FJSNDEVNTEX.EXE [IvV] Cxghc [bZ[W]\r\n\r\n");
	PutStdOut("@IvVFȉ̃IvVw\łB\r\n");
	PutStdOut("@@[/N]@@@@@@@        Wo͂Ȃw(lFWo͂܂)\r\n");
	PutStdOut("@@[/S:MJMSST[o]   MJMSST[ow肵܂B\r\n");
	PutStdOut("@@@@@@@@@@@@@    (lFftHgJMSST[oƂȂ܂B)\r\n");
	PutStdOut("@@[/Q:MWuL[] MWuL[w肵܂\r\n");
	PutStdOut("@@@@@                    (lFJMSST[oĎĂSĂ\r\n");
	PutStdOut("@@@@@                     Wuғ}VɑM܂B)\r\n");
	PutStdOut("@@[/P:ϐ=\"l\"]@@@@@JSchedulẽCxgNWu[Ɩ]A\r\n");
	PutStdOut("@@@@@                    [p[^]ɐݒ肳Ău\r\n");
	PutStdOut("@@@@@                    $ϐ$lɕϊ܂Bݒ肷邱Ƃ\r\n");
	PutStdOut("@@@@@                    ł܂B)\r\n");
	PutStdOut("@Cxghc  FMCxgID4oCgȓ̕Ŏw肵Ă\r\n");
	PutStdOut("@@              (͉p݂̂łB)\r\n");
	PutStdOut("@[bZ[W]  FCxgƈꏏɑM郁bZ[W128oCgȓ\r\n");
	PutStdOut("@@@@@@@@@Ŏw肵ĂB\r\n");
	return;
}

//
// 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;
}
