//
// JAPI CxgMAPI(JmssRecieveEvent֐) 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}hFJRECEVNT
//  @\Fw肵CxgID̃Cxg̎M҂s܂B
//        Cxg̎M҂瑗MJMSST[oA
//        M}VA[UACxgIDAbZ[W
//        Wo͂ɏo͂܂B
//        (IvVɂ\Ȃł܂B)
//        APIŃG[ꍇɂ́AG[R[h
//        \܂B
//  FJRECEVNT [IvV] Cxghc
//    EIvV ()͊l
//      /N           Wo͂ɏo͂܂B
//		/T:^CAEg(b)
//                   M҂܂ł̎Ԃw肵܂B
//					  (ɑ҂܂)
//		/?           ȈՃwv\܂B
//
//	 IlF 0 I
//			  1 ُI
//

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

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

// IvV
#define	OPTION_NOLOGO		"/N"		// Wo͂Ȃ
#define	OPTION_TIMEOUT		"/T"		// ^CAEgƖ
#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		caEventID[MAX_EVENT_ID_LENGTH + 1];				// M҂CxgID
	char		caServerName[MAX_COMPUTERNAME_LENGTH + 1];      // MJMSST[ö
	char		caMachineName[MAX_COMPUTERNAME_LENGTH + 1];     // M}V̈
	char		caUserName[MAX_USERNAME_LENGTH + 1];            // M[Ü
	char		caMessage[MAX_MESSAGE_LENGTH + 1];              // bZ[Ẅ
	char		caRecvEventID[MAX_EVENT_ID_LENGTH + 1];         // MCxgID̈
	char		caMsg[1024];                                    // Wo͗pobt@
	BOOL		bErr     = FALSE;		// p[^G[tO
	BOOL		bNologo  = FALSE;		// Wo͎w薳tO
	BOOL		bEvent   = FALSE;       // CxgwLtO
	int			i;                      // [NJE^
	DWORD		j;                      // [NJE^
	DWORD		dwLen;					// Cxg
	DWORD		dwResult;				// ֐߂l
	DWORD		dwTimeout = INFINITE;   // ^CAEgl
	LPSTR		lpsp;                   // [N|C^

	// 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
		  {	// ^CAEgIvV`FbN
			if (!strnicmp(argv[i], OPTION_TIMEOUT, 2))
			  {
			  	// Zp[^`FbN
				lpsp = strchr(argv[i], OPTION_SEPARETER);
				if (lpsp == NULL)
				  {
				  	// G[ݒ
					bErr = TRUE;
					break;
				  }
				lpsp++;
				// ^CAEglݒ
				sscanf(lpsp, "%d", &dwTimeout);
			  }
			else
			  {
				// Cxghc`FbN
				if (!bEvent)
				  {
					// `FbN
					dwLen = strlen(argv[i]);
					if (dwLen > MAX_EVENT_ID_LENGTH)
					  {
					  	// G[ݒ
						bErr = TRUE;
						break;
					  }

					// "*"`FbN
					if (!strcmp(argv[i], "*"))
					  {
					  	// CxgIDݒ
						strcpy(caEventID, argv[i]);
					  }
					else
					  {
						// p`FbN
						for (j = 0; j < dwLen; j++)
						  {
							if (!iswalnum(argv[i][j]))
							  {
							  	// G[ݒ
								bErr = TRUE;
								break;
							  }
						  }
                        // G[ȂG[
						if (bErr)
						  break;

                        // Cxg̐ݒ
						caEventID[MAX_EVENT_ID_LENGTH] = 0;
						memset(caEventID, ' ', MAX_EVENT_ID_LENGTH);
						memcpy(caEventID, argv[i], dwLen);
					  }
					bEvent = TRUE;
				  }
				else
			      {
					bErr = TRUE;
					break;
				  }
			  }
		  }
	  }

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

	// CxgM҂APIĂяo
	dwResult = JmssReceiveEvent(
						caEventID,				// M҂CxgID
						caServerName,           // MJMSST[ö
						caMachineName,          // M}V̈
						caUserName,             // M[Ü
						caMessage,              // bZ[Ẅ
						caRecvEventID,          // MCxgID
						dwTimeout);             // ^CAEg
	if (dwResult != 0)
	  {
		caMsg[0] = 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_TIMEOUT:					// ^CAEg
				wsprintf(caMsg, "CxgM҂Ƀ^CAEg܂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)
	  {
		caMsg[0] = 0;
		strcat(caMsg, "MJMSST[o : ");
		strcat(caMsg, caServerName);
		strcat(caMsg, "\r\n");

		strcat(caMsg, "M}V     : ");
		strcat(caMsg, caMachineName);
		strcat(caMsg, "\r\n");

		strcat(caMsg, "M[U     : ");
		strcat(caMsg, caUserName);
		strcat(caMsg, "\r\n");

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

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

		PutStdOut(caMsg);
	  }

	return 0;
}



//
// ȈՃwv\
//
//@F Ȃ
//
//@ԂlF Ȃ
//
void JPrintUsage()
{
	PutStdOut("\r\ngp@FJRECEVNT.EXE [IvV] Cxghc\r\n\r\n");
	PutStdOut("@IvVFȉ̃IvVw\łB\r\n");
	PutStdOut("@@[/N]@@@@@@@     Wo͂Ȃw(lFWo͂܂)\r\n");
	PutStdOut("@@[/T:^CAEg]  ^CAEg(lFɑ҂܂)\r\n");
	PutStdOut("@@@@@@@@@@@@@ (Ԃ͕bPʂŎw肵ĂB)\r\n");
	PutStdOut("@Cxghc  FMCxgID4oCgȓ̕Ŏw肵Ă\r\n");
	PutStdOut("@@@(͉p݂̂łB'*'w肵ꍇSẴCxgƂȂ܂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;
}
