www.pudn.com > Ftpwork > NetLayer.cpp


#include "NetLayer.h"
#include "NetState.h"

//##ModelId=3DB10CF00087
BOOL NetLayer::Validate(String* user, String* password)
{	
	sprintf(msgbuf,"cv username=%s password=%s",user->buffer(),password->buffer());	
	
	int len = strlen(msgbuf)+1;

	if(ftpsocketobj.SendData(msgbuf,len,BLOCK)==FALSE)
	{
		return FALSE;
	}
	
	len = ftpsocketobj.RecvData(msgbuf,MAXBUFFER,BLOCK);
	
	if(msgbuf[0]=='c' && msgbuf[1]=='y')
	{
		sscanf(msgbuf,"cy info=%s",msgbuf);
		netstateobj.SetState(TRUE);
		netstateobj.SetErrorInfo(msgbuf+8);
		return TRUE;
	}
	return FALSE;
	
}

//##ModelId=3DB1135D0209
BOOL NetLayer::SendCommand(char* msg)
{
	if(ftpsocketobj.SendData(msg,strlen(msg)+1,BLOCK)==FALSE)
	{
		printf("Socket send error\n");
		return FALSE;
	}
	int len;
	len = ftpsocketobj.RecvData(msgbuf,MAXBUFFER,BLOCK);		

	if(msgbuf[0]=='c' && msgbuf[1]=='y')
	{	
		// "cy info=[dd][dd][dfd]...[nn]"		
		netstateobj.SetState(TRUE);
		netstateobj.SetErrorInfo(msgbuf+8);
		return TRUE;
	}
	else if(msgbuf[0]=='c' && msgbuf[1]=='n')
	{
		// "cn info=information string"		
		netstateobj.SetState(FALSE	);
		netstateobj.SetErrorInfo(msgbuf+8);
		return TRUE;
	}
	return FALSE;
}

//##ModelId=3DB11C3B02B8

int NetLayer::GetFile(int fd, size_t filesize)
{
	size_t recvnum=0;
	char *begin="cb";
	size_t temprecv=0;		
			
	// nitify the server begin to send data
	if(ftpsocketobj.SendData(begin,strlen(begin)+1,BLOCK)==FALSE)
		return FALSE;	

	// receive data from the server
		
	while(recvnum < filesize)
	{
		temprecv = ftpsocketobj.RecvData(msgbuf, MAXBUFFER, BLOCK);	
		
		// if error occur
		if(temprecv < 0)
			return FALSE;
		// posite the pointer fo the file operation
		lseek(fd, recvnum, SEEK_SET);			
		
		// what has received should be written into the opened file
		if(temprecv != write( fd, msgbuf, temprecv))
			return FALSE;						
		recvnum += temprecv;
	}		
	if(recvnum == filesize )
		return TRUE;
	else
		return FALSE;
}

//##ModelId=3DB161D6026A
int NetLayer::PutFile(int fd, size_t length)
{	
	size_t  sendnum=0;
	size_t  readnum =0;
	
	// waiting for the server to send beginning signal
	ftpsocketobj.RecvData(msgbuf, MAXBUFFER, BLOCK);
	if(msgbuf[0]=='c' && msgbuf[1]=='b')
	{
		lseek(fd,0,SEEK_SET);
		while(sendnum < length )
		{
			readnum = read(fd,msgbuf, MAXBUFFER);		
			ftpsocketobj.SendData(msgbuf,readnum,BLOCK);		
			sendnum += readnum;			
		}
		return TRUE;
	}
	// the server cancel the transsion for some reason
	else if(msgbuf[0]=='c' && msgbuf[1]=='e')
	{
		return TRUE;
	}
	
	// error process
	else	
		return FALSE;
	
}

//##ModelId=3DB212AA026A
BOOL NetLayer::SetupConnection(LogInfo* ploginfo)
{
	return ftpsocketobj.Connect((struct sockaddr*)ploginfo->GetIPStruct());	
}

//##ModelId=3DB21951031D

BOOL NetLayer::CloseConnection()
{
	ftpsocketobj.SendData((void *)"cq",3,RETURN);
	ftpsocketobj.Close();
	return TRUE;
}

//##ModelId=3DB2281D03CE
NetLayer::NetLayer()
{

}

//##ModelId=3DB3B1B50207
NetLayer::NetLayer(const NetLayer& right)
{
}

NetState* NetLayer::GetNetState()
{
	return & netstateobj;
}