From 048aaf0c4e77402adf584e3318e5aae6f1cdd749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20P=C3=B6sel?= Date: Mon, 5 Nov 2012 21:11:48 +0000 Subject: XFire adoption (crashes on login, no 64bit) git-svn-id: http://svn.miranda-ng.org/main/trunk@2212 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Xfire/src/socket.cpp | 272 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 protocols/Xfire/src/socket.cpp (limited to 'protocols/Xfire/src/socket.cpp') diff --git a/protocols/Xfire/src/socket.cpp b/protocols/Xfire/src/socket.cpp new file mode 100644 index 0000000000..f5f48e5588 --- /dev/null +++ b/protocols/Xfire/src/socket.cpp @@ -0,0 +1,272 @@ +// Copied from http://linuxgazette.net/issue74/tougher.html +// (only slightly modified) +// heavy modified (für windows umgeschrieben) - dufte + +// Implementation of the Socket class. + + +#include "stdafx.h" + +#include "xdebug.h" +#include "socket.h" +#include "string.h" +#include +#include +#include +#include + +/*NETLIB*****************/ +#include +#include +extern HANDLE hNetlib; +/*NETLIB*****************/ + + +using namespace std; + +Socket::Socket( std::string host, int port, int useproxy, std::string proxyhost , int proxyport ) : + m_sock ( -1 ) +{ + + memset ( &m_addr, + 0, + sizeof ( m_addr ) ); + + if(!create()) { + throw SocketException( "Could not create socket." ); + } + if(!connect(host,port,useproxy,proxyhost,proxyport)) { + throw SocketException( "Could not bind port." ); + } +} + +Socket::~Socket() +{ + Netlib_CloseHandle(this->netlibcon); +} + +bool Socket::create() +{ + +/* + m_sock = socket ( AF_INET, SOCK_STREAM, 0 ); + + + if ( ! is_valid() ) + return false;*/ + + + // TIME_WAIT - argh +// int on = 1; + //if ( setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* ) &on, sizeof ( on ) ) == -1 ) +// return false; + + return true; + +} + + + +bool Socket::bind ( const int port ) +{ +/* if ( ! is_valid() ) + { + return false; + } + + + + m_addr.sin_family = AF_INET; + m_addr.sin_addr.s_addr = INADDR_ANY; + m_addr.sin_port = htons ( port ); + + int bind_return = ::bind ( m_sock, + ( struct sockaddr * ) &m_addr, + sizeof ( m_addr ) ); + + + if ( bind_return == -1 ) + { + return false; + } +*/ + return true; +} + + +bool Socket::listen() const +{ + /*if ( ! is_valid() ) + { + return false; + } + + int listen_return = ::listen ( m_sock, MAXCONNECTIONS ); + + + if ( listen_return == -1 ) + { + return false; + } +*/ + return false; +} + + +bool Socket::accept ( Socket& new_socket ) const +{ + /*int addr_length = sizeof ( m_addr ); + new_socket.m_sock = ::accept ( m_sock, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length ); + + if ( new_socket.m_sock <= 0 ) + return false; + else + return true;*/ + return false; + +} + +bool Socket::send ( char *buf, int length ) const { + int status = Netlib_Send(this->netlibcon,buf, length,0); //::send ( m_sock, buf, length, 0); + if ( status == -1 ) + { + return false; + } + else + { + return true; + } +} +bool Socket::send ( const std::string s ) const +{ + int status = Netlib_Send(this->netlibcon,s.c_str(), s.size(),0); //::send ( m_sock, s.c_str(), s.size(), 0); + if ( status == -1 ) + { + return false; + } + else + { + return true; + } +} + +int Socket::recv ( char *buf, int maxlen ) const { + int status = Netlib_Recv(this->netlibcon,buf,maxlen,0); //::recv( m_sock, buf, maxlen, 0 ); + + if ( status == -1 ) + { + //std::cout << "status == -1 errno == " << errno << " in Socket::recv WSA:::" << ::WSAGetLastError() << "\n"; + return 0; + } + return status; +} + +int Socket::recv ( std::string& s ) const +{ + char buf [ MAXRECV + 1 ]; + + s = ""; + + memset ( buf, 0, MAXRECV + 1 ); + + int status = Netlib_Recv(this->netlibcon,buf,MAXRECV,0);//::recv ( m_sock, buf, MAXRECV, 0 ); + + if ( status == -1 ) + { + //std::cout << "status == -1 errno == " << errno << " in Socket::recv\n"; + return 0; + } + else if ( status == 0 ) + { + return 0; + } + else + { + s = buf; + return status; + } +} + + + +bool Socket::connect ( const std::string host, const int port, int useproxy,std::string proxyhost,int proxyport) +{ + //if ( ! is_valid() ) return false; + + /*m_addr.sin_family = AF_INET; + if(useproxy) + { + m_addr.sin_port = htons ( proxyport ); + m_addr.sin_addr.s_addr=inet_addr(proxyhost.c_str()); + } + else + { + m_addr.sin_port = htons ( port ); + m_addr.sin_addr.s_addr=inet_addr(host.c_str()); + } + */ + + int status = 0; //inet_pton ( AF_INET, host.c_str(), &m_addr.sin_addr ); + + /* XDEBUG(("Is valid .. %d\n",status)); + if ( errno == EAFNOSUPPORT ) return false; */ + //status = ::connect ( m_sock, ( sockaddr * ) &m_addr, sizeof ( m_addr ) ); + + /*if(useproxy&&status==0) { + char temp[1024]; + this->send("CONNECT cs.xfire.com:25999 HTTP/1.1\nHost: cs.xfire.com:25999\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\n\n"); + this->recv((char*)temp,1024); + }*/ + + NETLIBOPENCONNECTION ncon = { 0 }; + ncon.cbSize = sizeof(ncon); + ncon.szHost = "cs.xfire.com"; + ncon.wPort = (WORD)atol("25999"); + ncon.timeout=5; + netlibcon = (HANDLE) CallService(MS_NETLIB_OPENCONNECTION, (WPARAM) hNetlib, (LPARAM) & ncon); + + + //std::cout << "status: " << status << std::endl; + if ( netlibcon != NULL ) + { + //CallService(MS_NETLIB_OPENCONNECTION, (WPARAM) hNetlib, (LPARAM) & ncon); + m_sock=CallService(MS_NETLIB_GETSOCKET,(WPARAM) netlibcon,0); + return true; + } + else { + int errsv = errno; + if(errsv == SOCKET_ERROR) { + // std::cout << "Connection refused to " << host << ":" << port << std::endl; + throw SocketException( "Connection refused." ); + } + //std::cout << "errno: " << errsv << std::endl; + return false; + } +} + +void Socket::set_non_blocking ( const bool b ) +{ +/* u_long arg=0; + + if(b) arg=1;*/ + + //ioctlsocket(m_sock, 0x8004667e,&arg); +// int opts; + + /* opts = fcntl ( m_sock, + F_GETFL ); + + if ( opts < 0 ) + { + return; + } +*/ + //if ( b ) + // opts = ( opts | O_NONBLOCK ); + /*else + opts = ( opts & ~O_NONBLOCK );*/ + + /*fcntl ( m_sock, + F_SETFL,opts );*/ + +} -- cgit v1.2.3