/**********************************************************************
*	Project		:	Notify Applications
*	Description	: Notify <Ip Addr> <Login> <Pw> <TelNum> <Message>
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <string.h>
#include <time.h>
#include <winsock.h>
#include <winbase.h>
 
#define SERV_PORT 8000
#define MAX_SEND_QUEUE_LEN 255
#define MAX_RET_MSG_LEN 128
#define INTERFACE_TYPE 0
char IpAddr[20] = "";
char Login[20] = "";
char Pw[20] = "";
char TelNum[20] = "";
char MsgId[50]= "";
char Msg[300] = "";
char TmpStr[300];
 
struct Send_Msg{
	unsigned char interface_type;
	unsigned char msg_type;
	unsigned char msg_content_len;
	char msg_content[MAX_SEND_QUEUE_LEN];
	};
 
struct Ret_Msg{
	unsigned char ret_code;
	char ret_description[MAX_RET_MSG_LEN];
	};
 
int FillMsg(char *src, char *target, int n)
{
int i,len;
 
len = strlen(target);
	for(i=0; i<len; i++)
	src[n++] = target[i];
	src[n++] = '\0';
	return(n);
}
 
void LogMessage(char *info)
{
char str_time[50];
time_t tnow;
struct tm *lctime;
FILE *fp;
if( (fp=fopen("notify.log","a+")) == NULL )
	 return;
time(&tnow);
lctime = localtime(&tnow);
strftime(str_time, 80, "%Y%m%d.%H%M%S", lctime);
sprintf(TmpStr,"%s %8s %8s %10s %s %s\n", str_time, Login, MsgId, TelNum, info, Msg);
fputs(TmpStr, fp);
fclose(fp);
}
 
void main(int argc, char *argv[])
{ int i,iPos,result;
struct Send_Msg sendMsg;
struct Ret_Msg retMsg;
struct sockaddr_in servAddr;
WSADATA WSAData;
SOCKET clientSD = -1;
int iCount = 0;
 
if(argc<6)
{
	 printf("\nUsage : notify <Ip Addr> <Login> <Pw> <TelNum> <Msg> ");
	 printf("\n <ex>: notify 10.81.50.72 test test1 0932444123 System Crit Alarm");
	 printf("\nOutput: notify.log");
	 printf("\n <ex>: <Date.Time> <Login> <MessageId> <TelNum> <Status> <Msg>");
	 LogMessage("Fail:Argument_Error");
	 exit(0);
}
strcpy(IpAddr, argv[1]);
strcpy(Login, argv[2]);
strcpy(Pw, argv[3]);
strcpy(TelNum, argv[4]);
strcpy(Msg, "");
for(i=5; i<argc; i++)
{strcat(Msg,argv[i]);	strcat(Msg," ");	}
Msg[160] = '\0';
/******* Startup Win Socket *******/
result = WSAStartup((WORD)((1 << 8) | 1), (LPWSADATA)&WSAData);
if(result != 0){
	printf("WSAStartup() error, program exits now\n");
	LogMessage("Fail:Socket_Start_Error");
	exit(0);
	}
/******* Socket Connect *******/
if((clientSD = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){
	printf("Socket create error\n");
	LogMessage("Fail:Socket_Create_Error");
	exit(0);
	}
memset((char *)&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = PF_INET;
servAddr.sin_port = htons(SERV_PORT);
servAddr.sin_addr.s_addr = inet_addr(IpAddr);
if(connect(clientSD, (struct sockaddr far *)&servAddr, sizeof(servAddr)) !=0){
	printf("Connect Error !");
	closesocket(clientSD);
	WSACleanup();
	LogMessage("Fail:Socket_Connect_Error");
	exit(0);
	}
/******* 檢查Username,Pw帳號/密碼 *******/
memset((char *)&sendMsg, 0, sizeof(sendMsg));
sendMsg.interface_type = INTERFACE_TYPE;
sendMsg.msg_type = 0;
iPos = 0;
iPos = FillMsg(&sendMsg.msg_content[0], Login, iPos);
iPos = FillMsg(&sendMsg.msg_content[0], Pw, iPos);
sendMsg.msg_content_len = iPos;
if(send(clientSD, (char *)&sendMsg, sizeof(sendMsg), 0) == SOCKET_ERROR){
	printf("Sending data error\n");
	closesocket(clientSD);
	WSACleanup();
	LogMessage("Fail:Sending_Data_Error");
	exit(0);
	}
memset((char *)&retMsg, 0, sizeof(retMsg));	
result = recv(clientSD, (char *)&retMsg, sizeof(retMsg), 0);
if((result == SOCKET_ERROR) || (result <= 0)){
	printf("Receiving Error !\n");
	closesocket(clientSD);
	WSACleanup();
	LogMessage("Fail:Receiving_Error");
	exit(0);
	}
 
if(retMsg.ret_code != 0 )
	{
	printf("Login/Password_Error !\n");
	closesocket(clientSD);
	WSACleanup();
	LogMessage("Fail:Login/Password_Error");
	exit(0);
	}
printf("\n%s", retMsg.ret_description);
/******* 傳送訊息(立即傳送) *******/
memset((char *)&sendMsg, 0, sizeof(sendMsg));
sendMsg.interface_type = INTERFACE_TYPE;
sendMsg.msg_type = 1;
iPos = 0;
iPos = FillMsg(&sendMsg.msg_content[0], TelNum, iPos);
iPos = FillMsg(&sendMsg.msg_content[0], Msg, iPos);
sendMsg.msg_content[iPos++] = 100;	//立即傳送 
sendMsg.msg_content[iPos++] = '\0';
sendMsg.msg_content_len = iPos;
 
if(send(clientSD, (char *)&sendMsg, sizeof(sendMsg), 0) == SOCKET_ERROR){
	printf("Sending data error\n");
	closesocket(clientSD);
	WSACleanup();
	LogMessage("Fail:Sending_Error");
	exit(0);
	}
memset((char *)&retMsg, 0, sizeof(retMsg));
result = recv(clientSD, (char *)&retMsg, sizeof(retMsg), 0);
if((result == SOCKET_ERROR) || (result <= 0)){
	printf("Receiving Error !\n");
	closesocket(clientSD);
	WSACleanup();
	LogMessage("Fail:Receiving_Error");
	exit(0);
	}
strcpy(MsgId, retMsg.ret_description);
printf("\nMessage Id:%s", MsgId);
LogMessage("Success");
closesocket(clientSD);
WSACleanup();
}