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"