116 changes: 54 additions & 62 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1423,7 +1423,7 @@ class Game
// If address is "", local server is used and address is updated
std::string *address,
u16 port,
std::wstring *error_message,
std::string &error_message,
ChatBackend *chat_backend,
const SubgameSpec &gamespec, // Used for local game
bool simple_singleplayer_mode);
Expand All @@ -1445,9 +1445,8 @@ class Game

// Client creation
bool createClient(const std::string &playername,
const std::string &password, std::string *address, u16 port,
std::wstring *error_message);
bool initGui(std::wstring *error_message);
const std::string &password, std::string *address, u16 port);
bool initGui();

// Client connection
bool connectToServer(const std::string &playername,
Expand Down Expand Up @@ -1575,7 +1574,7 @@ class Game
video::IVideoDriver *driver;
scene::ISceneManager *smgr;
bool *kill;
std::wstring *error_message;
std::string *error_message;
IGameDef *gamedef; // Convenience (same as *client)
scene::ISceneNode *skybox;

Expand Down Expand Up @@ -1692,15 +1691,15 @@ bool Game::startup(bool *kill,
const std::string &password,
std::string *address, // can change if simple_singleplayer_mode
u16 port,
std::wstring *error_message,
std::string &error_message,
ChatBackend *chat_backend,
const SubgameSpec &gamespec,
bool simple_singleplayer_mode)
{
// "cache"
this->device = device;
this->kill = kill;
this->error_message = error_message;
this->error_message = &error_message;
this->random_input = random_input;
this->input = input;
this->chat_backend = chat_backend;
Expand All @@ -1714,7 +1713,7 @@ bool Game::startup(bool *kill,
if (!init(map_dir, address, port, gamespec))
return false;

if (!createClient(playername, password, address, port, error_message))
if (!createClient(playername, password, address, port))
return false;

return true;
Expand Down Expand Up @@ -1934,10 +1933,10 @@ bool Game::createSingleplayerServer(const std::string map_dir,
}

if (bind_addr.isIPv6() && !g_settings->getBool("enable_ipv6")) {
*error_message = L"Unable to listen on " +
narrow_to_wide(bind_addr.serializeString()) +
L" because IPv6 is disabled";
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Unable to listen on " +
bind_addr.serializeString() +
" because IPv6 is disabled";
errorstream << *error_message << std::endl;
return false;
}

Expand All @@ -1950,8 +1949,7 @@ bool Game::createSingleplayerServer(const std::string map_dir,
}

bool Game::createClient(const std::string &playername,
const std::string &password, std::string *address, u16 port,
std::wstring *error_message)
const std::string &password, std::string *address, u16 port)
{
showOverlayMessage(wgettext("Creating client..."), 0, 10);

Expand All @@ -1966,19 +1964,19 @@ bool Game::createClient(const std::string &playername,
return false;

if (!could_connect) {
if (*error_message == L"" && !connect_aborted) {
if (error_message->empty() && !connect_aborted) {
// Should not happen if error messages are set properly
*error_message = L"Connection failed for unknown reason";
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Connection failed for unknown reason";
errorstream << *error_message << std::endl;
}
return false;
}

if (!getServerContent(&connect_aborted)) {
if (*error_message == L"" && !connect_aborted) {
if (error_message->empty() && !connect_aborted) {
// Should not happen if error messages are set properly
*error_message = L"Connection failed for unknown reason";
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Connection failed for unknown reason";
errorstream << *error_message << std::endl;
}
return false;
}
Expand All @@ -1997,9 +1995,8 @@ bool Game::createClient(const std::string &playername,
if (m_cache_enable_clouds) {
clouds = new Clouds(smgr->getRootSceneNode(), smgr, -1, time(0));
if (!clouds) {
*error_message = L"Memory allocation error";
*error_message += narrow_to_wide(" (clouds)");
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Memory allocation error (clouds)";
errorstream << *error_message << std::endl;
return false;
}
}
Expand All @@ -2012,9 +2009,8 @@ bool Game::createClient(const std::string &playername,
local_inventory = new Inventory(itemdef_manager);

if (!(sky && local_inventory)) {
*error_message = L"Memory allocation error";
*error_message += narrow_to_wide(" (sky or local inventory)");
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Memory allocation error (sky or local inventory)";
errorstream << *error_message << std::endl;
return false;
}

Expand All @@ -2028,7 +2024,7 @@ bool Game::createClient(const std::string &playername,
crack_animation_length = 5;
}

if (!initGui(error_message))
if (!initGui())
return false;

/* Set window caption
Expand All @@ -2046,15 +2042,15 @@ bool Game::createClient(const std::string &playername,
hud = new Hud(driver, smgr, guienv, gamedef, player, local_inventory);

if (!hud) {
*error_message = L"Memory error: could not create HUD";
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Memory error: could not create HUD";
errorstream << *error_message << std::endl;
return false;
}

return true;
}

bool Game::initGui(std::wstring *error_message)
bool Game::initGui()
{
// First line of debug text
guitext = guienv->addStaticText(
Expand Down Expand Up @@ -2095,8 +2091,8 @@ bool Game::initGui(std::wstring *error_message)
gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(),
-1, chat_backend, client);
if (!gui_chat_console) {
*error_message = L"Could not allocate memory for chat console";
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Could not allocate memory for chat console";
errorstream << *error_message << std::endl;
return false;
}

Expand Down Expand Up @@ -2146,16 +2142,16 @@ bool Game::connectToServer(const std::string &playername,
local_server_mode = true;
}
} catch (ResolveError &e) {
*error_message = L"Couldn't resolve address: " + narrow_to_wide(e.what());
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = std::string("Couldn't resolve address: ") + e.what();
errorstream << *error_message << std::endl;
return false;
}

if (connect_address.isIPv6() && !g_settings->getBool("enable_ipv6")) {
*error_message = L"Unable to connect to " +
narrow_to_wide(connect_address.serializeString()) +
L" because IPv6 is disabled";
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Unable to connect to " +
connect_address.serializeString() +
" because IPv6 is disabled";
errorstream << *error_message << std::endl;
return false;
}

Expand Down Expand Up @@ -2205,9 +2201,9 @@ bool Game::connectToServer(const std::string &playername,

// Break conditions
if (client->accessDenied()) {
*error_message = L"Access denied. Reason: "
*error_message = "Access denied. Reason: "
+ client->accessDeniedReason();
errorstream << wide_to_narrow(*error_message) << std::endl;
errorstream << *error_message << std::endl;
break;
}

Expand Down Expand Up @@ -2253,16 +2249,12 @@ bool Game::getServerContent(bool *aborted)
}

// Error conditions
if (client->accessDenied()) {
*error_message = L"Access denied. Reason: "
+ client->accessDeniedReason();
errorstream << wide_to_narrow(*error_message) << std::endl;
if (!checkConnection())
return false;
}

if (client->getState() < LC_Init) {
*error_message = L"Client disconnected";
errorstream << wide_to_narrow(*error_message) << std::endl;
*error_message = "Client disconnected";
errorstream << *error_message << std::endl;
return false;
}

Expand Down Expand Up @@ -2336,9 +2328,9 @@ inline void Game::updateInteractTimers(GameRunData *runData, f32 dtime)
inline bool Game::checkConnection()
{
if (client->accessDenied()) {
*error_message = L"Access denied. Reason: "
*error_message = "Access denied. Reason: "
+ client->accessDeniedReason();
errorstream << wide_to_narrow(*error_message) << std::endl;
errorstream << *error_message << std::endl;
return false;
}

Expand Down Expand Up @@ -4219,7 +4211,7 @@ void the_game(bool *kill,
const std::string &address, // If empty local server is created
u16 port,

std::wstring &error_message,
std::string &error_message,
ChatBackend &chat_backend,
const SubgameSpec &gamespec, // Used for local game
bool simple_singleplayer_mode)
Expand All @@ -4235,24 +4227,24 @@ void the_game(bool *kill,
try {

if (game.startup(kill, random_input, input, device, map_dir,
playername, password, &server_address, port,
&error_message, &chat_backend, gamespec,
simple_singleplayer_mode)) {

playername, password, &server_address, port,
error_message, &chat_backend, gamespec,
simple_singleplayer_mode)) {
game.run();
game.shutdown();
}

} catch (SerializationError &e) {
error_message = L"A serialization error occurred:\n"
+ narrow_to_wide(e.what()) + L"\n\nThe server is probably "
L" running a different version of " PROJECT_NAME ".";
errorstream << wide_to_narrow(error_message) << std::endl;
error_message = std::string("A serialization error occurred:\n")
+ e.what() + "\n\nThe server is probably "
" running a different version of " PROJECT_NAME ".";
errorstream << error_message << std::endl;
} catch (ServerError &e) {
error_message = narrow_to_wide(e.what());
errorstream << "ServerError: " << e.what() << std::endl;
error_message = e.what();
errorstream << "ServerError: " << error_message << std::endl;
} catch (ModError &e) {
errorstream << "ModError: " << e.what() << std::endl;
error_message = narrow_to_wide(e.what()) + wstrgettext("\nCheck debug.txt for details.");
error_message = e.what() + strgettext("\nCheck debug.txt for details.");
errorstream << "ModError: " << error_message << std::endl;
}
}

2 changes: 1 addition & 1 deletion src/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ void the_game(bool *kill,
const std::string &password,
const std::string &address, // If "", local server is used
u16 port,
std::wstring &error_message,
std::string &error_message,
ChatBackend &chat_backend,
const SubgameSpec &gamespec, // Used for local game
bool simple_singleplayer_mode);
Expand Down
10 changes: 7 additions & 3 deletions src/network/clientpackethandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
// to be processed even if the serialisation format has
// not been agreed yet, the same as TOCLIENT_INIT.
m_access_denied = true;
m_access_denied_reason = L"Unknown";
m_access_denied_reason = "Unknown";

if (pkt->getCommand() == TOCLIENT_ACCESS_DENIED) {
if (pkt->getSize() < 1)
Expand All @@ -149,7 +149,9 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
u8 denyCode = SERVER_ACCESSDENIED_UNEXPECTED_DATA;
*pkt >> denyCode;
if (denyCode == SERVER_ACCESSDENIED_CUSTOM_STRING) {
*pkt >> m_access_denied_reason;
std::wstring wide_reason;
*pkt >> wide_reason;
m_access_denied_reason = wide_to_narrow(wide_reason);
}
else if (denyCode < SERVER_ACCESSDENIED_MAX) {
m_access_denied_reason = accessDeniedStrings[denyCode];
Expand All @@ -159,7 +161,9 @@ void Client::handleCommand_AccessDenied(NetworkPacket* pkt)
// for compat with old clients
else {
if (pkt->getSize() >= 2) {
*pkt >> m_access_denied_reason;
std::wstring wide_reason;
*pkt >> wide_reason;
m_access_denied_reason = wide_to_narrow(wide_reason);
}
}
}
Expand Down
48 changes: 24 additions & 24 deletions src/network/networkprotocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -861,36 +861,36 @@ enum ToServerCommand
};

enum AccessDeniedCode {
SERVER_ACCESSDENIED_WRONG_PASSWORD = 0,
SERVER_ACCESSDENIED_UNEXPECTED_DATA = 1,
SERVER_ACCESSDENIED_SINGLEPLAYER = 2,
SERVER_ACCESSDENIED_WRONG_VERSION = 3,
SERVER_ACCESSDENIED_WRONG_CHARS_IN_NAME = 4,
SERVER_ACCESSDENIED_WRONG_NAME = 5,
SERVER_ACCESSDENIED_TOO_MANY_USERS = 6,
SERVER_ACCESSDENIED_EMPTY_PASSWORD = 7,
SERVER_ACCESSDENIED_ALREADY_CONNECTED = 8,
SERVER_ACCESSDENIED_SERVER_FAIL = 9,
SERVER_ACCESSDENIED_CUSTOM_STRING = 10,
SERVER_ACCESSDENIED_MAX = 11,
SERVER_ACCESSDENIED_WRONG_PASSWORD,
SERVER_ACCESSDENIED_UNEXPECTED_DATA,
SERVER_ACCESSDENIED_SINGLEPLAYER,
SERVER_ACCESSDENIED_WRONG_VERSION,
SERVER_ACCESSDENIED_WRONG_CHARS_IN_NAME,
SERVER_ACCESSDENIED_WRONG_NAME,
SERVER_ACCESSDENIED_TOO_MANY_USERS,
SERVER_ACCESSDENIED_EMPTY_PASSWORD,
SERVER_ACCESSDENIED_ALREADY_CONNECTED,
SERVER_ACCESSDENIED_SERVER_FAIL,
SERVER_ACCESSDENIED_CUSTOM_STRING,
SERVER_ACCESSDENIED_MAX,
};

enum NetProtoCompressionMode {
NETPROTO_COMPRESSION_ZLIB = 0,
};

const static std::wstring accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
L"Invalid password",
L"Your client sent something server didn't expect. Try reconnecting or updating your client",
L"The server is running in simple singleplayer mode. You cannot connect.",
L"Your client's version is not supported.\nPlease contact server administrator.",
L"Name contains unallowed characters",
L"Name is not allowed",
L"Too many users.",
L"Empty passwords are disallowed. Set a password and try again.",
L"Another client is connected with this name. If your client closed unexpectedly, try again in a minute.",
L"Server authenticator failed. Maybe the servers has some problems."
L"",
const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
"Invalid password",
"Your client sent something the server didn't expect. Try reconnecting or updating your client",
"The server is running in simple singleplayer mode. You cannot connect.",
"Your client's version is not supported.\nPlease contact server administrator.",
"Player name contains disallowed characters.",
"Player name not allowed.",
"Too many users.",
"Empty passwords are disallowed. Set a password and try again.",
"Another client is connected with this name. If your client closed unexpectedly, try again in a minute.",
"Server authention failed. This is likely a server error."
"",
};

#endif