File indexing completed on 2024-05-12 04:04:15
0001 /* 0002 This file is part of Knights, a chess board for KDE SC 4. 0003 SPDX-FileCopyrightText: 2011 Miha Čančula <miha@noughmad.eu> 0004 0005 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0006 */ 0007 0008 #include "computerprotocol.h" 0009 #include "knightsdebug.h" 0010 0011 #include <KProcess> 0012 #include <KLocalizedString> 0013 0014 using namespace Knights; 0015 0016 ComputerProtocol::ComputerProtocol(QObject* parent): TextProtocol(parent), mProcess(nullptr) { 0017 0018 } 0019 0020 ComputerProtocol::~ComputerProtocol() = default; 0021 0022 void ComputerProtocol::startProgram() { 0023 QStringList args = attribute("program").toString().split ( QLatin1Char ( ' ' ) ); 0024 QString program = args.takeFirst(); 0025 setPlayerName ( program ); 0026 mProcess = new KProcess ( this ); 0027 mProcess->setProgram ( program, args ); 0028 mProcess->setNextOpenMode ( QIODevice::ReadWrite | QIODevice::Unbuffered | QIODevice::Text ); 0029 mProcess->setOutputChannelMode ( KProcess::SeparateChannels ); 0030 mProcess->setReadChannel ( KProcess::StandardOutput ); 0031 connect ( mProcess, &KProcess::readyReadStandardError, this, &ComputerProtocol::readError ); 0032 setDevice(mProcess); 0033 qCDebug(LOG_KNIGHTS) << "Starting program" << program << "with args" << args; 0034 mProcess->start(); 0035 if ( !mProcess->waitForStarted ( 1000 ) ) { 0036 Q_EMIT error ( InstallationError, i18n ( "Program <code>%1</code> could not be started, please check that it is installed.", program ) ); 0037 return; 0038 } 0039 } 0040 0041 bool ComputerProtocol::isComputer() { 0042 return true; 0043 } 0044 0045 QList< Protocol::ToolWidgetData > ComputerProtocol::toolWidgets() { 0046 ChatWidget* console = createConsoleWidget(); 0047 connect ( console, &ChatWidget::sendText, this, &ComputerProtocol::writeCheckMoves ); 0048 setConsole ( console ); 0049 ToolWidgetData data; 0050 data.widget = console; 0051 data.title = i18n("Console for %1 (%2)", playerName(), colorName ( color() ) ); 0052 data.name = QLatin1String("console") + attribute("program").toString() + QLatin1Char( color() == White ? 'W' : 'B' ); 0053 data.type = ConsoleToolWidget; 0054 data.owner = color(); 0055 return {data}; 0056 } 0057 0058 0059 void ComputerProtocol::readError() { 0060 qCCritical(LOG_KNIGHTS) << mProcess->readAllStandardError(); 0061 }