7 #include "drivermanager.h"
9 #include "config-kstars.h"
11 #include "clientmanager.h"
12 #include "driverinfo.h"
13 #include "guimanager.h"
14 #include "indilistener.h"
18 #include "kstarsdata.h"
20 #include "servermanager.h"
21 #include "ui_indihostconf.h"
22 #include "auxiliary/ksnotification.h"
24 #include <basedevice.h>
27 #include <KMessageBox>
28 #include <KActionCollection>
29 #include <KNotifications/KNotification>
33 #include <QtConcurrent>
34 #include <indi_debug.h>
36 #define INDI_MAX_TRIES 2
37 #define ERRMSG_SIZE 1024
39 DriverManagerUI::DriverManagerUI(
QWidget *parent) :
QFrame(parent)
43 localTreeWidget->setSortingEnabled(
false);
44 localTreeWidget->setRootIsDecorated(
true);
46 clientTreeWidget->setSortingEnabled(
false);
57 &DriverManagerUI::makePortEditable);
60 void DriverManagerUI::makePortEditable(
QTreeWidgetItem *selectedItem,
int column)
63 if (column == ::DriverManager::LOCAL_PORT_COLUMN)
67 localTreeWidget->editItem(selectedItem, ::DriverManager::LOCAL_PORT_COLUMN);
70 DriverManager *DriverManager::_DriverManager =
nullptr;
71 INDIDBus *DriverManager::_INDIDBus =
nullptr;
73 DriverManager *DriverManager::Instance()
75 if (_DriverManager ==
nullptr)
80 qRegisterMetaType<QSharedPointer<DriverInfo>>(
"QSharedPointer<DriverInfo>");
83 return _DriverManager;
86 void DriverManager::release()
88 delete (_DriverManager);
90 _DriverManager =
nullptr;
100 currentPort = Options::serverPortStart() - 1;
103 ui =
new DriverManagerUI(
this);
105 setLayout(mainLayout);
106 setWindowTitle(
i18nc(
"@title:window",
"Device Manager"));
126 if (Options::indiDriversDir().isEmpty())
127 Options::setIndiDriversDir(
135 m_CustomDrivers =
new CustomDrivers(
this, driversList);
137 updateCustomDrivers();
140 ui->localTreeWidget->setEnabled(
false);
144 DriverManager::~DriverManager()
151 if (driver.
isNull() || driver->getDriverSource() == GENERATED_SOURCE)
155 ServerMode mode = connectionMode;
160 if (driver->getDriverSource() != HOST_SOURCE)
162 if (ui->localTreeWidget->currentItem())
163 currentDriver = ui->localTreeWidget->currentItem()->text(LOCAL_NAME_COLUMN);
165 for (
auto &item : ui->localTreeWidget->findItems(
168 item->setText(LOCAL_VERSION_COLUMN, driver->getVersion());
171 mode = manager->getMode();
173 dState = driver->getServerState();
174 cState = driver->getClientState() && dState;
176 bool locallyAvailable =
false;
177 if (driver->getAuxInfo().contains(
"LOCALLY_AVAILABLE"))
179 driver->getAuxInfo().value(
"LOCALLY_AVAILABLE",
false).toBool();
184 if (locallyAvailable)
186 ui->runServiceB->setEnabled(!dState);
187 ui->stopServiceB->setEnabled(dState);
188 item->setIcon(LOCAL_STATUS_COLUMN,
189 dState ? ui->runningPix : ui->stopPix);
193 ui->runServiceB->setEnabled(
false);
194 ui->stopServiceB->setEnabled(
false);
199 item->setIcon(LOCAL_MODE_COLUMN, ui->serverMode);
207 item->setIcon(LOCAL_MODE_COLUMN,
QIcon());
208 item->setText(LOCAL_PORT_COLUMN,
QString::number(driver->getUserPort()));
214 if (locallyAvailable)
216 ui->runServiceB->setEnabled(!cState);
217 ui->stopServiceB->setEnabled(cState);
218 item->setIcon(LOCAL_STATUS_COLUMN,
219 cState ? ui->runningPix : ui->stopPix);
223 ui->runServiceB->setEnabled(
false);
224 ui->stopServiceB->setEnabled(
false);
229 item->setIcon(LOCAL_MODE_COLUMN, ui->localMode);
238 item->setIcon(LOCAL_MODE_COLUMN,
QIcon());
239 const auto port = driver->getUserPort() == -1 ?
QString() :
QString::
number(driver->getUserPort());
240 item->setText(LOCAL_PORT_COLUMN, port);
247 if (currentDriver == driver->getLabel())
249 ui->serverLogText->
clear();
250 ui->serverLogText->append(driver->getServerBuffer());
256 for (
auto &item : ui->clientTreeWidget->findItems(driver->getName(),
Qt::MatchExactly,
259 if (driver->getClientState())
261 item->setIcon(HOST_STATUS_COLUMN, ui->connected);
262 ui->connectHostB->setEnabled(
false);
263 ui->disconnectHostB->setEnabled(
true);
267 item->setIcon(HOST_STATUS_COLUMN, ui->disconnected);
268 ui->connectHostB->setEnabled(
true);
269 ui->disconnectHostB->setEnabled(
false);
281 for (
auto &dv : dList)
286 for (
auto &idv : dList)
289 if ((dv->getHost() == idv->getHost() && dv->getPort() == idv->getPort()))
292 if (dv->getClientState() || dv->getServerState())
296 i18n(
"Driver %1 is already running, do you want to restart it?",
298 if (ans == KMessageBox::Cancel)
304 stopDevices(stopList);
311 for (
auto &qdi : uHosts)
328 if (uList.
empty() ==
false)
329 uHosts.append(uList);
339 getUniqueHosts(dList, uHosts);
341 qCDebug(KSTARS_INDI) <<
"INDI: Starting local drivers...";
343 for (
auto &qdv : uHosts)
348 port = qdv.at(0)->getPort();
349 auto host = qdv.at(0)->getHost();
353 port = getINDIPort(port);
357 emit serverFailed(
host, port,
i18n(
"Cannot start INDI server: port error."));
363 if (serverManager ==
nullptr)
365 emit serverFailed(
host, port,
i18n(
"Failed to create local INDI server"));
369 servers.append(serverManager);
370 serverManager->setPendingDrivers(qdv);
371 serverManager->setMode(connectionMode);
373 connect(serverManager, &ServerManager::newServerLog,
this, &DriverManager::updateLocalTab,
Qt::UniqueConnection);
374 connect(serverManager, &ServerManager::started,
this, &DriverManager::setServerStarted,
Qt::UniqueConnection);
375 connect(serverManager, &ServerManager::failed,
this, &DriverManager::setServerFailed,
Qt::UniqueConnection);
376 connect(serverManager, &ServerManager::terminated,
this, &DriverManager::setServerTerminated,
Qt::UniqueConnection);
378 serverManager->start();
382 void DriverManager::startLocalDrivers(
ServerManager *serverManager)
384 connect(serverManager, &ServerManager::driverStarted,
this, &DriverManager::processDriverStartup,
Qt::UniqueConnection);
385 connect(serverManager, &ServerManager::driverFailed,
this, &DriverManager::processDriverFailure,
Qt::UniqueConnection);
391 emit driverStarted(driver);
393 auto manager = driver->getServerManager();
395 if (manager->pendingDrivers().
count() > 0)
402 if (connectionMode == SERVER_ONLY)
408 startClientManager(manager->managedDrivers(), manager->getHost(), manager->getPort());
413 emit driverFailed(driver,
message);
415 qCWarning(KSTARS_INDI) <<
"Driver" << driver->getName() <<
"failed to start. Retrying in 5 seconds...";
419 auto manager = driver->getServerManager();
421 if (manager->pendingDrivers().
count() > 0)
423 QtConcurrent::run(manager, &ServerManager::startDriver, manager->pendingDrivers().first());
434 clientManager->appendManagedDriver(dv);
436 connect(clientManager, &ClientManager::started,
this, &DriverManager::setClientStarted,
Qt::UniqueConnection);
437 connect(clientManager, &ClientManager::failed,
this, &DriverManager::setClientFailed,
Qt::UniqueConnection);
438 connect(clientManager, &ClientManager::terminated,
this, &DriverManager::setClientTerminated,
Qt::UniqueConnection);
440 clientManager->setServer(
host.toLatin1().constData(), port);
442 GUIManager::Instance()->addClient(clientManager);
443 INDIListener::Instance()->addClient(clientManager);
445 clientManager->establishConnection();
450 qCDebug(KSTARS_INDI) <<
"INDI: Stopping local drivers...";
462 if (cm->count() == 0)
464 GUIManager::Instance()->removeClient(cm);
465 INDIListener::Instance()->removeClient(cm);
466 cm->disconnectServer();
467 clients.removeOne(cm);
487 servers.removeOne(sm);
494 currentPort = Options::serverPortStart() - 1;
499 void DriverManager::disconnectClients()
501 for (
auto &clientManager : clients)
503 clientManager->disconnectAll();
504 clientManager->disconnect();
508 void DriverManager::clearServers()
510 for (
auto &serverManager : servers)
511 serverManager->stop();
516 void DriverManager::activateRunService()
518 processLocalTree(
true);
521 void DriverManager::activateStopService()
523 processLocalTree(
false);
526 void DriverManager::activateHostConnection()
528 processRemoteTree(
true);
531 void DriverManager::activateHostDisconnection()
533 processRemoteTree(
false);
538 return driver->getClientManager();
541 void DriverManager::updateLocalTab()
543 if (ui->localTreeWidget->currentItem() ==
nullptr)
546 QString currentDriver = ui->localTreeWidget->currentItem()->text(LOCAL_NAME_COLUMN);
548 auto device = std::find_if(driversList.begin(), driversList.end(), [currentDriver](
const auto & oneDriver)
550 return currentDriver == oneDriver->getLabel();
552 if (device != driversList.end())
553 processDeviceStatus(*device);
556 void DriverManager::updateClientTab()
564 int port = item->
text(HOST_PORT_COLUMN).
toInt();
566 auto device = std::find_if(driversList.begin(), driversList.end(), [hostname, port](
const auto & oneDriver)
568 return hostname == oneDriver->getName() && port == oneDriver->getPort();
570 if (device != driversList.end())
571 processDeviceStatus(*device);
574 void DriverManager::processLocalTree(
bool dState)
581 connectionMode = ui->localR->isChecked() ? SERVER_CLIENT : SERVER_ONLY;
583 for (
auto &item : ui->localTreeWidget->selectedItems())
585 for (
auto &device : driversList)
590 if (item->
text(LOCAL_NAME_COLUMN) == device->getLabel() &&
591 device->getServerState() != dState)
593 processed_devices.
append(device);
598 if (port == -1 && item->
text(LOCAL_PORT_COLUMN).
isEmpty() ==
false)
600 port = item->
text(LOCAL_PORT_COLUMN).
toInt(&portOK);
604 KSNotification::error(
i18n(
"Invalid port entry: %1", item->
text(LOCAL_PORT_COLUMN)));
609 device->setHostParameters(
"localhost", port);
614 if (processed_devices.
empty())
618 startDevices(processed_devices);
620 stopDevices(processed_devices);
625 auto client = qobject_cast<ClientManager*>(sender());
627 if (client ==
nullptr)
630 auto host = client->getHost();
631 auto port = client->getPort();
637 GUIManager::Instance()->removeClient(client);
638 INDIListener::Instance()->removeClient(client);
642 clients.removeOne(client);
643 client->deleteLater();
645 if (connectionMode == SERVER_CLIENT)
646 activateStopService();
654 auto client = qobject_cast<ClientManager*>(sender());
656 if (client ==
nullptr)
659 auto host = client->getHost();
660 auto port = client->getPort();
666 GUIManager::Instance()->removeClient(client);
667 INDIListener::Instance()->removeClient(client);
669 KSNotification::event(
QLatin1String(
"IndiServerMessage"),
message, KSNotification::INDI, KSNotification::Alert);
671 clients.removeOne(client);
672 client->deleteLater();
679 void DriverManager::setServerStarted()
681 auto manager = qobject_cast<ServerManager*>(sender());
682 qCDebug(KSTARS_INDI) <<
"INDI: INDI Server started locally on port " << manager->getPort();
683 startLocalDrivers(manager);
684 emit serverStarted(manager->getHost(), manager->getPort());
689 auto server = qobject_cast<ServerManager *>(sender());
691 if (server ==
nullptr)
694 for (
auto &dv : driversList)
696 if (dv->getServerManager() == server)
702 if (server->getMode() == SERVER_ONLY)
703 KSNotification::error(
message);
705 emit serverFailed(server->getHost(), server->getPort(),
message);
706 servers.removeOne(server);
707 server->deleteLater();
714 auto server = qobject_cast<ServerManager *>(sender());
716 if (server ==
nullptr)
719 for (
auto &dv : driversList)
721 if (dv->getServerManager() == server)
727 if (server->getMode() == SERVER_ONLY)
728 KSNotification::error(
message);
730 emit serverTerminated(server->getHost(), server->getPort(),
message);
731 servers.removeOne(server);
732 server->deleteLater();
737 void DriverManager::processRemoteTree(
bool dState)
743 for (
auto &dv : driversList)
745 if (dv->getDriverSource() != HOST_SOURCE)
751 if (currentItem->
text(HOST_NAME_COLUMN) == dv->getName() &&
752 currentItem->
text(HOST_PORT_COLUMN).
toInt() == dv->getPort())
755 if (dv->getClientState() == dState)
760 connectRemoteHost(dv);
763 disconnectRemoteHost(dv);
770 auto host = driver->getHost();
771 auto port = driver->getPort();
775 clientManager->appendManagedDriver(driver);
777 connect(clientManager, &ClientManager::started,
this, &DriverManager::setClientStarted,
Qt::UniqueConnection);
778 connect(clientManager, &ClientManager::failed,
this, &DriverManager::setClientFailed,
Qt::UniqueConnection);
779 connect(clientManager, &ClientManager::terminated,
this, &DriverManager::setClientTerminated,
Qt::UniqueConnection);
781 clientManager->setServer(
host.toLatin1().constData(), port);
783 GUIManager::Instance()->addClient(clientManager);
784 INDIListener::Instance()->addClient(clientManager);
786 clientManager->establishConnection();
789 void DriverManager::setClientStarted()
791 auto clientManager = qobject_cast<ClientManager *>(sender());
792 if (clientManager ==
nullptr)
795 clients.append(clientManager);
800 i18n(
"Connected to INDI server"));
802 emit clientStarted(clientManager->getHost(), clientManager->getPort());
813 GUIManager::Instance()->removeClient(clientManager);
814 INDIListener::Instance()->removeClient(clientManager);
815 clients.removeOne(clientManager);
824 void DriverManager::resizeDeviceColumn()
826 ui->localTreeWidget->resizeColumnToContents(0);
829 void DriverManager::updateMenuActions()
835 bool activeDevice =
false;
837 if (clients.size() > 0)
841 if (tmpAction !=
nullptr)
848 int DriverManager::getINDIPort(
int customPort)
851 qWarning() <<
"INDI server is currently not supported on Windows.";
854 int lastPort = Options::serverPortEnd();
855 bool success =
false;
859 if (currentPort > lastPort)
860 currentPort = Options::serverPortStart();
864 if (customPort != -1)
876 for (; currentPort <= lastPort; currentPort++)
889 bool DriverManager::readINDIHosts()
891 QString indiFile(
"indihosts.xml");
896 LilXML *xmlParser = newLilXML();
897 XMLEle *root =
nullptr;
898 XMLAtt *ap =
nullptr;
905 delLilXML(xmlParser);
911 root = readXMLEle(xmlParser, c, errmsg);
916 ap = findXMLAtt(root,
"name");
919 delLilXML(xmlParser);
923 hName =
QString(valuXMLAtt(ap));
926 ap = findXMLAtt(root,
"hostname");
930 delLilXML(xmlParser);
934 hHost =
QString(valuXMLAtt(ap));
936 ap = findXMLAtt(root,
"port");
940 delLilXML(xmlParser);
944 hPort =
QString(valuXMLAtt(ap));
947 dv->setHostParameters(hHost, hPort.
toInt());
948 dv->setDriverSource(HOST_SOURCE);
950 connect(dv.get(), &DriverInfo::deviceStateChanged,
this, [dv,
this]()
952 processDeviceStatus(dv);
955 driversList.append(dv);
959 item->
setIcon(HOST_STATUS_COLUMN, ui->disconnected);
960 item->
setText(HOST_NAME_COLUMN, hName);
961 item->
setText(HOST_PORT_COLUMN, hPort);
967 qDebug() << Q_FUNC_INFO << errmsg;
968 delLilXML(xmlParser);
973 delLilXML(xmlParser);
978 bool DriverManager::readXMLDrivers()
983 QString driversDir = Options::indiDriversDir();
985 if (Options::indiDriversAreInternal())
990 if (indiDir.
cd(driversDir) ==
false)
992 KSNotification::error(
i18n(
"Unable to find INDI drivers directory: %1\nPlease "
993 "make sure to set the correct "
994 "path in KStars configuration",
1004 for (
auto &fileInfo : list)
1009 processXMLDriver(fileInfo.absoluteFilePath());
1018 void DriverManager::processXMLDriver(
const QString &driverName)
1020 QFile file(driverName);
1023 KSNotification::error(
i18n(
"Failed to open INDI Driver file: %1", driverName));
1027 char errmsg[ERRMSG_SIZE];
1029 LilXML *xmlParser = newLilXML();
1030 XMLEle *root =
nullptr;
1031 XMLEle *ep =
nullptr;
1034 driverSource = PRIMARY_XML;
1036 driverSource = THIRD_PARTY_XML;
1040 root = readXMLEle(xmlParser, c, errmsg);
1045 if (!strcmp(tagXMLEle(root),
"driversList"))
1047 for (ep = nextXMLEle(root, 1); ep !=
nullptr; ep = nextXMLEle(root, 0))
1049 if (!buildDeviceGroup(ep, errmsg))
1050 prXMLEle(stderr, ep, 0);
1056 if (!buildDeviceGroup(root, errmsg))
1057 prXMLEle(stderr, root, 0);
1064 qCDebug(KSTARS_INDI) <<
QString(errmsg);
1065 delLilXML(xmlParser);
1070 delLilXML(xmlParser);
1073 bool DriverManager::buildDeviceGroup(XMLEle *root,
char errmsg[])
1079 DeviceFamily groupType = KSTARS_TELESCOPE;
1082 if (strlen(tagXMLEle(root)) > 1024)
1086 ap = findXMLAtt(root,
"group");
1090 snprintf(errmsg, ERRMSG_SIZE,
"Tag %.64s does not have a group attribute",
1095 groupName = valuXMLAtt(ap);
1096 groupType = DeviceFamilyLabels.key(groupName);
1098 #ifndef HAVE_CFITSIO
1100 if (groupType == KSTARS_CCD || groupType == KSTARS_VIDEO)
1108 group = treeList[0];
1115 for (ep = nextXMLEle(root, 1); ep !=
nullptr; ep = nextXMLEle(root, 0))
1117 if (!buildDriverElement(ep, group, groupType, errmsg))
1124 bool DriverManager::buildDriverElement(XMLEle *root,
QTreeWidgetItem *DGroup,
1125 DeviceFamily groupType,
char errmsg[])
1133 QString manufacturer(
"Others");
1140 ap = findXMLAtt(root,
"label");
1143 snprintf(errmsg, ERRMSG_SIZE,
"Tag %.64s does not have a label attribute",
1148 label = valuXMLAtt(ap);
1151 if (findDriverByLabel(label) !=
nullptr)
1154 ap = findXMLAtt(root,
"manufacturer");
1156 manufacturer = valuXMLAtt(ap);
1159 ap = findXMLAtt(root,
"port");
1161 port = valuXMLAtt(ap);
1165 ap = findXMLAtt(root,
"skel");
1167 skel = valuXMLAtt(ap);
1170 ap = findXMLAtt(root,
"mdpd");
1174 mdpd = (
QString(valuXMLAtt(ap)) ==
QString(
"true")) ?
true :
false;
1175 vMap.insert(
"mdpd", mdpd);
1178 el = findXMLEle(root,
"driver");
1183 driver = pcdataXMLEle(el);
1185 ap = findXMLAtt(el,
"name");
1188 snprintf(errmsg, ERRMSG_SIZE,
"Tag %.64s does not have a name attribute",
1193 name = valuXMLAtt(ap);
1195 el = findXMLEle(root,
"version");
1201 bool versionOK =
false;
1203 if (versionOK ==
false)
1206 bool driverIsAvailable = checkDriverAvailability(driver);
1208 vMap.insert(
"LOCALLY_AVAILABLE", driverIsAvailable);
1213 device->
setText(LOCAL_NAME_COLUMN, label);
1214 if (driverIsAvailable)
1215 device->
setIcon(LOCAL_STATUS_COLUMN, ui->stopPix);
1217 device->
setIcon(LOCAL_STATUS_COLUMN, remoteIcon);
1218 device->
setText(LOCAL_VERSION_COLUMN, version);
1219 device->
setText(LOCAL_PORT_COLUMN, port);
1222 if (groupType == KSTARS_TELESCOPE && driversStringList.contains(driver) ==
false)
1223 driversStringList.append(driver);
1227 dv->setLabel(label);
1228 dv->setVersion(version);
1229 dv->setExecutable(driver);
1230 dv->setManufacturer(manufacturer);
1231 dv->setSkeletonFile(skel);
1232 dv->setType(groupType);
1233 dv->setDriverSource(driverSource);
1235 dv->setAuxInfo(vMap);
1237 connect(dv.get(), &DriverInfo::deviceStateChanged,
this, [dv,
this]()
1239 processDeviceStatus(dv);
1242 driversList.append(dv);
1247 bool DriverManager::checkDriverAvailability(
const QString &driver)
1249 QString indiServerDir = Options::indiServer();
1250 if (Options::indiServerIsInternal())
1255 QFile driverFile(indiServerDir +
'/' + driver);
1257 if (driverFile.exists() ==
false)
1263 void DriverManager::updateCustomDrivers()
1265 for (
const QVariantMap &oneDriver : m_CustomDrivers->customDrivers())
1268 dv->setLabel(oneDriver[
"Label"].
toString());
1269 dv->setUniqueLabel(dv->getLabel());
1270 dv->setExecutable(oneDriver[
"Exec"].
toString());
1271 dv->setVersion(oneDriver[
"Version"].
toString());
1272 dv->setManufacturer(oneDriver[
"Manufacturer"].
toString());
1273 dv->setType(DeviceFamilyLabels.key(oneDriver[
"Family"].toString()));
1274 dv->setDriverSource(CUSTOM_SOURCE);
1276 bool driverIsAvailable = checkDriverAvailability(oneDriver[
"Exec"].
toString());
1278 vMap.insert(
"LOCALLY_AVAILABLE", driverIsAvailable);
1279 dv->setAuxInfo(vMap);
1281 driversList.append(dv);
1287 void DriverManager::updateCustomDrivers()
1301 group = treeList[0];
1305 KStarsData::Instance()->
logObject()->readAll();
1308 foreach (
OAL::Scope *s, *(KStarsData::Instance()->logObject()->scopeList()))
1312 if (s->driver() ==
i18n(
"None"))
1316 if ((drv = findDriverByLabel(label)))
1318 if (s->aperture() > 0 && s->focalLength() > 0)
1320 vMap.
insert(
"TELESCOPE_APERTURE", s->aperture());
1321 vMap.
insert(
"TELESCOPE_FOCAL_LENGTH", s->focalLength());
1322 drv->setAuxInfo(vMap);
1325 drv->setExecutable(s->driver());
1330 driver = s->driver();
1335 device->
setIcon(LOCAL_STATUS_COLUMN, ui->stopPix);
1340 dv->setLabel(label);
1341 dv->setExecutable(driver);
1342 dv->setVersion(version);
1343 dv->setType(KSTARS_TELESCOPE);
1344 dv->setDriverSource(EM_XML);
1346 if (s->aperture() > 0 && s->focalLength() > 0)
1348 vMap.insert(
"TELESCOPE_APERTURE", s->aperture());
1349 vMap.insert(
"TELESCOPE_FOCAL_LENGTH", s->focalLength());
1350 dv->setAuxInfo(vMap);
1353 connect(dv, SIGNAL(deviceStateChanged(
DriverInfo*)),
this, SLOT(processDeviceStatus(
DriverInfo*)));
1354 driversList.append(dv);
1361 if (dev->getDriverSource() != EM_XML || dev->getClientState())
1364 if (KStarsData::Instance()->logObject()->findScopeByName(dev->getName()))
1372 widgetDev = devList[0];
1378 driversList.removeOne(dev);
1384 void DriverManager::addINDIHost()
1387 Ui::INDIHostConf hostConf;
1388 hostConf.
setupUi(&hostConfDialog);
1390 bool portOk =
false;
1396 hostConf.portnumber->text().toInt(&portOk);
1398 if (portOk ==
false)
1400 KSNotification::error(
i18n(
"Error: the port number is invalid."));
1404 hostItem->setHostParameters(hostConf.hostname->text(),
1405 hostConf.portnumber->text().toInt());
1410 if (hostItem->getName() ==
host->getName() &&
1411 hostItem->getPort() ==
host->getPort())
1413 KSNotification::error(
i18n(
"Host: %1 Port: %2 already exists.",
1414 hostItem->getName(), hostItem->getPort()));
1418 hostItem->setDriverSource(HOST_SOURCE);
1420 connect(hostItem.get(), &DriverInfo::deviceStateChanged,
this, [hostItem,
this]()
1422 processDeviceStatus(hostItem);
1425 driversList.append(hostItem);
1428 item->
setIcon(HOST_STATUS_COLUMN, ui->disconnected);
1429 item->
setText(HOST_NAME_COLUMN, hostConf.nameIN->text());
1430 item->
setText(HOST_PORT_COLUMN, hostConf.portnumber->text());
1436 void DriverManager::modifyINDIHost()
1439 Ui::INDIHostConf hostConf;
1440 hostConf.
setupUi(&hostConfDialog);
1445 if (currentItem ==
nullptr)
1448 for (
auto &
host : driversList)
1450 if (currentItem->
text(HOST_NAME_COLUMN) ==
host->getName() &&
1451 currentItem->
text(HOST_PORT_COLUMN).
toInt() ==
host->getPort())
1454 hostConf.hostname->setText(
host->getHost());
1459 host->setName(hostConf.nameIN->text());
1460 host->setHostParameters(hostConf.hostname->text(),
1461 hostConf.portnumber->text().toInt());
1463 currentItem->
setText(HOST_NAME_COLUMN, hostConf.nameIN->text());
1464 currentItem->
setText(HOST_PORT_COLUMN, hostConf.portnumber->text());
1473 void DriverManager::removeINDIHost()
1475 if (ui->clientTreeWidget->currentItem() ==
nullptr)
1479 if (ui->clientTreeWidget->currentItem()->text(HOST_NAME_COLUMN) ==
1481 ui->clientTreeWidget->currentItem()->text(HOST_PORT_COLUMN).toInt() ==
1484 if (
host->getClientState())
1486 KSNotification::error(
1487 i18n(
"You need to disconnect the client before removing it."));
1493 i18n(
"Are you sure you want to remove the %1 client?",
1494 ui->clientTreeWidget->currentItem()->text(HOST_NAME_COLUMN)),
1495 i18n(
"Delete Confirmation"),
1499 driversList.removeOne(
host);
1500 delete (ui->clientTreeWidget->currentItem());
1507 void DriverManager::saveHosts()
1514 .filePath(
"indihosts.xml"));
1518 KSNotification::sorry(
i18n(
"Unable to write to file 'indihosts.xml'\nAny changes "
1519 "to INDI hosts configurations will not be saved."),
1520 i18n(
"Could Not Open File"));
1529 if (
host->getDriverSource() != HOST_SOURCE)
1532 hostData =
"<INDIHost name='";
1533 hostData +=
host->getName();
1534 hostData +=
"' hostname='";
1535 hostData +=
host->getHost();
1536 hostData +=
"' port='";
1538 hostData +=
"' />\n";
1540 outstream << hostData;
1548 auto driver = std::find_if(driversList.begin(), driversList.end(), [name](
auto & oneDriver)
1550 return oneDriver->getName() == name;
1553 if (driver != driversList.end())
1561 auto driver = std::find_if(driversList.begin(), driversList.end(), [label](
auto & oneDriver)
1563 return oneDriver->getLabel() == label;
1566 if (driver != driversList.end())
1574 auto driver = std::find_if(driversList.begin(), driversList.end(), [exec](
auto & oneDriver)
1576 return oneDriver->getLabel() == exec;
1579 if (driver != driversList.end())
1585 QString DriverManager::getUniqueDeviceLabel(
const QString &label)
1590 for (
auto &cm : clients)
1592 auto devices = cm->getDevices();
1594 for (
auto &dv : devices)
1596 if (label ==
QString(dv.getDeviceName()))
1606 QJsonArray DriverManager::getDriverList()
const
1610 for (
const auto &drv : driversList)
1611 driverArray.
append(drv->toJson());
1618 for (
auto &oneServer : servers)
1620 if (oneServer->contains(driver))
1622 return oneServer->restartDriver(driver);