/* ** Command & Conquer Generals(tm) ** Copyright 2025 Electronic Arts Inc. ** ** 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, either version 3 of the License, or ** (at your option) any later version. ** ** 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 for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////// // FILE: WOLLoginMenu.cpp // Author: Chris Huybregts, November 2001 // Description: Lan Lobby Menu /////////////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine #include "Common/STLTypedefs.h" #include "Common/File.h" #include "Common/FileSystem.h" #include "Common/GameEngine.h" #include "Common/GameSpyMiscPreferences.h" #include "Common/QuotedPrintable.h" #include "Common/Registry.h" #include "Common/UserPreferences.h" #include "GameClient/AnimateWindowManager.h" #include "GameClient/WindowLayout.h" #include "GameClient/Gadget.h" #include "GameClient/GameText.h" #include "GameClient/Shell.h" #include "GameClient/KeyDefs.h" #include "GameClient/GameWindowManager.h" #include "GameClient/GadgetListBox.h" #include "GameClient/GadgetComboBox.h" #include "GameClient/GadgetCheckBox.h" #include "GameClient/GadgetStaticText.h" #include "GameClient/GadgetTextEntry.h" #include "GameClient/MessageBox.h" #include "GameClient/ShellHooks.h" #include "GameClient/GameWindowTransitions.h" #include "GameNetwork/GameSpy/GSConfig.h" #include "GameNetwork/GameSpy/PeerDefs.h" #include "GameNetwork/GameSpy/PeerThread.h" #include "GameNetwork/GameSpy/PingThread.h" #include "GameNetwork/GameSpy/BuddyThread.h" #include "GameNetwork/GameSpy/ThreadUtils.h" #include "GameNetwork/GameSpy/PersistentStorageThread.h" #include "GameNetwork/GameSpyOverlay.h" #include "GameNetwork/WOLBrowser/WebBrowser.h" #ifdef _INTERNAL // for occasional debugging... //#pragma optimize("", off) //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes") #endif #ifdef ALLOW_NON_PROFILED_LOGIN Bool GameSpyUseProfiles = false; #endif // ALLOW_NON_PROFILED_LOGIN static Bool webBrowserActive = FALSE; static Bool useWebBrowserForTOS = FALSE; static Bool isShuttingDown = false; static Bool buttonPushed = false; static char *nextScreen = NULL; static const UnsignedInt loginTimeoutInMS = 10000; static UnsignedInt loginAttemptTime = 0; class GameSpyLoginPreferences : public UserPreferences { public: GameSpyLoginPreferences() { m_emailPasswordMap.clear(); m_emailNickMap.clear(); } virtual ~GameSpyLoginPreferences() { m_emailPasswordMap.clear(); m_emailNickMap.clear(); } virtual Bool load(AsciiString fname); virtual Bool write(void); AsciiString getPasswordForEmail( AsciiString email ); AsciiString getDateForEmail( AsciiString email, AsciiString &month, AsciiString &date, AsciiString &year ); AsciiStringList getNicksForEmail( AsciiString email ); void addLogin( AsciiString email, AsciiString nick, AsciiString password, AsciiString date ); void forgetLogin( AsciiString email ); AsciiStringList getEmails( void ); private: typedef std::map PassMap; typedef std::map DateMap; typedef std::map NickMap; PassMap m_emailPasswordMap; NickMap m_emailNickMap; DateMap m_emailDateMap; }; static AsciiString obfuscate( AsciiString in ) { char *buf = NEW char[in.getLength() + 1]; strcpy(buf, in.str()); static const char *xor = "1337Munkee"; char *c = buf; const char *c2 = xor; while (*c) { if (!*c2) c2 = xor; if (*c != *c2) *c = *c++ ^ *c2++; else c++, c2++; } AsciiString out = buf; delete buf; return out; } Bool GameSpyLoginPreferences::load( AsciiString fname ) { if (!UserPreferences::load(fname)) return false; UserPreferences::iterator upIt = begin(); while (upIt != end()) { AsciiString key = upIt->first; if (key.startsWith("pass_")) { AsciiString email, pass; email = key.str() + 5; pass = upIt->second; AsciiString quoPass = QuotedPrintableToAsciiString(pass); pass = obfuscate(quoPass); m_emailPasswordMap[email] = pass; } if (key.startsWith("date_")) { AsciiString email, date; email = key.str() + 5; date = upIt->second; date = QuotedPrintableToAsciiString(date); m_emailDateMap[email] = date; } else if (key.startsWith("nick_")) { AsciiString email, nick, nicks; email = key.str() + 5; nicks = upIt->second; while (nicks.nextToken(&nick, ",")) { m_emailNickMap[email].push_back(nick); } } ++upIt; } return true; } Bool GameSpyLoginPreferences::write( void ) { if (m_filename.isEmpty()) return false; FILE *fp = fopen(m_filename.str(), "w"); if (fp) { fprintf(fp, "lastEmail = %s\n", ((*this)["lastEmail"].str())); fprintf(fp, "lastName = %s\n", ((*this)["lastName"].str())); fprintf(fp, "useProfiles = %s\n", ((*this)["useProfiles"].str())); PassMap::iterator passIt = m_emailPasswordMap.begin(); while (passIt != m_emailPasswordMap.end()) { AsciiString pass = obfuscate(passIt->second); AsciiString quoPass = AsciiStringToQuotedPrintable(pass); fprintf(fp, "pass_%s = %s\n", passIt->first.str(), quoPass.str()); ++passIt; } PassMap::iterator dateIt = m_emailDateMap.begin(); while (dateIt != m_emailDateMap.end()) { AsciiString date = AsciiStringToQuotedPrintable(dateIt->second); fprintf(fp, "date_%s = %s\n", dateIt->first.str(), date.str()); ++dateIt; } NickMap::iterator nickIt = m_emailNickMap.begin(); while (nickIt != m_emailNickMap.end()) { AsciiString nicks; AsciiStringListIterator listIt = nickIt->second.begin(); while (listIt != nickIt->second.end()) { nicks.concat(*listIt); nicks.concat(','); ++listIt; } fprintf(fp, "nick_%s = %s\n", nickIt->first.str(), nicks.str()); ++nickIt; } fclose(fp); return true; } return false; } AsciiString GameSpyLoginPreferences::getDateForEmail( AsciiString email, AsciiString &month, AsciiString &date, AsciiString &year ) { if ( m_emailDateMap.find(email) == m_emailDateMap.end() ) return AsciiString::TheEmptyString; AsciiString fullDate = m_emailDateMap[email]; if(fullDate.getLength() != 8) return AsciiString::TheEmptyString; month.format("%c%c", fullDate.getCharAt(0), fullDate.getCharAt(1)); date.format("%c%c", fullDate.getCharAt(2), fullDate.getCharAt(3)); year.format("%c%c%c%c", fullDate.getCharAt(4), fullDate.getCharAt(5), fullDate.getCharAt(6), fullDate.getCharAt(7)); return m_emailDateMap[email]; } AsciiString GameSpyLoginPreferences::getPasswordForEmail( AsciiString email ) { if ( m_emailPasswordMap.find(email) == m_emailPasswordMap.end() ) return AsciiString::TheEmptyString; return m_emailPasswordMap[email]; } AsciiStringList GameSpyLoginPreferences::getNicksForEmail( AsciiString email ) { if ( m_emailNickMap.find(email) == m_emailNickMap.end() ) { AsciiStringList empty; return empty; } return m_emailNickMap[email]; } void GameSpyLoginPreferences::addLogin( AsciiString email, AsciiString nick, AsciiString password, AsciiString date ) { if ( std::find(m_emailNickMap[email].begin(), m_emailNickMap[email].end(), nick) == m_emailNickMap[email].end() ) m_emailNickMap[email].push_back(nick); m_emailPasswordMap[email] = password; m_emailDateMap[email] = date; } void GameSpyLoginPreferences::forgetLogin( AsciiString email ) { m_emailNickMap.erase(email); m_emailPasswordMap.erase(email); m_emailDateMap.erase(email); } AsciiStringList GameSpyLoginPreferences::getEmails( void ) { AsciiStringList theList; NickMap::iterator it = m_emailNickMap.begin(); while (it != m_emailNickMap.end()) { theList.push_back(it->first); ++it; } return theList; } static const char *PREF_FILENAME = "GameSpyLogin.ini"; static GameSpyLoginPreferences *loginPref = NULL; static void startPings( void ) { std::list pingServers = TheGameSpyConfig->getPingServers(); Int timeout = TheGameSpyConfig->getPingTimeoutInMs(); Int reps = TheGameSpyConfig->getNumPingRepetitions(); for (std::list::const_iterator it = pingServers.begin(); it != pingServers.end(); ++it) { AsciiString pingServer = *it; PingRequest req; req.hostname = pingServer.str(); req.repetitions = reps; req.timeout = timeout; ThePinger->addRequest(req); } } //------------------------------------------------------------------------------------------------- /** This is called when a shutdown is complete for this menu */ //------------------------------------------------------------------------------------------------- static void shutdownComplete( WindowLayout *layout ) { isShuttingDown = false; // hide the layout layout->hide( TRUE ); // our shutdown is complete TheShell->shutdownComplete( layout, (nextScreen != NULL) ); if (nextScreen != NULL) { if (loginPref) { loginPref->write(); delete loginPref; loginPref = NULL; } TheShell->push(nextScreen); } else { DEBUG_ASSERTCRASH(loginPref != NULL, ("loginPref == NULL")); if (loginPref) { loginPref->write(); delete loginPref; loginPref = NULL; } } nextScreen = NULL; } // end if // PRIVATE DATA /////////////////////////////////////////////////////////////////////////////////// // window ids ------------------------------------------------------------------------------ static NameKeyType parentWOLLoginID = NAMEKEY_INVALID; static NameKeyType buttonBackID = NAMEKEY_INVALID; // profile, quick static NameKeyType buttonLoginID = NAMEKEY_INVALID; // profile, quick static NameKeyType buttonCreateAccountID = NAMEKEY_INVALID; // profile, quick static NameKeyType buttonUseAccountID = NAMEKEY_INVALID; // quick static NameKeyType buttonDontUseAccountID = NAMEKEY_INVALID; // profile static NameKeyType buttonTOSID = NAMEKEY_INVALID; // TOS static NameKeyType parentTOSID = NAMEKEY_INVALID; // TOS Parent static NameKeyType buttonTOSOKID = NAMEKEY_INVALID; // TOS static NameKeyType listboxTOSID = NAMEKEY_INVALID; // TOS static NameKeyType comboBoxEmailID = NAMEKEY_INVALID; // profile static NameKeyType comboBoxLoginNameID = NAMEKEY_INVALID; // profile static NameKeyType textEntryLoginNameID = NAMEKEY_INVALID; // quick static NameKeyType textEntryPasswordID = NAMEKEY_INVALID; // profile static NameKeyType checkBoxRememberPasswordID = NAMEKEY_INVALID; // checkbox to remember information or not static NameKeyType textEntryMonthID = NAMEKEY_INVALID; // profile static NameKeyType textEntryDayID = NAMEKEY_INVALID; // profile static NameKeyType textEntryYearID = NAMEKEY_INVALID; // profile // Window Pointers ------------------------------------------------------------------------ static GameWindow *parentWOLLogin = NULL; static GameWindow *buttonBack = NULL; static GameWindow *buttonLogin = NULL; static GameWindow *buttonCreateAccount = NULL; static GameWindow *buttonUseAccount = NULL; static GameWindow *buttonDontUseAccount = NULL; static GameWindow *buttonTOS = NULL; static GameWindow *parentTOS = NULL; static GameWindow *buttonTOSOK = NULL; static GameWindow *listboxTOS = NULL; static GameWindow *comboBoxEmail = NULL; static GameWindow *comboBoxLoginName = NULL; static GameWindow *textEntryLoginName = NULL; static GameWindow *textEntryPassword = NULL; static GameWindow *checkBoxRememberPassword = NULL; static GameWindow *textEntryMonth = NULL; static GameWindow *textEntryDay = NULL; static GameWindow *textEntryYear = NULL; void EnableLoginControls( Bool state ) { if (buttonLogin) buttonLogin->winEnable(state); if (buttonCreateAccount) buttonCreateAccount->winEnable(state); if (buttonUseAccount) buttonUseAccount->winEnable(state); if (buttonDontUseAccount) buttonDontUseAccount->winEnable(state); if (comboBoxEmail) comboBoxEmail->winEnable(state); if (comboBoxLoginName) comboBoxLoginName->winEnable(state); if (textEntryLoginName) textEntryLoginName->winEnable(state); if (textEntryPassword) textEntryPassword->winEnable(state); if (checkBoxRememberPassword) checkBoxRememberPassword->winEnable(state); if( buttonTOS ) buttonTOS->winEnable(state); if (textEntryMonth) textEntryMonth->winEnable(state); if (textEntryDay) textEntryDay->winEnable(state); if( textEntryYear ) textEntryYear->winEnable(state); } //------------------------------------------------------------------------------------------------- /** Initialize the WOL Login Menu */ //------------------------------------------------------------------------------------------------- void WOLLoginMenuInit( WindowLayout *layout, void *userData ) { nextScreen = NULL; buttonPushed = false; isShuttingDown = false; loginAttemptTime = 0; if (!loginPref) { loginPref = NEW GameSpyLoginPreferences; loginPref->load(PREF_FILENAME); } // if the ESRB warning is blank (other country) hide the box GameWindow *esrbTitle = TheWindowManager->winGetWindowFromId( NULL, NAMEKEY("GameSpyLoginProfile.wnd:StaticTextESRBTop") ); GameWindow *esrbParent = TheWindowManager->winGetWindowFromId( NULL, NAMEKEY("GameSpyLoginProfile.wnd:ParentESRB") ); if (esrbTitle && esrbParent) { if ( GadgetStaticTextGetText( esrbTitle ).getLength() < 2 ) { esrbParent->winHide(TRUE); } } parentWOLLoginID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:WOLLoginMenuParent" ); buttonBackID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ButtonBack" ); buttonLoginID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ButtonLogin" ); buttonCreateAccountID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ButtonCreateAccount" ); buttonUseAccountID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ButtonUseAccount" ); buttonDontUseAccountID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ButtonDontUseAccount" ); buttonTOSID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ButtonTOS" ); parentTOSID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ParentTOS" ); buttonTOSOKID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ButtonTOSOK" ); listboxTOSID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ListboxTOS" ); comboBoxEmailID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ComboBoxEmail" ); comboBoxLoginNameID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:ComboBoxLoginName" ); textEntryLoginNameID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:TextEntryLoginName" ); textEntryPasswordID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:TextEntryPassword" ); checkBoxRememberPasswordID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:CheckBoxRememberInfo" ); textEntryMonthID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:TextEntryMonth" ); textEntryDayID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:TextEntryDay" ); textEntryYearID = TheNameKeyGenerator->nameToKey( "GameSpyLoginProfile.wnd:TextEntryYear" ); parentWOLLogin = TheWindowManager->winGetWindowFromId( NULL, parentWOLLoginID ); buttonBack = TheWindowManager->winGetWindowFromId( NULL, buttonBackID); buttonLogin = TheWindowManager->winGetWindowFromId( NULL, buttonLoginID); buttonCreateAccount = TheWindowManager->winGetWindowFromId( NULL, buttonCreateAccountID); buttonUseAccount = TheWindowManager->winGetWindowFromId( NULL, buttonUseAccountID); buttonDontUseAccount = TheWindowManager->winGetWindowFromId( NULL, buttonDontUseAccountID); buttonTOS = TheWindowManager->winGetWindowFromId( NULL, buttonTOSID); parentTOS = TheWindowManager->winGetWindowFromId( NULL, parentTOSID); buttonTOSOK = TheWindowManager->winGetWindowFromId( NULL, buttonTOSOKID); listboxTOS = TheWindowManager->winGetWindowFromId( NULL, listboxTOSID); comboBoxEmail = TheWindowManager->winGetWindowFromId( NULL, comboBoxEmailID); comboBoxLoginName = TheWindowManager->winGetWindowFromId( NULL, comboBoxLoginNameID); textEntryLoginName = TheWindowManager->winGetWindowFromId( NULL, textEntryLoginNameID); textEntryPassword = TheWindowManager->winGetWindowFromId( NULL, textEntryPasswordID); checkBoxRememberPassword = TheWindowManager->winGetWindowFromId( NULL, checkBoxRememberPasswordID); textEntryMonth = TheWindowManager->winGetWindowFromId( NULL, textEntryMonthID); textEntryDay = TheWindowManager->winGetWindowFromId( NULL, textEntryDayID); textEntryYear = TheWindowManager->winGetWindowFromId( NULL, textEntryYearID); GadgetTextEntrySetText(textEntryMonth, UnicodeString::TheEmptyString); GadgetTextEntrySetText(textEntryDay, UnicodeString::TheEmptyString); GadgetTextEntrySetText(textEntryYear, UnicodeString::TheEmptyString); GameWindowList tabList; tabList.push_front(comboBoxEmail); tabList.push_back(comboBoxLoginName); tabList.push_back(textEntryPassword); tabList.push_back(textEntryMonth); tabList.push_back(textEntryDay); tabList.push_back(textEntryYear); tabList.push_back(checkBoxRememberPassword); tabList.push_back(buttonLogin); tabList.push_back(buttonCreateAccount); tabList.push_back(buttonTOS); tabList.push_back(buttonBack); TheWindowManager->clearTabList(); TheWindowManager->registerTabList(tabList); TheWindowManager->winSetFocus( comboBoxEmail ); // short form or long form? #ifdef ALLOW_NON_PROFILED_LOGIN if (parentWOLLogin) { GameSpyUseProfiles = true; #endif // ALLOW_NON_PROFILED_LOGIN DEBUG_ASSERTCRASH(buttonBack, ("buttonBack missing!")); DEBUG_ASSERTCRASH(buttonLogin, ("buttonLogin missing!")); DEBUG_ASSERTCRASH(buttonCreateAccount, ("buttonCreateAccount missing!")); //DEBUG_ASSERTCRASH(buttonDontUseAccount, ("buttonDontUseAccount missing!")); DEBUG_ASSERTCRASH(comboBoxEmail, ("comboBoxEmail missing!")); DEBUG_ASSERTCRASH(comboBoxLoginName, ("comboBoxLoginName missing!")); DEBUG_ASSERTCRASH(textEntryPassword, ("textEntryPassword missing!")); //TheShell->registerWithAnimateManager(parentWOLLogin, WIN_ANIMATION_SLIDE_TOP, TRUE); /**/ // TheShell->registerWithAnimateManager(buttonTOS, WIN_ANIMATION_SLIDE_BOTTOM, TRUE); //TheShell->registerWithAnimateManager(buttonCreateAccount, WIN_ANIMATION_SLIDE_LEFT, TRUE); //TheShell->registerWithAnimateManager(buttonDontUseAccount, WIN_ANIMATION_SLIDE_LEFT, TRUE); // TheShell->registerWithAnimateManager(buttonBack, WIN_ANIMATION_SLIDE_BOTTOM, TRUE); /**/ #ifdef ALLOW_NON_PROFILED_LOGIN } else { GameSpyUseProfiles = false; parentWOLLoginID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:WOLLoginMenuParent" ); buttonBackID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ButtonBack" ); buttonLoginID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ButtonLogin" ); buttonCreateAccountID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ButtonCreateAccount" ); buttonUseAccountID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ButtonUseAccount" ); buttonDontUseAccountID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ButtonDontUseAccount" ); buttonTOSID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ButtonTOS" ); parentTOSID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ParentTOS" ); buttonTOSOKID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ButtonTOSOK" ); listboxTOSID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ListboxTOS" ); comboBoxEmailID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:ComboBoxEmail" ); textEntryLoginNameID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:TextEntryLoginName" ); textEntryPasswordID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:TextEntryPassword" ); checkBoxRememberPasswordID = TheNameKeyGenerator->nameToKey( "GameSpyLoginQuick.wnd:CheckBoxRememberPassword" ); parentWOLLogin = TheWindowManager->winGetWindowFromId( NULL, parentWOLLoginID ); buttonBack = TheWindowManager->winGetWindowFromId( NULL, buttonBackID); buttonLogin = TheWindowManager->winGetWindowFromId( NULL, buttonLoginID); buttonCreateAccount = TheWindowManager->winGetWindowFromId( NULL, buttonCreateAccountID); buttonUseAccount = TheWindowManager->winGetWindowFromId( NULL, buttonUseAccountID); buttonDontUseAccount = TheWindowManager->winGetWindowFromId( NULL, buttonDontUseAccountID); comboBoxEmail = TheWindowManager->winGetWindowFromId( NULL, comboBoxEmailID); buttonTOS = TheWindowManager->winGetWindowFromId( NULL, buttonTOSID); parentTOS = TheWindowManager->winGetWindowFromId( NULL, parentTOSID); buttonTOSOK = TheWindowManager->winGetWindowFromId( NULL, buttonTOSOKID); listboxTOS = TheWindowManager->winGetWindowFromId( NULL, listboxTOSID); textEntryLoginName = TheWindowManager->winGetWindowFromId( NULL, textEntryLoginNameID); textEntryPassword = TheWindowManager->winGetWindowFromId( NULL, textEntryPasswordID); checkBoxRememberPassword = TheWindowManager->winGetWindowFromId( NULL, checkBoxRememberPasswordID); DEBUG_ASSERTCRASH(buttonBack, ("buttonBack missing!")); DEBUG_ASSERTCRASH(buttonLogin, ("buttonLogin missing!")); DEBUG_ASSERTCRASH(buttonCreateAccount, ("buttonCreateAccount missing!")); DEBUG_ASSERTCRASH(buttonUseAccount, ("buttonUseAccount missing!")); DEBUG_ASSERTCRASH(textEntryLoginName, ("textEntryLoginName missing!")); TheWindowManager->winSetFocus( textEntryLoginName ); //TheShell->registerWithAnimateManager(parentWOLLogin, WIN_ANIMATION_SLIDE_TOP, TRUE); // TheShell->registerWithAnimateManager(buttonTOS, WIN_ANIMATION_SLIDE_LEFT, TRUE); // TheShell->registerWithAnimateManager(buttonCreateAccount, WIN_ANIMATION_SLIDE_LEFT, TRUE); // TheShell->registerWithAnimateManager(buttonUseAccount, WIN_ANIMATION_SLIDE_LEFT, TRUE); // TheShell->registerWithAnimateManager(buttonBack, WIN_ANIMATION_SLIDE_RIGHT, TRUE); } #endif // ALLOW_NON_PROFILED_LOGIN #ifdef ALLOW_NON_PROFILED_LOGIN if (GameSpyUseProfiles) { #endif // ALLOW_NON_PROFILED_LOGIN // Read login names from registry... GadgetComboBoxReset(comboBoxEmail); GadgetTextEntrySetText(textEntryPassword, UnicodeString.TheEmptyString); // look for cached nicks to add AsciiString lastName; AsciiString lastEmail; Bool markCheckBox = FALSE; UserPreferences::const_iterator it = loginPref->find("lastName"); if (it != loginPref->end()) { lastName = it->second; } it = loginPref->find("lastEmail"); if (it != loginPref->end()) { lastEmail = it->second; } // fill in list of Emails, and select the most recent AsciiStringList cachedEmails = loginPref->getEmails(); AsciiStringListIterator eIt = cachedEmails.begin(); Int selectedPos = -1; while (eIt != cachedEmails.end()) { UnicodeString uniEmail; uniEmail.translate(*eIt); Int pos = GadgetComboBoxAddEntry(comboBoxEmail, uniEmail, GameSpyColor[GSCOLOR_DEFAULT]); if (*eIt == lastEmail) selectedPos = pos; ++eIt; } if (selectedPos >= 0) { GadgetComboBoxSetSelectedPos(comboBoxEmail, selectedPos); // fill in the password for the selected email UnicodeString pass; pass.translate(loginPref->getPasswordForEmail(lastEmail)); GadgetTextEntrySetText(textEntryPassword, pass); AsciiString month,day,year; loginPref->getDateForEmail(lastEmail, month, day, year); pass.translate(month); GadgetTextEntrySetText(textEntryMonth, pass); pass.translate(day); GadgetTextEntrySetText(textEntryDay, pass); pass.translate(year); GadgetTextEntrySetText(textEntryYear, pass); markCheckBox = TRUE; } // fill in list of nicks for selected email, selecting the most recent GadgetComboBoxReset(comboBoxLoginName); AsciiStringList cachedNicks = loginPref->getNicksForEmail(lastEmail); AsciiStringListIterator nIt = cachedNicks.begin(); selectedPos = -1; while (nIt != cachedNicks.end()) { UnicodeString uniNick; uniNick.translate(*nIt); Int pos = GadgetComboBoxAddEntry(comboBoxLoginName, uniNick, GameSpyColor[GSCOLOR_DEFAULT]); if (*nIt == lastName) selectedPos = pos; ++nIt; } if (selectedPos >= 0) { GadgetComboBoxSetSelectedPos(comboBoxLoginName, selectedPos); markCheckBox = TRUE; } // always start with not storing information if( markCheckBox) GadgetCheckBoxSetChecked(checkBoxRememberPassword, TRUE); else GadgetCheckBoxSetChecked(checkBoxRememberPassword, FALSE); #ifdef ALLOW_NON_PROFILED_LOGIN } else { // Read login names from registry... GadgetComboBoxReset(comboBoxLoginName); UnicodeString nick; UserPreferences::const_iterator it = loginPref->find("lastName"); if (it != loginPref->end()) { nick.translate(it->second); } else { char userBuf[32] = ""; unsigned long bufSize = 32; GetUserName(userBuf, &bufSize); nick.translate(userBuf); } GadgetTextEntrySetText(textEntryLoginName, nick); } #endif // ALLOW_NON_PROFILED_LOGIN EnableLoginControls(TRUE); // Show Menu layout->hide( FALSE ); // Set Keyboard to Main Parent RaiseGSMessageBox(); OptionPreferences optionPref; if (!optionPref.getBool("SawTOS", TRUE)) { TheWindowManager->winSendSystemMsg( parentWOLLogin, GBM_SELECTED, (WindowMsgData)buttonTOS, buttonTOSID ); } TheTransitionHandler->setGroup("GameSpyLoginProfileFade"); } // WOLLoginMenuInit //------------------------------------------------------------------------------------------------- /** WOL Login Menu shutdown method */ //------------------------------------------------------------------------------------------------- static Bool loggedInOK = false; void WOLLoginMenuShutdown( WindowLayout *layout, void *userData ) { isShuttingDown = true; loggedInOK = false; TheWindowManager->clearTabList(); if (webBrowserActive) { if (TheWebBrowser != NULL) { TheWebBrowser->closeBrowserWindow(listboxTOS); } webBrowserActive = FALSE; } // if we are shutting down for an immediate pop, skip the animations Bool popImmediate = *(Bool *)userData; if( popImmediate ) { shutdownComplete( layout ); return; } //end if TheShell->reverseAnimatewindow(); TheTransitionHandler->reverse("GameSpyLoginProfileFade"); } // WOLLoginMenuShutdown // this is used to check if we've got all the pings static void checkLogin( void ) { if (loggedInOK && ThePinger && !ThePinger->arePingsInProgress()) { // save off our ping string, and end those threads AsciiString pingStr = ThePinger->getPingString( 1000 ); DEBUG_LOG(("Ping string is %s\n", pingStr.str())); TheGameSpyInfo->setPingString(pingStr); //delete ThePinger; //ThePinger = NULL; buttonPushed = true; loggedInOK = false; // don't try this again loginAttemptTime = 0; // start looking for group rooms TheGameSpyInfo->clearGroupRoomList(); SignalUIInteraction(SHELL_SCRIPT_HOOK_GENERALS_ONLINE_LOGIN); nextScreen = "Menus/WOLWelcomeMenu.wnd"; TheShell->pop(); // read in some cached data GameSpyMiscPreferences mPref; PSPlayerStats localPSStats = GameSpyPSMessageQueueInterface::parsePlayerKVPairs(mPref.getCachedStats().str()); localPSStats.id = TheGameSpyInfo->getLocalProfileID(); TheGameSpyInfo->setCachedLocalPlayerStats(localPSStats); // TheGameSpyPSMessageQueue->trackPlayerStats(localPSStats); // and push the info around to other players // PSResponse newResp; // newResp.responseType = PSResponse::PSRESPONSE_PLAYERSTATS; // newResp.player = localPSStats; // TheGameSpyPSMessageQueue->addResponse(newResp); } } //------------------------------------------------------------------------------------------------- /** WOL Login Menu update method */ //------------------------------------------------------------------------------------------------- void WOLLoginMenuUpdate( WindowLayout * layout, void *userData) { // We'll only be successful if we've requested to if(isShuttingDown && TheShell->isAnimFinished() && TheTransitionHandler->isFinished()) shutdownComplete(layout); if (TheShell->isAnimFinished() && !buttonPushed && TheGameSpyPeerMessageQueue) { PingResponse pingResp; if (ThePinger && ThePinger->getResponse(pingResp)) { checkLogin(); } PeerResponse resp; if (!loggedInOK && TheGameSpyPeerMessageQueue->getResponse( resp )) { switch (resp.peerResponseType) { case PeerResponse::PEERRESPONSE_GROUPROOM: { GameSpyGroupRoom room; room.m_groupID = resp.groupRoom.id; room.m_maxWaiting = resp.groupRoom.maxWaiting; room.m_name = resp.groupRoomName.c_str(); room.m_translatedName = UnicodeString(L"TEST"); room.m_numGames = resp.groupRoom.numGames; room.m_numPlaying = resp.groupRoom.numPlaying; room.m_numWaiting = resp.groupRoom.numWaiting; TheGameSpyInfo->addGroupRoom( room ); } break; case PeerResponse::PEERRESPONSE_LOGIN: { loggedInOK = true; // fetch our player info TheGameSpyInfo->setLocalName( resp.nick.c_str() ); TheGameSpyInfo->setLocalProfileID( resp.player.profileID ); TheGameSpyInfo->loadSavedIgnoreList(); TheGameSpyInfo->setLocalIPs(resp.player.internalIP, resp.player.externalIP); TheGameSpyInfo->readAdditionalDisconnects(); //TheGameSpyInfo->setLocalEmail( resp.player.email ); //TheGameSpyInfo->setLocalPassword( resp) GameSpyMiscPreferences miscPref; TheGameSpyInfo->setMaxMessagesPerUpdate(miscPref.getMaxMessagesPerUpdate()); } break; case PeerResponse::PEERRESPONSE_DISCONNECT: { loginAttemptTime = 0; UnicodeString title, body; AsciiString disconMunkee; disconMunkee.format("GUI:GSDisconReason%d", resp.discon.reason); title = TheGameText->fetch( "GUI:GSErrorTitle" ); body = TheGameText->fetch( disconMunkee ); GSMessageBoxOk( title, body ); EnableLoginControls( TRUE ); // kill & restart the threads AsciiString motd = TheGameSpyInfo->getMOTD(); AsciiString config = TheGameSpyInfo->getConfig(); DEBUG_LOG(("Tearing down GameSpy from WOLLoginMenuUpdate(PEERRESPONSE_DISCONNECT)\n")); TearDownGameSpy(); SetUpGameSpy( motd.str(), config.str() ); } break; } } checkLogin(); } if (TheGameSpyInfo && !buttonPushed && loginAttemptTime && (loginAttemptTime + loginTimeoutInMS < timeGetTime())) { // timed out a login attempt, so say so loginAttemptTime = 0; UnicodeString title, body; AsciiString disconMunkee; disconMunkee.format("GUI:GSDisconReason4"); // ("could not connect to server") title = TheGameText->fetch( "GUI:GSErrorTitle" ); body = TheGameText->fetch( disconMunkee ); GSMessageBoxOk( title, body ); EnableLoginControls( TRUE ); // kill & restart the threads AsciiString motd = TheGameSpyInfo->getMOTD(); AsciiString config = TheGameSpyInfo->getConfig(); DEBUG_LOG(("Tearing down GameSpy from WOLLoginMenuUpdate(login timeout)\n")); TearDownGameSpy(); SetUpGameSpy( motd.str(), config.str() ); } }// WOLLoginMenuUpdate //------------------------------------------------------------------------------------------------- /** WOL Login Menu input callback */ //------------------------------------------------------------------------------------------------- WindowMsgHandledType WOLLoginMenuInput( GameWindow *window, UnsignedInt msg, WindowMsgData mData1, WindowMsgData mData2 ) { switch( msg ) { // -------------------------------------------------------------------------------------------- case GWM_CHAR: { UnsignedByte key = mData1; UnsignedByte state = mData2; if (buttonPushed) break; switch( key ) { // ---------------------------------------------------------------------------------------- case KEY_ESC: { // // send a simulated selected event to the parent window of the // back/exit button // if( BitTest( state, KEY_STATE_UP ) ) { TheWindowManager->winSendSystemMsg( window, GBM_SELECTED, (WindowMsgData)buttonBack, buttonBackID ); } // end if // don't let key fall through anywhere else return MSG_HANDLED; } // end escape } // end switch( key ) } // end char } // end switch( msg ) return MSG_IGNORED; }// WOLLoginMenuInput static Bool isNickOkay(UnicodeString nick) { static const WideChar * legalIRCChars = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789[]`_^{|}-"; Int len = nick.getLength(); if (len == 0) return TRUE; if (len == 1 && nick.getCharAt(0) == L'-') return FALSE; WideChar newChar = nick.getCharAt(len-1); if (wcschr(legalIRCChars, newChar) == NULL) return FALSE; return TRUE; } static Bool isAgeOkay(AsciiString &month, AsciiString &day, AsciiString year) { if(month.isEmpty() || day.isEmpty() || year.isEmpty() || year.getLength() != 4) return FALSE; Int monthInt = atoi(month.str()); Int dayInt = atoi(day.str()); if(monthInt > 12 || dayInt > 31) return FALSE; // setup date buffer for local region date format month.format("%02.2d",monthInt); day.format("%02.2d",dayInt); // test the year first #define DATE_BUFFER_SIZE 256 char dateBuffer[ DATE_BUFFER_SIZE ]; GetDateFormat( LOCALE_SYSTEM_DEFAULT, 0, NULL, "yyyy", dateBuffer, DATE_BUFFER_SIZE ); Int sysVal = atoi(dateBuffer); Int userVal = atoi(year.str()); if(sysVal - userVal >= 14) return TRUE; else if( sysVal - userVal <= 12) return FALSE; GetDateFormat( LOCALE_SYSTEM_DEFAULT, 0, NULL, "MM", dateBuffer, DATE_BUFFER_SIZE ); sysVal = atoi(dateBuffer); userVal = atoi(month.str()); if(sysVal - userVal >0 ) return TRUE; else if( sysVal -userVal < 0 ) return FALSE; // month.format("%02.2d",userVal); GetDateFormat( LOCALE_SYSTEM_DEFAULT, 0, NULL, "dd", dateBuffer, DATE_BUFFER_SIZE ); sysVal = atoi(dateBuffer); userVal = atoi(day.str()); if(sysVal - userVal< 0) return FALSE; // day.format("%02.2d",userVal); return TRUE; } //------------------------------------------------------------------------------------------------- /** WOL Login Menu window system callback */ //------------------------------------------------------------------------------------------------- WindowMsgHandledType WOLLoginMenuSystem( GameWindow *window, UnsignedInt msg, WindowMsgData mData1, WindowMsgData mData2 ) { UnicodeString txtInput; switch( msg ) { case GWM_CREATE: { break; } // case GWM_DESTROY: case GWM_DESTROY: { break; } // case GWM_DESTROY: case GWM_INPUT_FOCUS: { // if we're givin the opportunity to take the keyboard focus we must say we want it if( mData1 == TRUE ) *(Bool *)mData2 = TRUE; return MSG_HANDLED; }//case GWM_INPUT_FOCUS: // someone typed in a combo box. Clear password (or fill it in if the typed name matches a known login name) case GCM_UPDATE_TEXT: { UnicodeString uNick = GadgetComboBoxGetText(comboBoxLoginName); UnicodeString uEmail = GadgetComboBoxGetText(comboBoxEmail); AsciiString nick, email; nick.translate(uNick); email.translate(uEmail); GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); UnicodeString trimmedNick = uNick, trimmedEmail = uEmail; trimmedNick.trim(); trimmedEmail.trim(); if (!trimmedNick.isEmpty()) { if (trimmedNick.getCharAt(trimmedNick.getLength()-1) == L'\\') trimmedNick.removeLastChar(); if (trimmedNick.getCharAt(trimmedNick.getLength()-1) == L'/') trimmedNick.removeLastChar(); } if (!trimmedEmail.isEmpty()) { if (trimmedEmail.getCharAt(trimmedEmail.getLength()-1) == L'\\') trimmedEmail.removeLastChar(); if (trimmedEmail.getCharAt(trimmedEmail.getLength()-1) == L'/') trimmedEmail.removeLastChar(); } if (trimmedEmail.getLength() != uEmail.getLength()) { // we just trimmed a space. set the text back and bail GadgetComboBoxSetText(comboBoxEmail, trimmedEmail); break; } if (trimmedNick.getLength() != nick.getLength()) { // we just trimmed a space. set the text back and bail GadgetComboBoxSetText(comboBoxLoginName, trimmedNick); break; } if (controlID == comboBoxEmailID) { // email changed. look up password, and choose new login names // fill in the password for the selected email UnicodeString pass; pass.translate(loginPref->getPasswordForEmail(email)); GadgetTextEntrySetText(textEntryPassword, pass); // fill in list of nicks for selected email, selecting the first AsciiStringList cachedNicks = loginPref->getNicksForEmail(email); AsciiStringListIterator nIt = cachedNicks.begin(); Int selectedPos = -1; GadgetComboBoxReset(comboBoxLoginName); while (nIt != cachedNicks.end()) { UnicodeString uniNick; uniNick.translate(*nIt); GadgetComboBoxAddEntry(comboBoxLoginName, uniNick, GameSpyColor[GSCOLOR_DEFAULT]); selectedPos = 0; ++nIt; } if (selectedPos >= 0) { GadgetComboBoxSetSelectedPos(comboBoxLoginName, selectedPos); GadgetCheckBoxSetChecked(checkBoxRememberPassword, true); AsciiString month,day,year; loginPref->getDateForEmail(email, month, day, year); pass.translate(month); GadgetTextEntrySetText(textEntryMonth, pass); pass.translate(day); GadgetTextEntrySetText(textEntryDay, pass); pass.translate(year); GadgetTextEntrySetText(textEntryYear, pass); } else { GadgetCheckBoxSetChecked(checkBoxRememberPassword, false); GadgetTextEntrySetText(textEntryMonth, UnicodeString::TheEmptyString); GadgetTextEntrySetText(textEntryDay, UnicodeString::TheEmptyString); GadgetTextEntrySetText(textEntryYear, UnicodeString::TheEmptyString); } } else if (controlID == comboBoxLoginNameID) { // they typed a new login name. Email & pass shouldn't change } break; } case GCM_SELECTED: { if (buttonPushed) break; GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if (controlID == comboBoxEmailID) { // email changed. look up password, and choose new login names UnicodeString uEmail = GadgetComboBoxGetText(comboBoxEmail); AsciiString email; email.translate(uEmail); // fill in the password for the selected email UnicodeString pass; pass.translate(loginPref->getPasswordForEmail(email)); GadgetTextEntrySetText(textEntryPassword, pass); // fill in list of nicks for selected email, selecting the first AsciiStringList cachedNicks = loginPref->getNicksForEmail(email); AsciiStringListIterator nIt = cachedNicks.begin(); Int selectedPos = -1; GadgetComboBoxReset(comboBoxLoginName); while (nIt != cachedNicks.end()) { UnicodeString uniNick; uniNick.translate(*nIt); GadgetComboBoxAddEntry(comboBoxLoginName, uniNick, GameSpyColor[GSCOLOR_DEFAULT]); selectedPos = 0; ++nIt; } if (selectedPos >= 0) { GadgetComboBoxSetSelectedPos(comboBoxLoginName, selectedPos); GadgetCheckBoxSetChecked(checkBoxRememberPassword, true); AsciiString month,day,year; loginPref->getDateForEmail(email, month, day, year); pass.translate(month); GadgetTextEntrySetText(textEntryMonth, pass); pass.translate(day); GadgetTextEntrySetText(textEntryDay, pass); pass.translate(year); GadgetTextEntrySetText(textEntryYear, pass); } else { GadgetCheckBoxSetChecked(checkBoxRememberPassword, false); GadgetTextEntrySetText(textEntryMonth, UnicodeString::TheEmptyString); GadgetTextEntrySetText(textEntryDay, UnicodeString::TheEmptyString); GadgetTextEntrySetText(textEntryYear, UnicodeString::TheEmptyString); } } else if (controlID == comboBoxLoginNameID) { // they typed a new login name. Email & pass shouldn't change } break; } case GBM_SELECTED: { if (buttonPushed) break; GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); // If we back out, just bail - we haven't gotten far enough to need to log out if ( controlID == buttonBackID ) { buttonPushed = true; TearDownGameSpy(); TheShell->pop(); } //if ( controlID == buttonBack ) #ifdef ALLOW_NON_PROFILED_LOGIN else if ( controlID == buttonUseAccountID ) { buttonPushed = true; nextScreen = "Menus/GameSpyLoginProfile.wnd"; TheShell->pop(); //TheShell->push( "Menus/GameSpyLoginProfile.wnd" ); } //if ( controlID == buttonUseAccount ) else if ( controlID == buttonDontUseAccountID ) { buttonPushed = true; nextScreen = "Menus/GameSpyLoginQuick.wnd"; TheShell->pop(); //TheShell->push( "Menus/GameSpyLoginQuick.wnd" ); } //if ( controlID == buttonDontUseAccount ) #endif // ALLOW_NON_PROFILED_LOGIN else if ( controlID == buttonCreateAccountID ) { #ifdef ALLOW_NON_PROFILED_LOGIN if (GameSpyUseProfiles) { #endif // ALLOW_NON_PROFILED_LOGIN // actually attempt to create an account based on info entered AsciiString month, day, year; month.translate( GadgetTextEntryGetText(textEntryMonth) ); day.translate( GadgetTextEntryGetText(textEntryDay) ); year.translate( GadgetTextEntryGetText(textEntryYear) ); if(!isAgeOkay(month, day, year)) { GSMessageBoxOk(TheGameText->fetch("GUI:AgeFailedTitle"), TheGameText->fetch("GUI:AgeFailed")); break; } AsciiString login, password, email; email.translate( GadgetComboBoxGetText(comboBoxEmail) ); login.translate( GadgetComboBoxGetText(comboBoxLoginName) ); password.translate( GadgetTextEntryGetText(textEntryPassword) ); if ( !email.isEmpty() && !login.isEmpty() && !password.isEmpty() ) { loginAttemptTime = timeGetTime(); BuddyRequest req; req.buddyRequestType = BuddyRequest::BUDDYREQUEST_LOGINNEW; strcpy(req.arg.login.nick, login.str()); strcpy(req.arg.login.email, email.str()); strcpy(req.arg.login.password, password.str()); req.arg.login.hasFirewall = TRUE; TheGameSpyInfo->setLocalBaseName( login ); //TheGameSpyInfo->setLocalProfileID( resp.player.profileID ); TheGameSpyInfo->setLocalEmail( email ); TheGameSpyInfo->setLocalPassword( password ); DEBUG_LOG(("before create: TheGameSpyInfo->stuff(%s/%s/%s)\n", TheGameSpyInfo->getLocalBaseName().str(), TheGameSpyInfo->getLocalEmail().str(), TheGameSpyInfo->getLocalPassword().str())); TheGameSpyBuddyMessageQueue->addRequest( req ); if(checkBoxRememberPassword && GadgetCheckBoxIsChecked(checkBoxRememberPassword)) { (*loginPref)["lastName"] = login; (*loginPref)["lastEmail"] = email; (*loginPref)["useProfiles"] = "yes"; AsciiString date; date = month; date.concat(day); date.concat(year); loginPref->addLogin(email, login, password, date); } EnableLoginControls( FALSE ); // fire off some pings startPings(); } else { // user didn't fill in all info. prompt him. if(email.isEmpty() && login.isEmpty() && password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoAll")); else if( email.isEmpty() && login.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoEmailNickname")); else if( email.isEmpty() && password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoEmailPassword")); else if( login.isEmpty() && password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoNicknamePassword")); else if( email.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoEmail")); else if( password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoPassword")); else if( login.isEmpty() ) GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoNickname")); else GSMessageBoxOk(TheGameText->fetch("GUI:Error"), TheGameText->fetch("GUI:GSNoLoginInfoAll")); } #ifdef ALLOW_NON_PROFILED_LOGIN } else { // not the profile screen - switch to it buttonPushed = TRUE; nextScreen = "Menus/GameSpyLoginProfile.wnd"; TheShell->pop(); } #endif // ALLOW_NON_PROFILED_LOGIN } //if ( controlID == buttonCreateAccount ) else if ( controlID == buttonLoginID ) { AsciiString login, password, email; #ifdef ALLOW_NON_PROFILED_LOGIN if (GameSpyUseProfiles) { #endif // ALLOW_NON_PROFILED_LOGIN AsciiString month, day, year; month.translate( GadgetTextEntryGetText(textEntryMonth) ); day.translate( GadgetTextEntryGetText(textEntryDay) ); year.translate( GadgetTextEntryGetText(textEntryYear) ); if(!isAgeOkay(month, day, year)) { GSMessageBoxOk(TheGameText->fetch("GUI:AgeFailedTitle"), TheGameText->fetch("GUI:AgeFailed")); break; } email.translate( GadgetComboBoxGetText(comboBoxEmail) ); login.translate( GadgetComboBoxGetText(comboBoxLoginName) ); password.translate( GadgetTextEntryGetText(textEntryPassword) ); if ( !email.isEmpty() && !login.isEmpty() && !password.isEmpty() ) { loginAttemptTime = timeGetTime(); BuddyRequest req; req.buddyRequestType = BuddyRequest::BUDDYREQUEST_LOGIN; strcpy(req.arg.login.nick, login.str()); strcpy(req.arg.login.email, email.str()); strcpy(req.arg.login.password, password.str()); req.arg.login.hasFirewall = true; TheGameSpyInfo->setLocalBaseName( login ); //TheGameSpyInfo->setLocalProfileID( resp.player.profileID ); TheGameSpyInfo->setLocalEmail( email ); TheGameSpyInfo->setLocalPassword( password ); DEBUG_LOG(("before login: TheGameSpyInfo->stuff(%s/%s/%s)\n", TheGameSpyInfo->getLocalBaseName().str(), TheGameSpyInfo->getLocalEmail().str(), TheGameSpyInfo->getLocalPassword().str())); TheGameSpyBuddyMessageQueue->addRequest( req ); if(checkBoxRememberPassword && GadgetCheckBoxIsChecked(checkBoxRememberPassword)) { (*loginPref)["lastName"] = login; (*loginPref)["lastEmail"] = email; (*loginPref)["useProfiles"] = "yes"; AsciiString date; date = month; date.concat(day); date.concat(year); loginPref->addLogin(email, login, password,date); } else { loginPref->forgetLogin(email); } EnableLoginControls( FALSE ); // fire off some pings startPings(); } else { // user didn't fill in all info. prompt him. if(email.isEmpty() && login.isEmpty() && password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoAll")); else if( email.isEmpty() && login.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoEmailNickname")); else if( email.isEmpty() && password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoEmailPassword")); else if( login.isEmpty() && password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoNicknamePassword")); else if( email.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoEmail")); else if( password.isEmpty()) GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoPassword")); else if( login.isEmpty() ) GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoNickname")); else GSMessageBoxOk(TheGameText->fetch("GUI:GSErrorTitle"), TheGameText->fetch("GUI:GSNoLoginInfoAll")); } #ifdef ALLOW_NON_PROFILED_LOGIN } else { login.translate( GadgetTextEntryGetText(textEntryLoginName) ); if ( !login.isEmpty() ) { loginAttemptTime = timeGetTime(); PeerRequest req; req.peerRequestType = PeerRequest::PEERREQUEST_LOGIN; req.nick = login.str(); req.login.profileID = 0; TheGameSpyPeerMessageQueue->addRequest( req ); (*loginPref)["lastName"] = login; loginPref->erase("lastEmail"); (*loginPref)["useProfiles"] = "no"; EnableLoginControls( FALSE ); // fire off some pings startPings(); } } #endif // ALLOW_NON_PROFILED_LOGIN } //if ( controlID == buttonLogin ) else if ( controlID == buttonTOSID ) { parentTOS->winHide(FALSE); useWebBrowserForTOS = FALSE;//loginPref->getBool("UseTOSBrowser", TRUE); if (useWebBrowserForTOS && (TheWebBrowser != NULL)) { TheWebBrowser->createBrowserWindow("TermsOfService", listboxTOS); webBrowserActive = TRUE; } else { // Okay, no web browser. This means we're looking at a UTF-8 text file. GadgetListBoxReset(listboxTOS); AsciiString fileName; fileName.format("Data\\%s\\TOS.txt", GetRegistryLanguage().str()); File *theFile = TheFileSystem->openFile(fileName.str(), File::READ); if (theFile) { Int size = theFile->size(); char *fileBuf = new char[size]; Color tosColor = GameMakeColor(255, 255, 255, 255); Int bytesRead = theFile->read(fileBuf, size); if (bytesRead == size && size > 2) { fileBuf[size-1] = 0; // just to be safe AsciiString asciiBuf = fileBuf+2; AsciiString asciiLine; while (asciiBuf.nextToken(&asciiLine, "\r\n")) { UnicodeString uniLine; uniLine = UnicodeString(MultiByteToWideCharSingleLine(asciiLine.str()).c_str()); int len = uniLine.getLength(); for (int index = len-1; index >= 0; index--) { if (iswspace(uniLine.getCharAt(index))) { uniLine.removeLastChar(); } else { break; } } //uniLine.trim(); DEBUG_LOG(("adding TOS line: [%ls]\n", uniLine.str())); GadgetListBoxAddEntryText(listboxTOS, uniLine, tosColor, -1); } } delete fileBuf; fileBuf = NULL; theFile->close(); theFile = NULL; } } EnableLoginControls( FALSE ); buttonBack->winEnable(FALSE); } else if ( controlID == buttonTOSOKID ) { EnableLoginControls( TRUE ); parentTOS->winHide(TRUE); if (useWebBrowserForTOS && (TheWebBrowser != NULL)) { if (listboxTOS != NULL) { TheWebBrowser->closeBrowserWindow(listboxTOS); } } OptionPreferences optionPref; optionPref["SawTOS"] = "yes"; optionPref.write(); webBrowserActive = FALSE; buttonBack->winEnable(TRUE); } break; }// case GBM_SELECTED: case GEM_EDIT_DONE: { break; } /* case GEM_UPDATE_TEXT: { if (buttonPushed) break; GameWindow *control = (GameWindow *)mData1; Int controlID = control->winGetWindowId(); if ( controlID == textEntryLoginNameID ) { UnicodeString munkee = GadgetTextEntryGetText( textEntryLoginName ); if ( !isNickOkay( munkee ) ) { munkee.removeLastChar(); GadgetTextEntrySetText( textEntryLoginName, munkee ); } }// if ( controlID == textEntryLoginNameID ) break; }//case GEM_UPDATE_TEXT: */ default: return MSG_IGNORED; }//Switch return MSG_HANDLED; }// WOLLoginMenuSystem