/* ** Command & Conquer Renegade(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 . */ /****************************************************************************** * * NAME * $Archive: /Commando/Code/Commando/DlgQuickmatch.cpp $ * * DESCRIPTION * Quick match dialog * * PROGRAMMER * Denzil E. Long, Jr. * $Author: Denzil_l $ * * VERSION INFO * $Revision: 21 $ * $Modtime: 1/16/02 5:06p $ * ******************************************************************************/ #include "DlgQuickMatch.h" #include "DlgWOLWait.h" #include "DlgMessageBox.h" #include "DlgMPWolQuickMatchOptions.h" #include "Resource.h" #include "DialogResource.h" #include "gameinitmgr.h" #include "WOLJoinGame.h" #include "String_IDs.h" #include #include #include #include #ifdef _MSC_VER #pragma warning (push,3) #endif #include "systimer.h" #ifdef _MSC_VER #pragma warning (pop) #endif using namespace WWOnline; /****************************************************************************** * * NAME * DlgQuickMatch::DoDialog * * DESCRIPTION * * INPUTS * * RESULT * Success - True if dialog successfully started. * ******************************************************************************/ bool DlgQuickMatch::DoDialog(void) { DlgQuickMatch* dialog = new DlgQuickMatch; if (dialog) { if (dialog->FinalizeCreate()) { dialog->Start_Dialog(); } dialog->Release_Ref(); } return (dialog != NULL); } /****************************************************************************** * * NAME * DlgQuickMatch::DlgQuickMatch * * DESCRIPTION * Constructor * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ DlgQuickMatch::DlgQuickMatch() : MenuDialogClass(IDD_MP_WOL_QUICKMATCH_CONNECT), mTimeoutTime(0), mResendTime(0) { WWDEBUG_SAY(("DlgQuickMatch: Instantiating\n")); } /****************************************************************************** * * NAME * DlgQuickMatch::~DlgQuickMatch * * DESCRIPTION * Destructor * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ DlgQuickMatch::~DlgQuickMatch() { WWDEBUG_SAY(("DlgQuickMatch: Destructing\n")); if (mQuickMatch) { mQuickMatch->Release_Ref(); } } /****************************************************************************** * * NAME * DlgQuickMatch::FinalizeCreate * * DESCRIPTION * Finalize the creation of this object (Initialize). * * INPUTS * * RESULT * ******************************************************************************/ bool DlgQuickMatch::FinalizeCreate(void) { mQuickMatch = WOLQuickMatch::Create(); if (!mQuickMatch) { return false; } Observer::NotifyMe(*mQuickMatch); return true; } /****************************************************************************** * * NAME * DlgQuickMatch::On_Init_Dialog * * DESCRIPTION * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::On_Init_Dialog(void) { ListCtrlClass* output = (ListCtrlClass*)Get_Dlg_Item(IDC_OUTPUT); WWASSERT_PRINT(output, "IDC_OUTOUT list control missing from dialog!"); if (output) { output->Add_Column(L"", 1.0F, Vector3 (1, 1, 1)); } Connect(); MenuDialogClass::On_Init_Dialog(); } /****************************************************************************** * * NAME * DlgQuickMatch::On_Frame_Update * * DESCRIPTION * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::On_Frame_Update(void) { if (mConnectWait.IsValid()) { WaitCondition::WaitResult waitStatus = mConnectWait->GetResult(); if (waitStatus != WaitCondition::Waiting) { if (waitStatus == WaitCondition::ConditionMet) { SendMatchingInfo(); } else { OutputMessage(mConnectWait->GetResultText()); } mConnectWait.Release(); } } unsigned long theTime = TIMEGETTIME(); if ((mResendTime > 0) && (theTime >= mResendTime)) { mQuickMatch->SendClientInfo(); mResendTime = 0; } // Watch for timeout if ((mTimeoutTime > 0) && (theTime >= mTimeoutTime)) { OutputMessage(TRANSLATE(IDS_WOL_TIMEDOUT)); mTimeoutTime = 0; } MenuDialogClass::On_Frame_Update(); } /****************************************************************************** * * NAME * DlgQuickMatch:: * * DESCRIPTION * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::On_Command(int ctrl, int message, DWORD param) { if (ctrl == IDC_MENU_BACK_BUTTON) { OutputMessage(IDS_QM_DISCONNECT); RefPtr wait = mQuickMatch->Disconnect(); if (wait.IsValid()) { DlgWOLWait::DoDialog(IDS_QM_DISCONNECT, wait); } } MenuDialogClass::On_Command(ctrl, message, param); } /****************************************************************************** * * NAME * DlgQuickMatch::Connect * * DESCRIPTION * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::Connect(void) { OutputMessage(IDS_QM_CONNECTING); mConnectWait = mQuickMatch->ConnectClient(); if (mConnectWait.IsValid()) { mConnectWait->WaitBeginning(); } mTimeoutTime = (TIMEGETTIME() + 60000); } /****************************************************************************** * * NAME * DlgQuickMatch::SendMatchingInfo * * DESCRIPTION * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::SendMatchingInfo(void) { OutputMessage(IDS_QM_SENDINGMATCHINFO); bool sent = mQuickMatch->SendClientInfo(); if (sent) { OutputMessage(TRANSLATE (IDS_MENU_SEARCHING_FOR_MATCH)); } else { OutputMessage(TRANSLATE (IDS_MENU_CANT_LOCATE_MATCH)); } } /****************************************************************************** * * NAME * DlgQuickMatch::OutputMessage * * DESCRIPTION * * INPUTS * Message - Message to add to output. * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::OutputMessage(int messageID) { const WCHAR* message = TranslateDBClass::Get_String(messageID); OutputMessage(message); } /****************************************************************************** * * NAME * DlgQuickMatch::OutputMessage * * DESCRIPTION * * INPUTS * Message - Message to add to output. * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::OutputMessage(const WCHAR* message) { WWDEBUG_SAY(("QM: %S\n", message)); ListCtrlClass* output = (ListCtrlClass*)Get_Dlg_Item(IDC_OUTPUT); if (output) { int entryCount = output->Get_Entry_Count(); output->Insert_Entry(entryCount, message); // Limit message entries. if (entryCount > 100) { output->Delete_Entry(0); } } } /****************************************************************************** * * NAME * DlgQuickMatch::HandleNotification(QuickMatchEvent) * * DESCRIPTION * Handle status information from quickmatch. * * INPUTS * Status - * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::HandleNotification(QuickMatchEvent& status) { QuickMatchEvent::Event event = status.GetEvent(); const WCHAR* msg = (const WCHAR*)status.Subject(); if (QuickMatchEvent::QMERROR == event) { const WideStringClass& statusMsg = status.Subject(); // If no match then resend the request in 10 seconds. if (statusMsg.Compare_No_Case(L"QM:NoMatch") == 0) { msg = TRANSLATE(IDS_QM_NOMATCH); } else { #ifdef QUICKMATCH_OPTIONS // Unable to match user because preferred modes are all zero. if (statusMsg.Compare_No_Case(L"QM:NoModes") == 0) { DlgMsgBox::DoDialog(TRANSLATE (IDS_MENU_INVALID_QM_SETTINGS_TITLE), TRANSLATE (IDS_MENU_INVALID_QM_SETTINGS), DlgMsgBox::Okay, this); return; } #endif } } else if (QuickMatchEvent::QMMATCHED == event) { GameInitMgrClass::Set_WOL_Return_Dialog(RenegadeDialogMgrClass::LOC_INTERNET_MAIN); // Join the game const WCHAR* gameName = (const WCHAR*)status.Subject(); WOLJoinGame::JoinTheGame(gameName, L"", false); return; } // Assume any other message is for the user. OutputMessage(msg); } /****************************************************************************** * * NAME * DlgQuickMatch::HandleNotification(DlgMsgBoxEvent) * * DESCRIPTION * * INPUTS * * RESULT * NONE * ******************************************************************************/ void DlgQuickMatch::HandleNotification(DlgMsgBoxEvent& msgbox) { #ifdef QUICKMATCH_OPTIONS Add_Ref(); if (msgbox.Event() == DlgMsgBoxEvent::Okay) { End_Dialog(); START_DIALOG(MPWolQuickMatchOptionsMenuClass); } Release_Ref(); #endif // QUICKMATCH_OPTIONS }