8#include "nameresolver.h"
9#include "catalogobject.h"
13#include <kio/filecopyjob.h>
15#include "kstarslite.h"
20#include <QTemporaryFile>
22#include <QXmlStreamReader>
23#include <QNetworkRequest>
24#include <QNetworkReply>
25#include <QNetworkAccessManager>
28#include <kstars_debug.h>
32 const auto &
found_sesame{ NameResolverInternals::sesameResolver(name) };
36 xi18n(
"Error: sesameResolver failed. Could not resolve name on CDS Sesame.");
47std::pair<bool, CatalogObject>
48NameResolver::NameResolverInternals::sesameResolver(
const QString &name)
51 QString(
"http://cdsweb.u-strasbg.fr/cgi-bin/nph-sesame/-oxpFI/SNV?%1").arg(name));
53 QString msg =
xi18n(
"Attempting to resolve object %1 using CDS Sesame.", name);
71 msg =
xi18n(
"Error trying to get XML response from CDS Sesame server: %1",
86 msg =
xi18n(
"Empty result instead of expected XML from CDS Sesame. Maybe bad "
87 "Internet connection?");
101 while (!
xml.atEnd() && !
xml.hasError())
105 if (
xml.isStartDocument())
110 qCDebug(
KSTARS) <<
"Parsing token with name " <<
xml.name();
112 if (
xml.name() ==
"Resolver")
120 attributes.
value(
"name")
126 qWarning() <<
"Warning: Unknown resolver "
127 << attributes.
value(
"name ")
128 <<
" while reading output from CDS Sesame";
132 <<
"Resolved by " <<
resolver << attributes.
value(
"name") <<
"!";
135 while (
xml.readNextStartElement())
137 if (
xml.name() ==
"otype")
139 const QString typeString =
xml.readElementText();
140 data.setType(interpretObjectType(typeString));
142 else if (
xml.name() ==
"jradeg")
144 data.setRA0(
dms{
xml.readElementText().toDouble() });
146 else if (
xml.name() ==
"jdedeg")
148 data.setDec0(
dms{
xml.readElementText().toDouble() });
150 else if (
xml.name() ==
"mag")
152 attributes =
xml.attributes();
160 qWarning() <<
"Warning: Magnitude of unknown band found "
161 "while reading output from CDS Sesame";
167 if (
xml.isCharacters())
169 qCDebug(
KSTARS) <<
"characters: " <<
xml.tokenString();
170 mag =
xml.tokenString().toFloat();
172 else if (
xml.isStartElement())
174 while (
xml.name() !=
"v")
176 qCDebug(
KSTARS) <<
"element: " <<
xml.name();
177 xml.readNextStartElement();
179 mag =
xml.readElementText().toFloat();
181 <<
"Got " <<
xml.tokenString() <<
" mag = " << mag;
182 while (!
xml.atEnd() &&
xml.readNext() &&
xml.name() !=
"mag")
187 <<
"Failed to parse Xml token in magnitude element: "
188 <<
xml.tokenString();
194 else if (band ==
'B')
197 if (std::isnan(data.mag()))
202 else if (
xml.name() ==
"oname")
205 data.setCatalogIdentifier(contents);
208 xml.skipCurrentElement();
219 msg =
xi18n(
"Error parsing XML from CDS Sesame: %1 on line %2 @ col = %3",
220 xml.errorString(),
xml.lineNumber(),
xml.columnNumber());
226 return {
false, {} };
230 return {
false, {} };
232 msg =
xi18n(
"Resolved %1 successfully.", name);
239 <<
"; Coordinates: " << data.ra0().Degrees() <<
";"
240 << data.dec().Degrees();
241 return {
true, data };
249SkyObject::TYPE NameResolver::NameResolverInternals::interpretObjectType(
const QString &typeString,
bool caseSensitive)
315 return SkyObject::GALAXY;
318 return SkyObject::GALAXY_CLUSTER;
321 return SkyObject::OPEN_CLUSTER;
325 if (check(
"GlC") || check(
"GlCl"))
326 return SkyObject::GLOBULAR_CLUSTER;
327 if (check(
"Neb") || check(
"HII") || check(
"HH"))
328 return SkyObject::GASEOUS_NEBULA;
330 return SkyObject::SUPERNOVA_REMNANT;
331 if (check(
"PN") || check(
"PNeb") || check(
"PNe") || check(
"pA*"))
332 return SkyObject::PLANETARY_NEBULA;
333 if (typeString ==
"*")
334 return SkyObject::CATALOG_STAR;
336 return SkyObject::QUASAR;
337 if (check(
"DN") || check(
"DNe") || check(
"DNeb") || check(
"glb"))
338 return SkyObject::DARK_NEBULA;
340 return SkyObject::RADIO_SOURCE;
341 if (typeString ==
"**")
342 return SkyObject::MULT_STAR;
343 if (typeString.
contains(
'*') && !check(
"C?*"))
344 return SkyObject::CATALOG_STAR;
346 return SkyObject::TYPE_UNKNOWN;
A simple container object to hold the minimum information for a Deep Sky Object to be drawn on the sk...
static KStarsLite * Instance()
TYPE
The type classification of the SkyObject.
An angle, stored as degrees, but expressible in many ways.
QString xi18n(const char *text, const TYPE &arg...)
Type type(const QSqlDatabase &db)
QString name(StandardShortcut id)
std::pair< bool, CatalogObject > resolveName(const QString &name)
Resolve the name of the given DSO and extract data from various sources.
char toLatin1() const const
QNetworkReply * get(const QNetworkRequest &request)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
int compare(QLatin1StringView s1, const QString &s2, Qt::CaseSensitivity cs)
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
QChar at(qsizetype n) const const
bool hasAttribute(QAnyStringView namespaceUri, QAnyStringView name) const const
QStringView value(QAnyStringView namespaceUri, QAnyStringView name) const const