• 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
servermanager.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 <errno.h>
12 
13 #include <indicom.h>
14 
15 #include <config-kstars.h>
16 
17 #include <QTcpSocket>
18 #include <QTextEdit>
19 
20 #include <KProcess>
21 #include <KLocale>
22 #include <KDebug>
23 #include <KMessageBox>
24 #include <KStatusBar>
25 #include <KStandardDirs>
26 
27 
28 #include "servermanager.h"
29 #include "drivermanager.h"
30 #include "driverinfo.h"
31 
32 #include "Options.h"
33 #include "kstars.h"
34 #include "kstarsdatetime.h"
35 
36 
37 const int INDI_MAX_TRIES=3;
38 const int MAX_FILENAME_LEN = 1024;
39 
40 ServerManager::ServerManager(QString inHost, uint inPort)
41 {
42  serverProcess = NULL;
43  XMLParser = NULL;
44  host = inHost;
45  port = QString::number(inPort);
46 
47  //qDebug() << "We got port unit with value of " << inPort << " and now as tring it is equal to #" << port << "#" << endl;
48 }
49 
50 ServerManager::~ServerManager()
51 {
52  serverSocket.close();
53  indiFIFO.close();
54 
55  QFile::remove(indiFIFO.fileName());
56 
57  if (serverProcess)
58  serverProcess->close();
59 
60  delete (serverProcess);
61 }
62 
63 bool ServerManager::start()
64  {
65  bool connected=false;
66  int fd=0;
67  serverProcess = new KProcess(this);
68 
69  *serverProcess << Options::indiServer();
70  *serverProcess << "-v" << "-p" << port;
71  *serverProcess << "-m" << "100";
72 
73  QString fifoFile = QString("/tmp/indififo%1").arg(QUuid::createUuid().toString().mid(1, 8));
74 
75  if ( (fd = mkfifo (fifoFile.toLatin1(), S_IRUSR| S_IWUSR) < 0))
76  {
77  KMessageBox::error(NULL, i18n("Error making FIFO file %1: %2.", fifoFile, strerror(errno)));
78  return false;
79  }
80 
81  indiFIFO.setFileName(fifoFile);
82 
83  if (!indiFIFO.open(QIODevice::ReadWrite | QIODevice::Text))
84  {
85  qDebug() << "Unable to create INDI FIFO file: " << fifoFile << endl;
86  return false;
87  }
88 
89 
90  *serverProcess << "-f" << fifoFile;
91 
92  serverProcess->setOutputChannelMode(KProcess::SeparateChannels);
93  serverProcess->setReadChannel(QProcess::StandardError);
94 
95 
96  serverProcess->start();
97 
98  connected = serverProcess->waitForStarted();
99 
100  if (connected)
101  {
102  connect(serverProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processServerError(QProcess::ProcessError)));
103  connect(serverProcess, SIGNAL(readyReadStandardError()), this, SLOT(processStandardError()));
104 
105  emit started();
106  }
107 
108  return connected;
109 
110 
111 
112 }
113 
114 bool ServerManager::startDriver(DriverInfo *dv)
115 {
116  QTextStream out(&indiFIFO);
117 
118  managedDrivers.append(dv);
119  dv->setServerManager(this);
120 
121  dv->setUniqueLabel(DriverManager::Instance()->getUniqueDeviceLabel(dv->getTreeLabel()));
122 
123  if (KStandardDirs::findExe(dv->getDriver()).isEmpty())
124  {
125  KMessageBox::error(NULL, i18n("Driver %1 was not found on the system. Please make sure the package that provides the '%1' binary is installed.", dv->getDriver()));
126  return false;
127  }
128 
129  //qDebug() << "Will run driver: " << dv->getName() << " with driver " << dv->getDriver() << endl;
130 
131  if (dv->getSkeletonFile().isEmpty())
132  out << "start " << dv->getDriver() << " -n \"" << dv->getUniqueLabel() << "\"" << endl;
133  else
134  out << "start " << dv->getDriver() << " -n \"" << dv->getUniqueLabel() << "\"" << " -s \"" << Options::indiDriversDir() << "/" << dv->getSkeletonFile() << "\"" << endl;
135  //qDebug() << "Writing to " << file_template << endl << out.string() << endl;
136  out.flush();
137 
138  dv->setServerState(true);
139 
140  dv->setPort(port);
141 
142  return true;
143 }
144 
145 void ServerManager::stopDriver(DriverInfo *dv)
146 {
147  QTextStream out(&indiFIFO);
148 
149  managedDrivers.removeOne(dv);
150 
151 
152  //qDebug() << "Will run driver: " << dv->getName() << " with driver " << dv->getDriver() << endl;
153  out << "stop " << dv->getDriver() << " -n \"" << dv->getUniqueLabel() << "\"" << endl;
154  //qDebug() << "Writing to " << file_template << endl << out.string() << endl;
155  out.flush();
156 
157  dv->setServerState(false);
158 
159  dv->setPort(dv->getUserPort());
160 
161 }
162 
163 bool ServerManager::isDriverManaged(DriverInfo *di)
164 {
165  foreach(DriverInfo *dv, managedDrivers)
166  {
167  if (dv == di)
168  return true;
169  }
170 
171  return false;
172 }
173 
174 void ServerManager::stop()
175 {
176 
177  if (serverProcess == NULL)
178  return;
179 
180  foreach(DriverInfo *device, managedDrivers)
181  {
182  device->setServerState(false);
183  device->clear();
184  }
185 
186  serverProcess->disconnect(SIGNAL(error(QProcess::ProcessError)));
187 
188  serverProcess->terminate();
189 
190  serverProcess->waitForFinished();
191 
192  delete serverProcess;
193 
194  serverProcess = NULL;
195 
196 }
197 
198 void ServerManager::connectionSuccess()
199 {
200 
201  foreach(DriverInfo *device, managedDrivers)
202  device->setServerState(true);
203 
204  connect(serverProcess, SIGNAL(readyReadStandardError()), this, SLOT(processStandardError()));
205 
206  emit started();
207 }
208 
209 void ServerManager::processServerError(QProcess::ProcessError err)
210 {
211  INDI_UNUSED(err);
212  emit serverFailure(this);
213 }
214 
215 void ServerManager::processStandardError()
216 {
217 
218  serverBuffer.append(serverProcess->readAllStandardError());
219 
220  //qDebug() << "Recevined new stderr from server " << serverBuffer << endl;
221 
222  emit newServerLog();
223 }
224 
225 QString ServerManager::errorString()
226 {
227  if (serverProcess)
228  return serverProcess->errorString();
229 
230  return NULL;
231 }
232 
233 #include "servermanager.moc"
DriverInfo::setPort
void setPort(const QString &inPort)
Definition: driverinfo.h:76
DriverInfo::getSkeletonFile
const QString & getSkeletonFile()
Definition: driverinfo.h:67
ServerManager::startDriver
bool startDriver(DriverInfo *dv)
Definition: servermanager.cpp:114
ServerManager::start
bool start()
Definition: servermanager.cpp:63
DriverInfo::getUserPort
const QString & getUserPort()
Definition: driverinfo.h:64
ServerManager::~ServerManager
~ServerManager()
Definition: servermanager.cpp:50
ServerManager::processServerError
void processServerError(QProcess::ProcessError)
Definition: servermanager.cpp:209
servermanager.h
Options::indiServer
static QString indiServer()
Get PATH to indiserver binary.
Definition: Options.h:771
ServerManager::stopDriver
void stopDriver(DriverInfo *dv)
Definition: servermanager.cpp:145
ServerManager::ServerManager
ServerManager(QString inHost, uint inPort)
Definition: servermanager.cpp:40
driverinfo.h
ServerManager::serverFailure
void serverFailure(ServerManager *)
ServerManager::connectionSuccess
void connectionSuccess()
Definition: servermanager.cpp:198
DriverInfo::getUniqueLabel
const QString & getUniqueLabel()
Definition: driverinfo.h:43
ServerManager::stop
void stop()
Definition: servermanager.cpp:174
ServerManager::started
void started()
Options::indiDriversDir
static QString indiDriversDir()
Get PATH to indi drivers directory.
Definition: Options.h:790
DriverInfo::setServerManager
void setServerManager(ServerManager *newServerManager)
Definition: driverinfo.h:57
ServerManager::errorString
QString errorString()
Definition: servermanager.cpp:225
INDI_MAX_TRIES
const int INDI_MAX_TRIES
Definition: servermanager.cpp:37
DriverInfo::getTreeLabel
const QString & getTreeLabel()
Definition: driverinfo.h:40
DriverInfo
Definition: driverinfo.h:24
Options.h
QTextStream
ServerManager::newServerLog
void newServerLog()
DriverInfo::getDriver
const QString & getDriver()
Definition: driverinfo.h:46
DriverInfo::clear
void clear()
Definition: driverinfo.cpp:44
ServerManager::processStandardError
void processStandardError()
Definition: servermanager.cpp:215
kstarsdatetime.h
MAX_FILENAME_LEN
const int MAX_FILENAME_LEN
Definition: servermanager.cpp:38
DriverInfo::setServerState
void setServerState(bool inState)
Definition: driverinfo.cpp:64
DriverInfo::setUniqueLabel
void setUniqueLabel(const QString &inUniqueLabel)
Definition: driverinfo.h:42
kstars.h
drivermanager.h
ServerManager::isDriverManaged
bool isDriverManaged(DriverInfo *)
Definition: servermanager.cpp:163
DriverManager::Instance
static DriverManager * Instance()
Definition: drivermanager.cpp:91
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:36:20 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