forked from dolphin-emu/dolphin
		
	git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4725 8ced0084-cf51-0410-be5f-012b33b47a6e
		
			
				
	
	
		
			290 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			290 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright (C) 2003 Dolphin Project.
 | 
						|
 | 
						|
// This program is free software: you can redistribute it and/or modify
 | 
						|
// it under the terms of the GNU General Public License as published by
 | 
						|
// the Free Software Foundation, version 2.0.
 | 
						|
 | 
						|
// This program is distributed in the hope that it will be useful,
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
// GNU General Public License 2.0 for more details.
 | 
						|
 | 
						|
// A copy of the GPL 2.0 should have been included with the program.
 | 
						|
// If not, see http://www.gnu.org/licenses/
 | 
						|
 | 
						|
// Official SVN repository and contact information can be found at
 | 
						|
// http://code.google.com/p/dolphin-emu/
 | 
						|
 | 
						|
#include "NetSockets.h"
 | 
						|
#include "NetWindow.h"
 | 
						|
 | 
						|
void ClientSide::OnClientData(unsigned char data)
 | 
						|
{
 | 
						|
	unsigned char sent = 0;
 | 
						|
	u32 buffer_size;
 | 
						|
	size_t recv_size;
 | 
						|
	char *buffer = NULL;
 | 
						|
 | 
						|
	switch (data)
 | 
						|
	{
 | 
						|
		case 0x10: // Player joined server
 | 
						|
		{
 | 
						|
			// Read GameFound
 | 
						|
			m_socket.Receive((char*)&sent, 1, recv_size);
 | 
						|
			
 | 
						|
			// Read nickname
 | 
						|
			m_socket.Receive((char*)&buffer_size, 4, recv_size);
 | 
						|
				buffer = new char[buffer_size+1];
 | 
						|
			m_socket.Receive(buffer, buffer_size+1, recv_size);
 | 
						|
			Event->AppendText(wxString::FromAscii(StringFromFormat("*Player : %s is now connected to Host...\n", buffer).c_str()));
 | 
						|
 | 
						|
			if (sent != 0x1F)
 | 
						|
				for (int i = 0; i < 4; i++)
 | 
						|
					Event->AppendText(_("WARNING : Game Not Found on Client Side!\n"));
 | 
						|
 | 
						|
			m_numplayers++;
 | 
						|
			Event->SendEvent(HOST_NEWPLAYER);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x11: // Player left server
 | 
						|
		{
 | 
						|
			// Read Nickname
 | 
						|
			m_socket.Receive((char*)&buffer_size, 4, recv_size);
 | 
						|
				buffer = new char[buffer_size+1];
 | 
						|
			m_socket.Receive(buffer, buffer_size+1, recv_size);
 | 
						|
 | 
						|
			Event->AppendText(wxString::FromAscii(StringFromFormat("*Player : %s left the game\n\n", buffer).c_str()));
 | 
						|
 | 
						|
			m_numplayers--;
 | 
						|
			Event->SendEvent(HOST_PLAYERLEFT);
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x15: // Ping Player
 | 
						|
		{
 | 
						|
			m_socket.Receive((char*)&buffer_size, 4, recv_size);
 | 
						|
			m_socket.Send((const char*)&buffer_size, 4);
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x20: // IP request
 | 
						|
		{
 | 
						|
			//buffer_size = m_addr.size();
 | 
						|
			//m_socket.Send((const char*)&buffer_size, 4);
 | 
						|
			m_socket.Send((const char*)&data, 1);
 | 
						|
			m_socket.Send(m_addr.c_str(), m_addr.size() + 1);
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x30: // Chat message received from server 
 | 
						|
		{
 | 
						|
			m_socket.Receive((char*)&buffer_size, 4, recv_size);
 | 
						|
				buffer = new char[buffer_size+1];
 | 
						|
			m_socket.Receive(buffer, buffer_size+1, recv_size);
 | 
						|
 | 
						|
			if (recv_size > 1024)
 | 
						|
			{
 | 
						|
				//something wrong...
 | 
						|
				delete[] buffer;
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			Event->AppendText(wxString::FromAscii(buffer));
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x35: // ChangeGame message received
 | 
						|
		{
 | 
						|
			m_socket.Receive((char*)&buffer_size, 4, recv_size);
 | 
						|
				buffer = new char[buffer_size+1];
 | 
						|
			m_socket.Receive(buffer, buffer_size+1, recv_size);
 | 
						|
 | 
						|
			m_selectedgame = std::string(buffer);
 | 
						|
			Event->AppendText(wxString::FromAscii(StringFromFormat("*Host changed Game to : %s\n", buffer).c_str()));
 | 
						|
 | 
						|
			// Tell the server if the game's been found
 | 
						|
			m_socket.Send((const char*)&data, 1);
 | 
						|
			CheckGameFound();
 | 
						|
			
 | 
						|
			Event->SendEvent(GUI_UPDATE);
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x40: // Ready message received
 | 
						|
		{
 | 
						|
			m_socket.Receive((char*)&buffer_size, 4, recv_size);
 | 
						|
				buffer = new char[buffer_size+1];
 | 
						|
			m_socket.Receive(buffer, buffer_size+1, recv_size);
 | 
						|
 | 
						|
			if (recv_size > 1024)
 | 
						|
			{
 | 
						|
				delete[] buffer;
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			Event->AppendText(wxString::FromAscii(buffer));
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x50: // Everyone is Ready message received
 | 
						|
		{
 | 
						|
			// Load the game and start synching
 | 
						|
			m_netptr->LoadGame();
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0xA1: // Received pad data from host in versus mode
 | 
						|
		{
 | 
						|
			if (m_data_received)
 | 
						|
				wxThread::Sleep(10);
 | 
						|
			
 | 
						|
			m_socket.Receive((char*)m_netvalues[0], 8, recv_size);
 | 
						|
			m_data_received = true;
 | 
						|
 | 
						|
#ifdef NET_DEBUG
 | 
						|
			char sent[64];
 | 
						|
			sprintf(sent, "Received Values: 0x%08x : 0x%08x \n", m_netvalues[0][0], m_netvalues[0][1]);
 | 
						|
			Event->AppendText(wxString::FromAscii(sent));
 | 
						|
#endif
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	delete[] buffer;	
 | 
						|
}
 | 
						|
 | 
						|
void ServerSide::OnServerData(int sock, unsigned char data)
 | 
						|
{
 | 
						|
	size_t recv_size;
 | 
						|
	char *buffer = NULL;
 | 
						|
	unsigned char sent;
 | 
						|
	unsigned int four_bytes;
 | 
						|
 | 
						|
	switch (data)
 | 
						|
	{
 | 
						|
		case 0x15: // Ping Request
 | 
						|
		{
 | 
						|
			m_client[sock].socket.Receive((char*)&four_bytes, 4, recv_size);
 | 
						|
			m_client[sock].socket.Send((const char*)&four_bytes, 4);
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x20:	// IP request response
 | 
						|
		{
 | 
						|
			buffer = new char[24];
 | 
						|
			// Read IP Address
 | 
						|
			m_client[sock].socket.Receive(buffer, 24, recv_size);
 | 
						|
 | 
						|
			Event->AppendText(wxString::FromAscii(StringFromFormat("> Your IP is : %s\n", buffer).c_str()));
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x30:	// Chat message
 | 
						|
		{
 | 
						|
			buffer = new char[1024];
 | 
						|
			
 | 
						|
			m_client[sock].socket.Receive((char*)&four_bytes, 4, recv_size);
 | 
						|
			m_client[sock].socket.Receive((char*)buffer, four_bytes + 1, recv_size);
 | 
						|
 | 
						|
			if (recv_size > 1024)
 | 
						|
			{
 | 
						|
				//something wrong...
 | 
						|
				delete[] buffer;
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			sent = 0x30;
 | 
						|
			// Send to all
 | 
						|
			for (int i=0; i < m_numplayers ; i++)
 | 
						|
			{
 | 
						|
				if (i == sock)
 | 
						|
					continue;
 | 
						|
 | 
						|
				m_client[i].socket.Send((const char*)&sent, 1); 
 | 
						|
 | 
						|
				m_client[1].socket.Send((const char*)&four_bytes, 4);
 | 
						|
				m_client[i].socket.Send(buffer, recv_size);
 | 
						|
			}
 | 
						|
 | 
						|
			Event->AppendText(wxString::FromAscii(buffer));
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x35:	// Change game response received
 | 
						|
		{
 | 
						|
			// Receive isGameFound response (0x1F / 0x1A) 
 | 
						|
			m_client[sock].socket.Receive((char*)&sent, 1, recv_size);
 | 
						|
 | 
						|
			// If game is not found
 | 
						|
			if (sent != 0x1F)
 | 
						|
			{
 | 
						|
				sent = 0x30;
 | 
						|
 | 
						|
				wxString error_str = wxString::FromAscii(
 | 
						|
					StringFromFormat("WARNING : Player %s does Not have this Game !\n", m_client[sock].nick.c_str()).c_str());
 | 
						|
				four_bytes = (int)error_str.size();
 | 
						|
 | 
						|
				for (int i=0; i < 2; i++)
 | 
						|
					Event->AppendText(error_str);
 | 
						|
 | 
						|
				// Send to all
 | 
						|
				for (int i=0; i < m_numplayers ; i++)
 | 
						|
				{
 | 
						|
					if (i == sock)
 | 
						|
						continue;
 | 
						|
					m_client[i].socket.Send((const char*)&sent, 1);
 | 
						|
 | 
						|
					m_client[i].socket.Send((const char*)&four_bytes, 4);
 | 
						|
					m_client[i].socket.Send(error_str.mb_str(), four_bytes + 1);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0x40: // Ready message received
 | 
						|
		{
 | 
						|
			std::string buffer_str;
 | 
						|
 | 
						|
			m_client[sock].ready = !m_client[sock].ready;
 | 
						|
 | 
						|
			if (m_client[sock].ready)
 | 
						|
				buffer_str = ">> "+m_client[sock].nick+" is now ready !\n";
 | 
						|
			else
 | 
						|
				buffer_str = ">> "+m_client[sock].nick+" is now Unready !\n";
 | 
						|
 | 
						|
			four_bytes = (int)buffer_str.size();
 | 
						|
 | 
						|
			// Send to all
 | 
						|
			for (int i=0; i < m_numplayers ; i++)
 | 
						|
			{
 | 
						|
				m_client[i].socket.Send((const char*)&data, 1); 
 | 
						|
 | 
						|
				m_client[i].socket.Send((const char*)&four_bytes, 4);
 | 
						|
				m_client[i].socket.Send(buffer_str.c_str(), four_bytes+1);
 | 
						|
			}
 | 
						|
 | 
						|
			Event->AppendText(wxString::FromAscii(buffer_str.c_str()));
 | 
						|
			IsEveryoneReady();
 | 
						|
 | 
						|
			break;
 | 
						|
		}
 | 
						|
		case 0xA1: // Received pad data from a client
 | 
						|
		{
 | 
						|
			if (m_data_received)
 | 
						|
				wxThread::Sleep(10);
 | 
						|
 | 
						|
			m_client[sock].socket.Receive((char*)m_netvalues[sock], 8, recv_size);
 | 
						|
			m_data_received = true;
 | 
						|
 | 
						|
#ifdef NET_DEBUG
 | 
						|
			char sent[64];
 | 
						|
			sprintf(sent, "Received Values: 0x%08x : 0x%08x \n", m_netvalues[sock][0], m_netvalues[sock][1]);
 | 
						|
			Event->AppendText(wxString::FromAscii(sent));
 | 
						|
#endif
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	delete[] buffer;
 | 
						|
}
 | 
						|
 |