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;
72 DriverManager *DriverManager::Instance()
74 if (_DriverManager ==
nullptr)
81 return _DriverManager;
90 currentPort = Options::serverPortStart() - 1;
93 ui =
new DriverManagerUI(
this);
95 setLayout(mainLayout);
96 setWindowTitle(
i18nc(
"@title:window",
"Device Manager"));
116 if (Options::indiDriversDir().isEmpty())
117 Options::setIndiDriversDir(
125 m_CustomDrivers =
new CustomDrivers(
this, driversList);
127 updateCustomDrivers();
130 ui->localTreeWidget->setEnabled(
false);
134 DriverManager::~DriverManager()
137 qDeleteAll(driversList);
140 void DriverManager::processDeviceStatus(
DriverInfo *dv)
145 if (dv->getDriverSource() == GENERATED_SOURCE)
149 ServerMode mode = connectionMode;
154 if (dv->getDriverSource() != HOST_SOURCE)
156 if (ui->localTreeWidget->currentItem())
157 currentDriver = ui->localTreeWidget->currentItem()->text(LOCAL_NAME_COLUMN);
159 for (
auto &item : ui->localTreeWidget->findItems(
162 item->setText(LOCAL_VERSION_COLUMN, dv->getVersion());
165 mode = manager->getMode();
167 dState = dv->getServerState();
168 cState = dv->getClientState() && dState;
170 bool locallyAvailable =
false;
171 if (dv->getAuxInfo().contains(
"LOCALLY_AVAILABLE"))
173 dv->getAuxInfo().value(
"LOCALLY_AVAILABLE",
false).toBool();
178 if (locallyAvailable)
180 ui->runServiceB->setEnabled(!dState);
181 ui->stopServiceB->setEnabled(dState);
182 item->setIcon(LOCAL_STATUS_COLUMN,
183 dState ? ui->runningPix : ui->stopPix);
187 ui->runServiceB->setEnabled(
false);
188 ui->stopServiceB->setEnabled(
false);
193 item->setIcon(LOCAL_MODE_COLUMN, ui->serverMode);
201 item->setIcon(LOCAL_MODE_COLUMN,
QIcon());
208 if (locallyAvailable)
210 ui->runServiceB->setEnabled(!cState);
211 ui->stopServiceB->setEnabled(cState);
212 item->setIcon(LOCAL_STATUS_COLUMN,
213 cState ? ui->runningPix : ui->stopPix);
217 ui->runServiceB->setEnabled(
false);
218 ui->stopServiceB->setEnabled(
false);
223 item->setIcon(LOCAL_MODE_COLUMN, ui->localMode);
232 item->setIcon(LOCAL_MODE_COLUMN,
QIcon());
234 item->setText(LOCAL_PORT_COLUMN, port);
241 if (currentDriver == dv->getLabel())
243 ui->serverLogText->
clear();
244 ui->serverLogText->append(dv->getServerBuffer());
250 for (
auto &item : ui->clientTreeWidget->findItems(dv->getName(),
Qt::MatchExactly,
253 if (dv->getClientState())
255 item->setIcon(HOST_STATUS_COLUMN, ui->connected);
256 ui->connectHostB->setEnabled(
false);
257 ui->disconnectHostB->setEnabled(
true);
261 item->setIcon(HOST_STATUS_COLUMN, ui->disconnected);
262 ui->connectHostB->setEnabled(
true);
263 ui->disconnectHostB->setEnabled(
false);
282 if ((dv->getHost() == idv->getHost() && dv->getPort() == idv->getPort()))
285 if (dv->getClientState() || dv->getServerState())
289 i18n(
"Driver %1 is already running, do you want to restart it?",
291 if (ans == KMessageBox::Cancel)
297 stopDevices(stopList);
304 for (
auto &qdi : uHosts)
321 if (uList.
empty() ==
false)
322 uHosts.append(uList);
332 getUniqueHosts(dList, uHosts);
334 qCDebug(KSTARS_INDI) <<
"INDI: Starting local drivers...";
336 for (
auto &qdv : uHosts)
341 port = qdv.at(0)->getPort();
342 auto host = qdv.at(0)->getHost();
346 port = getINDIPort(port);
350 emit serverFailed(
host, port,
i18n(
"Cannot start INDI server: port error."));
356 if (serverManager ==
nullptr)
358 emit serverFailed(
host, port,
i18n(
"Failed to create local INDI server"));
362 serverManager->setPendingDrivers(qdv);
363 serverManager->setMode(connectionMode);
365 connect(serverManager, &ServerManager::newServerLog,
this, &DriverManager::updateLocalTab,
Qt::UniqueConnection);
366 connect(serverManager, &ServerManager::started,
this, &DriverManager::setServerStarted,
Qt::UniqueConnection);
367 connect(serverManager, &ServerManager::failed,
this, &DriverManager::setServerFailed,
Qt::UniqueConnection);
368 connect(serverManager, &ServerManager::terminated,
this, &DriverManager::setServerTerminated,
Qt::UniqueConnection);
370 serverManager->start();
374 void DriverManager::startLocalDrivers(
ServerManager *serverManager)
376 connect(serverManager, &ServerManager::driverStarted,
this, &DriverManager::processDriverStartup,
Qt::UniqueConnection);
377 connect(serverManager, &ServerManager::driverFailed,
this, &DriverManager::processDriverFailure,
Qt::UniqueConnection);
381 void DriverManager::processDriverStartup(
DriverInfo *dv)
383 emit driverStarted(dv);
385 auto manager = dv->getServerManager();
387 if (manager->pendingDrivers().
count() > 0)
394 if (connectionMode == SERVER_ONLY)
400 startClientManager(manager->managedDrivers(), manager->getHost(), manager->getPort());
405 emit driverFailed(dv,
message);
407 qCWarning(KSTARS_INDI) <<
"Driver" << dv->getName() <<
"failed to start. Retrying in 5 seconds...";
411 auto manager = dv->getServerManager();
413 if (manager->pendingDrivers().
count() > 0)
415 QtConcurrent::run(manager, &ServerManager::startDriver, manager->pendingDrivers().first());
426 clientManager->appendManagedDriver(dv);
428 connect(clientManager, &ClientManager::started,
this, &DriverManager::setClientStarted,
Qt::UniqueConnection);
429 connect(clientManager, &ClientManager::failed,
this, &DriverManager::setClientFailed,
Qt::UniqueConnection);
430 connect(clientManager, &ClientManager::terminated,
this, &DriverManager::setClientTerminated,
Qt::UniqueConnection);
432 clientManager->setServer(
host.toLatin1().constData(), port);
434 GUIManager::Instance()->addClient(clientManager);
435 INDIListener::Instance()->addClient(clientManager);
437 clientManager->establishConnection();
442 qCDebug(KSTARS_INDI) <<
"INDI: Stopping local drivers...";
454 if (cm->count() == 0)
456 GUIManager::Instance()->removeClient(cm);
457 INDIListener::Instance()->removeClient(cm);
458 cm->disconnectServer();
459 clients.removeOne(cm);
479 servers.removeOne(sm);
486 currentPort = Options::serverPortStart() - 1;
491 void DriverManager::disconnectClients()
493 for (
auto &clientManager : clients)
495 clientManager->disconnectAll();
496 clientManager->disconnect();
500 void DriverManager::clearServers()
502 for (
auto &serverManager : servers)
503 serverManager->stop();
508 void DriverManager::activateRunService()
510 processLocalTree(
true);
513 void DriverManager::activateStopService()
515 processLocalTree(
false);
518 void DriverManager::activateHostConnection()
520 processRemoteTree(
true);
523 void DriverManager::activateHostDisconnection()
525 processRemoteTree(
false);
530 return dv->getClientManager();
533 void DriverManager::updateLocalTab()
535 if (ui->localTreeWidget->currentItem() ==
nullptr)
538 QString currentDriver = ui->localTreeWidget->currentItem()->text(LOCAL_NAME_COLUMN);
540 auto device = std::find_if(driversList.begin(), driversList.end(), [currentDriver](
const auto & oneDriver)
542 return currentDriver == oneDriver->getLabel();
544 if (device != driversList.end())
545 processDeviceStatus(*device);
548 void DriverManager::updateClientTab()
556 int port = item->
text(HOST_PORT_COLUMN).
toInt();
558 auto device = std::find_if(driversList.begin(), driversList.end(), [hostname, port](
const auto & oneDriver)
560 return hostname == oneDriver->getName() && port == oneDriver->getPort();
562 if (device != driversList.end())
563 processDeviceStatus(*device);
566 void DriverManager::processLocalTree(
bool dState)
573 connectionMode = ui->localR->isChecked() ? SERVER_CLIENT : SERVER_ONLY;
575 for (
auto &item : ui->localTreeWidget->selectedItems())
577 for (
auto &device : driversList)
582 if (item->
text(LOCAL_NAME_COLUMN) == device->getLabel() &&
583 device->getServerState() != dState)
585 processed_devices.
append(device);
590 if (port == -1 && item->
text(LOCAL_PORT_COLUMN).
isEmpty() ==
false)
592 port = item->
text(LOCAL_PORT_COLUMN).
toInt(&portOK);
596 KSNotification::error(
i18n(
"Invalid port entry: %1", item->
text(LOCAL_PORT_COLUMN)));
601 device->setHostParameters(
"localhost", port);
606 if (processed_devices.
empty())
610 startDevices(processed_devices);
612 stopDevices(processed_devices);
617 auto client = qobject_cast<ClientManager*>(sender());
619 if (client ==
nullptr)
622 auto host = client->getHost();
623 auto port = client->getPort();
629 GUIManager::Instance()->removeClient(client);
630 INDIListener::Instance()->removeClient(client);
634 clients.removeOne(client);
635 client->deleteLater();
643 auto client = qobject_cast<ClientManager*>(sender());
645 if (client ==
nullptr)
648 auto host = client->getHost();
649 auto port = client->getPort();
655 GUIManager::Instance()->removeClient(client);
656 INDIListener::Instance()->removeClient(client);
658 KSNotification::event(
QLatin1String(
"IndiServerMessage"),
message, KSNotification::EVENT_ALERT);
660 clients.removeOne(client);
661 client->deleteLater();
667 void DriverManager::setServerStarted()
669 auto manager = qobject_cast<ServerManager*>(sender());
670 qCDebug(KSTARS_INDI) <<
"INDI: INDI Server started locally on port " << manager->getPort();
671 startLocalDrivers(manager);
672 emit serverStarted(manager->getHost(), manager->getPort());
677 auto server = qobject_cast<ServerManager *>(sender());
679 if (server ==
nullptr)
682 for (
auto &dv : driversList)
684 if (dv->getServerManager() == server)
690 if (server->getMode() == SERVER_ONLY)
691 KSNotification::error(
message);
693 emit serverFailed(server->getHost(), server->getPort(),
message);
694 servers.removeOne(server);
695 server->deleteLater();
702 auto server = qobject_cast<ServerManager *>(sender());
704 if (server ==
nullptr)
707 for (
auto &dv : driversList)
709 if (dv->getServerManager() == server)
715 if (server->getMode() == SERVER_ONLY)
716 KSNotification::error(
message);
718 emit serverTerminated(server->getHost(), server->getPort(),
message);
719 servers.removeOne(server);
720 server->deleteLater();
725 void DriverManager::processRemoteTree(
bool dState)
731 for (
auto &dv : driversList)
733 if (dv->getDriverSource() != HOST_SOURCE)
739 if (currentItem->
text(HOST_NAME_COLUMN) == dv->getName() &&
740 currentItem->
text(HOST_PORT_COLUMN).
toInt() == dv->getPort())
743 if (dv->getClientState() == dState)
748 connectRemoteHost(dv);
751 disconnectRemoteHost(dv);
756 void DriverManager::connectRemoteHost(
DriverInfo *dv)
758 auto host = dv->getHost();
759 auto port = dv->getPort();
763 clientManager->appendManagedDriver(dv);
765 connect(clientManager, &ClientManager::started,
this, &DriverManager::setClientStarted,
Qt::UniqueConnection);
766 connect(clientManager, &ClientManager::failed,
this, &DriverManager::setClientFailed,
Qt::UniqueConnection);
767 connect(clientManager, &ClientManager::terminated,
this, &DriverManager::setClientTerminated,
Qt::UniqueConnection);
769 clientManager->setServer(
host.toLatin1().constData(), port);
771 GUIManager::Instance()->addClient(clientManager);
772 INDIListener::Instance()->addClient(clientManager);
774 clientManager->establishConnection();
777 void DriverManager::setClientStarted()
779 auto clientManager = qobject_cast<ClientManager *>(sender());
780 if (clientManager ==
nullptr)
783 clients.append(clientManager);
788 i18n(
"Connected to INDI server"),
789 KSNotification::EVENT_INFO);
791 emit clientStarted(clientManager->getHost(), clientManager->getPort());
794 bool DriverManager::disconnectRemoteHost(
DriverInfo *dv)
802 GUIManager::Instance()->removeClient(clientManager);
803 INDIListener::Instance()->removeClient(clientManager);
804 clients.removeOne(clientManager);
813 void DriverManager::resizeDeviceColumn()
815 ui->localTreeWidget->resizeColumnToContents(0);
818 void DriverManager::updateMenuActions()
824 bool activeDevice =
false;
826 if (clients.size() > 0)
830 if (tmpAction !=
nullptr)
837 int DriverManager::getINDIPort(
int customPort)
840 qWarning() <<
"INDI server is currently not supported on Windows.";
843 int lastPort = Options::serverPortEnd();
844 bool success =
false;
848 if (currentPort > lastPort)
849 currentPort = Options::serverPortStart();
853 if (customPort != -1)
865 for (; currentPort <= lastPort; currentPort++)
878 bool DriverManager::readINDIHosts()
880 QString indiFile(
"indihosts.xml");
885 LilXML *xmlParser = newLilXML();
886 XMLEle *root =
nullptr;
887 XMLAtt *ap =
nullptr;
894 delLilXML(xmlParser);
900 root = readXMLEle(xmlParser, c, errmsg);
905 ap = findXMLAtt(root,
"name");
908 delLilXML(xmlParser);
912 hName =
QString(valuXMLAtt(ap));
915 ap = findXMLAtt(root,
"hostname");
919 delLilXML(xmlParser);
923 hHost =
QString(valuXMLAtt(ap));
925 ap = findXMLAtt(root,
"port");
929 delLilXML(xmlParser);
933 hPort =
QString(valuXMLAtt(ap));
936 dv->setHostParameters(hHost, hPort.
toInt());
937 dv->setDriverSource(HOST_SOURCE);
939 connect(dv, &DriverInfo::deviceStateChanged,
this, &DriverManager::processDeviceStatus);
941 driversList.append(dv);
945 item->
setIcon(HOST_STATUS_COLUMN, ui->disconnected);
946 item->
setText(HOST_NAME_COLUMN, hName);
947 item->
setText(HOST_PORT_COLUMN, hPort);
953 qDebug() << Q_FUNC_INFO << errmsg;
954 delLilXML(xmlParser);
959 delLilXML(xmlParser);
964 bool DriverManager::readXMLDrivers()
977 QString driversDir = Options::indiDriversDir();
979 if (Options::indiDriversAreInternal())
984 if (indiDir.
cd(driversDir) ==
false)
986 KSNotification::error(
i18n(
"Unable to find INDI drivers directory: %1\nPlease "
987 "make sure to set the correct "
988 "path in KStars configuration",
998 for (
auto &fileInfo : list)
1017 processXMLDriver(fileInfo.absoluteFilePath());
1023 void DriverManager::processXMLDriver(
const QString &driverName)
1025 QFile file(driverName);
1028 KSNotification::error(
i18n(
"Failed to open INDI Driver file: %1", driverName));
1032 char errmsg[ERRMSG_SIZE];
1034 LilXML *xmlParser = newLilXML();
1035 XMLEle *root =
nullptr;
1036 XMLEle *ep =
nullptr;
1039 driverSource = PRIMARY_XML;
1041 driverSource = THIRD_PARTY_XML;
1045 root = readXMLEle(xmlParser, c, errmsg);
1050 if (!strcmp(tagXMLEle(root),
"driversList"))
1052 for (ep = nextXMLEle(root, 1); ep !=
nullptr; ep = nextXMLEle(root, 0))
1054 if (!buildDeviceGroup(ep, errmsg))
1055 prXMLEle(stderr, ep, 0);
1061 if (!buildDeviceGroup(root, errmsg))
1062 prXMLEle(stderr, root, 0);
1069 qCDebug(KSTARS_INDI) <<
QString(errmsg);
1070 delLilXML(xmlParser);
1075 delLilXML(xmlParser);
1078 bool DriverManager::buildDeviceGroup(XMLEle *root,
char errmsg[])
1084 DeviceFamily groupType = KSTARS_TELESCOPE;
1087 if (strlen(tagXMLEle(root)) > 1024)
1091 ap = findXMLAtt(root,
"group");
1095 snprintf(errmsg, ERRMSG_SIZE,
"Tag %.64s does not have a group attribute",
1100 groupName = valuXMLAtt(ap);
1101 groupType = DeviceFamilyLabels.key(groupName);
1103 #ifndef HAVE_CFITSIO
1105 if (groupType == KSTARS_CCD || groupType == KSTARS_VIDEO)
1113 group = treeList[0];
1120 for (ep = nextXMLEle(root, 1); ep !=
nullptr; ep = nextXMLEle(root, 0))
1122 if (!buildDriverElement(ep, group, groupType, errmsg))
1129 bool DriverManager::buildDriverElement(XMLEle *root,
QTreeWidgetItem *DGroup,
1130 DeviceFamily groupType,
char errmsg[])
1139 QString manufacturer(
"Others");
1146 ap = findXMLAtt(root,
"label");
1149 snprintf(errmsg, ERRMSG_SIZE,
"Tag %.64s does not have a label attribute",
1154 label = valuXMLAtt(ap);
1157 if (findDriverByLabel(label) !=
nullptr)
1160 ap = findXMLAtt(root,
"manufacturer");
1162 manufacturer = valuXMLAtt(ap);
1165 ap = findXMLAtt(root,
"port");
1167 port = valuXMLAtt(ap);
1171 ap = findXMLAtt(root,
"skel");
1173 skel = valuXMLAtt(ap);
1185 ap = findXMLAtt(root,
"mdpd");
1189 mdpd = (
QString(valuXMLAtt(ap)) ==
QString(
"true")) ?
true :
false;
1190 vMap.insert(
"mdpd", mdpd);
1201 el = findXMLEle(root,
"driver");
1206 driver = pcdataXMLEle(el);
1208 ap = findXMLAtt(el,
"name");
1211 snprintf(errmsg, ERRMSG_SIZE,
"Tag %.64s does not have a name attribute",
1216 name = valuXMLAtt(ap);
1218 el = findXMLEle(root,
"version");
1224 bool versionOK =
false;
1226 if (versionOK ==
false)
1229 bool driverIsAvailable = checkDriverAvailability(driver);
1231 vMap.insert(
"LOCALLY_AVAILABLE", driverIsAvailable);
1236 device->
setText(LOCAL_NAME_COLUMN, label);
1237 if (driverIsAvailable)
1238 device->
setIcon(LOCAL_STATUS_COLUMN, ui->stopPix);
1240 device->
setIcon(LOCAL_STATUS_COLUMN, remoteIcon);
1241 device->
setText(LOCAL_VERSION_COLUMN, version);
1242 device->
setText(LOCAL_PORT_COLUMN, port);
1245 if (groupType == KSTARS_TELESCOPE && driversStringList.contains(driver) ==
false)
1246 driversStringList.append(driver);
1250 dv->setLabel(label);
1251 dv->setVersion(version);
1252 dv->setExecutable(driver);
1253 dv->setManufacturer(manufacturer);
1254 dv->setSkeletonFile(skel);
1255 dv->setType(groupType);
1256 dv->setDriverSource(driverSource);
1258 dv->setAuxInfo(vMap);
1260 connect(dv, &DriverInfo::deviceStateChanged,
this, &DriverManager::processDeviceStatus);
1262 driversList.append(dv);
1267 bool DriverManager::checkDriverAvailability(
const QString &driver)
1269 QString indiServerDir = Options::indiServer();
1270 if (Options::indiServerIsInternal())
1275 QFile driverFile(indiServerDir +
'/' + driver);
1277 if (driverFile.exists() ==
false)
1283 void DriverManager::updateCustomDrivers()
1285 for (
const QVariantMap &oneDriver : m_CustomDrivers->customDrivers())
1288 dv->setLabel(oneDriver[
"Label"].
toString());
1289 dv->setUniqueLabel(dv->getLabel());
1290 dv->setExecutable(oneDriver[
"Exec"].
toString());
1291 dv->setVersion(oneDriver[
"Version"].
toString());
1292 dv->setManufacturer(oneDriver[
"Manufacturer"].
toString());
1293 dv->setType(DeviceFamilyLabels.key(oneDriver[
"Family"].toString()));
1294 dv->setDriverSource(CUSTOM_SOURCE);
1296 bool driverIsAvailable = checkDriverAvailability(oneDriver[
"Exec"].
toString());
1298 vMap.insert(
"LOCALLY_AVAILABLE", driverIsAvailable);
1299 dv->setAuxInfo(vMap);
1301 driversList.append(dv);
1307 void DriverManager::updateCustomDrivers()
1321 group = treeList[0];
1325 KStarsData::Instance()->
logObject()->readAll();
1328 foreach (
OAL::Scope *s, *(KStarsData::Instance()->logObject()->scopeList()))
1332 if (s->driver() ==
i18n(
"None"))
1336 if ((drv = findDriverByLabel(label)))
1338 if (s->aperture() > 0 && s->focalLength() > 0)
1340 vMap.
insert(
"TELESCOPE_APERTURE", s->aperture());
1341 vMap.
insert(
"TELESCOPE_FOCAL_LENGTH", s->focalLength());
1342 drv->setAuxInfo(vMap);
1345 drv->setExecutable(s->driver());
1350 driver = s->driver();
1355 device->
setIcon(LOCAL_STATUS_COLUMN, ui->stopPix);
1360 dv->setLabel(label);
1361 dv->setExecutable(driver);
1362 dv->setVersion(version);
1363 dv->setType(KSTARS_TELESCOPE);
1364 dv->setDriverSource(EM_XML);
1366 if (s->aperture() > 0 && s->focalLength() > 0)
1368 vMap.insert(
"TELESCOPE_APERTURE", s->aperture());
1369 vMap.insert(
"TELESCOPE_FOCAL_LENGTH", s->focalLength());
1370 dv->setAuxInfo(vMap);
1373 connect(dv, SIGNAL(deviceStateChanged(
DriverInfo*)),
this, SLOT(processDeviceStatus(
DriverInfo*)));
1374 driversList.append(dv);
1381 if (dev->getDriverSource() != EM_XML || dev->getClientState())
1384 if (KStarsData::Instance()->logObject()->findScopeByName(dev->getName()))
1392 widgetDev = devList[0];
1398 driversList.removeOne(dev);
1404 void DriverManager::addINDIHost()
1407 Ui::INDIHostConf hostConf;
1408 hostConf.
setupUi(&hostConfDialog);
1410 bool portOk =
false;
1416 hostConf.portnumber->text().toInt(&portOk);
1418 if (portOk ==
false)
1420 KSNotification::error(
i18n(
"Error: the port number is invalid."));
1425 hostItem->setHostParameters(hostConf.hostname->text(),
1426 hostConf.portnumber->text().toInt());
1431 if (hostItem->getName() ==
host->getName() &&
1432 hostItem->getPort() ==
host->getPort())
1434 KSNotification::error(
i18n(
"Host: %1 Port: %2 already exists.",
1435 hostItem->getName(), hostItem->getPort()));
1440 hostItem->setDriverSource(HOST_SOURCE);
1442 connect(hostItem, &DriverInfo::deviceStateChanged,
this, &DriverManager::processDeviceStatus);
1444 driversList.append(hostItem);
1447 item->
setIcon(HOST_STATUS_COLUMN, ui->disconnected);
1448 item->
setText(HOST_NAME_COLUMN, hostConf.nameIN->text());
1449 item->
setText(HOST_PORT_COLUMN, hostConf.portnumber->text());
1455 void DriverManager::modifyINDIHost()
1458 Ui::INDIHostConf hostConf;
1459 hostConf.
setupUi(&hostConfDialog);
1464 if (currentItem ==
nullptr)
1467 for (
auto &
host : driversList)
1469 if (currentItem->
text(HOST_NAME_COLUMN) ==
host->getName() &&
1470 currentItem->
text(HOST_PORT_COLUMN).
toInt() ==
host->getPort())
1473 hostConf.hostname->setText(
host->getHost());
1478 host->setName(hostConf.nameIN->text());
1479 host->setHostParameters(hostConf.hostname->text(),
1480 hostConf.portnumber->text().toInt());
1482 currentItem->
setText(HOST_NAME_COLUMN, hostConf.nameIN->text());
1483 currentItem->
setText(HOST_PORT_COLUMN, hostConf.portnumber->text());
1492 void DriverManager::removeINDIHost()
1494 if (ui->clientTreeWidget->currentItem() ==
nullptr)
1498 if (ui->clientTreeWidget->currentItem()->text(HOST_NAME_COLUMN) ==
1500 ui->clientTreeWidget->currentItem()->text(HOST_PORT_COLUMN).toInt() ==
1503 if (
host->getClientState())
1505 KSNotification::error(
1506 i18n(
"You need to disconnect the client before removing it."));
1512 i18n(
"Are you sure you want to remove the %1 client?",
1513 ui->clientTreeWidget->currentItem()->text(HOST_NAME_COLUMN)),
1514 i18n(
"Delete Confirmation"),
1518 driversList.removeOne(
host);
1520 delete (ui->clientTreeWidget->currentItem());
1527 void DriverManager::saveHosts()
1534 .filePath(
"indihosts.xml"));
1538 KSNotification::sorry(
i18n(
"Unable to write to file 'indihosts.xml'\nAny changes "
1539 "to INDI hosts configurations will not be saved."),
1540 i18n(
"Could Not Open File"));
1549 if (
host->getDriverSource() != HOST_SOURCE)
1552 hostData =
"<INDIHost name='";
1553 hostData +=
host->getName();
1554 hostData +=
"' hostname='";
1555 hostData +=
host->getHost();
1556 hostData +=
"' port='";
1557 hostData +=
host->getPort();
1558 hostData +=
"' />\n";
1560 outstream << hostData;
1568 for (
auto &dv : driversList)
1570 if (dv->getName() == name)
1579 for (
auto &dv : driversList)
1581 if (dv->getLabel() == label)
1590 for (
auto &dv : driversList)
1592 if (dv->getExecutable() == exec)
1599 QString DriverManager::getUniqueDeviceLabel(
const QString &label)
1604 for (
auto &cm : clients)
1606 auto &devices = cm->getDevices();
1608 for (
auto &dv : devices)
1610 if (label ==
QString(dv->getDeviceName()))
1620 QJsonArray DriverManager::getDriverList()
const
1624 for (
const auto &drv : driversList)
1625 driverArray.
append(drv->toJson());
1630 bool DriverManager::restartDriver(
DriverInfo *dv)
1632 for (
auto &oneServer : servers)
1634 if (oneServer->contains(dv))
1636 return oneServer->restartDriver(dv);