9#include "ekosliveclient.h"
10#include "ekos/manager.h"
14#include "ekos_debug.h"
15#include "QProgressIndicator.h"
17#include <config-kstars.h>
20#include <qt5keychain/keychain.h>
23#include <QJsonDocument>
25#include <QNetworkAccessManager>
26#include <QNetworkReply>
30Client::Client(Ekos::Manager *manager) :
QDialog(manager), m_Manager(manager)
38 leftBanner->setPixmap(im);
41 bottomLayout->insertWidget(1, pi);
45 username->setText(Options::ekosLiveUsername());
48 Options::setEkosLiveUsername(username->text());
53 connect(onlineManager.get(), &NodeManager::authenticationError,
this, [
this](
const QString & message)
55 onlineLabel->setToolTip(message);
60 connect(offlineManager.get(), &NodeManager::authenticationError,
this, [
this](
const QString & message)
62 offlineLabel->setToolTip(message);
65 m_NodeManagers.append(std::move(onlineManager));
66 m_NodeManagers.append(std::move(offlineManager));
74 for (
auto &oneManager : m_NodeManagers)
75 oneManager->disconnectNodes();
79 for (
auto &oneManager : m_NodeManagers)
81 oneManager->setCredentials(username->text(), password->text());
82 oneManager->authenticate();
91 for (
auto &oneManager : m_NodeManagers)
93 oneManager->setCredentials(username->text(), password->text());
94 oneManager->authenticate();
99 rememberCredentialsCheck->setChecked(Options::rememberCredentials());
102 Options::setRememberCredentials(toggled);
104 autoStartCheck->setChecked(Options::autoStartEkosLive());
107 Options::setAutoStartEkosLive(toggled);
111 QKeychain::ReadPasswordJob *job =
new QKeychain::ReadPasswordJob(
QLatin1String(
"kstars"));
112 job->setAutoDelete(
false);
114 connect(job, &QKeychain::Job::finished,
this, [&](QKeychain::Job * job)
116 if (job->error() ==
false)
118 const auto passwordText = dynamic_cast<QKeychain::ReadPasswordJob*>(job)->textData().toLatin1();
121 if (passwordText.isEmpty() == false && username->text().isEmpty() == false)
123 password->setText(passwordText);
124 if (autoStartCheck->isChecked())
126 for (auto &oneManager : m_NodeManagers)
128 oneManager->setCredentials(username->text(), password->text());
129 oneManager->authenticate();
136 if (autoStartCheck->isChecked())
137 qCWarning(KSTARS_EKOS) <<
"Failed to automatically connect due to missing EkosLive credentials:" << job->errorString();
144 m_Message =
new Message(m_Manager, m_NodeManagers);
145 connect(m_Message, &Message::connected,
this, &Client::onConnected);
146 connect(m_Message, &Message::disconnected,
this, &Client::onDisconnected);
147 connect(m_Message, &Message::expired,
this, [&](
const QUrl & url)
150 for (
auto &oneManager : m_NodeManagers)
152 if (oneManager->property(
"websocketURL").toUrl() == url)
154 oneManager->disconnectNodes();
155 oneManager->setCredentials(username->text(), password->text());
156 oneManager->authenticate();
161 m_Media =
new Media(m_Manager, m_NodeManagers);
162 connect(m_Media, &Media::connected,
this, &Client::onConnected);
163 m_Cloud =
new Cloud(m_Manager, m_NodeManagers);
164 connect(m_Cloud, &Cloud::connected,
this, &Client::onConnected);
169 for (
auto &oneManager : m_NodeManagers)
170 oneManager->disconnectNodes();
173void Client::onConnected()
177 m_isConnected =
true;
179 connectB->setText(
i18n(
"Disconnect"));
182 auto disconnected =
QIcon(
":/icons/AlignFailure.svg").
pixmap(
QSize(32, 32));
185 onlineLabel->setStyleSheet(m_NodeManagers[0]->isConnected() ?
"color:white" :
"color:gray");
186 onlineIcon->setPixmap(m_NodeManagers[0]->isConnected() ? connected : disconnected);
187 if (m_NodeManagers[0]->isConnected())
188 onlineLabel->setToolTip(
QString());
190 selectServersB->setEnabled(
false);
191 offlineLabel->setStyleSheet(m_NodeManagers[1]->isConnected() ?
"color:white" :
"color:gray");
192 offlineIcon->setPixmap(m_NodeManagers[1]->isConnected() ? connected : disconnected);
193 if (m_NodeManagers[1]->isConnected())
194 offlineLabel->setToolTip(
QString());
196 if (rememberCredentialsCheck->isChecked())
199 QKeychain::WritePasswordJob *job =
new QKeychain::WritePasswordJob(
QLatin1String(
"kstars"));
200 job->setAutoDelete(
true);
202 job->setTextData(password->text());
208void Client::onDisconnected()
211 m_isConnected =
false;
212 connectB->setText(
i18n(
"Connect"));
214 auto disconnected =
QIcon(
":/icons/AlignFailure.svg").
pixmap(
QSize(32, 32));
217 onlineLabel->setStyleSheet(m_NodeManagers[0]->isConnected() ?
"color:white" :
"color:gray");
218 onlineIcon->setPixmap(m_NodeManagers[0]->isConnected() ? connected : disconnected);
220 offlineLabel->setStyleSheet(m_NodeManagers[1]->isConnected() ?
"color:white" :
"color:gray");
221 offlineIcon->setPixmap(m_NodeManagers[1]->isConnected() ? connected : disconnected);
223 selectServersB->setEnabled(
true);
226void Client::setConnected(
bool enabled)
229 if (enabled == m_isConnected)
235void Client::setConfig(
bool rememberCredentials,
bool autoConnect)
237 rememberCredentialsCheck->setChecked(rememberCredentials);
238 autoStartCheck->setChecked(autoConnect);
243 username->setText(user);
244 Options::setEkosLiveUsername(user);
246 password->setText(pass);
249void Client::showSelectServersDialog()
252 dialog.setMinimumWidth(300);
253 dialog.setWindowTitle(
i18nc(
"@title:window",
"Select EkosLive Servers"));
264 machineID.setReadOnly(
true);
267 observatoryEdit.setText(Options::ekosLiveObservatory());
268 offlineEdit.setText(Options::ekosLiveOfflineServer());
269 onlineEdit.setText(Options::ekosLiveOnlineServer());
272 layout->
addRow(&observatory, &observatoryEdit);
273 layout->
addRow(&offline, &offlineEdit);
274 layout->
addRow(&online, &onlineEdit);
275 layout->
addRow(&
id, &machineID);
276 dialog.setLayout(layout);
279 Options::setEkosLiveObservatory(observatoryEdit.text());
280 Options::setEkosLiveOfflineServer(offlineEdit.text());
281 Options::setEkosLiveOnlineServer(onlineEdit.text());
286void Client::syncURLs()
288 auto onlineSSL =
QUrl(Options::ekosLiveOnlineServer()).
scheme() ==
"https";
291 m_NodeManagers[Online]->setURLs(
QUrl(
"https:" + onlineURL),
QUrl(
"wss:" + onlineURL));
293 m_NodeManagers[Online]->setURLs(
QUrl(
"http:" + onlineURL),
QUrl(
"ws:" + onlineURL));
295 auto offlineSSL =
QUrl(Options::ekosLiveOfflineServer()).
scheme() ==
"https";
298 m_NodeManagers[Offline]->setURLs(
QUrl(
"https:" + offlineURL),
QUrl(
"wss:" + offlineURL));
300 m_NodeManagers[Offline]->setURLs(
QUrl(
"http:" + offlineURL),
QUrl(
"ws:" + offlineURL));
The QProgressIndicator class lets an application display a progress indicator to show that a long tas...
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
Generic record interfaces and implementations.
QPixmap pixmap(QWindow *window, const QSize &size, Mode mode, State state) const const
QIcon fromTheme(const QString &name)
bool load(const QString &fileName, const char *format, Qt::ImageConversionFlags flags)
QString fromUtf8(QByteArrayView str)
QByteArray machineUniqueId()
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QString scheme() const const
QString url(FormattingOptions options) const const