File indexing completed on 2024-05-05 03:50:47

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2010 Utku Aydın <utkuaydin34@gmail.com>
0004 // SPDX-FileCopyrightText: 2012 Illya Kovalevskyy <illya.kovalevskyy@gmail.com>
0005 //
0006 
0007 
0008 #include "OpenDesktopModel.h"
0009 #include "OpenDesktopItem.h"
0010 #include "MarbleGlobal.h"
0011 #include "MarbleModel.h"
0012 #include "GeoDataLatLonAltBox.h"
0013 #include "GeoDataCoordinates.h"
0014 #include <QString>
0015 #include <QUrl>
0016 #include <QJsonDocument>
0017 #include <QJsonArray>
0018 #include <QJsonObject>
0019 
0020 using namespace Marble;
0021  
0022  
0023 OpenDesktopModel::OpenDesktopModel( const MarbleModel *marbleModel, QObject *parent )
0024     : AbstractDataPluginModel( "opendesktop", marbleModel, parent )
0025 {
0026     // Nothing to do...
0027 }
0028  
0029 OpenDesktopModel::~OpenDesktopModel()
0030 {
0031     // Nothing to do...
0032 }
0033 
0034 void OpenDesktopModel::setMarbleWidget(MarbleWidget *widget)
0035 {
0036     m_marbleWidget = widget;
0037 }
0038  
0039 void OpenDesktopModel::getAdditionalItems( const GeoDataLatLonAltBox& box, qint32 number )
0040 {
0041     Q_UNUSED( number )
0042   
0043     if (marbleModel()->planetId() != QLatin1String("earth")) {
0044         return;
0045     }
0046 
0047     GeoDataCoordinates coords = box.center();
0048 
0049     const QString openDesktopUrl(QLatin1String("http://api.opendesktop.org/v1/person/data") +
0050         QLatin1String("?latitude=")  + QString::number(coords.latitude() * RAD2DEG) +
0051         QLatin1String("&longitude=") + QString::number(coords.longitude() * RAD2DEG) +
0052         QLatin1String("&format=json"));
0053     
0054     downloadDescriptionFile( QUrl( openDesktopUrl ) );
0055 }
0056 
0057 void OpenDesktopModel::parseFile( const QByteArray& file )
0058 {
0059     QJsonDocument jsonDoc = QJsonDocument::fromJson(file);
0060     QJsonValue dataValue = jsonDoc.object().value(QStringLiteral("data"));
0061 
0062     // Parse if any result exists
0063     if (dataValue.isArray()) {
0064         // Add items to the list
0065         QList<AbstractDataPluginItem*> items;
0066 
0067         QJsonArray dataArray = dataValue.toArray();
0068         for (int index = 0; index < dataArray.size(); ++index) {
0069             QJsonObject dataObject = dataArray[index].toObject();
0070 
0071             // Convert profile's properties from JSON to appropriate types
0072             const QString personid  = dataObject.value(QStringLiteral("personid")).toString();
0073             const QString firstName = dataObject.value(QStringLiteral("firstname")).toString();
0074             const QString lastName  = dataObject.value(QStringLiteral("lastname")).toString();
0075             const QString city      = dataObject.value(QStringLiteral("city")).toString();
0076             const QString country   = dataObject.value(QStringLiteral("country")).toString();
0077             const QString role   = dataObject.value(QStringLiteral("communityrole")).toString();
0078             const double longitude  = dataObject.value(QStringLiteral("longitude")).toDouble();
0079             const double latitude   = dataObject.value(QStringLiteral("latitude")).toDouble();
0080             const QUrl avatarUrl(dataObject.value(QStringLiteral("avatarpic")).toString());
0081 
0082             if( !itemExists( personid ) )
0083             {
0084                 // If it does not exists, create it
0085                 GeoDataCoordinates coor(longitude * DEG2RAD, latitude * DEG2RAD);
0086                 OpenDesktopItem *item = new OpenDesktopItem( this );
0087                 item->setMarbleWidget(m_marbleWidget);
0088                 item->setId( personid );
0089                 item->setCoordinate( coor );
0090                 item->setFullName(firstName + QLatin1Char(' ') + lastName);
0091                 item->setLocation(city + QLatin1String(", ") + country);
0092                 item->setRole( !role.isEmpty() ? role : QString( "nothing" ) );
0093                 downloadItem( avatarUrl, "avatar", item );
0094                 items << item;
0095             }
0096         }
0097 
0098         addItemsToList( items );
0099     }
0100 }
0101  
0102 #include "moc_OpenDesktopModel.cpp"