File indexing completed on 2024-04-21 03:44:26

0001 /*
0002     SPDX-FileCopyrightText: 2009 Prakash Mohan <prakash.mohan@kdemail.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "log.h"
0008 
0009 #include "kstars.h"
0010 #include "kstarsdata.h"
0011 #include "kstarsdatetime.h"
0012 #include "ksutils.h"
0013 #include "observinglist.h"
0014 #include "skymap.h"
0015 #include "skycomponents/constellationboundarylines.h"
0016 #include "skycomponents/skymapcomposite.h"
0017 #include "skyobjects/skyobject.h"
0018 #include "skyobjects/starobject.h"
0019 
0020 #include "kstars_debug.h"
0021 
0022 OAL::Log::~Log()
0023 {
0024     //qDeleteAll(m_targetList);
0025     qDeleteAll(m_observerList);
0026     qDeleteAll(m_eyepieceList);
0027     qDeleteAll(m_lensList);
0028     qDeleteAll(m_filterList);
0029     qDeleteAll(m_siteList);
0030     qDeleteAll(m_sessionList);
0031     qDeleteAll(m_scopeList);
0032     qDeleteAll(m_dslrLensList);
0033     qDeleteAll(m_observationList);
0034 }
0035 
0036 void OAL::Log::writeBegin()
0037 {
0038     output       = "";
0039     //m_targetList = KSUtils::makeVanillaPointerList(KStarsData::Instance()->observingList()->sessionList());
0040     m_targetList = KStarsData::Instance()->observingList()->sessionList();
0041     writer       = new QXmlStreamWriter(&output);
0042     writer->setAutoFormatting(true);
0043     writer->writeStartDocument();
0044     writer->writeNamespace("http://observation.sourceforge.net/openastronomylog", "oal");
0045     writer->writeNamespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");
0046     writer->writeNamespace("http://observation.sourceforge.net/openastronomylog oal20.xsd", "schemaLocation");
0047     writer->writeStartElement("oal:observations");
0048     writer->writeAttribute("version", "2.0");
0049 }
0050 
0051 QString OAL::Log::writeLog(bool _native)
0052 {
0053     native = _native;
0054     writeBegin();
0055     if (native)
0056         writeGeoDate();
0057     writeObservers();
0058     writeSites();
0059     writeSessions();
0060     writeTargets();
0061     writeScopes();
0062     writeDSLRLenses();
0063     writeEyepieces();
0064     writeLenses();
0065     writeFilters();
0066     writeImagers();
0067     writeObservations();
0068     writeEnd();
0069     return output;
0070 }
0071 
0072 void OAL::Log::writeEnd()
0073 {
0074     writer->writeEndDocument();
0075     delete writer;
0076 }
0077 
0078 void OAL::Log::writeObservers()
0079 {
0080     writer->writeStartElement("observers");
0081     foreach (OAL::Observer *o, m_observerList)
0082         writeObserver(o);
0083     writer->writeEndElement();
0084 }
0085 
0086 void OAL::Log::writeSites()
0087 {
0088     writer->writeStartElement("sites");
0089     foreach (OAL::Site *o, m_siteList)
0090         writeSite(o);
0091     writer->writeEndElement();
0092 }
0093 
0094 void OAL::Log::writeSessions()
0095 {
0096     writer->writeStartElement("sessions");
0097     foreach (OAL::Session *o, m_sessionList)
0098         writeSession(o);
0099     writer->writeEndElement();
0100 }
0101 
0102 void OAL::Log::writeTargets()
0103 {
0104     writer->writeStartElement("targets");
0105     //foreach (SkyObject *o, m_targetList)
0106     for (auto &o : m_targetList)
0107     {
0108         writeTarget(o.data());
0109     }
0110     writer->writeEndElement();
0111 }
0112 
0113 void OAL::Log::writeScopes()
0114 {
0115     writer->writeStartElement("scopes");
0116     foreach (OAL::Scope *o, m_scopeList)
0117         writeScope(o);
0118     writer->writeEndElement();
0119 }
0120 
0121 void OAL::Log::writeDSLRLenses()
0122 {
0123     writer->writeStartElement("dslrlenses");
0124     for (const auto &o : m_dslrLensList)
0125         writeDSLRLenses(o);
0126     writer->writeEndElement();
0127 }
0128 
0129 void OAL::Log::writeEyepieces()
0130 {
0131     writer->writeStartElement("eyepieces");
0132     foreach (OAL::Eyepiece *o, m_eyepieceList)
0133         writeEyepiece(o);
0134     writer->writeEndElement();
0135 }
0136 
0137 void OAL::Log::writeLenses()
0138 {
0139     writer->writeStartElement("lenses");
0140     foreach (OAL::Lens *o, m_lensList)
0141         writeLens(o);
0142     writer->writeEndElement();
0143 }
0144 
0145 void OAL::Log::writeFilters()
0146 {
0147     writer->writeStartElement("filters");
0148     foreach (OAL::Filter *o, m_filterList)
0149         writeFilter(o);
0150     writer->writeEndElement();
0151 }
0152 
0153 void OAL::Log::writeImagers()
0154 {
0155     writer->writeStartElement("imagers");
0156     writer->writeEndElement();
0157 }
0158 
0159 void OAL::Log::writeObservations()
0160 {
0161     foreach (OAL::Observation *o, m_observationList)
0162         writeObservation(o);
0163 }
0164 
0165 void OAL::Log::writeTarget(SkyObject *o)
0166 {
0167     writer->writeStartElement("target");
0168     writer->writeAttribute("id", o->name().remove(' '));
0169     QString typeString;
0170     if (native)
0171         writer->writeAttribute("type", o->typeName());
0172     else
0173     {
0174         switch (o->type())
0175         {
0176             case 0:
0177                 typeString = "oal:starTargetType";
0178                 break;
0179             case 1:
0180                 typeString = "oal:starTargetType";
0181                 break;
0182             case 2:
0183                 typeString = "oal:PlanetTargetType";
0184                 break;
0185             case 3:
0186                 typeString = "oal:deepSkyOC";
0187                 break;
0188             case 4:
0189                 typeString = "oal:deepSkyGC";
0190                 break;
0191             case 5:
0192                 typeString = "oal:deepSkyGN";
0193                 break;
0194             case 6:
0195                 typeString = "oal:deepSkyPN";
0196                 break;
0197             case 8:
0198                 typeString = "oal:deepSkyGX";
0199                 break;
0200             case 9:
0201                 typeString = "oal:CometTargetType";
0202                 break;
0203             case 12:
0204                 typeString = "oal:MoonTargetType";
0205                 break;
0206             case 13:
0207                 typeString = "oal:deepSkyAS";
0208                 break;
0209             case 14:
0210                 typeString = "oal:deepSkyCG";
0211                 break;
0212             case 15:
0213                 typeString = "oal:deepSkyDN";
0214                 break;
0215             case 16:
0216                 typeString = "oal:deepSkyQS";
0217                 break;
0218             case 17:
0219                 typeString = "oal:deepSkyMS";
0220                 break;
0221             default:
0222                 typeString = "oal:deepSkyNA";
0223                 break;
0224         }
0225         writer->writeAttribute("xsi:type", typeString);
0226     }
0227     writer->writeStartElement("datasource");
0228     writer->writeCDATA("KStars");
0229     writer->writeEndElement();
0230     writer->writeStartElement("name");
0231     QString name = o->name();
0232     if (name == "star")
0233     {
0234         if (((StarObject *)o)->getHDIndex() != 0)
0235             name = QString("HD %1").arg(((StarObject *)o)->getHDIndex());
0236     }
0237     writer->writeCDATA(name);
0238     writer->writeEndElement();
0239     writer->writeStartElement("position");
0240     writer->writeStartElement("ra");
0241     writer->writeAttribute("unit", "rad");
0242     writer->writeCharacters(QString::number(o->ra().radians()));
0243     writer->writeEndElement();
0244     writer->writeStartElement("dec");
0245     writer->writeAttribute("unit", "rad");
0246     writer->writeCharacters(QString::number(o->dec().radians()));
0247     writer->writeEndElement();
0248     writer->writeEndElement();
0249     if (native && !KStarsData::Instance()->observingList()->getTime(o).isEmpty())
0250     {
0251         writer->writeStartElement("time");
0252         writer->writeCDATA(KStarsData::Instance()->observingList()->getTime(o));
0253         writer->writeEndElement();
0254     }
0255     writer->writeStartElement("constellation");
0256     writer->writeCDATA(KStarsData::Instance()
0257                        ->skyComposite()
0258                        ->constellationBoundary()
0259                        ->constellationName(o));
0260     writer->writeEndElement();
0261     writer->writeStartElement("notes");
0262     writer->writeCDATA(KStarsData::Instance()->getUserData(o->name()).userLog);
0263     writer->writeEndElement();
0264     writer->writeEndElement();
0265 }
0266 
0267 void OAL::Log::writeObserver(OAL::Observer *o)
0268 {
0269     writer->writeStartElement("observer");
0270     writer->writeAttribute("id", o->id());
0271     writer->writeStartElement("name");
0272     writer->writeCDATA(o->name());
0273     writer->writeEndElement();
0274     writer->writeStartElement("surname");
0275     writer->writeCDATA(o->surname());
0276     writer->writeEndElement();
0277     writer->writeStartElement("contact");
0278     writer->writeCDATA(o->contact());
0279     writer->writeEndElement();
0280     writer->writeEndElement();
0281 }
0282 
0283 void OAL::Log::writeSite(OAL::Site *s)
0284 {
0285     writer->writeStartElement("site");
0286     writer->writeAttribute("id", s->id());
0287     writer->writeStartElement("name");
0288     writer->writeCDATA(s->name());
0289     writer->writeEndElement();
0290     writer->writeStartElement("latitude");
0291     writer->writeAttribute("unit", s->latUnit());
0292     writer->writeCharacters(QString::number(s->latitude()));
0293     writer->writeStartElement("longitude");
0294     writer->writeAttribute("unit", s->lonUnit());
0295     writer->writeCharacters(QString::number(s->longitude()));
0296     writer->writeEndElement();
0297     writer->writeEndElement();
0298 }
0299 
0300 void OAL::Log::writeSession(OAL::Session *s)
0301 {
0302     writer->writeStartElement("session");
0303     writer->writeAttribute("id", s->id());
0304     writer->writeStartElement("begin");
0305     writer->writeCharacters(s->begin().date().toString("yyyy-MM-dd") + 'T' + s->begin().time().toString("hh:mm:ss"));
0306     writer->writeEndElement();
0307     writer->writeStartElement("end");
0308     writer->writeCharacters(s->end().date().toString("yyyy-MM-dd") + 'T' + s->end().time().toString("hh:mm:ss"));
0309     writer->writeEndElement();
0310     writer->writeStartElement("site");
0311     writer->writeCharacters(s->site());
0312     writer->writeEndElement();
0313     writer->writeStartElement("weather");
0314     writer->writeCDATA(s->weather());
0315     writer->writeEndElement();
0316     writer->writeStartElement("equipment");
0317     writer->writeCDATA(s->equipment());
0318     writer->writeEndElement();
0319     writer->writeStartElement("comments");
0320     writer->writeCDATA(s->comments());
0321     writer->writeEndElement();
0322     writer->writeEndElement();
0323 }
0324 
0325 void OAL::Log::writeScope(OAL::Scope *s)
0326 {
0327     writer->writeStartElement("scope");
0328     writer->writeAttribute("id", s->id());
0329     writer->writeStartElement("model");
0330     writer->writeCDATA(s->model());
0331     writer->writeEndElement();
0332     writer->writeStartElement("type");
0333     writer->writeCDATA(s->type().at(0));
0334     writer->writeEndElement();
0335     writer->writeStartElement("vendor");
0336     writer->writeCDATA(s->vendor());
0337     writer->writeEndElement();
0338     writer->writeStartElement("aperture");
0339     writer->writeCharacters(QString::number(s->aperture()));
0340     writer->writeEndElement();
0341     writer->writeStartElement("focalLength");
0342     writer->writeCharacters(QString::number(s->focalLength()));
0343     writer->writeEndElement();
0344     writer->writeEndElement();
0345     writer->writeEndElement();
0346 }
0347 
0348 void OAL::Log::writeDSLRLenses(OAL::DSLRLens *s)
0349 {
0350     writer->writeStartElement("dslrlens");
0351     writer->writeAttribute("id", s->id());
0352     writer->writeStartElement("model");
0353     writer->writeCDATA(s->model());
0354     writer->writeEndElement();
0355     writer->writeStartElement("vendor");
0356     writer->writeCDATA(s->vendor());
0357     writer->writeEndElement();
0358     writer->writeStartElement("focalLength");
0359     writer->writeCharacters(QString::number(s->focalLength()));
0360     writer->writeEndElement();
0361     writer->writeStartElement("focalRatio");
0362     writer->writeCharacters(QString::number(s->focalRatio()));
0363     writer->writeEndElement();
0364     writer->writeEndElement();
0365 }
0366 
0367 void OAL::Log::writeEyepiece(OAL::Eyepiece *ep)
0368 {
0369     writer->writeStartElement("eyepiece");
0370     writer->writeAttribute("id", ep->id());
0371     writer->writeStartElement("model");
0372     writer->writeCDATA(ep->model());
0373     writer->writeEndElement();
0374     writer->writeStartElement("vendor");
0375     writer->writeCDATA(ep->vendor());
0376     writer->writeEndElement();
0377     writer->writeStartElement("focalLength");
0378     writer->writeCharacters(QString::number(ep->focalLength()));
0379     writer->writeEndElement();
0380     writer->writeStartElement("apparantFOV");
0381     writer->writeAttribute("unit", ep->fovUnit());
0382     writer->writeCharacters(QString::number(ep->appFov()));
0383     writer->writeEndElement();
0384     writer->writeEndElement();
0385 }
0386 
0387 void OAL::Log::writeLens(OAL::Lens *l)
0388 {
0389     writer->writeStartElement("lens");
0390     writer->writeAttribute("id", l->id());
0391     writer->writeStartElement("model");
0392     writer->writeCDATA(l->model());
0393     writer->writeEndElement();
0394     writer->writeStartElement("vendor");
0395     writer->writeCDATA(l->vendor());
0396     writer->writeEndElement();
0397     writer->writeStartElement("factor");
0398     writer->writeCharacters(QString::number(l->factor()));
0399     writer->writeEndElement();
0400     writer->writeEndElement();
0401 }
0402 
0403 void OAL::Log::writeFilter(OAL::Filter *f)
0404 {
0405     writer->writeStartElement("filter");
0406     writer->writeAttribute("id", f->id());
0407 
0408     // Model
0409     writer->writeStartElement("model");
0410     writer->writeCDATA(f->model());
0411     writer->writeEndElement();
0412     // Vendor
0413     writer->writeStartElement("vendor");
0414     writer->writeCDATA(f->vendor());
0415     writer->writeEndElement();
0416     // Type
0417     writer->writeStartElement("type");
0418     writer->writeCDATA(f->type());
0419     writer->writeEndElement();
0420     // Color
0421     writer->writeStartElement("color");
0422     writer->writeCDATA(f->color());
0423     writer->writeEndElement();
0424     // Offset
0425     writer->writeStartElement("offset");
0426     writer->writeCDATA(QString::number(f->offset()));
0427     writer->writeEndElement();
0428     // Exposure
0429     writer->writeStartElement("exposure");
0430     writer->writeCDATA(QString::number(f->exposure()));
0431     writer->writeEndElement();
0432     // AutoFocus
0433     writer->writeStartElement("autofocus");
0434     writer->writeCDATA(QString::number(f->useAutoFocus() ? 1 : 0));
0435     writer->writeEndElement();
0436     // Locked Filter
0437     writer->writeStartElement("lockedfilter");
0438     writer->writeCDATA(f->lockedFilter());
0439     writer->writeEndElement();
0440 
0441     writer->writeEndElement();
0442 }
0443 
0444 void OAL::Log::writeObservation(OAL::Observation *o)
0445 {
0446     writer->writeStartElement("observation");
0447     writer->writeStartElement("observer");
0448     writer->writeCharacters(o->observer());
0449     writer->writeEndElement();
0450     writer->writeStartElement("site");
0451     writer->writeCharacters(o->site());
0452     writer->writeEndElement();
0453     writer->writeStartElement("session");
0454     writer->writeCharacters(o->session());
0455     writer->writeEndElement();
0456     writer->writeStartElement("target");
0457     writer->writeCharacters(o->target().remove(' '));
0458     writer->writeEndElement();
0459     writer->writeStartElement("begin");
0460     writer->writeCharacters(o->begin().date().toString("yyyy-MM-dd") + 'T' + o->begin().time().toString("hh:mm:ss"));
0461     writer->writeEndElement();
0462     writer->writeStartElement("faintestStar");
0463     writer->writeCharacters(QString::number(o->faintestStar()));
0464     writer->writeEndElement();
0465     writer->writeStartElement("seeing");
0466     writer->writeCharacters(QString::number(o->seeing()));
0467     writer->writeEndElement();
0468     writer->writeStartElement("scope");
0469     writer->writeCharacters(o->scope());
0470     writer->writeEndElement();
0471     writer->writeStartElement("eyepiece");
0472     writer->writeCharacters(o->eyepiece());
0473     writer->writeEndElement();
0474     writer->writeStartElement("lens");
0475     writer->writeCharacters(o->lens());
0476     writer->writeEndElement();
0477     writer->writeStartElement("filter");
0478     writer->writeCharacters(o->filter());
0479     writer->writeEndElement();
0480     writer->writeStartElement("result");
0481     writer->writeAttribute("xsi:type", "oal:findingsType");
0482     writer->writeAttribute("lang", o->lang());
0483     writer->writeStartElement("description");
0484     writer->writeCDATA(o->result());
0485     writer->writeEndElement();
0486     writer->writeEndElement();
0487     writer->writeEndElement();
0488 }
0489 
0490 void OAL::Log::writeGeoDate()
0491 {
0492     writer->writeStartElement("geodate");
0493     writer->writeStartElement("name");
0494     writer->writeCDATA(KStarsData::Instance()->observingList()->geoLocation()->name());
0495     writer->writeEndElement();
0496     writer->writeStartElement("province");
0497     writer->writeCDATA(KStarsData::Instance()->observingList()->geoLocation()->province());
0498     writer->writeEndElement();
0499     writer->writeStartElement("country");
0500     writer->writeCDATA(KStarsData::Instance()->observingList()->geoLocation()->country());
0501     writer->writeEndElement();
0502     writer->writeStartElement("date");
0503     writer->writeCDATA(KStarsData::Instance()->observingList()->dateTime().date().toString("ddMMyyyy"));
0504     writer->writeEndElement();
0505     writer->writeEndElement();
0506 }
0507 
0508 void OAL::Log::readBegin(QString input)
0509 {
0510     reader = new QXmlStreamReader(input);
0511     while (!reader->atEnd())
0512     {
0513         reader->readNext();
0514         if (reader->isStartElement())
0515         {
0516             //       if( reader->name() == "oal:observations" && reader->attributes().value("version") == "2.0" )
0517             readLog();
0518         }
0519     }
0520 }
0521 
0522 void OAL::Log::readUnknownElement()
0523 {
0524     while (!reader->atEnd())
0525     {
0526         reader->readNext();
0527 
0528         if (reader->isEndElement())
0529             break;
0530 
0531         if (reader->isStartElement())
0532             readUnknownElement();
0533     }
0534 }
0535 
0536 void OAL::Log::readLog()
0537 {
0538     while (!reader->atEnd())
0539     {
0540         reader->readNext();
0541 
0542         if (reader->isEndElement())
0543             break;
0544 
0545         if (reader->isStartElement())
0546         {
0547             if (reader->name() == "targets")
0548                 readTargets();
0549             else if (reader->name() == "sites")
0550                 readSites();
0551             else if (reader->name() == "sessions")
0552                 readSessions();
0553             else if (reader->name() == "observation")
0554                 readObservation(reader->attributes().value("id").toString());
0555             else if (reader->name() == "geodate")
0556                 readGeoDate();
0557             else
0558                 readUnknownElement();
0559         }
0560     }
0561 }
0562 
0563 void OAL::Log::readTargets()
0564 {
0565     while (!reader->atEnd())
0566     {
0567         reader->readNext();
0568 
0569         if (reader->isEndElement())
0570             break;
0571 
0572         if (reader->isStartElement())
0573         {
0574             if (reader->name() == "target")
0575                 readTarget();
0576             else
0577                 readUnknownElement();
0578         }
0579     }
0580 }
0581 
0582 void OAL::Log::readObservers()
0583 {
0584     KStars::Instance()->data()->userdb()->GetAllObservers(m_observerList);
0585 }
0586 
0587 void OAL::Log::readSites()
0588 {
0589     while (!reader->atEnd())
0590     {
0591         reader->readNext();
0592 
0593         if (reader->isEndElement())
0594             break;
0595 
0596         if (reader->isStartElement())
0597         {
0598             if (reader->name() == "site")
0599                 readSite(reader->attributes().value("id").toString());
0600             else
0601                 readUnknownElement();
0602         }
0603     }
0604 }
0605 
0606 void OAL::Log::readSessions()
0607 {
0608     while (!reader->atEnd())
0609     {
0610         reader->readNext();
0611 
0612         if (reader->isEndElement())
0613             break;
0614 
0615         if (reader->isStartElement())
0616         {
0617             if (reader->name() == "session")
0618                 readSession(reader->attributes().value("id").toString(), reader->attributes().value("lang").toString());
0619             else
0620                 readUnknownElement();
0621         }
0622     }
0623 }
0624 
0625 void OAL::Log::readScopes()
0626 {
0627     KStars::Instance()->data()->userdb()->GetAllScopes(m_scopeList);
0628 }
0629 
0630 void OAL::Log::readDSLRLenses()
0631 {
0632     KStars::Instance()->data()->userdb()->GetAllDSLRLenses(m_dslrLensList);
0633 }
0634 
0635 void OAL::Log::readEyepieces()
0636 {
0637     KStars::Instance()->data()->userdb()->GetAllEyepieces(m_eyepieceList);
0638 }
0639 
0640 void OAL::Log::readLenses()
0641 {
0642     KStars::Instance()->data()->userdb()->GetAllLenses(m_lensList);
0643 }
0644 
0645 void OAL::Log::readFilters()
0646 {
0647     KStars::Instance()->data()->userdb()->GetAllFilters(m_filterList);
0648 }
0649 
0650 void OAL::Log::readTarget()
0651 {
0652     SkyObject *o = nullptr;
0653     SkyPoint pos;
0654     bool posOK = false;
0655     QString name, time, notes;
0656     while (!reader->atEnd())
0657     {
0658         reader->readNext();
0659 
0660         if (reader->isEndElement())
0661             break;
0662 
0663         if (reader->isStartElement())
0664         {
0665             if (reader->name() == "name")
0666             {
0667                 name = reader->readElementText();
0668                 if (name != "star")
0669                 {
0670                     o = KStarsData::Instance()->objectNamed(name);
0671                     if (!o)
0672                         o = KStarsData::Instance()
0673                             ->skyComposite()
0674                             ->findStarByGenetiveName(name);
0675                     if (o)
0676                         targetList().append(QSharedPointer<SkyObject>(o->clone()));
0677                 }
0678             }
0679             else if (!o && reader->name() == "position")
0680             {
0681                 pos = readPosition(posOK);
0682                 if (posOK)
0683                 {
0684                     double maxrd = 0.5;
0685                     while (!o && maxrd <= 2.0)
0686                     {
0687                         o = KStarsData::Instance()->skyComposite()->starNearest(&pos,
0688                                 maxrd);
0689                         if (!o)
0690                             maxrd += 0.5;
0691                     }
0692 
0693                     if (o)
0694                         targetList().append(QSharedPointer<SkyObject>(o->clone()));
0695                 }
0696             }
0697             else if (reader->name() == "time")
0698             {
0699                 time = reader->readElementText();
0700                 if (o)
0701                     TimeHash.insert(o->name(), QTime::fromString(time, "h:mm:ss AP"));
0702             }
0703             else if (reader->name() == "notes")
0704             {
0705                 notes = reader->readElementText();
0706                 if (o)
0707                 {
0708                     KStarsData::Instance()->updateUserLog(o->name(), notes);
0709                 }
0710             }
0711             //   else  if( reader->name() == "datasource" )
0712             //         qDebug() << reader->readElementText();
0713             //     else if( reader->name() == "position" )
0714             //         readPosition();
0715             //     else if( reader->name() == "constellation" )
0716             //         qDebug() << reader->readElementText();
0717             else
0718                 readUnknownElement();
0719         }
0720     }
0721 }
0722 
0723 void OAL::Log::readSite(const QString &id)
0724 {
0725     QString name, latUnit, lonUnit, lat, lon;
0726     while (!reader->atEnd())
0727     {
0728         reader->readNext();
0729 
0730         if (reader->isEndElement())
0731             break;
0732 
0733         if (reader->isStartElement())
0734         {
0735             if (reader->name() == "name")
0736             {
0737                 name = reader->readElementText();
0738             }
0739             else if (reader->name() == "latitude")
0740             {
0741                 lat     = reader->readElementText();
0742                 latUnit = reader->attributes().value("unit").toString();
0743             }
0744             else if (reader->name() == "longitude")
0745             {
0746                 lon     = reader->readElementText();
0747                 lonUnit = reader->attributes().value("unit").toString();
0748             }
0749             else
0750                 readUnknownElement();
0751         }
0752     }
0753     OAL::Site *o = new OAL::Site(id, name, lat.toDouble(), latUnit, lon.toDouble(), lonUnit);
0754     m_siteList.append(o);
0755 }
0756 
0757 void OAL::Log::readSession(const QString &id, const QString &lang)
0758 {
0759     QString site, weather, equipment, comments, begin, end;
0760     KStarsDateTime beginDT, endDT;
0761     while (!reader->atEnd())
0762     {
0763         reader->readNext();
0764 
0765         if (reader->isEndElement())
0766             break;
0767 
0768         if (reader->isStartElement())
0769         {
0770             if (reader->name() == "site")
0771             {
0772                 site = reader->readElementText();
0773             }
0774             else if (reader->name() == "begin")
0775             {
0776                 begin = reader->readElementText();
0777                 beginDT.fromString(begin);
0778             }
0779             else if (reader->name() == "end")
0780             {
0781                 end = reader->readElementText();
0782                 endDT.fromString(begin);
0783             }
0784             else if (reader->name() == "weather")
0785             {
0786                 weather = reader->readElementText();
0787             }
0788             else if (reader->name() == "equipment")
0789             {
0790                 equipment = reader->readElementText();
0791             }
0792             else if (reader->name() == "comments")
0793             {
0794                 comments = reader->readElementText();
0795             }
0796             else
0797                 readUnknownElement();
0798         }
0799     }
0800     OAL::Session *o = new OAL::Session(id, site, beginDT, endDT, weather, equipment, comments, lang);
0801     m_sessionList.append(o);
0802 }
0803 
0804 SkyPoint OAL::Log::readPosition(bool &OK)
0805 {
0806     SkyPoint p;
0807     bool RAOK = false, DEOK = false;
0808     while (!reader->atEnd())
0809     {
0810         reader->readNext();
0811 
0812         if (reader->isEndElement())
0813             break;
0814 
0815         if (reader->isStartElement())
0816         {
0817             if (reader->name() == "ra")
0818             {
0819                 qDebug() << reader->readElementText() << reader->attributes().value("unit");
0820                 dms ra;
0821                 if (reader->attributes().value("unit") == "rad")
0822                     ra.setRadians(reader->readElementText().toDouble(&RAOK));
0823                 else
0824                     ra.setD(reader->readElementText().toDouble(&RAOK));
0825 
0826                 p.setRA(ra);
0827             }
0828             else if (reader->name() == "dec")
0829             {
0830                 qDebug() << reader->readElementText() << reader->attributes().value("unit");
0831                 dms de;
0832                 if (reader->attributes().value("unit") == "rad")
0833                     de.setRadians(reader->readElementText().toDouble(&DEOK));
0834                 else
0835                     de.setD(reader->readElementText().toDouble(&DEOK));
0836 
0837                 p.setDec(de);
0838             }
0839             else
0840                 readUnknownElement();
0841         }
0842     }
0843 
0844     OK = RAOK && DEOK;
0845 
0846     return p;
0847 }
0848 
0849 void OAL::Log::readObservation(const QString &id)
0850 {
0851     QString observer, site, session, target, faintestStar, seeing, scope, eyepiece, lens, filter, result, lang;
0852     KStarsDateTime begin;
0853     while (!reader->atEnd())
0854     {
0855         reader->readNext();
0856         if (reader->isEndElement())
0857             break;
0858         if (reader->isStartElement())
0859         {
0860             if (reader->name() == "observer")
0861                 observer = reader->readElementText();
0862             else if (reader->name() == "site")
0863                 site = reader->readElementText();
0864             else if (reader->name() == "session")
0865                 session = reader->readElementText();
0866             else if (reader->name() == "target")
0867                 target = reader->readElementText();
0868             else if (reader->name() == "begin")
0869                 begin.fromString(reader->readElementText());
0870             else if (reader->name() == "faintestStar")
0871                 faintestStar = reader->readElementText();
0872             else if (reader->name() == "seeing")
0873                 seeing = reader->readElementText();
0874             else if (reader->name() == "scope")
0875                 scope = reader->readElementText();
0876             else if (reader->name() == "eyepiece")
0877                 eyepiece = reader->readElementText();
0878             else if (reader->name() == "lens")
0879                 lens = reader->readElementText();
0880             else if (reader->name() == "filter")
0881                 filter = reader->readElementText();
0882             else if (reader->name() == "result")
0883             {
0884                 lang   = reader->attributes().value("lang").toString();
0885                 result = readResult();
0886             }
0887             else
0888                 readUnknownElement();
0889         }
0890     }
0891     OAL::Observation *o = new OAL::Observation(id, observer, site, session, target, begin, faintestStar.toDouble(),
0892             seeing.toDouble(), scope, eyepiece, lens, filter, result, lang);
0893     m_observationList.append(o);
0894 }
0895 
0896 QString OAL::Log::readResult()
0897 {
0898     QString result;
0899     while (!reader->atEnd())
0900     {
0901         reader->readNext();
0902 
0903         if (reader->isEndElement())
0904             break;
0905         if (reader->isStartElement())
0906         {
0907             if (reader->name() == "description")
0908                 result = reader->readElementText();
0909             else
0910                 readUnknownElement();
0911         }
0912     }
0913     return result;
0914 }
0915 
0916 void OAL::Log::readGeoDate()
0917 {
0918     QString name, province, country, date;
0919     while (!reader->atEnd())
0920     {
0921         reader->readNext();
0922 
0923         if (reader->isEndElement())
0924             break;
0925 
0926         if (reader->isStartElement())
0927         {
0928             if (reader->name() == "name")
0929                 name = reader->readElementText();
0930             else if (reader->name() == "province")
0931                 province = reader->readElementText();
0932             else if (reader->name() == "country")
0933                 country = reader->readElementText();
0934             else if (reader->name() == "date")
0935             {
0936                 date = reader->readElementText();
0937             }
0938             else
0939                 readUnknownElement();
0940         }
0941     }
0942     geo = KStarsData::Instance()->locationNamed(name, province, country);
0943     if (geo == nullptr)
0944     {
0945         qCWarning(KSTARS) << "Location " << name << ", " << province << ", " << country
0946                           << " not found in KStars. Using current location.";
0947         geo = KStarsData::Instance()->geo();
0948     }
0949     dt.setDate(QDate::fromString(date, "ddMMyyyy"));
0950 }
0951 
0952 OAL::Observer *OAL::Log::findObserverByName(const QString &name)
0953 {
0954     foreach (OAL::Observer *obs, *observerList())
0955     {
0956         if (QString(obs->name() + ' ' + obs->surname()) == name)
0957             return obs;
0958     }
0959     return nullptr;
0960 }
0961 
0962 OAL::Observer *OAL::Log::findObserverById(const QString &id)
0963 {
0964     foreach (OAL::Observer *obs, *observerList())
0965     {
0966         if (obs->id() == id)
0967             return obs;
0968     }
0969     return nullptr;
0970 }
0971 
0972 OAL::Session *OAL::Log::findSessionByName(const QString &id)
0973 {
0974     foreach (OAL::Session *s, *sessionList())
0975     {
0976         if (s->id() == id)
0977             return s;
0978     }
0979     return nullptr;
0980 }
0981 
0982 OAL::Site *OAL::Log::findSiteById(const QString &id)
0983 {
0984     foreach (OAL::Site *s, *siteList())
0985     {
0986         if (s->id() == id)
0987             return s;
0988     }
0989     return nullptr;
0990 }
0991 
0992 OAL::Site *OAL::Log::findSiteByName(const QString &name)
0993 {
0994     foreach (OAL::Site *s, *siteList())
0995     {
0996         if (s->name() == name)
0997             return s;
0998     }
0999     return nullptr;
1000 }
1001 
1002 OAL::Scope *OAL::Log::findScopeById(const QString &id)
1003 {
1004     foreach (OAL::Scope *s, *scopeList())
1005     {
1006         if (s->id() == id)
1007             return s;
1008     }
1009     return nullptr;
1010 }
1011 
1012 OAL::Eyepiece *OAL::Log::findEyepieceById(const QString &id)
1013 {
1014     foreach (OAL::Eyepiece *e, *eyepieceList())
1015     {
1016         if (e->id() == id)
1017             return e;
1018     }
1019     return nullptr;
1020 }
1021 
1022 OAL::Lens *OAL::Log::findLensById(const QString &id)
1023 {
1024     foreach (OAL::Lens *l, *lensList())
1025     {
1026         if (l->id() == id)
1027             return l;
1028     }
1029     return nullptr;
1030 }
1031 
1032 OAL::Filter *OAL::Log::findFilterById(const QString &id)
1033 {
1034     foreach (OAL::Filter *f, *filterList())
1035     {
1036         if (f->id() == id)
1037             return f;
1038     }
1039     return nullptr;
1040 }
1041 
1042 OAL::Scope *OAL::Log::findScopeByName(const QString &name)
1043 {
1044     foreach (OAL::Scope *s, *scopeList())
1045     {
1046         if (s->name() == name)
1047             return s;
1048     }
1049     return nullptr;
1050 }
1051 
1052 OAL::DSLRLens *OAL::Log::findDSLRLensByName(const QString &name)
1053 {
1054     for (const auto &s : *dslrLensList())
1055     {
1056         if (s->name() == name)
1057             return s;
1058     }
1059     return nullptr;
1060 }
1061 
1062 OAL::DSLRLens *OAL::Log::findDSLRLensById(const QString &id)
1063 {
1064     for (const auto &s : *dslrLensList())
1065     {
1066         if (s->id() == id)
1067             return s;
1068     }
1069     return nullptr;
1070 }
1071 
1072 OAL::Eyepiece *OAL::Log::findEyepieceByName(const QString &name)
1073 {
1074     foreach (OAL::Eyepiece *e, *eyepieceList())
1075     {
1076         if (e->name() == name)
1077             return e;
1078     }
1079     return nullptr;
1080 }
1081 
1082 OAL::Filter *OAL::Log::findFilterByName(const QString &name)
1083 {
1084     foreach (OAL::Filter *f, *filterList())
1085     {
1086         if (f->name() == name)
1087             return f;
1088     }
1089     return nullptr;
1090 }
1091 
1092 OAL::Lens *OAL::Log::findLensByName(const QString &name)
1093 {
1094     foreach (OAL::Lens *l, *lensList())
1095     {
1096         if (l->name() == name)
1097             return l;
1098     }
1099     return nullptr;
1100 }
1101 
1102 OAL::Observation *OAL::Log::findObservationByName(const QString &id)
1103 {
1104     foreach (OAL::Observation *o, *observationList())
1105     {
1106         if (o->id() == id)
1107             return o;
1108     }
1109     return nullptr;
1110 }
1111 
1112 void OAL::Log::readAll()
1113 {
1114     readObservers();
1115     readScopes();
1116     readEyepieces();
1117     readLenses();
1118     readFilters();
1119 }