File indexing completed on 2024-04-14 05:34:15
0001 /* 0002 SPDX-FileCopyrightText: 2011 Vishesh Yadav <vishesh3y@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "servewrapper.h" 0008 #include "hgwrapper.h" 0009 0010 #include <QTextCodec> 0011 0012 HgServeWrapper *HgServeWrapper::m_instance = nullptr; 0013 0014 HgServeWrapper::HgServeWrapper(QObject *parent) : 0015 QObject(parent) 0016 { 0017 } 0018 0019 HgServeWrapper::~HgServeWrapper() 0020 { 0021 QMutableHashIterator<QString, ServerProcessType*> it(m_serverList); 0022 while (it.hasNext()) { 0023 it.next(); 0024 ///terminate server if not terminated already 0025 if (it.value()->process.state() != QProcess::NotRunning) { 0026 it.value()->process.terminate(); 0027 } 0028 it.value()->deleteLater(); 0029 it.remove(); 0030 } 0031 } 0032 0033 HgServeWrapper *HgServeWrapper::instance() 0034 { 0035 if (m_instance == nullptr) { 0036 m_instance = new HgServeWrapper; 0037 } 0038 return m_instance; 0039 } 0040 0041 void HgServeWrapper::startServer(const QString &repoLocation, int portNumber) 0042 { 0043 ServerProcessType *server = m_serverList.value(repoLocation, nullptr); 0044 if (server != nullptr) { 0045 m_serverList.remove(repoLocation); 0046 server->deleteLater(); 0047 } 0048 server = new ServerProcessType; 0049 m_serverList.insert(repoLocation, server); 0050 server->port = portNumber; 0051 server->process.setWorkingDirectory(HgWrapper::instance()->getBaseDir()); 0052 0053 connect(&server->process, &QProcess::started, 0054 this, &HgServeWrapper::started); 0055 connect(&server->process, &QProcess::finished, 0056 this, &HgServeWrapper::slotFinished); 0057 connect(server, &ServerProcessType::readyReadLine, 0058 this, &HgServeWrapper::readyReadLine); 0059 0060 QStringList args; 0061 args << QLatin1String("-oL"); 0062 args << QLatin1String("hg"); 0063 args << QLatin1String("serve"); 0064 args << QLatin1String("--port"); 0065 args << QString::number(portNumber); 0066 server->process.start(QLatin1String("stdbuf"), args); 0067 Q_EMIT readyReadLine(repoLocation, 0068 i18n("## Starting Server ##")); 0069 Q_EMIT readyReadLine(repoLocation, 0070 QStringLiteral("% hg serve --port %1").arg(portNumber)); 0071 } 0072 0073 void HgServeWrapper::stopServer(const QString &repoLocation) 0074 { 0075 ServerProcessType *server = m_serverList.value(repoLocation, nullptr); 0076 if (server == nullptr) { 0077 return; 0078 } 0079 server->process.terminate(); 0080 } 0081 0082 bool HgServeWrapper::running(const QString &repoLocation) 0083 { 0084 ServerProcessType *server = m_serverList.value(repoLocation, nullptr); 0085 if (server == nullptr) { 0086 return false; 0087 } 0088 return ( server->process.state() == QProcess::Running || 0089 server->process.state() == QProcess::Starting); 0090 } 0091 0092 void HgServeWrapper::slotFinished(int exitCode, QProcess::ExitStatus status) 0093 { 0094 if (exitCode == 0 && status == QProcess::NormalExit) { 0095 Q_EMIT finished(); 0096 } 0097 else { 0098 Q_EMIT error(); 0099 } 0100 } 0101 0102 QString HgServeWrapper::errorMessage(const QString &repoLocation) 0103 { 0104 ServerProcessType *server = m_serverList.value(repoLocation, nullptr); 0105 if (server == nullptr) { 0106 return QString(); 0107 } 0108 return QTextCodec::codecForLocale()->toUnicode(server->process.readAllStandardError()); 0109 } 0110 0111 bool HgServeWrapper::normalExit(const QString &repoLocation) 0112 { 0113 ServerProcessType *server = m_serverList.value(repoLocation, nullptr); 0114 if (server == nullptr) { 0115 return true; 0116 } 0117 0118 return (server->process.exitStatus() == QProcess::NormalExit && 0119 server->process.exitCode() == 0); 0120 } 0121 0122 void HgServeWrapper::cleanUnused() 0123 { 0124 QMutableHashIterator<QString, ServerProcessType*> it(m_serverList); 0125 while (it.hasNext()) { 0126 it.next(); 0127 if (it.value()->process.state() == QProcess::NotRunning) { 0128 it.value()->deleteLater(); 0129 it.remove(); 0130 } 0131 } 0132 } 0133 0134 0135 0136 #include "moc_servewrapper.cpp"