788 lines
21 KiB
C++
788 lines
21 KiB
C++
#include "stdafx.h"
|
|
|
|
#ifndef NOT_USE_UBICOM_SDK
|
|
|
|
|
|
#include "NewUbisoftClient.h"
|
|
#include "CommonDefines.h" // UBI.com common defines
|
|
#include "IConsole.h" // ICVar
|
|
#include "IRenderer.h" // IRenderer
|
|
|
|
#if defined(LINUX)
|
|
#include "CryLibrary.h"
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <fstream>
|
|
#endif
|
|
|
|
#if defined(WIN32) || defined(WIN64)
|
|
#include "windows.h"
|
|
#include "Wininet.h"
|
|
#endif
|
|
|
|
#include "ScriptObjectNewUbisoftClient.h" // CScriptObjectNewUbisoftClient
|
|
#if !defined(LINUX)
|
|
#include <assert.h>
|
|
#endif
|
|
|
|
|
|
#include "GSCDKeyInterface.h"
|
|
#include "InitSockets.h"
|
|
|
|
#if !defined(LINUX)
|
|
static const char GSINIFILE[10] = ".\\gs.ini";
|
|
static const char GSINIFILETMP[10] = ".\\gs.tmp";
|
|
#else
|
|
static const char GSINIFILE[10] = "gs.ini";
|
|
static const char GSINIFILETMP[10] = "gs.tmp";
|
|
#endif
|
|
|
|
static const char RegistryKeyName[] = "SOFTWARE\\Crytek\\FarCry";
|
|
|
|
|
|
|
|
// src and trg can be the same pointer (in place encryption)
|
|
// len must be in bytes and must be multiple of 8 byts (64bits).
|
|
// key is 128bit: int key[4] = {n1,n2,n3,n4};
|
|
// void encipher(unsigned int *const v,unsigned int *const w,const unsigned int *const k )
|
|
#define TEA_ENCODE( src,trg,len,key ) {\
|
|
register unsigned int *v = (src), *w = (trg), *k = (key), nlen = (len) >> 3; \
|
|
register unsigned int delta=0x9E3779B9,a=k[0],b=k[1],c=k[2],d=k[3]; \
|
|
while (nlen--) {\
|
|
register unsigned int y=v[0],z=v[1],n=32,sum=0; \
|
|
while(n-->0) { sum += delta; y += (z << 4)+a ^ z+sum ^ (z >> 5)+b; z += (y << 4)+c ^ y+sum ^ (y >> 5)+d; } \
|
|
w[0]=y; w[1]=z; v+=2,w+=2; }}
|
|
|
|
// src and trg can be the same pointer (in place decryption)
|
|
// len must be in bytes and must be multiple of 8 byts (64bits).
|
|
// key is 128bit: int key[4] = {n1,n2,n3,n4};
|
|
// void decipher(unsigned int *const v,unsigned int *const w,const unsigned int *const k)
|
|
#define TEA_DECODE( src,trg,len,key ) {\
|
|
register unsigned int *v = (src), *w = (trg), *k = (key), nlen = (len) >> 3; \
|
|
register unsigned int delta=0x9E3779B9,a=k[0],b=k[1],c=k[2],d=k[3]; \
|
|
while (nlen--) { \
|
|
register unsigned int y=v[0],z=v[1],sum=0xC6EF3720,n=32; \
|
|
while(n-->0) { z -= (y << 4)+c ^ y+sum ^ (y >> 5)+d; y -= (z << 4)+a ^ z+sum ^ (z >> 5)+b; sum -= delta; } \
|
|
w[0]=y; w[1]=z; v+=2,w+=2; }}
|
|
|
|
|
|
|
|
NewUbisoftClient::NewUbisoftClient( const char *szLocalIPAddress ):m_strUsername(""), m_iJoinedLobbyID(0), m_iJoinedRoomID(0),
|
|
m_bDownloadedGSini(false), m_eServerState(NoUbiServer), m_eClientState(NoUbiClient), m_hCDKey(0),
|
|
m_pCDKeyServer(NULL), m_bCheckCDKeys(false), m_dwNextServerAbsTime(0),
|
|
m_dwNextClientAbsTime(0), m_dwAccountCreateTime(0), m_bDisconnecting(0), sv_authport(0), sv_regserver_port(0),
|
|
m_pLog(0), m_pSystem(0), m_usGamePort(0)
|
|
{
|
|
assert(szLocalIPAddress);
|
|
|
|
m_pScriptObject=0;
|
|
|
|
GSbool bRet;
|
|
|
|
if(strcmp(szLocalIPAddress,"0.0.0.0")!=0)
|
|
{
|
|
static char szLocalIP[256];
|
|
|
|
strcpy(szLocalIP,(char *)szLocalIPAddress); // make a copy (to compensate UBI sdk error)
|
|
bRet=InitializeSockets((GSchar *)szLocalIP);
|
|
}
|
|
else bRet=InitializeSockets();
|
|
|
|
|
|
/*
|
|
if(!bRet)
|
|
{
|
|
// log error
|
|
}
|
|
*/
|
|
|
|
m_bSavePassword = false;
|
|
}
|
|
|
|
#if defined(LINUX)
|
|
static void ResolveServerAndPath( const char* szURL, string& strServer, string& strPath )
|
|
{
|
|
const char c_szHTTPSig[] = "http://";
|
|
const size_t c_HTTPSigLength( sizeof( c_szHTTPSig ) - 1 ); // substract zero termination
|
|
|
|
string strTemp( szURL );
|
|
if( string::npos == strTemp.find( c_szHTTPSig ) )
|
|
{
|
|
string::size_type posFirstSlash( strTemp.find( "/" ) );
|
|
if(posFirstSlash == string::npos)
|
|
{
|
|
printf("Cannot resolve server path URL for downloading gs.ini\n");
|
|
return;
|
|
}
|
|
strServer = strTemp.substr( 0, posFirstSlash );
|
|
strPath = strTemp.substr( posFirstSlash, strTemp.size() - posFirstSlash );
|
|
}
|
|
else
|
|
{
|
|
string::size_type posFirstSlash( strTemp.find( "/", c_HTTPSigLength ) );
|
|
if(posFirstSlash == string::npos)
|
|
{
|
|
printf("Cannot resolve server path URL for downloading gs.ini\n");
|
|
return;
|
|
}
|
|
strServer = strTemp.substr( c_HTTPSigLength, posFirstSlash - c_HTTPSigLength );
|
|
strPath = strTemp.substr( posFirstSlash , strTemp.size() - posFirstSlash );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static bool SendReceive( SOCKET& conSocket, const char* szRequestFmt, const string& strServer, const string& strPath, string& strData )
|
|
{
|
|
// send request
|
|
std::vector< char > request;
|
|
request.reserve( strServer.size() + strPath.size() + strlen( szRequestFmt ) + 1 );
|
|
sprintf( &request[ 0 ], szRequestFmt, strPath.c_str(), strServer.c_str() );
|
|
|
|
if( SOCKET_ERROR == send( conSocket, &request[ 0 ], (int) strlen( &request[ 0 ] ) + 1, 0 ) )
|
|
{
|
|
return( false );
|
|
}
|
|
|
|
// receive data
|
|
strData.clear();
|
|
while( true )
|
|
{
|
|
const int c_bufferSize( 128 );
|
|
char buffer[ c_bufferSize + 1 ];
|
|
buffer[ 0 ] = 0;
|
|
|
|
int retval( recv( conSocket, buffer, c_bufferSize, 0 ) );
|
|
if( SOCKET_ERROR == retval )
|
|
{
|
|
return( false );
|
|
}
|
|
|
|
if( 0 < retval )
|
|
{
|
|
buffer[ retval ] = 0;
|
|
strData += buffer;
|
|
}
|
|
else
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return( true );
|
|
}
|
|
|
|
|
|
|
|
bool GetTextFromURL( const char* szURL, string& strText )
|
|
{
|
|
// determine server and path from URL
|
|
string strServer;
|
|
string strPath;
|
|
|
|
ResolveServerAndPath( szURL, strServer, strPath );
|
|
// create host structure
|
|
hostent* pHost( 0 );
|
|
if( false != isalpha( strServer[ 0 ] ) )
|
|
{
|
|
// resolve host name
|
|
pHost = gethostbyname( strServer.c_str() );
|
|
}
|
|
else
|
|
{
|
|
// convert string to ip address number
|
|
unsigned int addr( inet_addr( strServer.c_str() ) );
|
|
pHost = gethostbyaddr( (char*) &addr, 4, AF_INET );
|
|
}
|
|
|
|
if( 0 == pHost )
|
|
{
|
|
return( false );
|
|
}
|
|
|
|
// create socket
|
|
sockaddr_in server;
|
|
memset( &server, 0, sizeof( server ) );
|
|
memcpy( &(server.sin_addr), pHost->h_addr, pHost->h_length );
|
|
server.sin_family = pHost->h_addrtype;
|
|
server.sin_port = htons( 80 );
|
|
|
|
SOCKET conSocket( socket( AF_INET, SOCK_STREAM, 0 ) );
|
|
if( 0 > conSocket )
|
|
{
|
|
return( false );
|
|
}
|
|
|
|
// connect
|
|
if( SOCKET_ERROR == connect( conSocket, (sockaddr*) &server, sizeof( server ) ) )
|
|
{
|
|
return( false );
|
|
}
|
|
|
|
// send request
|
|
//const char pcRequest[] = "GET /gsinit.php?user=%25s&dp=%25s HTTP/1.0\nUser-Agent: Wget/1.9\nHost: gsconnect.ubisoft.com\nAccept: */*\nConnection: Keep-Alive\n\n";
|
|
//const char pcRequest[] = "GET /gsinit.php?user=%s&dp=%s HTTP/1.0\nHost: gsconnect.ubisoft.com\n\n";
|
|
const char c_szRequestFmt[] = "GET %s HTTP/1.0\nHost: %s\n\n";
|
|
if( false != SendReceive( conSocket, c_szRequestFmt, strServer, strPath, strText ) )
|
|
{
|
|
const char c_szHTTPHeaderEnd[ ] = "\r\n\r\n\r\n";
|
|
const size_t c_szHTTPHeaderEndLength( sizeof( c_szHTTPHeaderEnd ) - 1 ); // substract zero termination
|
|
|
|
// remove http header
|
|
string::size_type pos( strText.find( c_szHTTPHeaderEnd ) );
|
|
if( string::npos != pos )
|
|
{
|
|
strText = strText.substr( pos + c_szHTTPHeaderEndLength, strText.size() - pos - c_szHTTPHeaderEndLength );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return( false );
|
|
}
|
|
|
|
// close socket and return
|
|
closesocket( conSocket );
|
|
|
|
return( true );
|
|
}
|
|
#endif
|
|
|
|
|
|
NewUbisoftClient::~NewUbisoftClient()
|
|
{
|
|
Server_RemoveAllPlayers();
|
|
|
|
#ifndef EXCLUDE_UBICOM_CLIENT_SDK
|
|
if (m_eClientState != NoUbiClient)
|
|
clMSClientClass::Uninitialize();
|
|
#endif // EXCLUDE_UBICOM_CLIENT_SDK
|
|
|
|
if (m_pCDKeyServer)
|
|
delete m_pCDKeyServer;
|
|
|
|
GSCDKey_Uninitialize();
|
|
UninitializeSockets();
|
|
}
|
|
|
|
bool NewUbisoftClient::WriteStringToRegistry(const string &szKeyName, const string &szValueName, const string &szValue)
|
|
{
|
|
#if !defined(LINUX)
|
|
HKEY hKey;
|
|
|
|
string szREGKeyName = string(RegistryKeyName) + string("\\") + szKeyName;
|
|
|
|
if (RegOpenKey(HKEY_LOCAL_MACHINE, szREGKeyName.c_str(), &hKey) != ERROR_SUCCESS)
|
|
{
|
|
if (RegCreateKey(HKEY_LOCAL_MACHINE, szREGKeyName.c_str(), &hKey) != ERROR_SUCCESS)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (RegSetValueEx(hKey, szValueName.c_str(), 0, REG_SZ, (BYTE *)szValue.c_str(), szValue.size()) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
|
|
return false;
|
|
}
|
|
RegCloseKey(hKey);
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::ReadStringFromRegistry(const string &szKeyName, const string &szValueName, string &szValue)
|
|
{
|
|
#if !defined(LINUX)
|
|
HKEY hKey;
|
|
|
|
string szREGKeyName = string(RegistryKeyName) + string("\\") + szKeyName;
|
|
|
|
if (RegOpenKey(HKEY_LOCAL_MACHINE, szREGKeyName.c_str(), &hKey) != ERROR_SUCCESS)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
DWORD dwSize = 0;
|
|
|
|
if (RegQueryValueEx(hKey, szValueName.c_str(), 0, 0, 0, &dwSize) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
|
|
return false;
|
|
}
|
|
|
|
szValue.resize(dwSize);
|
|
|
|
RegQueryValueEx(hKey, szValueName.c_str(), 0, 0, (LPBYTE)szValue.c_str(), &dwSize);
|
|
RegCloseKey(hKey);
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::RemoveStringFromRegistry(const string &szKeyName, const string &szValueName)
|
|
{
|
|
#if !defined(LINUX)
|
|
HKEY hKey;
|
|
|
|
string szREGKeyName = string(RegistryKeyName) + string("\\") + szKeyName;
|
|
|
|
if (RegOpenKey(HKEY_LOCAL_MACHINE, szREGKeyName.c_str(), &hKey) != ERROR_SUCCESS)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
DWORD dwSize = 0;
|
|
|
|
|
|
|
|
if (RegDeleteValue(hKey, szValueName.c_str()) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
|
|
return false;
|
|
}
|
|
|
|
RegCloseKey(hKey);
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::IsValueOnRegistry(const string &szKeyName, const string &szValueName)
|
|
{
|
|
#if !defined(LINUX)
|
|
HKEY hKey;
|
|
|
|
string szREGKeyName = string(RegistryKeyName) + string("\\") + szKeyName;
|
|
|
|
if (RegOpenKey(HKEY_LOCAL_MACHINE, szREGKeyName.c_str(), &hKey) != ERROR_SUCCESS)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
DWORD dwSize = 0;
|
|
|
|
if (RegQueryValueEx(hKey, szValueName.c_str(), 0, 0, 0, &dwSize) != ERROR_SUCCESS)
|
|
{
|
|
RegCloseKey(hKey);
|
|
|
|
return false;
|
|
}
|
|
RegCloseKey(hKey);
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::EncryptString(unsigned char *szOut, const unsigned char *szIn)
|
|
{
|
|
string szInPadded = (char *)szIn;
|
|
|
|
while ((szInPadded.size() % 8) != 0)
|
|
{
|
|
szInPadded.push_back(0);
|
|
}
|
|
|
|
unsigned int Key[4] = {31337, 31337*2, 31337*4, 31337*8};
|
|
|
|
TEA_ENCODE((unsigned int *)szInPadded.c_str(), (unsigned int *)szOut, szInPadded.size(), Key);
|
|
szOut[szInPadded.size()] = 0;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::DecryptString(unsigned char *szOut, const unsigned char *szIn)
|
|
{
|
|
string szInPadded = (char *)szIn;
|
|
|
|
while ((szInPadded.size() % 8) != 0)
|
|
{
|
|
szInPadded.push_back(0);
|
|
}
|
|
|
|
unsigned int Key[4] = {31337, 31337*2, 31337*4, 31337*8};
|
|
|
|
TEA_DECODE((unsigned int *)szIn, (unsigned int *)szOut, strlen((char *)szIn), Key);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::EncodeHex(unsigned char *szOut, const unsigned char *szIn)
|
|
{
|
|
unsigned int len = strlen((char *)szIn);
|
|
|
|
for (unsigned int i = 0; i < len; i++)
|
|
{
|
|
sprintf((char *)&szOut[i*2], "%02x", szIn[i]);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::DecodeHex(unsigned char *szOut, const unsigned char *szIn)
|
|
{
|
|
unsigned int len = strlen((char *)szIn) >> 1;
|
|
char szAux[16];
|
|
|
|
for (unsigned int i = 0; i < len; i++)
|
|
{
|
|
sprintf(szAux, "0x%c%c", szIn[i*2+0], szIn[i*2+1]);
|
|
szOut[i] = strtol(szAux, 0, 0);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void NewUbisoftClient::Init( ISystem *inpSystem )
|
|
{
|
|
m_pSystem = inpSystem; assert(m_pSystem);
|
|
m_pLog = m_pSystem->GetILog(); assert(m_pLog);
|
|
|
|
IConsole *pConsole = m_pSystem->GetIConsole();
|
|
|
|
sv_authport = pConsole->GetCVar("sv_authport"); assert(sv_authport);
|
|
sv_regserver_port = pConsole->GetCVar("sv_regserver_port"); assert(sv_regserver_port);
|
|
}
|
|
|
|
|
|
bool NewUbisoftClient::Update()
|
|
{
|
|
#ifndef EXCLUDE_UBICOM_CLIENT_SDK
|
|
clMSClientClass::Engine();
|
|
#endif // EXCLUDE_UBICOM_CLIENT_SDK
|
|
|
|
CRegisterServer::RegServer_Engine();
|
|
|
|
//if (m_bUsingRegServer && !m_bServerLoggedIn)
|
|
//Server_RecreateServer();
|
|
|
|
{
|
|
bool bCheckCDKey = m_pSystem->GetIGame()->GetModuleState(EGameMultiplayer)
|
|
&& m_pSystem->GetINetwork()
|
|
&& m_pSystem->GetINetwork()->GetServerByPort(m_usGamePort)
|
|
&& m_pSystem->GetINetwork()->GetServerByPort(m_usGamePort)->GetServerType()!=eMPST_LAN;
|
|
|
|
Server_CheckCDKeys(bCheckCDKey);
|
|
}
|
|
|
|
if (m_hCDKey)
|
|
GSCDKey_Engine(m_hCDKey);
|
|
|
|
// ensure server is shown in the UBI.com list
|
|
// Server_CreateServer() has a timelimit
|
|
|
|
if (m_eServerState == ServerDisconnected)
|
|
Server_RecreateServer();
|
|
|
|
if ((m_eClientState == ClientDisconnected) || (m_eClientState == GameServerDisconnected))
|
|
Client_ReJoinGameServer();
|
|
|
|
#ifndef EXCLUDE_UBICOM_CLIENT_SDK
|
|
if (m_eClientState == NoUbiClient)
|
|
clMSClientClass::Uninitialize();
|
|
#endif // EXCLUDE_UBICOM_CLIENT_SDK
|
|
|
|
return true;
|
|
}
|
|
|
|
void NewUbisoftClient::SetScriptObject( CScriptObjectNewUbisoftClient *inpObject )
|
|
{
|
|
assert(!m_pScriptObject); // called twice?
|
|
assert(inpObject); // param must be 0
|
|
|
|
m_pScriptObject = inpObject;
|
|
}
|
|
|
|
|
|
bool NewUbisoftClient::DownloadGSini(const char *szUsername)
|
|
{
|
|
if (m_bDownloadedGSini)
|
|
return true;
|
|
|
|
#if defined(LINUX)
|
|
static const char* pGSConnectFilename = "gsconnect.ini";
|
|
#endif
|
|
|
|
// Get the URL to download the INI from
|
|
// Get it from the reg key
|
|
// HKEY_LOCAL_MACHINE\SOFTWARE\Ubi Soft\Game Service\ConnectURL
|
|
// if we can, otherwise use the default URL
|
|
// http://gsconnect.ubisoft.com/gsinit.php?user=%s&dp=%s
|
|
// If that doesn't work check the local directory
|
|
char *connectURL = NULL;
|
|
DWORD dwBufLen = 0;
|
|
#if !defined(LINUX)
|
|
//connectURL[0]=0;
|
|
HKEY hKey;
|
|
if (RegOpenKeyEx( HKEY_LOCAL_MACHINE,"SOFTWARE\\Ubi Soft\\Game Service",0, KEY_QUERY_VALUE, &hKey ) == ERROR_SUCCESS)
|
|
{
|
|
if (RegQueryValueEx( hKey, "ConnectURL", NULL, NULL, NULL, &dwBufLen) == ERROR_SUCCESS)
|
|
{
|
|
connectURL = (char*)malloc(dwBufLen);
|
|
RegQueryValueEx( hKey, "ConnectURL", NULL, NULL, (LPBYTE) connectURL, &dwBufLen);
|
|
RegCloseKey( hKey );
|
|
}
|
|
}
|
|
#else
|
|
char iniEntry[512];
|
|
//Check to see if the tmp file contains good info
|
|
string GSConnectFilename(GetModulePath());
|
|
if(GSConnectFilename.c_str()[GSConnectFilename.size()-1] != '/')
|
|
GSConnectFilename += "/";
|
|
GSConnectFilename += pGSConnectFilename;
|
|
GetPrivateProfileString("Servers", "GSConnectURL", "Key not found", iniEntry, 512, GSConnectFilename.c_str());
|
|
if (strcmp("Key not found", iniEntry) !=0 )
|
|
{
|
|
dwBufLen = strlen(iniEntry);
|
|
connectURL = (char*)malloc(dwBufLen+1);
|
|
strcpy(connectURL, iniEntry);
|
|
}
|
|
#endif
|
|
if (connectURL==NULL) // We didn't get the key from the registry so try the default url
|
|
{
|
|
char defURL[] = "http://gsconnect.ubisoft.com/gsinit.php?user=%s&dp=%s";
|
|
dwBufLen = sizeof(defURL);
|
|
connectURL = (char*)malloc(dwBufLen + 1);
|
|
strcpy(connectURL, defURL);
|
|
}
|
|
|
|
const unsigned int cMaxCount = dwBufLen + strlen(szUsername) + strlen(GAME_NAME) + 1;
|
|
char *szGSURL = (char*)malloc(cMaxCount); //size of the url + username + gamename
|
|
|
|
_snprintf(szGSURL,cMaxCount - 1, connectURL, szUsername, GAME_NAME);
|
|
free(connectURL);
|
|
|
|
|
|
/*GShandle stHandle = GSHttpInitialize();
|
|
// Returns 0 on failure, but for now I don't care
|
|
int i=GSHttpSave(stHandle,connectURL,"gsinit.ini",GS_TRUE,NULL,NULL); // Store in the working dir
|
|
assert(i);
|
|
GSHttpUninitialize();*/
|
|
|
|
//delete the current tmp file
|
|
remove(GSINIFILETMP);
|
|
|
|
|
|
#if !defined(LINUX)
|
|
HINTERNET hNet = InternetOpen("",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,NULL);
|
|
if (!hNet)
|
|
{
|
|
free(szGSURL);
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
HINTERNET hURL = InternetOpenUrl(hNet,szGSURL,NULL,0,INTERNET_FLAG_HYPERLINK,NULL);
|
|
free(szGSURL);
|
|
if (!hURL)
|
|
return false;
|
|
else
|
|
{
|
|
GSchar szBuffer[1024];
|
|
GSint iSize = 1024;
|
|
DWORD iRead = 0;
|
|
|
|
FILE *pFile = fopen(GSINIFILETMP,"w");
|
|
|
|
// If we can't open the tmp file return true and we will use the real one.
|
|
if (!pFile)
|
|
{
|
|
InternetCloseHandle(hURL);
|
|
return true;
|
|
}
|
|
|
|
while (InternetReadFile(hURL,szBuffer,iSize,&iRead))
|
|
{
|
|
if (iRead != 0)
|
|
{
|
|
fwrite(szBuffer,sizeof(GSchar),iRead,pFile);
|
|
}
|
|
else
|
|
{
|
|
fclose(pFile);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
InternetCloseHandle(hURL);
|
|
}
|
|
#else
|
|
string strText;
|
|
GetTextFromURL(szGSURL, strText);
|
|
free(szGSURL);
|
|
// write file
|
|
FILE *pFile = fopen(GSINIFILETMP,"wb");
|
|
if(NULL != pFile)
|
|
{
|
|
fwrite(strText.c_str(), 1, strText.size(), pFile);
|
|
fclose(pFile);
|
|
}
|
|
#endif
|
|
GSchar szIPAddress[100];
|
|
//Check to see if the tmp file contains good info
|
|
GetPrivateProfileString("Servers", "RouterIP0", "Key not found", szIPAddress, 100, GSINIFILETMP);
|
|
if (strcmp("Key not found", szIPAddress)!=0)
|
|
{
|
|
//It contains good info so replace the real gs.ini file
|
|
remove(GSINIFILE);
|
|
rename(GSINIFILETMP,GSINIFILE);
|
|
}
|
|
|
|
m_bDownloadedGSini = true;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
// Script Callbacks -------------------------------------------
|
|
|
|
void NewUbisoftClient::Client_LoginSuccess(const char *szUsername)
|
|
{
|
|
if (m_bSavePassword)
|
|
{
|
|
char szEncUsername[256] = {0};
|
|
char szEncPassword[256] = {0};
|
|
char szHexUsername[512] = {0};
|
|
char szHexPassword[512] = {0};
|
|
|
|
EncryptString((unsigned char *)szEncUsername, (unsigned char *)m_strUsername.c_str());
|
|
EncryptString((unsigned char *)szEncPassword, (unsigned char *)m_strPassword.c_str());
|
|
|
|
EncodeHex((unsigned char *)szHexUsername, (unsigned char *)szEncUsername);
|
|
EncodeHex((unsigned char *)szHexPassword, (unsigned char *)szEncPassword);
|
|
|
|
WriteStringToRegistry("Ubi.com", "username", szHexUsername);
|
|
WriteStringToRegistry("Ubi.com", "password", szHexPassword);
|
|
}
|
|
else
|
|
{
|
|
RemoveStringFromRegistry("Ubi.com", "username");
|
|
RemoveStringFromRegistry("Ubi.com", "password");
|
|
}
|
|
|
|
m_pScriptObject->Client_LoginSuccess(szUsername);
|
|
}
|
|
void NewUbisoftClient::Client_LoginFail(const char *szText)
|
|
{
|
|
m_pScriptObject->Client_LoginFail(szText);
|
|
}
|
|
void NewUbisoftClient::Client_GameServer(int iLobbyID, int iRoomID, const char *szServerName, const char *szIPAddress,
|
|
const char *szLANIPAddress, int iMaxPlayers, int iNumPlayers)
|
|
{
|
|
m_pScriptObject->Client_GameServer(iLobbyID,iRoomID,szServerName,szIPAddress,szLANIPAddress,iMaxPlayers,iNumPlayers);
|
|
}
|
|
void NewUbisoftClient::Client_RequestFinished()
|
|
{
|
|
m_pScriptObject->Client_RequestFinished();
|
|
}
|
|
void NewUbisoftClient::Client_JoinGameServerSuccess(const char *szIPAddress, const char *szLanIPAddress,unsigned short usPort)
|
|
{
|
|
m_pScriptObject->Client_JoinGameServerSuccess(szIPAddress,szLanIPAddress,usPort);
|
|
}
|
|
void NewUbisoftClient::Client_JoinGameServerFail(const char *szText)
|
|
{
|
|
m_pScriptObject->Client_JoinGameServerFail(szText);
|
|
}
|
|
void NewUbisoftClient::Client_CreateAccountSuccess()
|
|
{
|
|
m_pScriptObject->Client_CreateAccountSuccess();
|
|
}
|
|
void NewUbisoftClient::Client_CreateAccountFail(const char *szText)
|
|
{
|
|
m_pScriptObject->Client_CreateAccountFail(szText);
|
|
}
|
|
void NewUbisoftClient::Server_RegisterServerSuccess(GSint iLobbyID, GSint iRoomID)
|
|
{
|
|
m_pScriptObject->Server_RegisterServerSuccess(iLobbyID,iRoomID);
|
|
}
|
|
void NewUbisoftClient::Server_RegisterServerFail()
|
|
{
|
|
m_pScriptObject->Server_RegisterServerFail();
|
|
}
|
|
void NewUbisoftClient::Server_LobbyServerDisconnected()
|
|
{
|
|
m_pScriptObject->Server_LobbyServerDisconnected();
|
|
}
|
|
void NewUbisoftClient::Server_PlayerJoin(const char *szUsername)
|
|
{
|
|
m_pScriptObject->Server_PlayerJoin(szUsername);
|
|
}
|
|
void NewUbisoftClient::Server_PlayerLeave(const char *szUsername)
|
|
{
|
|
m_pScriptObject->Server_PlayerLeave(szUsername);
|
|
}
|
|
|
|
void NewUbisoftClient::CDKey_Failed(const char *szText)
|
|
{
|
|
m_pScriptObject->CDKey_Failed(szText);
|
|
}
|
|
|
|
void NewUbisoftClient::CDKey_GetCDKey()
|
|
{
|
|
m_pScriptObject->CDKey_GetCDKey();
|
|
}
|
|
|
|
void NewUbisoftClient::CDKey_ActivationSuccess()
|
|
{
|
|
m_pScriptObject->CDKey_ActivationSuccess();
|
|
}
|
|
|
|
void NewUbisoftClient::CDKey_ActivationFail(const char *szText)
|
|
{
|
|
if(m_pSystem->GetIGame()->GetModuleState(EGameMultiplayer))
|
|
m_pSystem->GetIRenderer()->ClearColorBuffer(Vec3(0,0,0));
|
|
|
|
m_pSystem->GetIConsole()->ResetProgressBar(0);
|
|
m_pSystem->GetIConsole()->ShowConsole(false);
|
|
m_pSystem->GetIConsole()->SetScrollMax(600/2);
|
|
|
|
m_pScriptObject->CDKey_ActivationFail(szText);
|
|
}
|
|
// --------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
bool NewUbisoftClient::GetRouterAddress(int iIndex, char *szIPAddress, unsigned short *pusClientPort,
|
|
unsigned short *pusRegServerPort)
|
|
{
|
|
char szKey[50];
|
|
char szPort[50];
|
|
|
|
// Try to read from the tmp file first
|
|
_snprintf(szKey, 50, "RouterIP%i", iIndex);
|
|
GetPrivateProfileString("Servers", szKey,"Key not found", szIPAddress, 50, GSINIFILE); // Read from the working directory
|
|
if (strcmp("Key not found", szIPAddress)==0)
|
|
return false;
|
|
|
|
_snprintf(szKey, 50, "RouterPort%i", iIndex);
|
|
GetPrivateProfileString("Servers", szKey,"Key not found", szPort, 50, GSINIFILE); // Read from the working directory
|
|
if (strcmp("Key not found", szPort)==0)
|
|
return false;
|
|
*pusClientPort = atoi(szPort);
|
|
|
|
_snprintf(szKey, 50, "RouterLauncherPort%i", iIndex);
|
|
GetPrivateProfileString("Servers", szKey,"Key not found", szPort, 50, GSINIFILE); // Read from the working directory
|
|
if (strcmp("Key not found", szPort)==0)
|
|
return false;
|
|
*pusRegServerPort = atoi(szPort);
|
|
return true;
|
|
}
|
|
|
|
bool NewUbisoftClient::GetCDKeyServerAddress(int iIndex, char *szIPAddress, unsigned short *pusPort)
|
|
{
|
|
char szKey[50];
|
|
char szPort[50];
|
|
// Try to read from the tmp file first
|
|
_snprintf(szKey, 50, "CDKeyServerIP%i", iIndex);
|
|
GetPrivateProfileString("Servers", szKey,"Key not found", szIPAddress, 50, GSINIFILE); // Read from the working directory
|
|
if (strcmp("Key not found", szIPAddress)==0)
|
|
return false;
|
|
_snprintf(szKey, 50, "CDKeyServerPort%i", iIndex);
|
|
GetPrivateProfileString("Servers", szKey,"Key not found", szPort, 50, GSINIFILE); // Read from the working directory
|
|
if (strcmp("Key not found", szPort)==0)
|
|
return false;
|
|
*pusPort = atoi(szPort);
|
|
return true;
|
|
}
|
|
|
|
#endif // NOT_USE_UBICOM_SDK
|