⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 faxagent.cpp

📁 利用HyfaFax传真的传输协议(与FTP协议相似),编写发送传真到目的传真服务器的客户代码!
💻 CPP
字号:
// FaxAgent.cpp: implementation of the FaxAgent class.
//
//////////////////////////////////////////////////////////////////////

#include "FaxAgent.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////





typedef list<string>           stringlist;
typedef list<string>::iterator stringIterator;



FaxAgent::FaxAgent()
{
	
		
}

FaxAgent::~FaxAgent()
{
	
}




bool FaxAgent::SendFax(const task &tsk,string serverHost)
{


	if(!initialize(serverHost))
		return false;
	stringlist filelist;
	bool      bSendSuccess = false;
	do 
	{
		if(!login())
			break;			
		
		if(command(T_TZONE,cmdtab[T_TZONE].cmd,"LOCAL") != Success)
		{
			
			break;
		}
		
		memset(szBuffer_,0,BUFFER_SIZE);
		stringlist attachment = (stringlist) tsk.attachment;
		stringIterator sit = attachment.begin();
		bool bSuccess = true;
		for(; sit != attachment.end();sit ++)
		{	
			
			
			if(command(T_MODE,cmdtab[T_MODE].cmd,"S") != Success)
			{
				bSuccess = false;
				break;
			}
			
			if(command(T_TYPE,cmdtab[T_TYPE].cmd,"I") != Success)
			{
				bSuccess = false;
				break;
			}
			if(command(T_PASV,cmdtab[T_PASV].cmd) != Success)
			{
				bSuccess = false;
				break;
			}
			int       pasvPort;
			char      pasvHost [32] = {0};
			if(!GetHostAndPort(szBuffer_,pasvHost,pasvPort))
				break;
			
			NetSocket pasvSession;
			if(pasvSession.Initialize(PROTOCOL_TCP))
			{
				if(pasvSession.Connect(pasvHost,pasvPort))
				{
					if(command(T_STOT,cmdtab[T_STOT].cmd) != Success)
					{
						bSuccess = false;
						break;
					}					
					char      SubmitedFileName[64] = {0};
					GetSubmitedFileName(szBuffer_,SubmitedFileName);
					string subfilename = SubmitedFileName;
					filelist.push_back(subfilename);
					
					string& filename = *sit;
					if(!SendFile(pasvSession,filename))
					{
						bSuccess = false;
						break;
					}
					pasvSession.Close();
				}
								
			
				if(!TransferComplete())
				{
					bSuccess = false;
					break;
					
				}
				
			}
		}
		
		if(!bSuccess)
		{
			break;
		}
		
		if(command(T_JNEW,cmdtab[T_JNEW].cmd,tsk.taskID) != Success)
		{
			
			break;
		}
		int       jobID;
		GetJobID(szBuffer_,jobID);
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("FROMUSER %s",tsk.senderName.c_str())) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("LASTTIME 000300")) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("MAXDIALS %d",12)) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("MAXTRIES %d",12)) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("DIALSTRING \"%s\"",tsk.faxNumber.c_str()))!= Success)
		{
			break;
		}
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("NOTIFYADDR %s",tsk.senderMail.c_str()))!= Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("VRES %d",98)) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("PAGEWIDTH %d",194)) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("PAGELENGTH %d",281)) != Success)
		{
			break;
		}//NONE
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("NOTIFY \"%s\"","NONE")) != Success)//done+requeue
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("PAGECHOP \"%s\"","default")) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("CHOPTHRESHOLD %d",3)) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("TOCOMPANY \"\"")) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("TOLOCATION \"\"")) != Success)
		{
			break;
		}
		
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("TOUSER \"%s\"",tsk.receiverName.c_str())) != Success)
		{
			break;
		}
		if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("TAGLINE \"%s\"",tsk.subject.c_str())) != Success)
		{
			break;
		}
		
		stringIterator fit = filelist.begin();
		for(;fit != filelist.end(); fit ++)
		{
			string filename = *fit;
			if(command(T_JPARM,cmdtab[T_JPARM].cmd,cmdParam("DOCUMENT %s",filename.c_str())) != Success)
			{
				break;
			}
		}
		
		
		if(command(T_JSUB,cmdtab[T_JSUB].cmd,jobID) != Success)
		{
			break;
		}
		
		if(command(T_JOB,cmdtab[T_JOB].cmd,"DEFAULT") != Success)
		{
			break;
		}	
		
		
		
		bSendSuccess = true;
	} while(false);
	
	
	
	filelist.clear();
	
	Release();
	return bSendSuccess;
}






bool FaxAgent::GetSubmitedFileName(const char* const pstr,char* pFileName)
{

	char szMark[16] = "FILE: ";
	char szEndMark[16] = " (";
	char* pMark = strstr(pstr,szMark);
	
	if(pMark != NULL)
	{
		char *pEndMark = strstr(pMark,szEndMark);
		if(pEndMark != NULL)
		{
			*pEndMark = '\0';
		}
		
		pMark += strlen(szMark);
		strcpy(pFileName,pMark);
		return true;
		
	}
	return false;
	
}

bool FaxAgent::GetJobID(const char* const pstr,int& jobID)
{
	const char *JOBID = "jobid: ";
	const char *GROUPID = " groupid:";
	char *pszID = strstr(pstr,JOBID);
	if(pszID != NULL)
	{
		char *pszEnd = strstr(pszID,GROUPID);
		if(pszEnd != NULL)
		{
			*pszEnd = '\0';
			jobID = atoi(pszID + strlen(JOBID));
			return true;
		}
	}
	return false;
}



bool FaxAgent::SendFile(NetSocket& SendSocket,string& file)
{

	FILE* pFile = fopen(file.c_str(),"rb");
	if(pFile != NULL)
	{
		const long FILE_READ_SIZE = 1024;
		char FileData[FILE_READ_SIZE];
		fseek(pFile,0,SEEK_END);
		long filesize = ftell(pFile);
		fseek(pFile,0,SEEK_SET);		
		int nReadCount = 0;
		long nRemainCount = filesize;
		while(nRemainCount > 0)
		{
			int nReaded = fread(FileData,1,FILE_READ_SIZE,pFile);
			SendSocket.Send(FileData,nReaded);
			nRemainCount -= nReaded;
			
		}	
		
		
		fclose(pFile);
		return true;
	}	
	
	return false;


}


bool FaxAgent::ListStat(string &host, string &status)
{
	
	if(!initialize(host))
		return false;
	stringlist filelist;
	bool      bSendSuccess = false;
	do 
	{
		if(!login())
			break;
		
	
		if(command(T_PASV,cmdtab[T_PASV].cmd) != Success)
		{			
			break;
		}
		int       pasvPort;
		char      pasvHost [32] = {0};
		if(!GetHostAndPort(szBuffer_,pasvHost,pasvPort))
			break;
		
		
		NetSocket pasvSession;
		if(pasvSession.Initialize(PROTOCOL_TCP))
		{
			if(pasvSession.Connect(pasvHost,pasvPort))
			{
				
				if(command(T_LIST,cmdtab[T_LIST].cmd,"status") != Success)
				{
					break;
				}
				
				int nRecvCount = 0;
				int nRecvedCount = 0;
				char *pState = NULL;
				
				SLEEP(30);
				int nStatusBufSize = pasvSession.GetMaxCanReadSize();
				char* pStatusBuf = new char[nStatusBufSize + 1];
				while (nRecvedCount < nStatusBufSize)
				{
					nRecvCount = pasvSession.Recv(pStatusBuf + nRecvedCount,
						BUFFER_SIZE);
					if(nRecvCount == -1)
						break;
					nRecvedCount += nRecvCount;
				}
				*(pStatusBuf + nRecvedCount) = '\0'; 
				status = pStatusBuf;
				delete[]pStatusBuf;
				
				
				pasvSession.Close();
				if(!TransferComplete())
				{
					break;
					
				}
			}
		}

	
		bSendSuccess = true;
	}
	while(false);
	Release();
	return bSendSuccess;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -