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 }