/* ** Command & Conquer Generals Zero Hour(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 . */ /////////////////////////////////////////////////////////////////////////EA-V1 // $File: //depot/GeneralsMD/Staging/code/Libraries/Source/debug/debug_io_net.cpp $ // $Author: mhoffe $ // $Revision: #1 $ // $DateTime: 2003/07/03 11:55:26 $ // // ©2003 Electronic Arts // // Debug I/O class net (Network destination via named pipe) ////////////////////////////////////////////////////////////////////////////// #include "_pch.h" #include // needed for placement new prototype DebugIONet::DebugIONet(void) { } DebugIONet::~DebugIONet() { if (m_pipe!=INVALID_HANDLE_VALUE) CloseHandle(m_pipe); } int DebugIONet::Read(char *buf, int maxchar) { if (m_pipe==INVALID_HANDLE_VALUE) return 0; DWORD mode=PIPE_READMODE_MESSAGE|PIPE_NOWAIT; SetNamedPipeHandleState(m_pipe,&mode,NULL,NULL); DWORD read; if (!ReadFile(m_pipe,buf,maxchar-1,&read,NULL)) read=0; mode=PIPE_READMODE_MESSAGE|PIPE_WAIT; SetNamedPipeHandleState(m_pipe,&mode,NULL,NULL); return read; } void DebugIONet::Write(StringType type, const char *src, const char *str) { if (m_pipe==INVALID_HANDLE_VALUE) return; DWORD dummy; WriteFile(m_pipe,&type,1,&dummy,NULL); unsigned len; len=src?strlen(src):0; WriteFile(m_pipe,&len,4,&dummy,NULL); if (len) WriteFile(m_pipe,src,len,&dummy,NULL); len=strlen(str); WriteFile(m_pipe,&len,4,&dummy,NULL); if (len) WriteFile(m_pipe,str,len,&dummy,NULL); } void DebugIONet::EmergencyFlush(void) { } void DebugIONet::Execute(class Debug& dbg, const char *cmd, bool structuredCmd, unsigned argn, const char * const * argv) { if (!cmd||!strcmp(cmd,"help")) { dbg << "net I/O help:\n" " add [ ]\n" " create net I/O (optionally specifying the machine to connect to)\n"; } else if (!strcmp(cmd,"add")) { const char *machine=argn?argv[0]:"."; char buf[256]; wsprintf(buf,"\\\\%s\\pipe\\ea_debug_v1",machine); m_pipe=CreateFile(buf,GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL); if (m_pipe==INVALID_HANDLE_VALUE) { dbg << "Could not connect to given machine.\n"; return; } // we're reading messages DWORD mode=PIPE_READMODE_MESSAGE; SetNamedPipeHandleState(m_pipe,&mode,NULL,NULL); // write welcome message char comp[128]; mode=sizeof(comp); GetComputerName(comp,&mode); wsprintf(buf,"Client at %s\n",comp); Write(Other,NULL,buf); } } DebugIOInterface *DebugIONet::Create(void) { return new (DebugAllocMemory(sizeof(DebugIONet))) DebugIONet(); } void DebugIONet::Delete(void) { this->~DebugIONet(); DebugFreeMemory(this); }