290 lines
6.9 KiB
C++
290 lines
6.9 KiB
C++
// Copyright (C) 2003-2009 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::Format(wxT("*Player : %s is now connected to Host...\n"), buffer));
|
|
|
|
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::Format(wxT("*Player : %s left the game\n\n"), buffer));
|
|
|
|
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::Format(wxT("*Host changed Game to : %s\n"), buffer));
|
|
|
|
// 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::Format(wxT("> Your IP is : %s\n"), buffer));
|
|
|
|
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::Format(
|
|
wxT("WARNING : Player %s does Not have this Game !\n"), m_client[sock].nick.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;
|
|
}
|
|
|