| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- /*
- ** 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 <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : Command & Conquer *
- * *
- * $Archive:: /Commando/Code/Commando/gamesideservercontrol.cpp $*
- * *
- * $Author:: Bhayes $*
- * *
- * $Modtime:: 3/19/02 4:37p $*
- * *
- * $Revision:: 9 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "always.h"
- #include "gamesideservercontrol.h"
- #include "registry.h"
- #include "_globals.h"
- #include "consolefunction.h"
- #include "gamedata.h"
- #include "servercontrol.h"
- #include "gamemode.h"
- #include "buildnum.h"
- #include "slavemaster.h"
- #include "consolemode.h"
- #include <string.h>
- #include <stdio.h>
- /*
- ** Static class data.
- */
- bool GameSideServerControlClass::Listening = false;
- StringClass GameSideServerControlClass::Response;
- /***********************************************************************************************
- * GameSideServerControlClass::Init -- Start listening for server control messages *
- * *
- * *
- * *
- * INPUT: Nothing *
- * *
- * OUTPUT: Nothing *
- * *
- * WARNINGS: None *
- * *
- * HISTORY: *
- * 11/16/2001 3:55PM ST : Created *
- *=============================================================================================*/
- void GameSideServerControlClass::Init(void)
- {
- char password[64] = DEFAULT_SERVER_CONTROL_PASSWORD;
- if (!Listening) {
- /*
- ** Only for dedicated servers.
- */
- if (SlaveMaster.Am_I_Slave() || (The_Game() && The_Game()->IsDedicated.Is_True()) || ConsoleBox.Is_Exclusive()) {
- /*
- ** Get the port number from the registry.
- */
- RegistryClass reg(APPLICATION_SUB_KEY_NAME_NET_SERVER_CONTROL);
- int port = reg.Get_Int(SERVER_CONTROL_PORT_KEY, DEFAULT_SERVER_CONTROL_PORT);
- if (port != 0) {
- /*
- ** See if we should only bind to the loopback address (for slaves).
- */
- int loopback = reg.Get_Int(SERVER_CONTROL_LOOPBACK_KEY, 0);
- if (SlaveMaster.Am_I_Slave()) {
- ServerControl.Allow_Remote_Admin((loopback == 0) ? true : false);
- }
- /*
- ** Get the bind IP from the registry.
- */
- unsigned long ip = reg.Get_Int(SERVER_CONTROL_IP_KEY, 0);
- /*
- ** Get the password from the registry.
- */
- reg.Get_String(SERVER_CONTROL_PASSWORD_KEY, password, sizeof(password), password);
- /*
- ** Start listening.
- */
- ServerControl.Start_Listening(port, password, &App_Request_Callback, NULL, loopback ? true : false, ip);
- Listening = true;
- /*
- ** Update the welcome message.
- */
- Set_Welcome_Message();
- }
- } else {
- Listening = false;
- }
- }
- }
- /***********************************************************************************************
- * GameSideServerControlClass::Set_Welcome_Message -- Update the welcome message *
- * *
- * *
- * *
- * INPUT: Nothing *
- * *
- * OUTPUT: Nothing *
- * *
- * WARNINGS: None *
- * *
- * HISTORY: *
- * 11/16/2001 3:56PM ST : Created *
- *=============================================================================================*/
- void GameSideServerControlClass::Set_Welcome_Message(void)
- {
- char buffer[1024];
- buffer[0] = 0;
- char welcome[1024];
- /*
- ** Basic welcome message includes build info.
- */
- sprintf(welcome, "Welcome to Renegade %s\n", BuildInfoClass::Composite_Build_Info());
- /*
- ** Get the slave info and add it into the welcome message.
- */
- SlaveMaster.Get_Slave_Info(buffer, sizeof(buffer));
- strcat(welcome, buffer);
- welcome[499] = 0;
- ServerControl.Set_Welcome_Message(welcome);
- }
- /***********************************************************************************************
- * GameSideServerControlClass::Shutdown -- Stop listening to server control messages *
- * *
- * *
- * *
- * INPUT: Nothing *
- * *
- * OUTPUT: Nothing *
- * *
- * WARNINGS: None *
- * *
- * HISTORY: *
- * 11/16/2001 3:57PM ST : Created *
- *=============================================================================================*/
- void GameSideServerControlClass::Shutdown(void)
- {
- ServerControl.Stop_Listening();
- Listening = false;
- }
- /***********************************************************************************************
- * GameSideServerControlClass::App_Request_Callback -- Server control request handler *
- * *
- * *
- * *
- * INPUT: Request text *
- * *
- * OUTPUT: Response text *
- * *
- * WARNINGS: None *
- * *
- * HISTORY: *
- * 11/16/2001 3:58PM ST : Created *
- *=============================================================================================*/
- const char *GameSideServerControlClass::App_Request_Callback(char *request)
- {
- Response.Erase(0, Response.Get_Length());
- if (Listening) {
- if (GameModeManager::Find("Combat")->Is_Active()) {
- ConsoleFunctionManager::Parse_Input(request);
- }
- }
- Response += "\n";
- return(Response.Peek_Buffer());
- }
- /***********************************************************************************************
- * GameSideServerControlClass::Print -- Adds to the response packet for the current request *
- * *
- * *
- * *
- * INPUT: Response text *
- * *
- * OUTPUT: Nothing *
- * *
- * WARNINGS: None *
- * *
- * HISTORY: *
- * 11/16/2001 3:58PM ST : Created *
- *=============================================================================================*/
- void GameSideServerControlClass::Print(char *text, ...)
- {
- if (Listening) {
- if (Response.Get_Length() > 32768) {
- Response.Erase(0, Response.Get_Length());
- }
- char buffer[8192];
- va_list va;
- buffer[sizeof(buffer)-1] = 0;
- va_start(va, text);
- _vsnprintf(&buffer[0], sizeof(buffer)-1, text, va);
- va_end(va);
- Response += buffer;
- }
- }
- /***********************************************************************************************
- * GameSideServerControlClass::Send_Message -- Send a request message to another server *
- * *
- * *
- * *
- * INPUT: Message *
- * IP *
- * Port *
- * *
- * OUTPUT: Nothing *
- * *
- * WARNINGS: None *
- * *
- * HISTORY: *
- * 11/16/2001 3:59PM ST : Created *
- *=============================================================================================*/
- void GameSideServerControlClass::Send_Message(char *text, unsigned long ip, unsigned short port)
- {
- if (Listening) {
- ServerControl.Send_Message(text, ip, port);
- }
- }
|