• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kstars

  • sources
  • kde-4.12
  • kdeedu
  • kstars
  • kstars
  • indi
drivermanager.cpp
Go to the documentation of this file.
1 /* INDI Server Manager
2  Copyright (C) 2012 Jasem Mutlaq (mutlaqja@ikarustech.com)
3 
4  This application is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8 
9  */
10 
11 #include <basedevice.h>
12 
13 #include <unistd.h>
14 #include <sys/socket.h>
15 #include <netinet/in.h>
16 #include <netdb.h>
17 #include <string>
18 
19 #include <QRadioButton>
20 #include <QFile>
21 #include <QDir>
22 #include <QTextStream>
23 #include <QTreeWidget>
24 #include <QIcon>
25 #include <QDialog>
26 #include <QTcpServer>
27 
28 #include <KMenu>
29 #include <KMessageBox>
30 #include <KPushButton>
31 #include <KLineEdit>
32 #include <KProcess>
33 #include <KAction>
34 #include <KActionCollection>
35 #include <KIconLoader>
36 
37 #include <kstandarddirs.h>
38 
39 #include "oal/log.h"
40 #include "oal/scope.h"
41 
42 #include "ui_indihostconf.h"
43 #include "servermanager.h"
44 #include "guimanager.h"
45 #include "Options.h"
46 #include "drivermanager.h"
47 #include "driverinfo.h"
48 
49 #include "kstars.h"
50 #include "kstarsdata.h"
51 #include "ksutils.h"
52 #include "driverinfo.h"
53 #include "indilistener.h"
54 
55 #include <config-kstars.h>
56 
57 #define INDI_MAX_TRIES 3
58 #define ERRMSG_SIZE 1024
59 
60 DriverManagerUI::DriverManagerUI(QWidget *parent) : QFrame(parent)
61 {
62  setupUi(this);
63 
64  localTreeWidget->setSortingEnabled(false);
65  localTreeWidget->setRootIsDecorated(true);
66 
67  clientTreeWidget->setSortingEnabled(false);
68 
69  runningPix = KIcon( "system-run" );
70  stopPix = KIcon( "dialog-cancel" );
71  localMode = KIcon( "computer" );
72  serverMode = KIcon( "network-server" );
73 
74  connected = KIcon( "network-connect" );
75  disconnected = KIcon( "network-disconnect" );
76 
77  connect(localTreeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(makePortEditable(QTreeWidgetItem*,int)));
78 }
79 
80 void DriverManagerUI::makePortEditable(QTreeWidgetItem* selectedItem, int column)
81 {
82  // If it's the port column, then make it user-editable
83  if (column == ::DriverManager::LOCAL_PORT_COLUMN)
84  selectedItem->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled);
85 
86  localTreeWidget->editItem(selectedItem, ::DriverManager::LOCAL_PORT_COLUMN);
87 }
88 
89 DriverManager * DriverManager::_DriverManager = NULL;
90 
91 DriverManager * DriverManager::Instance()
92 {
93  if (_DriverManager == NULL)
94  _DriverManager = new DriverManager();
95 
96  return _DriverManager;
97 }
98 
99 DriverManager::DriverManager()
100  : KDialog( KStars::Instance() )
101 {
102 
103  currentPort = Options::serverPortStart().toInt()-1;
104  lastGroup = NULL;
105  lastDevice = NULL;
106 
107  connectionMode = SERVER_CLIENT;
108 
109  ui = new DriverManagerUI( this );
110  setMainWidget( ui );
111  setCaption( i18n( "Device Manager" ) );
112  setButtons( KDialog::Close );
113 
114  lastGroup = NULL;
115 
116  QObject::connect(ui->addB, SIGNAL(clicked()), this, SLOT(addINDIHost()));
117  QObject::connect(ui->modifyB, SIGNAL(clicked()), this, SLOT(modifyINDIHost()));
118  QObject::connect(ui->removeB, SIGNAL(clicked()), this, SLOT(removeINDIHost()));
119 
120  QObject::connect(ui->connectHostB, SIGNAL(clicked()), this, SLOT(activateHostConnection()));
121  QObject::connect(ui->disconnectHostB, SIGNAL(clicked()), this, SLOT(activateHostDisconnection()));
122  QObject::connect(ui->runServiceB, SIGNAL(clicked()), this, SLOT(activateRunService()));
123  QObject::connect(ui->stopServiceB, SIGNAL(clicked()), this, SLOT(activateStopService()));
124  QObject::connect(ui->localTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(updateLocalTab()));
125  QObject::connect(ui->clientTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(updateClientTab()));
126  QObject::connect(ui->localTreeWidget, SIGNAL(expanded(const QModelIndex &)), this, SLOT(resizeDeviceColumn()));
127 
128  readXMLDrivers();
129 
130  readINDIHosts();
131 
132  updateCustomDrivers();
133 
134 
135 }
136 
137 void DriverManager::processDeviceStatus(DriverInfo *dv)
138 {
139 
140  if (dv == NULL)
141  return;
142 
143  QString currentDriver;
144  ServerMode mode = connectionMode;
145  ServerManager *manager = dv->getServerManager();
146  bool dState=false;
147  bool cState=false;
148 
149  if (dv->getDriverSource() != HOST_SOURCE)
150  {
151  if (ui->localTreeWidget->currentItem())
152  currentDriver = ui->localTreeWidget->currentItem()->text(LOCAL_NAME_COLUMN);
153 
154  foreach (QTreeWidgetItem *item, ui->localTreeWidget->findItems(dv->getTreeLabel(), Qt::MatchExactly | Qt::MatchRecursive))
155  {
156 
157  item->setText(LOCAL_VERSION_COLUMN, dv->getVersion());
158 
159  if (manager)
160  mode = manager->getMode();
161 
162 
163  dState = dv->getServerState();
164  cState = dv->getClientState() && dState;
165 
166 
167  switch (mode)
168  {
169  case SERVER_ONLY:
170  ui->runServiceB->setEnabled(!dState);
171  ui->stopServiceB->setEnabled(dState);
172  item->setIcon(LOCAL_STATUS_COLUMN, dState ? ui->runningPix : ui->stopPix);
173  if (dState)
174  {
175  item->setIcon(LOCAL_MODE_COLUMN, ui->serverMode);
176  if (manager)
177  item->setText(LOCAL_PORT_COLUMN, QString(manager->getPort()));
178  }
179  else
180  {
181  item->setIcon(LOCAL_MODE_COLUMN, QIcon());
182  item->setText(LOCAL_PORT_COLUMN, dv->getUserPort());
183  }
184 
185  break;
186 
187  case SERVER_CLIENT:
188  ui->runServiceB->setEnabled(!cState);
189  ui->stopServiceB->setEnabled(cState);
190  item->setIcon(LOCAL_STATUS_COLUMN, cState ? ui->runningPix : ui->stopPix);
191  if (cState)
192  {
193  item->setIcon(LOCAL_MODE_COLUMN, ui->localMode);
194 
195  if (manager)
196  item->setText(LOCAL_PORT_COLUMN, QString(manager->getPort()));
197  }
198  else
199  {
200  item->setIcon(LOCAL_MODE_COLUMN, QIcon());
201  item->setText(LOCAL_PORT_COLUMN, dv->getUserPort());
202  }
203 
204  break;
205  }
206 
207  // Only update the log if the current driver is selected
208  if (currentDriver == dv->getTreeLabel())
209  {
210  ui->serverLogText->clear();
211  ui->serverLogText->append(dv->getServerBuffer());
212  }
213 
214  }
215  }
216  else
217  {
218  foreach (QTreeWidgetItem *item, ui->clientTreeWidget->findItems(dv->getName(), Qt::MatchExactly, HOST_NAME_COLUMN))
219  {
220  if (dv->getClientState())
221  {
222  item->setIcon(HOST_STATUS_COLUMN, ui->connected);
223  ui->connectHostB->setEnabled(false);
224  ui->disconnectHostB->setEnabled(true);
225  }
226  else
227  {
228  item->setIcon(HOST_STATUS_COLUMN, ui->disconnected);
229  ui->connectHostB->setEnabled(true);
230  ui->disconnectHostB->setEnabled(false);
231  }
232  }
233 
234  }
235 
236 }
237 
238 void DriverManager::getUniqueHosts(QList<DriverInfo*> & dList, QList < QList<DriverInfo *> > & uHosts)
239 {
240  bool found=false;
241 
242  foreach(DriverInfo *dv, dList)
243  {
244  QList<DriverInfo *> uList;
245 
246  foreach(DriverInfo *idv, dList)
247  {
248  if (dv->getHost() == idv->getHost() && dv->getPort() == idv->getPort())
249  {
250 
251  // Check if running already
252  if (dv->getClientState() || dv->getServerState())
253  {
254  int ans = KMessageBox::warningContinueCancel(0, i18n("Driver %1 is already running, do you want to restart it?", dv->getTreeLabel()));
255  if (ans == KMessageBox::Cancel)
256  continue;
257  else
258  {
259  QList<DriverInfo *> stopList;
260  stopList.append(dv);
261  stopDevices(stopList);
262  }
263  }
264 
265  found = false;
266 
267  foreach(QList < DriverInfo *> qdi, uHosts)
268  {
269  foreach(DriverInfo *di, qdi)
270  {
271  if (di == idv)
272  {
273  found = true;
274  break;
275  }
276  }
277  }
278 
279  if (found == false)
280  uList.append(idv);
281 
282  }
283  }
284 
285  if (uList.empty() == false)
286  uHosts.append(uList);
287  }
288 
289 }
290 
291 bool DriverManager::startDevices(QList<DriverInfo*> & dList)
292 {
293  ServerManager *serverManager=NULL;
294  ClientManager *clientManager=NULL;
295  int port=-1;
296 
297  QList < QList<DriverInfo*> > uHosts;
298 
299  bool connectionToServer=false;
300 
301  getUniqueHosts(dList, uHosts);
302 
303  foreach(QList <DriverInfo *> qdv, uHosts)
304  {
305 
306  if (qdv.empty())
307  continue;
308 
309  port = qdv.at(0)->getPort().toInt();
310 
311  // Select random port within range is none specified.
312  if (port == -1)
313  port = getINDIPort(port);
314 
315  if (port <= 0)
316  {
317  KMessageBox::error(0, i18n("Cannot start INDI server: port error."));
318  return false;
319  }
320 
321  serverManager = new ServerManager(qdv.at(0)->getHost(), ((uint) port));
322 
323  if (serverManager == NULL)
324  {
325  kWarning() << "Warning: device manager has not been established properly";
326  return false;
327  }
328 
329  serverManager->setMode(connectionMode);
330 
331  connect(serverManager, SIGNAL(newServerLog()), this, SLOT(updateLocalTab()));
332  //connect(serverManager, SIGNAL(serverFailure(ServerManager*)), this, SLOT(processServerTermination(ServerManager*)));
333 
334 
335 
336  if (serverManager->start())
337  servers.append(serverManager);
338  else
339  {
340  delete serverManager;
341  return false;
342  }
343 
344 
345  foreach(DriverInfo *dv, qdv)
346  {
347  if (serverManager->startDriver(dv) == false)
348  {
349  servers.removeOne(serverManager);
350  serverManager->stop();
351  delete serverManager;
352  return false;
353  }
354  }
355 
356  // Nothing to do more if SERVER ONLY
357  if (connectionMode == SERVER_ONLY)
358  continue;
359 
360  clientManager = new ClientManager();
361 
362  foreach(DriverInfo *dv, qdv)
363  clientManager->appendManagedDriver(dv);
364 
365 
366  connect(clientManager, SIGNAL(connectionFailure(ClientManager*)), this, SLOT(processClientTermination(ClientManager*)));
367  //connect(clientManager, SIGNAL(newINDIDevice(DriverInfo*)), this, SIGNAL(newINDIDevice(DriverInfo*)));
368 
369  clientManager->setServer(qdv.at(0)->getHost().toLatin1().constData(), ((uint) port));
370 
371  GUIManager::Instance()->addClient(clientManager);
372  INDIListener::Instance()->addClient(clientManager);
373 
374  for (int i=0; i < INDI_MAX_TRIES; i++)
375  {
376  connectionToServer= clientManager->connectServer();
377 
378  if (connectionToServer)
379  break;
380 
381  usleep(100000);
382  }
383 
384  if (connectionToServer)
385  {
386  clients.append(clientManager);
387  updateMenuActions();
388  }
389  else
390  {
391  QString errMsg = i18n("Connection to INDI server locally on port %1 failed.", port);
392  KMessageBox::error(NULL, errMsg);
393  foreach (DriverInfo *dv, qdv)
394  processDeviceStatus(dv);
395 
396  GUIManager::Instance()->removeClient(clientManager);
397  INDIListener::Instance()->removeClient(clientManager);
398 
399  return false;
400 
401  }
402 
403  }
404 
405 
406  return true;
407 
408 }
409 
410 void DriverManager::stopDevices(const QList<DriverInfo*> & dList)
411 {
412 
413  // #2 stop server
414  foreach(DriverInfo *dv, dList)
415  {
416  ClientManager *cm = dv->getClientManager();
417 
418  if (cm == NULL)
419  continue;
420 
421  cm->removeManagedDriver(dv);
422 
423  if (cm->count() == 0)
424  {
425  GUIManager::Instance()->removeClient(cm);
426  INDIListener::Instance()->removeClient(cm);
427  cm->disconnectServer();
428  clients.removeOne(cm);
429  delete cm;
430  cm = NULL;
431  }
432  }
433 
434  foreach(DriverInfo *dv, dList)
435  {
436  ServerManager *sm = dv->getServerManager();
437 
438  if (sm != NULL)
439  {
440  sm->stopDriver(dv);
441 
442  if (sm->size() == 0)
443  {
444  sm->stop();
445  servers.removeOne(sm);
446  delete sm;
447  sm = NULL;
448  }
449  }
450 
451  }
452 
453  updateMenuActions();
454 
455 }
456 
457 void DriverManager::clearServers()
458 {
459  foreach(ServerManager *serverManager, servers)
460  serverManager->stop();
461 
462  qDeleteAll(servers);
463 }
464 
465 void DriverManager::activateRunService()
466  {
467  processLocalTree(true);
468  }
469 
470 void DriverManager::activateStopService()
471  {
472  processLocalTree(false);
473  }
474 
475 void DriverManager::activateHostConnection()
476  {
477  processRemoteTree(true);
478  }
479 
480 void DriverManager::activateHostDisconnection()
481  {
482  processRemoteTree(false);
483  }
484 
485 ClientManager *DriverManager::getClientManager(DriverInfo *dv)
486 {
487  return dv->getClientManager();
488 }
489 
490 void DriverManager::updateLocalTab()
491 {
492  if (ui->localTreeWidget->currentItem() == NULL)
493  return;
494 
495  QString currentDriver = ui->localTreeWidget->currentItem()->text(LOCAL_NAME_COLUMN);
496 
497  foreach (DriverInfo *device, driversList)
498  {
499  if (currentDriver == device->getTreeLabel())
500  {
501  processDeviceStatus(device);
502  break;
503  }
504  }
505 }
506 
507 void DriverManager::updateClientTab()
508 {
509 
510  if (ui->clientTreeWidget->currentItem() == NULL)
511  return;
512 
513  foreach (DriverInfo *dv, driversList)
514  {
515  if (ui->clientTreeWidget->currentItem()->text(HOST_NAME_COLUMN) == dv->getName() &&
516  ui->clientTreeWidget->currentItem()->text(HOST_PORT_COLUMN) == dv->getPort())
517  {
518  processDeviceStatus(dv);
519  break;
520  }
521  }
522 
523 }
524 
525 void DriverManager::processLocalTree(bool dState)
526 {
527  QList<DriverInfo *> processed_devices;
528 
529  int port=-1;
530  bool portOK=false;
531 
532  connectionMode = ui->localR->isChecked() ? SERVER_CLIENT : SERVER_ONLY;
533 
534  foreach(QTreeWidgetItem *item, ui->localTreeWidget->selectedItems())
535  {
536  foreach (DriverInfo *device, driversList)
537  {
538  port = -1;
539 
540  //device->state = (dev_request == DriverInfo::DEV_TERMINATE) ? DriverInfo::DEV_START : DriverInfo::DEV_TERMINATE;
541  if (item->text(LOCAL_NAME_COLUMN) == device->getTreeLabel() && device->getServerState() != dState)
542  {
543  processed_devices.append(device);
544 
545  // N.B. If multiple devices are selected to run under one device manager
546  // then we select the port for the first device that has a valid port
547  // entry, the rest are ignored.
548  if (port == -1 && item->text(LOCAL_PORT_COLUMN).isEmpty() == false)
549  {
550  port = item->text(LOCAL_PORT_COLUMN).toInt(&portOK);
551  // If we encounter conversion error, we abort
552  if (portOK == false)
553  {
554  KMessageBox::error(0, i18n("Invalid port entry: %1", item->text(LOCAL_PORT_COLUMN)));
555  return;
556  }
557  }
558 
559  device->setHostParameters("localhost", QString("%1").arg(port));
560  }
561  }
562  }
563 
564  if (processed_devices.empty()) return;
565 
566  if (dState)
567  startDevices(processed_devices);
568  else
569  stopDevices(processed_devices);
570 
571 
572 }
573 
574 void DriverManager::processClientTermination(ClientManager *client)
575 {
576  if (client == NULL)
577  return;
578 
579  ServerManager *manager = client->getServerManager();
580  QString errMsg = i18n("Connection to INDI host at %1 on port %2 lost. Server disconnected.", client->getHost(), client->getPort());
581  KMessageBox::error(NULL, errMsg);
582 
583  if (manager)
584  {
585  servers.removeOne(manager);
586  delete manager;
587  }
588 
589  GUIManager::Instance()->removeClient(client);
590  INDIListener::Instance()->removeClient(client);
591 
592  clients.removeOne(client);
593  delete client;
594 
595  updateMenuActions();
596  updateLocalTab();
597 
598 
599 }
600 
601 void DriverManager::processServerTermination(ServerManager* server)
602 {
603  if (server == NULL)
604  return;
605 
606  foreach(DriverInfo *dv, driversList)
607  if (dv->getServerManager() == server)
608  {
609  dv->setServerState(false);
610  dv->clear();
611  }
612 
613  if (server->getMode() == SERVER_ONLY)
614  {
615  QString errMsg = i18n("Connection to INDI host at %1 on port %2 encountered an error: %3.", server->getHost(), server->getPort(), server->errorString());
616  KMessageBox::error(NULL, errMsg);
617  }
618 
619  servers.removeOne(server);
620  delete server;
621 
622  updateLocalTab();
623 }
624 
625 
626 void DriverManager::processRemoteTree(bool dState)
627 {
628 
629  QTreeWidgetItem *currentItem = ui->clientTreeWidget->currentItem();
630  if (!currentItem) return;
631 
632  foreach (DriverInfo *dv, driversList)
633  {
634  if (dv->getDriverSource() != HOST_SOURCE)
635  continue;
636 
637  //qDebug() << "Current item port " << currentItem->text(HOST_PORT_COLUMN) << " current dev " << dv->getName() << " -- port " << dv->getPort() << endl;
638  //qDebug() << "dState is : " << (dState ? "True" : "False") << endl;
639 
640  if (currentItem->text(HOST_NAME_COLUMN) == dv->getName() && currentItem->text(HOST_PORT_COLUMN) == dv->getPort())
641  {
642  // Nothing changed, return
643  if (dv->getClientState() == dState)
644  return;
645 
646  // connect to host
647  if (dState)
648  connectRemoteHost(dv);
649  // Disconnect form host
650  else
651  disconnectRemoteHost(dv);
652  }
653 
654  }
655 }
656 
657 bool DriverManager::connectRemoteHost(DriverInfo *dv)
658 {
659  bool hostPortOk = false;
660  bool connectionToServer=false;
661  ClientManager *clientManager = NULL;
662 
663  dv->getPort().toInt(&hostPortOk);
664 
665  if (hostPortOk == false)
666  {
667  QString errMsg = QString("Invalid host port %1").arg(dv->getPort());
668  KMessageBox::error(NULL, errMsg);
669  return false;
670  }
671 
672  clientManager = new ClientManager();
673 
674  clientManager->appendManagedDriver(dv);
675 
676  connect(clientManager, SIGNAL(connectionFailure(ClientManager*)), this, SLOT(processClientTermination(ClientManager*)));
677 
678  clientManager->setServer(dv->getHost().toLatin1().constData(), (uint) (dv->getPort().toInt()));
679 
680  GUIManager::Instance()->addClient(clientManager);
681  INDIListener::Instance()->addClient(clientManager);
682 
683  for (int i=0; i < INDI_MAX_TRIES; i++)
684  {
685  connectionToServer= clientManager->connectServer();
686 
687  if (connectionToServer)
688  break;
689 
690  usleep(100000);
691  }
692 
693  if (connectionToServer)
694  {
695  clients.append(clientManager);
696  updateMenuActions();
697  }
698  else
699  {
700  GUIManager::Instance()->removeClient(clientManager);
701  INDIListener::Instance()->removeClient(clientManager);
702  QString errMsg = i18n("Connection to INDI server at host %1 with port %2 failed.", dv->getHost(), dv->getPort());
703  KMessageBox::error(NULL, errMsg);
704  processDeviceStatus(dv);
705  return false;
706  }
707 
708  return true;
709 }
710 
711 bool DriverManager::disconnectRemoteHost(DriverInfo *dv)
712 {
713  ClientManager *clientManager = NULL;
714  clientManager = dv->getClientManager();
715 
716  if (clientManager)
717  {
718  clientManager->removeManagedDriver(dv);
719  clientManager->disconnectServer();
720  GUIManager::Instance()->removeClient(clientManager);
721  INDIListener::Instance()->removeClient(clientManager);
722  clients.removeOne(clientManager);
723  delete clientManager;
724  updateMenuActions();
725  return true;
726 
727  }
728 
729  return false;
730 
731 }
732 
733 void DriverManager::resizeDeviceColumn()
734 {
735  ui->localTreeWidget->resizeColumnToContents(0);
736 }
737 
738 void DriverManager::updateMenuActions()
739 {
740  // We iterate over devices, we enable INDI Control Panel if we have any active device
741  // We enable capture image sequence if we have any imaging device
742 
743  QAction *tmpAction = NULL;
744  bool activeDevice = false;
745 
746  if (clients.size() > 0)
747  activeDevice = true;
748 
749  tmpAction = KStars::Instance()->actionCollection()->action("indi_cpl");
750  if (tmpAction != NULL)
751  {
752  //qDebug() << "indi_cpl action set to active" << endl;
753  tmpAction->setEnabled(activeDevice);
754  }
755 }
756 
757 int DriverManager::getINDIPort(int customPort)
758 {
759 
760  int lastPort = Options::serverPortEnd().toInt();;
761  bool success = false;
762  currentPort++;
763 
764  // recycle
765  if (currentPort > lastPort) currentPort = Options::serverPortStart().toInt();
766 
767  QTcpServer temp_server;
768 
769  if (customPort != -1)
770  {
771  success = temp_server.listen(QHostAddress::LocalHost, customPort);
772  if (success)
773  {
774  temp_server.close();
775  return customPort;
776  }
777  else
778  return -1;
779  }
780 
781  for(; currentPort <= lastPort; currentPort++)
782  {
783  success = temp_server.listen(QHostAddress::LocalHost, currentPort);
784  if(success)
785  {
786  temp_server.close();
787  return currentPort;
788  }
789  }
790  return -1;
791 }
792 
793 
794 bool DriverManager::readINDIHosts()
795 {
796  QString indiFile("indihosts.xml");
797  //QFile localeFile;
798  QFile file;
799  char errmsg[1024];
800  char c;
801  LilXML *xmlParser = newLilXML();
802  XMLEle *root = NULL;
803  XMLAtt *ap;
804  QString hName, hHost, hPort;
805  lastGroup = NULL;
806 
807 
808  file.setFileName( KStandardDirs::locate( "appdata", indiFile ) );
809  if ( file.fileName().isEmpty() || !file.open( QIODevice::ReadOnly ) )
810  return false;
811 
812  while ( file.getChar( &c ) )
813  {
814  root = readXMLEle(xmlParser, c, errmsg);
815 
816  if (root)
817  {
818  // Get host name
819  ap = findXMLAtt(root, "name");
820  if (!ap)
821  {
822  delLilXML(xmlParser);
823  return false;
824  }
825 
826  hName = QString(valuXMLAtt(ap));
827 
828  // Get host name
829  ap = findXMLAtt(root, "hostname");
830 
831  if (!ap)
832  {
833  delLilXML(xmlParser);
834  return false;
835  }
836 
837  hHost = QString(valuXMLAtt(ap));
838 
839  ap = findXMLAtt(root, "port");
840 
841  if (!ap)
842  {
843  delLilXML(xmlParser);
844  return false;
845  }
846 
847  hPort = QString(valuXMLAtt(ap));
848 
849  DriverInfo *dv = new DriverInfo(hName);
850  dv->setHostParameters(hHost, hPort);
851  dv->setDriverSource(HOST_SOURCE);
852 
853  connect(dv, SIGNAL(deviceStateChanged(DriverInfo*)), this, SLOT(processDeviceStatus(DriverInfo*)));
854 
855  driversList.append(dv);
856 
857  QTreeWidgetItem *item = new QTreeWidgetItem(ui->clientTreeWidget, lastGroup);
858  lastGroup = item;
859  item->setIcon(HOST_STATUS_COLUMN, ui->disconnected);
860  item->setText(HOST_NAME_COLUMN, hName);
861  item->setText(HOST_PORT_COLUMN, hPort);
862 
863 
864  delXMLEle(root);
865  }
866  else if (errmsg[0])
867  {
868  kDebug() << errmsg;
869  delLilXML(xmlParser);
870  return false;
871  }
872  }
873 
874  delLilXML(xmlParser);
875 
876  return true;
877 
878 
879 
880 
881 }
882 
883 
884 bool DriverManager::readXMLDrivers()
885 {
886  QDir indiDir;
887  QString driverName;
888 
889  if (indiDir.cd(Options::indiDriversDir()) == false)
890  {
891  KMessageBox::error(0, i18n("Unable to find INDI Drivers directory: %1\nPlease make sure to set the correct path in KStars configuration", Options::indiDriversDir()));
892  return false;
893  }
894 
895  indiDir.setNameFilters(QStringList("*.xml"));
896  indiDir.setFilter(QDir::Files | QDir::NoSymLinks);
897  QFileInfoList list = indiDir.entryInfoList();
898 
899  foreach (QFileInfo fileInfo, list)
900  {
901  // libindi 0.7.1: Skip skeleton files
902  if (fileInfo.fileName().endsWith("_sk.xml"))
903  continue;
904 
905  if (fileInfo.fileName() == "drivers.xml")
906  {
907  // Let first attempt to load the local version of drivers.xml
908  driverName = KStandardDirs::locateLocal( "appdata", "drivers.xml");
909 
910  // If found, we continue, otherwise, we load the system file
911  if (driverName.isEmpty() == false && QFile(driverName).exists())
912  {
913  processXMLDriver(driverName);
914  continue;
915  }
916  }
917 
918  driverName = QString("%1/%2").arg(Options::indiDriversDir()).arg(fileInfo.fileName());
919  processXMLDriver(driverName);
920 
921  }
922 
923 return true;
924 
925 }
926 
927 void DriverManager::processXMLDriver(QString & driverName)
928 {
929  QFile file(driverName);
930  if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
931  {
932  KMessageBox::error(0, i18n("Failed to open INDI Driver file: %1", driverName));
933  return;
934  }
935 
936  char errmsg[ERRMSG_SIZE];
937  char c;
938  LilXML *xmlParser = newLilXML();
939  XMLEle *root = NULL;
940 
941  if (driverName.endsWith("drivers.xml"))
942  driverSource = PRIMARY_XML;
943  else
944  driverSource = THIRD_PARTY_XML;
945 
946  while ( file.getChar(&c))
947  {
948  root = readXMLEle(xmlParser, c, errmsg);
949 
950  if (root)
951  {
952  if (!buildDeviceGroup(root, errmsg))
953  prXMLEle(stderr, root, 0);
954 
955  delXMLEle(root);
956  }
957  else if (errmsg[0])
958  {
959  kDebug() << QString(errmsg) << endl;
960  delLilXML(xmlParser);
961  return;
962  }
963  }
964 
965  delLilXML(xmlParser);
966 
967 }
968 
969 bool DriverManager::buildDeviceGroup(XMLEle *root, char errmsg[])
970 {
971 
972  XMLAtt *ap;
973  XMLEle *ep;
974  QString groupName;
975  QTreeWidgetItem *group;
976  DeviceFamily groupType = KSTARS_TELESCOPE;
977 
978  // avoid overflow
979  if (strlen(tagXMLEle(root)) > 1024)
980  return false;
981 
982  // Get device grouping name
983  ap = findXMLAtt(root, "group");
984 
985  if (!ap)
986  {
987  snprintf(errmsg, ERRMSG_SIZE, "Tag %.64s does not have a group attribute", tagXMLEle(root));
988  return false;
989  }
990 
991  groupName = valuXMLAtt(ap);
992 
993  if (groupName.indexOf("Telescopes") != -1)
994  groupType = KSTARS_TELESCOPE;
995  else if (groupName.indexOf("CCDs") != -1)
996  groupType = KSTARS_CCD;
997  else if (groupName.indexOf("Filter") != -1)
998  groupType = KSTARS_FILTER;
999  else if (groupName.indexOf("Video") != -1)
1000  groupType = KSTARS_VIDEO;
1001  else if (groupName.indexOf("Focusers") != -1)
1002  groupType = KSTARS_FOCUSER;
1003  else if (groupName.indexOf("Domes") != -1)
1004  groupType = KSTARS_DOME;
1005  else if (groupName.indexOf("Receivers") != -1)
1006  groupType = KSTARS_RECEIVERS;
1007  else if (groupName.indexOf("GPS") != -1)
1008  groupType = KSTARS_GPS;
1009  else if (groupName.indexOf("Auxiliary") != -1)
1010  groupType = KSTARS_AUXILIARY;
1011  else
1012  groupType = KSTARS_UNKNOWN;
1013 
1014 #ifndef HAVE_CFITSIO_H
1015  // We do not create these groups if we don't have CFITSIO support
1016  if (groupType == KSTARS_CCD || groupType == KSTARS_VIDEO)
1017  return true;
1018 #endif
1019 
1020  // Find if the group already exists
1021  QList<QTreeWidgetItem *> treeList = ui->localTreeWidget->findItems(groupName, Qt::MatchExactly);
1022  if (!treeList.isEmpty())
1023  group = treeList[0];
1024  else
1025  group = new QTreeWidgetItem(ui->localTreeWidget, lastGroup);
1026 
1027  group->setText(0, groupName);
1028  lastGroup = group;
1029 
1030  for (ep = nextXMLEle(root, 1) ; ep != NULL ; ep = nextXMLEle(root, 0))
1031  if (!buildDriverElement(ep, group, groupType, errmsg))
1032  return false;
1033 
1034  return true;
1035 }
1036 
1037 
1038 bool DriverManager::buildDriverElement(XMLEle *root, QTreeWidgetItem *DGroup, DeviceFamily groupType, char errmsg[])
1039 {
1040  XMLAtt *ap;
1041  XMLEle *el;
1042  DriverInfo *dv;
1043  QString label;
1044  QString driver;
1045  QString version;
1046  QString name;
1047  QString port;
1048  QString skel;
1049  //double focal_length (-1), aperture (-1);
1050 
1051 
1052  ap = findXMLAtt(root, "label");
1053  if (!ap)
1054  {
1055  snprintf(errmsg, ERRMSG_SIZE, "Tag %.64s does not have a label attribute", tagXMLEle(root));
1056  return false;
1057  }
1058 
1059  label = valuXMLAtt(ap);
1060 
1061  // Search for optional port attribute
1062  ap = findXMLAtt(root, "port");
1063  if (ap)
1064  port = valuXMLAtt(ap);
1065 
1066  // Search for skel file, if any
1067  // Search for optional port attribute
1068  ap = findXMLAtt(root, "skel");
1069  if (ap)
1070  skel = valuXMLAtt(ap);
1071 
1072  // Let's look for telescope-specific attributes: focal length and aperture
1073  /*ap = findXMLAtt(root, "focal_length");
1074  if (ap)
1075  focal_length = QString(valuXMLAtt(ap)).toDouble();
1076 
1077  ap = findXMLAtt(root, "aperture");
1078  if (ap)
1079  aperture = QString(valuXMLAtt(ap)).toDouble();*/
1080 
1081  el = findXMLEle(root, "driver");
1082 
1083  if (!el)
1084  return false;
1085 
1086  driver = pcdataXMLEle(el);
1087 
1088  ap = findXMLAtt(el, "name");
1089  if (!ap)
1090  {
1091  snprintf(errmsg, ERRMSG_SIZE, "Tag %.64s does not have a name attribute", tagXMLEle(el));
1092  return false;
1093  }
1094 
1095  name = valuXMLAtt(ap);
1096 
1097  el = findXMLEle(root, "version");
1098 
1099  if (!el)
1100  return false;
1101 
1102  version = pcdataXMLEle(el);
1103 
1104  QTreeWidgetItem *device = new QTreeWidgetItem(DGroup);
1105  //, lastDevice);
1106 
1107  device->setText(LOCAL_NAME_COLUMN, label);
1108  device->setIcon(LOCAL_STATUS_COLUMN, ui->stopPix);
1109  device->setText(LOCAL_VERSION_COLUMN, version);
1110  device->setText(LOCAL_PORT_COLUMN, port);
1111 
1112  lastDevice = device;
1113 
1114  if ((driverSource == PRIMARY_XML) && driversStringList.contains(driver) == false)
1115  driversStringList.append(driver);
1116 
1117  dv = new DriverInfo(name);
1118 
1119  dv->setTreeLabel(label);
1120  dv->setVersion(version);
1121  dv->setDriver(driver);
1122  dv->setSkeletonFile(skel);
1123  dv->setType(groupType);
1124 
1125  dv->setDriverSource(driverSource);
1126 
1127  dv->setUserPort(port);
1128 
1129  connect(dv, SIGNAL(deviceStateChanged(DriverInfo*)), this, SLOT(processDeviceStatus(DriverInfo*)));
1130 
1131  driversList.append(dv);
1132 
1133  // SLOTS/SIGNAL, pop menu, indi server logic
1134  return true;
1135 }
1136 
1137 void DriverManager::updateCustomDrivers()
1138 {
1139 
1140  QString label;
1141  QString driver;
1142  QString version;
1143  QString name;
1144  QTreeWidgetItem *group, *widgetDev;
1145  //double focal_length (-1), aperture (-1);
1146 
1147  // Find if the group already exists
1148  QList<QTreeWidgetItem *> treeList = ui->localTreeWidget->findItems("Telescopes", Qt::MatchExactly);
1149  if (!treeList.isEmpty())
1150  group = treeList[0];
1151  else return;
1152 
1153 
1154  // Find custom telescope to ADD
1155  foreach(OAL::Scope *s, *(KStarsData::Instance()->logObject()->scopeList()))
1156  {
1157  name = label = s->name();
1158 
1159  if (findDriverByLabel(label) || s->driver() == i18n("None"))
1160  continue;
1161 
1162  driver = s->driver();
1163  version = QString("1.0");
1164 
1165  QTreeWidgetItem *device = new QTreeWidgetItem(group);
1166  device->setText(LOCAL_NAME_COLUMN, QString(label));
1167  device->setIcon(LOCAL_STATUS_COLUMN, ui->stopPix);
1168  device->setText(LOCAL_VERSION_COLUMN, QString(version));
1169 
1170  DriverInfo *dv = new DriverInfo(name);
1171 
1172  dv->setTreeLabel(label);
1173  dv->setDriver(driver);
1174  dv->setVersion(version);
1175  dv->setType(KSTARS_TELESCOPE);
1176  dv->setDriverSource(EM_XML);
1177 
1178  connect(dv, SIGNAL(deviceStateChanged(DriverInfo*)), this, SLOT(processDeviceStatus(DriverInfo*)));
1179  driversList.append(dv);
1180  }
1181 
1182  // Find custom telescope to REMOVE
1183  foreach(DriverInfo *dev, driversList)
1184  {
1185  // If it's from primary xml file or it is in a running state, continue.
1186  if (dev->getDriverSource() != EM_XML || dev->getClientState())
1187  continue;
1188 
1189  if (KStarsData::Instance()->logObject()->findScopeByName(dev->getName()))
1190  continue;
1191 
1192  // Find if the group already exists
1193  QList<QTreeWidgetItem *> devList = ui->localTreeWidget->findItems(dev->getTreeLabel(), Qt::MatchExactly | Qt::MatchRecursive);
1194  if (!devList.isEmpty())
1195  {
1196  widgetDev = devList[0];
1197  group->removeChild(widgetDev);
1198  }
1199  else return;
1200 
1201  driversList.removeOne(dev);
1202  delete (dev);
1203  }
1204 
1205 }
1206 
1207 void DriverManager::addINDIHost()
1208 {
1209  QDialog hostConfDialog;
1210  Ui::INDIHostConf hostConf;
1211  hostConf.setupUi(&hostConfDialog);
1212  hostConfDialog.setWindowTitle(i18n("Add Host"));
1213  bool portOk = false;
1214 
1215  if (hostConfDialog.exec() == QDialog::Accepted)
1216  {
1217  DriverInfo *hostItem = new DriverInfo(hostConf.nameIN->text());
1218 
1219  hostConf.portnumber->text().toInt(&portOk);
1220 
1221  if (portOk == false)
1222  {
1223  KMessageBox::error(0, i18n("Error: the port number is invalid."));
1224  delete hostItem;
1225  return;
1226  }
1227 
1228  hostItem->setHostParameters(hostConf.hostname->text(), hostConf.portnumber->text());
1229 
1230  //search for duplicates
1231  //for (uint i=0; i < ksw->data()->INDIHostsList.count(); i++)
1232  foreach (DriverInfo * host, driversList)
1233  if (hostItem->getName() == host->getName() && hostItem->getPort() == host->getPort())
1234  {
1235  KMessageBox::error(0, i18n("Host: %1 Port: %2 already exists.", hostItem->getName(), hostItem->getPort()));
1236  delete hostItem;
1237  return;
1238  }
1239 
1240  hostItem->setDriverSource(HOST_SOURCE);
1241 
1242  driversList.append(hostItem);
1243 
1244  QTreeWidgetItem *item = new QTreeWidgetItem(ui->clientTreeWidget);
1245  item->setIcon(HOST_STATUS_COLUMN, ui->disconnected);
1246  item->setText(HOST_NAME_COLUMN, hostConf.nameIN->text());
1247  item->setText(HOST_PORT_COLUMN, hostConf.portnumber->text());
1248 
1249  }
1250 
1251  saveHosts();
1252 }
1253 
1254 void DriverManager::modifyINDIHost()
1255 {
1256 
1257  QDialog hostConfDialog;
1258  Ui::INDIHostConf hostConf;
1259  hostConf.setupUi(&hostConfDialog);
1260  hostConfDialog.setWindowTitle(i18n("Modify Host"));
1261 
1262  QTreeWidgetItem *currentItem = ui->clientTreeWidget->currentItem();
1263 
1264  if (currentItem == NULL)
1265  return;
1266 
1267  foreach (DriverInfo * host, driversList)
1268  {
1269  if (currentItem->text(HOST_NAME_COLUMN) == host->getName() && currentItem->text(HOST_PORT_COLUMN) == host->getPort())
1270  {
1271  hostConf.nameIN->setText(host->getName());
1272  hostConf.hostname->setText(host->getHost());
1273  hostConf.portnumber->setText(host->getPort());
1274 
1275  if (hostConfDialog.exec() == QDialog::Accepted)
1276  {
1277  //INDIHostsInfo *hostItem = new INDIHostsInfo;
1278  host->setName(hostConf.nameIN->text());
1279  host->setHostParameters(hostConf.hostname->text(), hostConf.portnumber->text());
1280 
1281  currentItem->setText(HOST_NAME_COLUMN, hostConf.nameIN->text());
1282  currentItem->setText(HOST_PORT_COLUMN, hostConf.portnumber->text());
1283 
1284  //ksw->data()->INDIHostsList.replace(i, hostItem);
1285 
1286  saveHosts();
1287  return;
1288  }
1289  }
1290  }
1291 
1292 }
1293 
1294 void DriverManager::removeINDIHost()
1295 {
1296 
1297 
1298  if (ui->clientTreeWidget->currentItem() == NULL)
1299  return;
1300 
1301  foreach (DriverInfo * host, driversList)
1302  if (ui->clientTreeWidget->currentItem()->text(HOST_NAME_COLUMN) == host->getName() &&
1303  ui->clientTreeWidget->currentItem()->text(HOST_PORT_COLUMN) == host->getPort())
1304  {
1305  if (host->getClientState())
1306  {
1307  KMessageBox::error( 0, i18n("You need to disconnect the client before removing it."));
1308  return;
1309  }
1310 
1311  if (KMessageBox::warningContinueCancel( 0, i18n("Are you sure you want to remove the %1 client?", ui->clientTreeWidget->currentItem()->text(HOST_NAME_COLUMN)), i18n("Delete Confirmation"),KStandardGuiItem::del())!=KMessageBox::Continue)
1312  return;
1313 
1314  driversList.removeOne(host);
1315  delete host;
1316  delete (ui->clientTreeWidget->currentItem());
1317  break;
1318  }
1319 
1320  saveHosts();
1321 }
1322 
1323 void DriverManager::saveHosts()
1324 {
1325  QFile file;
1326  QString hostData;
1327 
1328  file.setFileName( KStandardDirs::locateLocal( "appdata", "indihosts.xml" ) ); //determine filename in local user KDE directory tree.
1329 
1330  if ( !file.open( QIODevice::WriteOnly))
1331  {
1332  QString message = i18n( "Unable to write to file 'indihosts.xml'\nAny changes to INDI hosts configurations will not be saved." );
1333  KMessageBox::sorry( 0, message, i18n( "Could Not Open File" ) );
1334  return;
1335  }
1336 
1337  QTextStream outstream(&file);
1338 
1339  //for (uint i= 0; i < ksw->data()->INDIHostsList.count(); i++)
1340  foreach (DriverInfo * host, driversList)
1341  {
1342 
1343  if (host->getDriverSource() != HOST_SOURCE)
1344  continue;
1345 
1346  hostData = "<INDIHost name='";
1347  hostData += host->getName();
1348  hostData += "' hostname='";
1349  hostData += host->getHost();
1350  hostData += "' port='";
1351  hostData += host->getPort();
1352  hostData += "' />\n";
1353 
1354  outstream << hostData;
1355 
1356  }
1357 
1358  file.close();
1359 }
1360 
1361 DriverInfo * DriverManager::findDriverByName(const QString &name)
1362 {
1363  foreach(DriverInfo *dv, driversList)
1364  {
1365  if (dv->getName() == name)
1366  return dv;
1367  }
1368 
1369  return NULL;
1370 }
1371 
1372 DriverInfo * DriverManager::findDriverByLabel(const QString &label)
1373 {
1374  foreach(DriverInfo *dv, driversList)
1375  {
1376  if (dv->getTreeLabel() == label)
1377  return dv;
1378  }
1379 
1380  return NULL;
1381 }
1382 
1383 QString DriverManager::getUniqueDeviceLabel(const QString &label)
1384 {
1385  int nset=0;
1386  QString uniqueLabel = label;
1387 
1388  foreach(ClientManager *cm, clients)
1389  foreach(INDI::BaseDevice *dv, cm->getDevices())
1390  {
1391  if (label == QString(dv->getDeviceName()))
1392  nset++;
1393  }
1394 
1395  if (nset > 1)
1396  uniqueLabel = QString("%1 %2").arg(label).arg(nset);
1397 
1398  return uniqueLabel;
1399 }
1400 
1401 #include "drivermanager.moc"
EM_XML
Definition: indicommon.h:15
DriverManager::currentPort
int currentPort
Definition: drivermanager.h:76
Options::serverPortStart
static QString serverPortStart()
Get INDI Server Start Port.
Definition: Options.h:714
indilistener.h
DriverManager::removeINDIHost
void removeINDIHost()
Definition: drivermanager.cpp:1294
DriverInfo::setUserPort
void setUserPort(const QString &inUserPort)
Definition: driverinfo.cpp:95
DriverManager::lastGroup
QTreeWidgetItem * lastGroup
Definition: drivermanager.h:73
QDialog
DriverManager::resizeDeviceColumn
void resizeDeviceColumn()
Definition: drivermanager.cpp:733
DeviceFamily
DeviceFamily
Definition: indicommon.h:66
INDIListener::Instance
static INDIListener * Instance()
Definition: indilistener.cpp:46
DriverInfo::setSkeletonFile
void setSkeletonFile(const QString &inSkeleton)
Definition: driverinfo.h:66
DriverInfo::setName
void setName(const QString &newName)
Definition: driverinfo.h:37
KStarsData::logObject
OAL::Log * logObject()
Return log object.
Definition: kstarsdata.h:219
ServerManager::startDriver
bool startDriver(DriverInfo *dv)
Definition: servermanager.cpp:114
DriverManager::disconnectRemoteHost
bool disconnectRemoteHost(DriverInfo *dv)
Definition: drivermanager.cpp:711
DriverManagerUI::disconnected
QIcon disconnected
Definition: drivermanager.h:45
OAL::Scope
Definition: scope.h:25
ServerManager
Definition: servermanager.h:26
DriverManager::stopDevices
void stopDevices(const QList< DriverInfo * > &dList)
Definition: drivermanager.cpp:410
ServerManager::start
bool start()
Definition: servermanager.cpp:63
QWidget
DriverManager::lastDevice
QTreeWidgetItem * lastDevice
Definition: drivermanager.h:74
DriverManager::readXMLDrivers
bool readXMLDrivers()
Definition: drivermanager.cpp:884
KStarsData::Instance
static KStarsData * Instance()
Definition: kstarsdata.h:92
KSTARS_UNKNOWN
Definition: indicommon.h:66
DriverInfo::getUserPort
const QString & getUserPort()
Definition: driverinfo.h:64
DriverManager::getUniqueHosts
void getUniqueHosts(QList< DriverInfo * > &dList, QList< QList< DriverInfo * > > &uHosts)
Definition: drivermanager.cpp:238
KStars::Instance
static KStars * Instance()
Definition: kstars.h:125
ServerManager::getPort
const QString & getPort()
Definition: servermanager.h:43
DriverInfo::setVersion
void setVersion(const QString &newVersion)
Definition: driverinfo.h:48
DriverManager::findDriverByLabel
DriverInfo * findDriverByLabel(const QString &label)
Definition: drivermanager.cpp:1372
KDialog
servermanager.h
OAL::Scope::name
QString name() const
Definition: scope.h:32
KSTARS_DOME
Definition: indicommon.h:66
THIRD_PARTY_XML
Definition: indicommon.h:15
ClientManager::removeManagedDriver
void removeManagedDriver(DriverInfo *dv)
Definition: clientmanager.cpp:130
KStars
This is the main window for KStars.
Definition: kstars.h:94
DriverManager::activateHostConnection
void activateHostConnection()
Definition: drivermanager.cpp:475
DriverManager::clearServers
void clearServers()
Definition: drivermanager.cpp:457
KSTARS_FOCUSER
Definition: indicommon.h:66
DriverManagerUI::serverMode
QIcon serverMode
Definition: drivermanager.h:47
DriverManager::processServerTermination
void processServerTermination(ServerManager *server)
Definition: drivermanager.cpp:601
ServerMode
ServerMode
Definition: indicommon.h:17
DriverManager::processDeviceStatus
void processDeviceStatus(DriverInfo *dv)
Definition: drivermanager.cpp:137
DriverManager::saveHosts
void saveHosts()
Definition: drivermanager.cpp:1323
ServerManager::stopDriver
void stopDriver(DriverInfo *dv)
Definition: servermanager.cpp:145
guimanager.h
DriverManager::connectRemoteHost
bool connectRemoteHost(DriverInfo *dv)
Definition: drivermanager.cpp:657
DriverInfo::setTreeLabel
void setTreeLabel(const QString &inTreeLabel)
Definition: driverinfo.h:39
ClientManager::appendManagedDriver
void appendManagedDriver(DriverInfo *dv)
Definition: clientmanager.cpp:121
DriverManagerUI::DriverManagerUI
DriverManagerUI(QWidget *parent=0)
Definition: drivermanager.cpp:60
DriverInfo::getClientManager
ClientManager * getClientManager()
Definition: driverinfo.h:61
DriverManager::buildDeviceGroup
bool buildDeviceGroup(XMLEle *root, char errmsg[])
Definition: drivermanager.cpp:969
INDIListener::addClient
void addClient(ClientManager *cm)
Definition: indilistener.cpp:79
ClientManager::getServerManager
ServerManager * getServerManager()
Definition: clientmanager.h:35
DriverManager::buildDriverElement
bool buildDriverElement(XMLEle *root, QTreeWidgetItem *DGroup, DeviceFamily groupType, char errmsg[])
Definition: drivermanager.cpp:1038
DriverInfo::getDriverSource
DriverSource getDriverSource()
Definition: driverinfo.h:55
KSTARS_RECEIVERS
Definition: indicommon.h:66
DriverInfo::getPort
const QString & getPort()
Definition: driverinfo.h:79
driverinfo.h
DriverManagerUI::runningPix
QIcon runningPix
Definition: drivermanager.h:42
HOST_SOURCE
Definition: indicommon.h:15
ServerManager::stop
void stop()
Definition: servermanager.cpp:174
ServerManager::getMode
ServerMode getMode()
Definition: servermanager.h:49
DriverManager::processRemoteTree
void processRemoteTree(bool dState)
Definition: drivermanager.cpp:626
GUIManager::addClient
void addClient(ClientManager *cm)
Definition: guimanager.cpp:125
DriverManager::activateHostDisconnection
void activateHostDisconnection()
Definition: drivermanager.cpp:480
SERVER_ONLY
Definition: indicommon.h:17
KSTARS_GPS
Definition: indicommon.h:66
ServerManager::getHost
const QString & getHost()
Definition: servermanager.h:42
Options::indiDriversDir
static QString indiDriversDir()
Get PATH to indi drivers directory.
Definition: Options.h:790
scope.h
DriverInfo::getServerManager
ServerManager * getServerManager()
Definition: driverinfo.h:58
DriverManager::readINDIHosts
bool readINDIHosts()
Definition: drivermanager.cpp:794
Options::serverPortEnd
static QString serverPortEnd()
Get INDI Server Final Port.
Definition: Options.h:733
DriverManager::findDriverByName
DriverInfo * findDriverByName(const QString &name)
Definition: drivermanager.cpp:1361
ServerManager::errorString
QString errorString()
Definition: servermanager.cpp:225
DriverManager::processXMLDriver
void processXMLDriver(QString &driverName)
Definition: drivermanager.cpp:927
INDI_MAX_TRIES
#define INDI_MAX_TRIES
Definition: drivermanager.cpp:57
GUIManager::removeClient
void removeClient(ClientManager *cm)
Definition: guimanager.cpp:143
SERVER_CLIENT
Definition: indicommon.h:17
DriverManager::modifyINDIHost
void modifyINDIHost()
Definition: drivermanager.cpp:1254
DriverManager::updateLocalTab
void updateLocalTab()
Definition: drivermanager.cpp:490
DriverInfo::getTreeLabel
const QString & getTreeLabel()
Definition: driverinfo.h:40
DriverManager::getClientManager
ClientManager * getClientManager(DriverInfo *dv)
Definition: drivermanager.cpp:485
KSTARS_CCD
Definition: indicommon.h:66
DriverInfo
Definition: driverinfo.h:24
DriverManagerUI::makePortEditable
void makePortEditable(QTreeWidgetItem *selectedItem, int column)
Definition: drivermanager.cpp:80
DriverManagerUI::localMode
QIcon localMode
Definition: drivermanager.h:46
DriverInfo::getClientState
bool getClientState()
Definition: driverinfo.h:73
Options.h
DriverManager::getINDIPort
int getINDIPort(int customPort)
Definition: drivermanager.cpp:757
DriverInfo::getServerBuffer
QString getServerBuffer()
Definition: driverinfo.cpp:56
QTextStream
DriverInfo::getServerState
bool getServerState()
Definition: driverinfo.h:70
KSTARS_VIDEO
Definition: indicommon.h:66
DriverManagerUI::stopPix
QIcon stopPix
Definition: drivermanager.h:43
GUIManager::Instance
static GUIManager * Instance()
Definition: guimanager.cpp:47
DriverManager::updateCustomDrivers
void updateCustomDrivers()
Definition: drivermanager.cpp:1137
DriverInfo::getHost
const QString & getHost()
Definition: driverinfo.h:78
DriverManagerUI
Definition: drivermanager.h:35
ERRMSG_SIZE
#define ERRMSG_SIZE
Definition: drivermanager.cpp:58
ClientManager
Definition: clientmanager.h:22
DriverInfo::getName
const QString & getName()
Definition: driverinfo.h:36
ServerManager::size
int size()
Definition: servermanager.h:53
OAL::Scope::driver
QString driver() const
Definition: scope.h:33
DriverManager::activateRunService
void activateRunService()
Definition: drivermanager.cpp:465
DriverInfo::clear
void clear()
Definition: driverinfo.cpp:44
DriverManager::getUniqueDeviceLabel
QString getUniqueDeviceLabel(const QString &label)
Definition: drivermanager.cpp:1383
DriverInfo::setDriverSource
void setDriverSource(DriverSource newDriverSource)
Definition: driverinfo.h:54
ClientManager::count
int count()
Definition: clientmanager.h:33
DriverManager::processClientTermination
void processClientTermination(ClientManager *client)
Definition: drivermanager.cpp:574
DriverInfo::setType
void setType(DeviceFamily newType)
Definition: driverinfo.h:51
DriverManager::startDevices
bool startDevices(QList< DriverInfo * > &dList)
Definition: drivermanager.cpp:291
KSTARS_FILTER
Definition: indicommon.h:66
DriverManager::updateClientTab
void updateClientTab()
Definition: drivermanager.cpp:507
OAL::Log::findScopeByName
OAL::Scope * findScopeByName(QString name)
Definition: log.cpp:759
INDIListener::removeClient
void removeClient(ClientManager *cm)
Definition: indilistener.cpp:100
DriverManager::activateStopService
void activateStopService()
Definition: drivermanager.cpp:470
kstarsdata.h
DriverInfo::setServerState
void setServerState(bool inState)
Definition: driverinfo.cpp:64
KSTARS_TELESCOPE
Definition: indicommon.h:66
KSTARS_AUXILIARY
Definition: indicommon.h:66
log.h
DriverManager::processLocalTree
void processLocalTree(bool dState)
Definition: drivermanager.cpp:525
DriverManager::addINDIHost
void addINDIHost()
Definition: drivermanager.cpp:1207
ksutils.h
DriverInfo::getVersion
const QString & getVersion()
Definition: driverinfo.h:49
ServerManager::setMode
void setMode(ServerMode inMode)
Definition: servermanager.h:48
QFrame
DriverInfo::setDriver
void setDriver(const QString &newDriver)
Definition: driverinfo.h:45
kstars.h
DriverManager::updateMenuActions
void updateMenuActions()
Definition: drivermanager.cpp:738
DriverManager::LOCAL_PORT_COLUMN
Definition: drivermanager.h:63
drivermanager.h
QList
DriverManagerUI::connected
QIcon connected
Definition: drivermanager.h:44
PRIMARY_XML
Definition: indicommon.h:15
DriverManager::Instance
static DriverManager * Instance()
Definition: drivermanager.cpp:91
DriverInfo::setHostParameters
void setHostParameters(const QString &inHost, const QString &inPort)
Definition: driverinfo.h:75
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:19 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kstars

Skip menu "kstars"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal