Kstars
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) };
33 if (!found_sesame.first)
36 xi18n(
"Error: sesameResolver failed. Could not resolve name on CDS Sesame.");
37 qCDebug(KSTARS) << msg;
47 std::pair<bool, CatalogObject>
48 NameResolver::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);
54 qCDebug(KSTARS) << msg;
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?");
88 qCDebug(KSTARS) << msg;
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")
204 QString contents = xml.readElementText();
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());
221 qCDebug(KSTARS) << msg;
226 return {
false, {} };
230 return {
false, {} };
232 msg =
xi18n(
"Resolved %1 successfully.", name);
233 qCDebug(KSTARS) << msg;
239 <<
"; Coordinates: " << data.ra0().Degrees() <<
";"
240 << data.dec().Degrees();
241 return {
true, data };
249 SkyObject::TYPE NameResolver::NameResolverInternals::interpretObjectType(
const QString &typeString,
bool caseSensitive)
288 galaxyGroupTypes <<
"GClstr"
298 openClusterTypes <<
"*Cl"
305 radioSourceTypes <<
"Rad"
315 return SkyObject::GALAXY;
317 if (galaxyGroupTypes.
contains(s, cs))
318 return SkyObject::GALAXY_CLUSTER;
320 if (openClusterTypes.
contains(s, cs))
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;
339 if (radioSourceTypes.
contains(s, cs))
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;
QString errorString() const const
QStringRef value(const QString &namespaceUri, const QString &name) const const
Type type(const QSqlDatabase &db)
QNetworkReply::NetworkError error() const const
bool contains(const QString &str, Qt::CaseSensitivity cs) const const
static KStarsLite * Instance()
QString xi18n(const char *text, const TYPE &arg...)
void notificationMessage(QString msg)
Once this signal is emitted, notification with text msg will appear on the screen.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QNetworkReply * get(const QNetworkRequest &request)
bool hasAttribute(const QString &qualifiedName) const const
An angle, stored as degrees, but expressible in many ways.
std::pair< bool, CatalogObject > resolveName(const QString &name)
Resolve the name of the given DSO and extract data from various sources.
QString name(StandardShortcut id)
const QChar at(int position) const const
int compare(const QString &other, Qt::CaseSensitivity cs) const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
char toLatin1() const const
A simple container object to hold the minimum information for a Deeb Sky Object to be drawn on the sk...
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Sat Aug 13 2022 04:01:56 by
doxygen 1.8.17 written
by
Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.