Index: skin/Confluence/720p/Home.xml =================================================================== --- skin/Confluence/720p/Home.xml (revision 30773) +++ skin/Confluence/720p/Home.xml (working copy) @@ -22,7 +22,7 @@ VisibleFadeEffect Skin.HasSetting(homepageSysteminfo) + Container(9000).HasFocus(5) conditional - conditional + conditional WindowClose WindowOpen @@ -54,7 +54,7 @@ conditional WindowClose WindowOpen - !Skin.HasSetting(homepageWeatherinfo) + IsTrue(Window(Weather).Property(Weather.IsFetched)) + !Skin.HasSetting(homepageWeatherinfo) + Weather.IsFetched time background 0 Index: skin/Confluence/720p/includes.xml =================================================================== --- skin/Confluence/720p/includes.xml (revision 30773) +++ skin/Confluence/720p/includes.xml (working copy) @@ -173,7 +173,7 @@ 10000 true 1000 - ![Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Skin.String(WeatherFanartDir))] + ![Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Window(Weather).Property(Current.FanartPath)] 0 @@ -184,7 +184,7 @@ 10000 true 1000 - Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Skin.String(WeatherFanartDir)) + Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Window(Weather).Property(Current.FanartPath)) WindowClose Index: skin/Confluence/720p/IncludesHomeHorizontal.xml =================================================================== --- skin/Confluence/720p/IncludesHomeHorizontal.xml (revision 30773) +++ skin/Confluence/720p/IncludesHomeHorizontal.xml (working copy) @@ -852,7 +852,7 @@ special://skin/backgrounds/weather.jpg $INFO[Skin.String(Home_Custom_Back_Weather_Folder)] !Skin.HasSetting(HomeMenuNoWeatherButton) - !Skin.HasSetting(ShowWeatherFanart) | IsEmpty(Skin.String(WeatherFanartDir)) + !Skin.HasSetting(ShowWeatherFanart) | IsEmpty(Window(Weather).Property(Current.FanartPath)) @@ -860,7 +860,7 @@ special://skin/backgrounds/weather.jpg $INFO[Window(Weather).Property(Current.FanartPath)] !Skin.HasSetting(HomeMenuNoWeatherButton) - Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Skin.String(WeatherFanartDir)) + Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Window(Weather).Property(Current.FanartPath)) Index: skin/Confluence/720p/IncludesHomeVertical.xml =================================================================== --- skin/Confluence/720p/IncludesHomeVertical.xml (revision 30773) +++ skin/Confluence/720p/IncludesHomeVertical.xml (working copy) @@ -846,7 +846,7 @@ special://skin/backgrounds/weather.jpg $INFO[Skin.String(Home_Custom_Back_Weather_Folder)] !Skin.HasSetting(HomeMenuNoWeatherButton) - !Skin.HasSetting(ShowWeatherFanart) | IsEmpty(Skin.String(WeatherFanartDir)) + !Skin.HasSetting(ShowWeatherFanart) | IsEmpty(Window(Weather).Property(Current.FanartPath)) @@ -854,7 +854,7 @@ special://skin/backgrounds/weather.jpg $INFO[Window(Weather).Property(Current.FanartPath)] !Skin.HasSetting(HomeMenuNoWeatherButton) - Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Skin.String(WeatherFanartDir)) + Skin.HasSetting(ShowWeatherFanart) + !IsEmpty(Window(Weather).Property(Current.FanartPath)) Index: skin/Confluence/720p/script.weather.com.plus/WeatherPluginView.xml =================================================================== --- skin/Confluence/720p/script.weather.com.plus/WeatherPluginView.xml (revision 30773) +++ skin/Confluence/720p/script.weather.com.plus/WeatherPluginView.xml (working copy) @@ -180,14 +180,6 @@ TWC.Current - - TWC.36Hour - TWC.Weekend - TWC.Hourly - TWC.Daily - TWC.Maps - TWC.Alerts - TWC.Video @@ -203,14 +195,6 @@ 2000 - TWC.Current.ButtonXLabel - - TWC.36Hour.ButtonXLabel - TWC.Weekend.ButtonXLabel - TWC.Hourly.ButtonXLabel - TWC.10Day.ButtonXLabel - TWC.Maps.ButtonXLabel - TWC.Alerts.ButtonXLabel - TWC.Video.ButtonXLabel @@ -226,14 +210,6 @@ 2000 - TWC.Current.Button - - TWC.36Hour.Button - TWC.Weekend.Button - TWC.Hourly.Button - TWC.10Day.Button - TWC.Maps.Button - TWC.Alerts.Button - TWC.Video.Button @@ -303,7 +279,6 @@ !StringCompare(Window.Property(Weather.CurrentView),Skin.String(TWC.DefaultView)) - TWC.Maps.DummyButtons 10 250 @@ -332,12 +307,6 @@ !StringCompare(Window.Property(Weather.CurrentView),$LOCALIZE[31907] - $LOCALIZE[31914]) + !StringCompare(Window.Property(Weather.CurrentView),$LOCALIZE[31906] - $LOCALIZE[31913]) TWC.Current.SettingsButtons - TWC.36Hour.SettingsButtons - - TWC.Maps.SettingsButtons - TWC.Weekend.SettingsButtons - TWC.10Day.SettingsButtons - 220 45 Index: skin/PM3.HD/720p/MyWeather.xml =================================================================== --- skin/PM3.HD/720p/MyWeather.xml (revision 30773) +++ skin/PM3.HD/720p/MyWeather.xml (working copy) @@ -258,7 +258,7 @@ 110 50 20 - + font12 left center @@ -281,7 +281,7 @@ 290 50 20 - + font12 left center @@ -357,7 +357,7 @@ 110 50 20 - + font12 left center @@ -380,7 +380,7 @@ 290 50 20 - + font12 left center @@ -456,7 +456,7 @@ 110 50 20 - + font12 left center @@ -479,7 +479,7 @@ 290 50 20 - + font12 left center @@ -555,7 +555,7 @@ 110 50 20 - + font12 left center @@ -578,7 +578,7 @@ 290 50 20 - + font12 left center Index: skin/Project Mayhem III/PAL/MyWeather.xml =================================================================== --- skin/Project Mayhem III/PAL/MyWeather.xml (revision 30773) +++ skin/Project Mayhem III/PAL/MyWeather.xml (working copy) @@ -373,7 +373,7 @@ high value 160 30 - + font12 @@ -388,7 +388,7 @@ low value 160 50 - + font12 @@ -452,7 +452,7 @@ high value 160 30 - + font12 @@ -467,7 +467,7 @@ low value 160 50 - + font12 @@ -531,7 +531,7 @@ high value 160 30 - + font12 @@ -546,7 +546,7 @@ low value 160 50 - + font12 @@ -610,7 +610,7 @@ high value 160 30 - + font12 @@ -625,7 +625,7 @@ low value 160 50 - + font12 Index: xbmc/GUIWindowWeather.cpp =================================================================== --- xbmc/GUIWindowWeather.cpp (revision 30773) +++ xbmc/GUIWindowWeather.cpp (working copy) @@ -242,7 +242,7 @@ void CGUIWindowWeather::CallPlugin() { - SetProperty("Weather.IsFetched", false); + SetProperty("Weather.IsFetched", "false"); if (g_guiSettings.GetString("weather.plugin").IsEmpty()) return; Index: xbmc/utils/Weather.cpp =================================================================== --- xbmc/utils/Weather.cpp (revision 30773) +++ xbmc/utils/Weather.cpp (working copy) @@ -21,123 +21,20 @@ #include "stdafx.h" #include "Weather.h" -#include "FileSystem/ZipManager.h" -#include "FileSystem/RarManager.h" -#include "FileSystem/FileCurl.h" -#include "XMLUtils.h" -#include "Temperature.h" -#include "xbox/network.h" -#include "../Util.h" -#include "Application.h" #include "GUISettings.h" #include "GUIWindowManager.h" -#include "GUIDialogProgress.h" -#include "GUIDialogSelect.h" -#include "DateTime.h" -#include "FileSystem/Directory.h" +#include "GUIMediaWindow.h" #include "ScriptSettings.h" #include "GUIDialogPluginSettings.h" using namespace std; -using namespace DIRECTORY; -#define CONTROL_BTNREFRESH 2 -#define CONTROL_SELECTLOCATION 3 -#define CONTROL_LABELLOCATION 10 -#define CONTROL_LABELUPDATED 11 -#define CONTROL_IMAGELOGO 101 - -#define CONTROL_IMAGENOWICON 21 -#define CONTROL_LABELNOWCOND 22 -#define CONTROL_LABELNOWTEMP 23 -#define CONTROL_LABELNOWFEEL 24 -#define CONTROL_LABELNOWUVID 25 -#define CONTROL_LABELNOWWIND 26 -#define CONTROL_LABELNOWDEWP 27 -#define CONTROL_LABELNOWHUMI 28 - -#define CONTROL_STATICTEMP 223 -#define CONTROL_STATICFEEL 224 -#define CONTROL_STATICUVID 225 -#define CONTROL_STATICWIND 226 -#define CONTROL_STATICDEWP 227 -#define CONTROL_STATICHUMI 228 - -#define CONTROL_LABELD0DAY 31 -#define CONTROL_LABELD0HI 32 -#define CONTROL_LABELD0LOW 33 -#define CONTROL_LABELD0GEN 34 -#define CONTROL_IMAGED0IMG 35 - -#define PARTNER_ID "1004124588" //weather.com partner id -#define PARTNER_KEY "079f24145f208494" //weather.com partner key - #define MAX_LOCATION 10 -#define LOCALIZED_TOKEN_FIRSTID 370 -#define LOCALIZED_TOKEN_LASTID 395 -#define LOCALIZED_TOKEN_FIRSTID2 1396 -#define LOCALIZED_TOKEN_LASTID2 1450 -/* -FIXME'S ->strings are not centered ->weather.com dev account is mine not a general xbmc one -*/ -// USE THESE FOR ZIP -//#define WEATHER_USE_ZIP 1 -//#define WEATHER_USE_RAR 0 -//#define WEATHER_BASE_PATH "special://temp/weather/" -//#define WEATHER_SOURCE_FILE "special://xbmc/media/weather.zip" - -// OR THESE FOR RAR -#define WEATHER_BASE_PATH "special://temp/weather/" -#define WEATHER_USE_ZIP 0 -#define WEATHER_USE_RAR 1 -#define WEATHER_SOURCE_FILE "special://xbmc/media/weather.rar" - CWeather g_weatherManager; -void CBackgroundWeatherLoader::GetInformation() -{ - //if (!g_network.IsAvailable()) - // return; - - //CWeather *callback = (CWeather *)m_callback; - /* - // Download our weather - CLog::Log(LOGINFO, "WEATHER: Downloading weather"); - XFILE::CFileCurl httpUtil; - CStdString strURL; - - CStdString strSetting; - strSetting.Format("weather.areacode%i", callback->GetArea() + 1); - CStdString areaCode(callback->GetAreaCode(g_guiSettings.GetString(strSetting))); - strURL.Format("http://xoap.weather.com/weather/local/%s?cc=*&unit=m&dayf=4&prod=xoap&link=xoap&par=%s&key=%s", - areaCode.c_str(), PARTNER_ID, PARTNER_KEY); - CStdString xml; - if (httpUtil.Get(strURL, xml)) - { - CLog::Log(LOGINFO, "WEATHER: Weather download successful"); - if (!callback->m_bImagesOkay) - { - CDirectory::Create(WEATHER_BASE_PATH); - if (WEATHER_USE_ZIP) - g_ZipManager.ExtractArchive(WEATHER_SOURCE_FILE, WEATHER_BASE_PATH); - else if (WEATHER_USE_RAR) - g_RarManager.ExtractArchive(WEATHER_SOURCE_FILE, WEATHER_BASE_PATH); - callback->m_bImagesOkay = true; - } - callback->LoadWeather(xml); - } - else - CLog::Log(LOGERROR, "WEATHER: Weather download failed!"); - */ -} - CWeather::CWeather(void) : CInfoLoader("weather") { - m_bImagesOkay = false; - Reset(); } @@ -145,555 +42,20 @@ { } -void CWeather::GetString(const TiXmlElement* pRootElement, const CStdString& strTagName, char* szValue, const CStdString& strDefaultValue) -{ - strcpy(szValue, ""); - const TiXmlNode *pChild = pRootElement->FirstChild(strTagName.c_str()); - if (pChild && pChild->FirstChild()) - { - CStdString strValue = pChild->FirstChild()->Value(); - if (strValue.size() ) - { - if (strValue != "-") - strcpy(szValue, strValue.c_str()); - } - } - if (strlen(szValue) == 0) - { - strcpy(szValue, strDefaultValue.c_str()); - } -} - -void CWeather::GetInteger(const TiXmlElement* pRootElement, const CStdString& strTagName, int& iValue) -{ - if (!XMLUtils::GetInt(pRootElement, strTagName.c_str(), iValue)) - iValue = 0; -} - -void CWeather::LocalizeOverviewToken(char *szToken, bool bAppendSpace) -{ - // NOTE: This routine is case-sensitive. Reason is std::less uses a case-sensitive - // < operator. Thus, some tokens may have to be duplicated in strings.xml (see drizzle vs Drizzle). - CStdString strLocStr = ""; - CStdString token = szToken; - if (!token.IsEmpty()) - { - ilocalizedTokens i; - i = m_localizedTokens.find(token); - if (i != m_localizedTokens.end()) - { - strLocStr = g_localizeStrings.Get(i->second); - } - } - if (strLocStr == "") - strLocStr = szToken; //if not found, let fallback - if (bAppendSpace) - strLocStr += " "; //append space if applicable - strcpy(szToken, strLocStr.c_str()); -} - -void CWeather::LocalizeOverview(char *szStr) -{ - char loc[256]; - char szToken[256]; - int intOffset = 0; - char *pnt = NULL; - memset(loc, '\0', sizeof(loc)); - - while ((pnt = strstr(szStr + intOffset, " ")) != NULL) - { - //get the length of this token (everything before pnt) - int iTokenLen = (int)(strlen(szStr) - strlen(pnt) - intOffset); - strncpy(szToken, szStr + intOffset, iTokenLen); //extract the token - szToken[iTokenLen] = '\0'; //stick an end on it - LocalizeOverviewToken(szToken); //localize - strcpy(loc + strlen(loc), szToken); //add it to the end of loc - intOffset += iTokenLen + 1; //update offset for next strstr search - } - strncpy(szToken, szStr + intOffset, strlen(szStr) - intOffset); //last word, copy the rest of the string - szToken[strlen(szStr) - intOffset] = '\0'; //stick an end on it - LocalizeOverviewToken(szToken); //localize - strcpy(loc + strlen(loc), szToken); //add it to the end of loc - strcpy(szStr, loc); //copy loc over the original input string -} - -// input param must be kmh -int CWeather::ConvertSpeed(int curSpeed) -{ - switch (g_langInfo.GetSpeedUnit()) - { - case CLangInfo::SPEED_UNIT_KMH: - break; - case CLangInfo::SPEED_UNIT_MPS: - curSpeed=(int)(curSpeed * (1000.0 / 3600.0) + 0.5); - break; - case CLangInfo::SPEED_UNIT_MPH: - curSpeed=(int)(curSpeed / (8.0 / 5.0)); - break; - case CLangInfo::SPEED_UNIT_MPMIN: - curSpeed=(int)(curSpeed * (1000.0 / 3600.0) + 0.5*60); - break; - case CLangInfo::SPEED_UNIT_FTH: - curSpeed=(int)(curSpeed * 3280.8398888889f); - break; - case CLangInfo::SPEED_UNIT_FTMIN: - curSpeed=(int)(curSpeed * 54.6805555556f); - break; - case CLangInfo::SPEED_UNIT_FTS: - curSpeed=(int)(curSpeed * 0.911344f); - break; - case CLangInfo::SPEED_UNIT_KTS: - curSpeed=(int)(curSpeed * 0.5399568f); - break; - case CLangInfo::SPEED_UNIT_INCHPS: - curSpeed=(int)(curSpeed * 10.9361388889f); - break; - case CLangInfo::SPEED_UNIT_YARDPS: - curSpeed=(int)(curSpeed * 0.3037814722f); - break; - case CLangInfo::SPEED_UNIT_FPF: - curSpeed=(int)(curSpeed * 1670.25f); - break; - case CLangInfo::SPEED_UNIT_BEAUFORT: - { - float knot=(float)curSpeed * 0.5399568f; // to kts first - if(knot<=1.0) curSpeed=0; - if(knot>1.0 && knot<3.5) curSpeed=1; - if(knot>=3.5 && knot<6.5) curSpeed=2; - if(knot>=6.5 && knot<10.5) curSpeed=3; - if(knot>=10.5 && knot<16.5) curSpeed=4; - if(knot>=16.5 && knot<21.5) curSpeed=5; - if(knot>=21.5 && knot<27.5) curSpeed=6; - if(knot>=27.5 && knot<33.5) curSpeed=7; - if(knot>=33.5 && knot<40.5) curSpeed=8; - if(knot>=40.5 && knot<47.5) curSpeed=9; - if(knot>=47.5 && knot<55.5) curSpeed=10; - if(knot>=55.5 && knot<63.5) curSpeed=11; - if(knot>=63.5 && knot<74.5) curSpeed=12; - if(knot>=74.5 && knot<80.5) curSpeed=13; - if(knot>=80.5 && knot<89.5) curSpeed=14; - if(knot>=89.5) curSpeed=15; - } - break; - default: - assert(false); - } - - return curSpeed; -} - -bool CWeather::LoadWeather(const CStdString &weatherXML) -{ - int iTmpInt; - char iTmpStr[256]; - SYSTEMTIME time; - - GetLocalTime(&time); //used when deciding what weather to grab for today - - // Load in our tokens if necessary - if (!m_localizedTokens.size()) - LoadLocalizedToken(); - - // load the xml file - TiXmlDocument xmlDoc; - if (!xmlDoc.Parse(weatherXML)) - { - CLog::Log(LOGERROR, "WEATHER: Unable to get data - invalid XML"); - return false; - } - - TiXmlElement *pRootElement = xmlDoc.RootElement(); - if (!pRootElement) - { - CLog::Log(LOGERROR, "WEATHER: Unable to get data - invalid XML"); - return false; - } - - //if root element is 'error' display the error message - if (strcmp(pRootElement->Value(), "error") == 0) - { - char szCheckError[256]; - GetString(pRootElement, "err", szCheckError, "Unknown Error"); //grab the error string - CLog::Log(LOGERROR, "WEATHER: Unable to get data: %s", szCheckError); - return false; - } - - // location - TiXmlElement *pElement = pRootElement->FirstChildElement("loc"); - if (pElement) - { - GetString(pElement, "dnam", m_szLocation[m_iCurWeather], ""); - } - - //current weather - pElement = pRootElement->FirstChildElement("cc"); - if (pElement) - { - // Use the local date/time the file is parsed... - CDateTime time=CDateTime::GetCurrentDateTime(); - CStdString strDateTime=time.GetAsLocalizedDateTime(false, false); - strcpy(m_szLastUpdateTime, strDateTime.c_str()); - - // ...and not the date/time from weather.com - //GetString(pElement, "lsup", m_szLastUpdateTime, ""); - - GetString(pElement, "icon", iTmpStr, ""); //string cause i've seen it return N/A - if (strcmp(iTmpStr, "N/A") == 0) - { - sprintf(m_szCurrentIcon, "%s128x128/na.png", WEATHER_BASE_PATH); - } - else - sprintf(m_szCurrentIcon, "%s128x128/%s.png", WEATHER_BASE_PATH, iTmpStr); - - GetString(pElement, "t", m_szCurrentConditions, ""); //current condition - LocalizeOverview(m_szCurrentConditions); - - GetInteger(pElement, "tmp", iTmpInt); //current temp - CTemperature temp=CTemperature::CreateFromCelsius(iTmpInt); - sprintf(m_szCurrentTemperature, "%2.0f", temp.ToLocale()); - GetInteger(pElement, "flik", iTmpInt); //current 'Feels Like' - CTemperature tempFlik=CTemperature::CreateFromCelsius(iTmpInt); - sprintf(m_szCurrentFeelsLike, "%2.0f", tempFlik.ToLocale()); - - TiXmlElement *pNestElement = pElement->FirstChildElement("wind"); //current wind - if (pNestElement) - { - GetInteger(pNestElement, "s", iTmpInt); //current wind strength - iTmpInt = ConvertSpeed(iTmpInt); //convert speed if needed - GetString(pNestElement, "t", iTmpStr, "N"); //current wind direction - - //From at km/h g_localizeStrings.Get(407) - //This is a bit untidy, but i'm fed up with localization and string formats :) - CStdString szWindFrom = g_localizeStrings.Get(407); - CStdString szWindAt = g_localizeStrings.Get(408); - CStdString szCalm = g_localizeStrings.Get(1410); - - // get speed unit - char szUnitSpeed[5]; - strncpy(szUnitSpeed, g_langInfo.GetSpeedUnitString().c_str(), 5); - szUnitSpeed[4] = '\0'; - - if (strcmp(iTmpStr,"CALM") == 0) - sprintf(m_szCurrentWind, "%s", szCalm.c_str()); - else - sprintf(m_szCurrentWind, "%s %s %s %i %s", - szWindFrom.GetBuffer(szWindFrom.GetLength()), iTmpStr, - szWindAt.GetBuffer(szWindAt.GetLength()), iTmpInt, szUnitSpeed); - } - - GetInteger(pElement, "hmid", iTmpInt); //current humidity - sprintf(m_szCurrentHumidity, "%i%%", iTmpInt); - - pNestElement = pElement->FirstChildElement("uv"); //current UV index - if (pNestElement) - { - GetInteger(pNestElement, "i", iTmpInt); - GetString(pNestElement, "t", iTmpStr, ""); - LocalizeOverviewToken(iTmpStr, false); - sprintf(m_szCurrentUVIndex, "%i %s", iTmpInt, iTmpStr); - } - - GetInteger(pElement, "dewp", iTmpInt); //current dew point - CTemperature dewPoint=CTemperature::CreateFromCelsius(iTmpInt); - sprintf(m_szCurrentDewPoint, "%2.0f", dewPoint.ToLocale()); - } - //future forcast - pElement = pRootElement->FirstChildElement("dayf"); - if (pElement) - { - TiXmlElement *pOneDayElement = pElement->FirstChildElement("day");; - if (pOneDayElement) - { - for (int i = 0; i < NUM_DAYS; i++) - { - const char *attr = pOneDayElement->Attribute("t"); - if (attr) - { - strcpy(m_dfForcast[i].m_szDay, attr); - LocalizeDay(m_dfForcast[i].m_szDay); - } - - GetString(pOneDayElement, "hi", iTmpStr, ""); //string cause i've seen it return N/A - if (strcmp(iTmpStr, "N/A") == 0) - strcpy(m_dfForcast[i].m_szHigh, ""); - else - { - CTemperature temp=CTemperature::CreateFromCelsius(atoi(iTmpStr)); - sprintf(m_dfForcast[i].m_szHigh, "%2.0f", temp.ToLocale()); - } - - GetString(pOneDayElement, "low", iTmpStr, ""); - if (strcmp(iTmpStr, "N/A") == 0) - strcpy(m_dfForcast[i].m_szHigh, ""); - else - { - CTemperature temp=CTemperature::CreateFromCelsius(atoi(iTmpStr)); - sprintf(m_dfForcast[i].m_szLow, "%2.0f", temp.ToLocale()); - } - - TiXmlElement *pDayTimeElement = pOneDayElement->FirstChildElement("part"); //grab the first day/night part (should be day) - if (pDayTimeElement) - { - if (i == 0 && (time.wHour < 7 || time.wHour >= 19)) //weather.com works on a 7am to 7pm basis so grab night if its late in the day - pDayTimeElement = pDayTimeElement->NextSiblingElement("part"); - - GetString(pDayTimeElement, "icon", iTmpStr, ""); //string cause i've seen it return N/A - if (strcmp(iTmpStr, "N/A") == 0) - sprintf(m_dfForcast[i].m_szIcon, "%s128x128/na.png", WEATHER_BASE_PATH); - else - sprintf(m_dfForcast[i].m_szIcon, "%s128x128/%s.png", WEATHER_BASE_PATH, iTmpStr); - - GetString(pDayTimeElement, "t", m_dfForcast[i].m_szOverview, ""); - LocalizeOverview(m_dfForcast[i].m_szOverview); - } - - pOneDayElement = pOneDayElement->NextSiblingElement("day"); - if (!pOneDayElement) - break; // No more days, break out - } - } - } - return true; -} - -//convert weather.com day strings into localized string id's -void CWeather::LocalizeDay(char *szDay) -{ - CStdString strLocDay; - - if (strcmp(szDay, "Monday") == 0) //monday is localized string 11 - strLocDay = g_localizeStrings.Get(11); - else if (strcmp(szDay, "Tuesday") == 0) - strLocDay = g_localizeStrings.Get(12); - else if (strcmp(szDay, "Wednesday") == 0) - strLocDay = g_localizeStrings.Get(13); - else if (strcmp(szDay, "Thursday") == 0) - strLocDay = g_localizeStrings.Get(14); - else if (strcmp(szDay, "Friday") == 0) - strLocDay = g_localizeStrings.Get(15); - else if (strcmp(szDay, "Saturday") == 0) - strLocDay = g_localizeStrings.Get(16); - else if (strcmp(szDay, "Sunday") == 0) - strLocDay = g_localizeStrings.Get(17); - else - strLocDay = ""; - - strcpy(szDay, strLocDay.GetBuffer(strLocDay.GetLength())); -} - - -void CWeather::LoadLocalizedToken() -{ - // We load the english strings in to get our tokens - CStdString strLanguagePath = "special://xbmc/language/English/strings.xml"; - - TiXmlDocument xmlDoc; - if (!xmlDoc.LoadFile(strLanguagePath) || !xmlDoc.RootElement()) - { - CLog::Log(LOGERROR, "Weather: unable to load %s: %s at line %d", strLanguagePath.c_str(), xmlDoc.ErrorDesc(), xmlDoc.ErrorRow()); - return; - } - - CStdString strEncoding; - XMLUtils::GetEncoding(&xmlDoc, strEncoding); - - TiXmlElement* pRootElement = xmlDoc.RootElement(); - if (pRootElement->Value() != CStdString("strings")) - return; - - const TiXmlElement *pChild = pRootElement->FirstChildElement(); - while (pChild) - { - CStdString strValue = pChild->Value(); - if (strValue == "string") - { // Load new style language file with id as attribute - const char* attrId = pChild->Attribute("id"); - if (attrId && !pChild->NoChildren()) - { - int id = atoi(attrId); - if ((LOCALIZED_TOKEN_FIRSTID <= id && id <= LOCALIZED_TOKEN_LASTID) || - (LOCALIZED_TOKEN_FIRSTID2 <= id && id <= LOCALIZED_TOKEN_LASTID2)) - { - CStdString utf8Label; - if (strEncoding.IsEmpty()) // Is language file utf8? - utf8Label=pChild->FirstChild()->Value(); - else - g_charsetConverter.stringCharsetToUtf8(strEncoding, pChild->FirstChild()->Value(), utf8Label); - - if (!utf8Label.IsEmpty()) - m_localizedTokens.insert(make_pair(utf8Label, id)); - } - } - } - pChild = pChild->NextSiblingElement(); - } -} - -bool CWeather::GetSearchResults(const CStdString &strSearch, CStdString &strResult) -{ - // Check to see if the user entered a weather.com code - if (strSearch.size() == 8) - { - strResult = ""; - int i = 0; - for (i = 0; i < 4; ++i) - { - strResult += toupper(strSearch[i]); - if (!isalpha(strSearch[i])) - break; - } - if (i == 4) - { - for ( ; i < 8; ++i) - { - strResult += strSearch[i]; - if (!isdigit(strSearch[i])) - break; - } - if (i == 8) - { - return true; // match - } - } - // no match, wipe string - strResult = ""; - } - - CGUIDialogSelect *pDlgSelect = (CGUIDialogSelect*)g_windowManager.GetWindow(WINDOW_DIALOG_SELECT); - CGUIDialogProgress *pDlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); - - //do the download - CStdString strURL; - CStdString strXML; - XFILE::CFileCurl httpUtil; - - if (pDlgProgress) - { - pDlgProgress->SetHeading(410); //"Accessing Weather.com" - pDlgProgress->SetLine(0, 194); //"Searching" - pDlgProgress->SetLine(1, strSearch); - pDlgProgress->SetLine(2, ""); - pDlgProgress->StartModal(); - pDlgProgress->Progress(); - } - - strURL.Format("http://xoap.weather.com/search/search?where=%s", strSearch); - - if (!httpUtil.Get(strURL, strXML)) - { - if (pDlgProgress) - pDlgProgress->Close(); - return false; - } - - //some select dialog init stuff - if (!pDlgSelect) - { - if (pDlgProgress) - pDlgProgress->Close(); - return false; - } - - pDlgSelect->SetHeading(396); //"Select Location" - pDlgSelect->Reset(); - - /////////////////////////////// - // load the xml file - /////////////////////////////// - TiXmlDocument xmlDoc; - xmlDoc.Parse(strXML.c_str()); - if (xmlDoc.Error()) - return false; - - TiXmlElement *pRootElement = xmlDoc.RootElement(); - if (pRootElement) - { - CStdString strItemTmp; - TiXmlElement *pElement = pRootElement->FirstChildElement("loc"); - while (pElement) - { - if (!pElement->NoChildren()) - { - strItemTmp.Format("%s - %s", pElement->Attribute("id"), pElement->FirstChild()->Value()); - pDlgSelect->Add(strItemTmp); - } - pElement = pElement->NextSiblingElement("loc"); - } - } - - if (pDlgProgress) - pDlgProgress->Close(); - - pDlgSelect->EnableButton(TRUE); - pDlgSelect->SetButtonLabel(222); //'Cancel' button returns to weather settings - pDlgSelect->DoModal(); - - if (pDlgSelect->GetSelectedLabel() < 0) - { - if (pDlgSelect->IsButtonPressed()) - { - pDlgSelect->Close(); //close the select dialog and return to weather settings - return true; - } - } - - //copy the selected code into the settings - if (pDlgSelect->GetSelectedLabel() >= 0) - strResult = pDlgSelect->GetSelectedLabelText(); - - if (pDlgProgress) - pDlgProgress->Close(); - - return true; -} - -const char *CWeather::BusyInfo(int info) -{ - if (info == WEATHER_IMAGE_CURRENT_ICON) - { - sprintf(m_szNAIcon,"%s128x128/na.png", WEATHER_BASE_PATH); - return m_szNAIcon; - } - return CInfoLoader::BusyInfo(info); -} - const char *CWeather::TranslateInfo(int info) { if (info == WEATHER_LABEL_CURRENT_COND) return m_szCurrentConditions; else if (info == WEATHER_IMAGE_CURRENT_ICON) return m_szCurrentIcon; else if (info == WEATHER_LABEL_CURRENT_TEMP) return m_szCurrentTemperature; - else if (info == WEATHER_LABEL_CURRENT_FEEL) return m_szCurrentFeelsLike; - else if (info == WEATHER_LABEL_CURRENT_UVID) return m_szCurrentUVIndex; - else if (info == WEATHER_LABEL_CURRENT_WIND) return m_szCurrentWind; - else if (info == WEATHER_LABEL_CURRENT_DEWP) return m_szCurrentDewPoint; - else if (info == WEATHER_LABEL_CURRENT_HUMI) return m_szCurrentHumidity; - else if (info == WEATHER_LABEL_LOCATION) return m_szLocation[m_iCurWeather]; + else if (info == WEATHER_LABEL_LOCATION) return m_szCurrentLocation; return ""; } DWORD CWeather::TimeToNextRefreshInMs() -{ // 15 minutes - return 15 * 60 * 1000; +{ // 10 minutes + return 10 * 60 * 1000; } -CStdString CWeather::GetAreaCity(const CStdString &codeAndCity) const -{ - CStdString areaCode(codeAndCity); - int pos = areaCode.Find(" - "); - if (pos >= 0) - areaCode = areaCode.Mid(pos + 3); - return areaCode; -} - -CStdString CWeather::GetAreaCode(const CStdString &codeAndCity) const -{ - CStdString areaCode(codeAndCity); - int pos = areaCode.Find(" - "); - if (pos >= 0) - areaCode = areaCode.Left(pos); - return areaCode; -} - char *CWeather::GetLocation(int iLocation) { if (strlen(m_szLocation[iLocation]) == 0) @@ -724,26 +86,12 @@ void CWeather::Reset() { - strcpy(m_szLastUpdateTime, ""); + strcpy(m_szLastUpdateTime, "false"); strcpy(m_szCurrentIcon,""); strcpy(m_szCurrentConditions, ""); strcpy(m_szCurrentTemperature, ""); - strcpy(m_szCurrentFeelsLike, ""); + strcpy(m_szCurrentLocation, ""); - strcpy(m_szCurrentWind, ""); - strcpy(m_szCurrentHumidity, ""); - strcpy(m_szCurrentUVIndex, ""); - strcpy(m_szCurrentDewPoint, ""); - - //loop here as well - for (int i = 0; i < NUM_DAYS; i++) - { - strcat(m_dfForcast[i].m_szIcon,""); - strcpy(m_dfForcast[i].m_szOverview, ""); - strcpy(m_dfForcast[i].m_szDay, ""); - strcpy(m_dfForcast[i].m_szHigh, ""); - strcpy(m_dfForcast[i].m_szLow, ""); - } for (int i = 0; i < MAX_LOCATION; i++) { strcpy(m_szLocation[i], ""); @@ -755,6 +103,23 @@ { // call GetInfo() to make sure that we actually start up GetInfo(0); - return (0 != *m_szLastUpdateTime); + SetInfo(); + return (strcmp(m_szLastUpdateTime, "true") == 0); } +void CWeather::SetInfo() +{ + if (strcmp(m_szLastUpdateTime, "false") == 0 || strcmp(m_szLastUpdateTime, "") == 0) + { + CGUIWindow *window = g_windowManager.GetWindow(WINDOW_WEATHER); + if (window) + { + // set these so existing weather infolabels don't break + strcpy(m_szLastUpdateTime, ((CGUIMediaWindow*)window)->GetProperty("Weather.IsFetched").c_str()); + strcpy(m_szCurrentIcon, ((CGUIMediaWindow*)window)->GetProperty("Current.ConditionIcon").c_str()); + strcpy(m_szCurrentConditions, ((CGUIMediaWindow*)window)->GetProperty("Current.Condition").c_str()); + strcpy(m_szCurrentTemperature, ((CGUIMediaWindow*)window)->GetProperty("Current.Condition").c_str()); + strcpy(m_szCurrentLocation, ((CGUIMediaWindow*)window)->GetProperty("Location").c_str()); + } + } +} Index: xbmc/utils/Weather.h =================================================================== --- xbmc/utils/Weather.h (revision 30773) +++ xbmc/utils/Weather.h (working copy) @@ -23,36 +23,16 @@ #include "InfoLoader.h" -class TiXmlElement; - #define WEATHER_LABEL_LOCATION 10 #define WEATHER_IMAGE_CURRENT_ICON 21 #define WEATHER_LABEL_CURRENT_COND 22 #define WEATHER_LABEL_CURRENT_TEMP 23 -#define WEATHER_LABEL_CURRENT_FEEL 24 -#define WEATHER_LABEL_CURRENT_UVID 25 -#define WEATHER_LABEL_CURRENT_WIND 26 -#define WEATHER_LABEL_CURRENT_DEWP 27 -#define WEATHER_LABEL_CURRENT_HUMI 28 -struct day_forcast -{ - char m_szIcon[256]; - char m_szOverview[256]; - char m_szDay[20]; - char m_szHigh[15]; - char m_szLow[15]; -}; -#define NUM_DAYS 4 - class CBackgroundWeatherLoader : public CBackgroundLoader { public: CBackgroundWeatherLoader(CInfoLoader *pCallback) : CBackgroundLoader(pCallback) {}; - -protected: - virtual void GetInformation(); }; class CWeather : public CInfoLoader @@ -60,37 +40,19 @@ public: CWeather(void); virtual ~CWeather(void); - static bool GetSearchResults(const CStdString &strSearch, CStdString &strResult); - bool LoadWeather(const CStdString& strWeatherFile); //parse strWeatherFile char *GetLocation(int iLocation); - char *GetLastUpdateTime() { return m_szLastUpdateTime; }; bool IsFetched(); void Reset(); void SetArea(int iArea) { m_iCurWeather = iArea; }; - int GetArea() const { return m_iCurWeather; }; - CStdString GetAreaCode(const CStdString &codeAndCity) const; - CStdString GetAreaCity(const CStdString &codeAndCity) const; unsigned int GetMaxLocations(); + void SetInfo(); - day_forcast m_dfForcast[NUM_DAYS]; - bool m_bImagesOkay; protected: virtual const char *TranslateInfo(int info); - virtual const char *BusyInfo(int info); virtual DWORD TimeToNextRefreshInMs(); - void GetString(const TiXmlElement* pRootElement, const CStdString& strTagName, char* szValue, const CStdString& strDefaultValue); - void GetInteger(const TiXmlElement* pRootElement, const CStdString& strTagName, int& iValue); - void LocalizeOverview(char *szStr); - void LocalizeOverviewToken(char *szStr, bool bAppendSpace = true); - void LocalizeDay(char *szDay); - void LoadLocalizedToken(); - int ConvertSpeed(int speed); - std::map m_localizedTokens; - typedef std::map::const_iterator ilocalizedTokens; - char m_szLocation[10][100]; // Last updated @@ -99,13 +61,7 @@ char m_szCurrentIcon[256]; char m_szCurrentConditions[256]; char m_szCurrentTemperature[10]; - char m_szCurrentFeelsLike[10]; - char m_szCurrentUVIndex[10]; - char m_szCurrentWind[256]; - char m_szCurrentDewPoint[10]; - char m_szCurrentHumidity[10]; - char m_szBusyString[256]; - char m_szNAIcon[256]; + char m_szCurrentLocation[256]; unsigned int m_iCurWeather; int m_MaxLocations;