www.pudn.com > doc2pdf-0_7_1.rar > doc2pdf_io.cpp


///////////////////////////////////////////////////////////////////////////// 
//  
// Project:		Doc2pdf 
// 
// File:		doc2pdf_io.cpp 
// 
// Author(s):	Matt Peterson  
// 
// Description:	IO class that implement the doc2pdf IO interface 
// 
///////////////////////////////////////////////////////////////////////////// 
 
#include "doc2pdf_io.h" 
 
// Constructor 
Doc2pdfSocket::Doc2pdfSocket() 
{ 
	m_Sock = -1; 
} 
 
// Destructor 
Doc2pdfSocket::~Doc2pdfSocket() 
{ 
	Close(); 
} 
 
// Connects to a host. Returns zero on success, WSAError on failure 
int Doc2pdfSocket::Connect(const CString& host, unsigned short port) 
{ 
	struct hostent*		he; 
	struct sockaddr_in	peeraddr; 
	 
	// Create socket if necessary 
	if(m_Sock  == -1) 
	{ 
		m_Sock = socket(AF_INET,SOCK_STREAM,0); 
		if(m_Sock == -1) 
		{ 
			return WSAGetLastError(); 
		} 
	} 
	 
	// resolve host to address 
	he = gethostbyname((LPCSTR)host); 
	if(he == NULL) 
	{ 
		return WSAEINVAL; 
	} 
	 
	// connnect  
	memset(&peeraddr,0,sizeof(struct sockaddr_in)); 
	peeraddr.sin_family=AF_INET; 
	peeraddr.sin_port=htons(port); 
	peeraddr.sin_addr.s_addr = *((unsigned long*)he->h_addr);	 
	if(connect(m_Sock,(struct sockaddr*)&peeraddr,sizeof(sockaddr_in)) != 0) 
	{ 
		return WSAGetLastError(); 
	} 
 
	return 0; 
} 
 
// Writes a line. Returns zero on success, WSAError on failure  
int Doc2pdfSocket::WriteLine(const CString& line) 
{ 
	return WriteLine((LPCSTR)line); 
} 
 
 
// Writes a line. Returns zero on success, WSAError on failure  
int Doc2pdfSocket::WriteLine(LPCSTR line) 
{ 
	char crlf[2] = {'\r','\n'}; 
 
	if(send(m_Sock,line,strlen(line), 0) == SOCKET_ERROR) 
	{ 
		return WSAGetLastError(); 
	} 
 
	if(send(m_Sock,crlf,2, 0) == SOCKET_ERROR) 
	{ 
		return WSAGetLastError(); 
	} 
 
	return 0; 
} 
 
// Writes a buffer 
int Doc2pdfSocket::Write(void* buf, int bufsize) 
{ 
	if(send(m_Sock,(const char*) buf,bufsize,0) == SOCKET_ERROR) 
	{ 
		return WSAGetLastError(); 
	} 
 
	return 0;	 
} 
 
 
// Reads a line. Returns zero on success, WSAError on failure 
int Doc2pdfSocket::ReadLine(CString& line) 
{ 
	CHAR	l[81]; 
	CHAR*	lf; 
	CHAR*   c; 
	BOOL	end; 
	int		bytesread; 
	fd_set	readfds; 
	struct timeval timeout; 
 
	line.Empty(); 
	end = FALSE; 
	do 
	{ 
		timeout.tv_sec = MAX_IO_WAIT; 
		timeout.tv_usec = 0; 
		FD_ZERO(&readfds); 
		FD_SET(m_Sock,&readfds); 
		if(select(m_Sock + 1, &readfds,NULL,NULL,&timeout) <= 0) 
		{ 
			return 1; 
		} 
 
		bytesread = recv(m_Sock,l,80,MSG_PEEK); 
		if(bytesread > 1) 
		{ 
			/*			 
			c = l; 
			for(i=0;i 0) 
	{ 
		closesocket(m_Sock); 
		m_Sock=-1; 
	} 
 
	return 0; 
}