File indexing completed on 2024-05-12 15:31:19

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2009 Bastian Holst <bastianholst@gmx.de>
0004 //
0005 
0006 // Self
0007 #include "BBCWeatherService.h"
0008 
0009 // Marble
0010 #include "BBCItemGetter.h"
0011 #include "BBCStation.h"
0012 #include "BBCWeatherItem.h"
0013 #include "GeoDataCoordinates.h"
0014 #include "GeoDataLatLonAltBox.h"
0015 #include "MarbleDirs.h"
0016 #include "StationListParser.h"
0017 #include "WeatherData.h"
0018 #include "WeatherModel.h"
0019 #include "MarbleDebug.h"
0020 #include "MarbleGlobal.h"
0021 
0022 // Qt
0023 #include <QUrl>
0024 
0025 using namespace Marble;
0026 
0027 BBCWeatherService::BBCWeatherService( const MarbleModel *model, QObject *parent )
0028     : AbstractWeatherService( model, parent ),
0029       m_parsingStarted( false ),
0030       m_parser( nullptr ),
0031       m_itemGetter( new BBCItemGetter( this ) )
0032 {
0033      qRegisterMetaType<BBCStation>("BBCStation");
0034 }
0035 
0036 BBCWeatherService::~BBCWeatherService()
0037 {
0038 }
0039 
0040 void BBCWeatherService::setFavoriteItems( const QStringList& favorite )
0041 {
0042     if ( favoriteItems() != favorite ) {
0043         m_parsingStarted = false;
0044 
0045         delete m_itemGetter;
0046         m_itemGetter = new BBCItemGetter( this );
0047 
0048         AbstractWeatherService::setFavoriteItems( favorite );
0049     }
0050 }
0051 
0052 void BBCWeatherService::getAdditionalItems( const GeoDataLatLonAltBox& box,
0053                                             qint32 number )
0054 {
0055     if ( !m_parsingStarted ) {
0056         m_parsingStarted = true;
0057 
0058         m_parser = new StationListParser( this );
0059         m_parser->setPath(MarbleDirs::path(QStringLiteral("weather/bbc-stations.xml")));
0060         connect( m_parser, SIGNAL(finished()),
0061                  this,     SLOT(fetchStationList()) );
0062         if ( m_parser->wait( 100 ) ) {
0063             m_parser->start( QThread::IdlePriority );
0064         }
0065     }
0066 
0067     m_itemGetter->setSchedule( box, number );
0068 }
0069 
0070 void BBCWeatherService::getItem( const QString &id )
0071 {
0072     if ( id.startsWith( QLatin1String( "bbc" ) ) ) {
0073         BBCStation const station = m_itemGetter->station( id );
0074         if ( station.bbcId() > 0 ) {
0075             createItem( station );
0076         }
0077     }
0078 }
0079 
0080 void BBCWeatherService::fetchStationList()
0081 {
0082     if ( !m_parser ) {
0083         return;
0084     }
0085 
0086     connect( m_itemGetter,
0087              SIGNAL(foundStation(BBCStation)),
0088              this,
0089              SLOT(createItem(BBCStation)) );
0090 
0091     m_stationList = m_parser->stationList();
0092     m_itemGetter->setStationList( m_stationList );
0093 
0094     delete m_parser;
0095     m_parser = nullptr;
0096 }
0097 
0098 void BBCWeatherService::createItem( const BBCStation& station )
0099 {
0100     BBCWeatherItem *item = new BBCWeatherItem( this );
0101     item->setMarbleWidget( marbleWidget() );
0102     item->setBbcId( station.bbcId() );
0103     item->setCoordinate( station.coordinate() );
0104     item->setPriority( station.priority() );
0105     item->setStationName( station.name() );
0106 
0107     emit requestedDownload( item->observationUrl(), "bbcobservation", item );
0108     emit requestedDownload( item->forecastUrl(),    "bbcforecast",    item );
0109 }
0110 
0111 #include "moc_BBCWeatherService.cpp"