@ -1,9 +1,13 @@
# include <e.h>
# include "e_mod_main.h"
# include <json-c/json.h>
# define _XOPEN_SOURCE
# include <time.h>
# define FORECASTS 2
# define KM_TO_MI 1.609344
# define MB_TO_IN 68.946497518
# define MB_TO_IN 33.864
# define GOLDEN_RATIO 1.618033989
@ -370,7 +374,7 @@ _forecasts_config_item_get(const char *id)
ci - > id = eina_stringshare_add ( id ) ;
ci - > poll_time = 60.0 ;
ci - > degrees = DEGREES_C ;
ci - > host = eina_stringshare_add ( " query.yahooapis .com" ) ;
ci - > host = eina_stringshare_add ( " www.yahoo .com" ) ;
ci - > code = eina_stringshare_add ( " 839722 " ) ;
ci - > show_text = 1 ;
ci - > popup_on_hover = 1 ;
@ -424,7 +428,7 @@ e_modapi_init(E_Module *m)
ci = E_NEW ( Config_Item , 1 ) ;
ci - > poll_time = 60.0 ;
ci - > degrees = DEGREES_C ;
ci - > host = eina_stringshare_add ( " query.yahooapis .com" ) ;
ci - > host = eina_stringshare_add ( " www.yahoo .com" ) ;
ci - > code = eina_stringshare_add ( " 839722 " ) ;
ci - > id = eina_stringshare_add ( " 0 " ) ;
ci - > show_text = 1 ;
@ -580,7 +584,7 @@ _forecasts_cb_check(void *data)
proxy . host , proxy . port , inst ) ;
else
inst - > server =
ecore_con_server_connect ( ECORE_CON_REMOTE_NODELAY , inst - > ci - > host , 80 , inst ) ;
ecore_con_server_connect ( ECORE_CON_REMOTE_NODELAY | ECORE_CON_USE_MIXED , inst - > ci - > host , 443 , inst ) ;
if ( ! inst - > server ) return EINA_FALSE ;
return EINA_TRUE ;
@ -593,7 +597,6 @@ _forecasts_server_add(void *data, int type, void *event)
Ecore_Con_Event_Server_Add * ev ;
char buf [ 1024 ] ;
char forecast [ 1024 ] ;
char degrees ;
inst = data ;
if ( ! inst )
@ -603,13 +606,8 @@ _forecasts_server_add(void *data, int type, void *event)
if ( ( ! inst - > server ) | | ( inst - > server ! = ev - > server ) )
return EINA_TRUE ;
if ( inst - > ci - > degrees = = DEGREES_F )
degrees = ' f ' ;
else
degrees = ' c ' ;
snprintf ( forecast , sizeof ( forecast ) , " /v1/public/yql?q=select+%%2A+from+weather.forecast+where+woeid%%3D%s+and+u%%3D%%27%c%%27 " , inst - > ci - > code , degrees ) ;
snprintf ( buf , sizeof ( buf ) , " GET http://%s%s HTTP/1.1 \r \n "
snprintf ( forecast , sizeof ( forecast ) , " /news/_tdnews/api/resource/WeatherService;woeids=%s " , inst - > ci - > code ) ;
snprintf ( buf , sizeof ( buf ) - strlen ( forecast ) - ( strlen ( inst - > ci - > host ) * 2 ) , " GET https://%s%s HTTP/1.1 \r \n "
" Host: %s \r \n "
" Connection: close \r \n \r \n " ,
inst - > ci - > host , forecast , inst - > ci - > host ) ;
@ -647,7 +645,6 @@ _forecasts_server_data(void *data, int type, void *event)
{
Instance * inst ;
Ecore_Con_Event_Server_Data * ev ;
void * tmp ;
inst = data ;
ev = event ;
@ -663,12 +660,7 @@ _forecasts_parse(void *data)
{
Instance * inst ;
char * needle ;
char city [ 256 ] ;
char region [ 256 ] ;
char * region_ptr ;
char location [ 512 ] ;
float visibility ;
int i ;
int secs , i ;
inst = data ;
if ( ! inst )
@ -676,151 +668,71 @@ _forecasts_parse(void *data)
if ( ! inst - > buffer )
return 0 ;
/* Location */
needle = strstr ( eina_strbuf_string_get ( inst - > buffer ) , " <yweather:location " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " city= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %255[^ \" ] \" " , city ) ;
region [ 0 ] = ' \0 ' ;
needle = strstr ( needle , " region= \" " ) ;
/* get rid of HTTP headers */
needle = strstr ( eina_strbuf_string_get ( inst - > buffer ) , " \r \n \r \n " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %255[^ \" ] \" " , region ) ;
region_ptr = region ;
//get rid of leading white space
if ( region [ 0 ] = ' ' )
region_ptr + + ;
if ( strlen ( region_ptr ) )
snprintf ( location , 512 , " %s, %s " , city , region_ptr ) ;
else
snprintf ( location , 512 , " %s " , city ) ;
eina_stringshare_replace ( & inst - > location , location ) ;
/* Units */
needle = strstr ( eina_strbuf_string_get ( inst - > buffer ) , " <yweather:units " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " distance= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %2[^ \" ] \" " , inst - > units . distance ) ;
needle = strstr ( needle , " pressure= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %2[^ \" ] \" " , inst - > units . pressure ) ;
needle = strstr ( needle , " speed= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %4[^ \" ] \" " , inst - > units . speed ) ;
needle = strstr ( needle , " temperature= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %c \" " , & inst - > units . temp ) ;
needle + = 4 ;
/* parse data to json object */
json_object * obj_root = json_tokener_parse ( needle ) ;
json_object * obj_weathers = json_object_object_get ( obj_root , " weathers " ) ;
if ( json_object_get_type ( obj_weathers ) ! = json_type_array | | json_object_array_length ( obj_weathers ) ! = 1 )
goto error ;
json_object * obj_main = json_object_array_get_idx ( obj_weathers , 0 ) ;
/* we have data in imperial units by default, so set it accordingly */
inst - > units . temp = ' F ' ;
snprintf ( inst - > units . distance , 3 , " mi " ) ;
snprintf ( inst - > units . pressure , 3 , " in " ) ;
snprintf ( inst - > units . speed , 4 , " mph " ) ;
json_object * obj_location = json_object_object_get ( obj_main , " location " ) ;
eina_stringshare_replace ( & inst - > location , json_object_get_string ( json_object_object_get ( obj_location , " displayName " ) ) ) ;
json_object * obj_sunmoon = json_object_object_get ( obj_main , " sunAndMoon " ) ;
secs = json_object_get_int ( json_object_object_get ( obj_sunmoon , " sunrise " ) ) ;
snprintf ( inst - > details . astronomy . sunrise , 7 , " %02d:%02d " , secs / 3600 , ( secs % 3600 ) / 60 ) ;
secs = json_object_get_int ( json_object_object_get ( obj_sunmoon , " sunset " ) ) ;
snprintf ( inst - > details . astronomy . sunset , 7 , " %02d:%02d " , secs / 3600 , ( secs % 3600 ) / 60 ) ;
/* Current conditions */
needle = strstr ( eina_strbuf_string_get ( inst - > buffer ) , " <yweather:condition " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " code= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > condition . code ) ;
needle = strstr ( needle , " date= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %51[^ \" ] \" " , inst - > condition . update ) ;
needle = strstr ( needle , " temp= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > condition . temp ) ;
needle = strstr ( needle , " text= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %255[^ \" ] \" " , inst - > condition . desc ) ;
/* Details */
/* Wind */
needle = strstr ( eina_strbuf_string_get ( inst - > buffer ) , " <yweather:wind " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " chill= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > details . wind . chill ) ;
needle = strstr ( needle , " direction= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > details . wind . direction ) ;
needle = strstr ( needle , " speed= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > details . wind . speed ) ;
/* Atmosphere */
needle = strstr ( eina_strbuf_string_get ( inst - > buffer ) , " <yweather:atmosphere " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " humidity= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > details . atmosphere . humidity ) ;
needle = strstr ( needle , " pressure= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %f \" " , & inst - > details . atmosphere . pressure ) ;
needle = strstr ( needle , " rising= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > details . atmosphere . rising ) ;
needle = strstr ( needle , " visibility= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %f \" " , & visibility ) ;
inst - > details . atmosphere . visibility = visibility ;
/* Astronomy */
needle = strstr ( eina_strbuf_string_get ( inst - > buffer ) , " <yweather:astronomy " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " sunrise= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %8[^ \" ] \" " , inst - > details . astronomy . sunrise ) ;
needle = strstr ( needle , " sunset= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %8[^ \" ] \" " , inst - > details . astronomy . sunset ) ;
json_object * obj_observation = json_object_object_get ( obj_main , " observation " ) ;
inst - > details . atmosphere . pressure = json_object_get_double ( json_object_object_get ( obj_observation , " barometricPressure " ) ) ;
inst - > details . atmosphere . humidity = json_object_get_int ( json_object_object_get ( obj_observation , " humidity " ) ) ;
inst - > details . atmosphere . visibility = json_object_get_double ( json_object_object_get ( obj_observation , " visibility " ) ) ;
inst - > condition . code = json_object_get_int ( json_object_object_get ( obj_observation , " conditionCode " ) ) ;
strncpy ( inst - > condition . desc , json_object_get_string ( json_object_object_get ( obj_observation , " conditionDescription " ) ) , 255 ) ;
inst - > details . wind . direction = json_object_get_int ( json_object_object_get ( obj_observation , " windDirection " ) ) ;
inst - > details . wind . speed = json_object_get_int ( json_object_object_get ( obj_observation , " windSpeed " ) ) ;
json_object * obj_observation_temp = json_object_object_get ( obj_observation , " temperature " ) ;
inst - > condition . temp = json_object_get_int ( json_object_object_get ( obj_observation_temp , " now " ) ) ;
inst - > details . wind . chill = json_object_get_int ( json_object_object_get ( obj_observation_temp , " feelsLike " ) ) ;
json_object * obj_observation_time = json_object_object_get ( obj_observation , " observationTime " ) ;
strncpy ( inst - > condition . update , json_object_get_string ( json_object_object_get ( obj_observation_time , " timestamp " ) ) , 51 ) ;
/* Forecasts */
for ( i = 0 ; i < FORECASTS ; i + + )
{
needle = strstr ( needle , " <yweather:forecast " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " code= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > forecast [ i ] . code ) ;
needle = strstr ( needle , " date= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %12[^ \" ] \" " , inst - > forecast [ i ] . date ) ;
needle = strstr ( needle , " day= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %4[^ \" ] \" " , inst - > forecast [ i ] . day ) ;
needle = strstr ( needle , " high= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > forecast [ i ] . high ) ;
needle = strstr ( needle , " low= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %d \" " , & inst - > forecast [ i ] . low ) ;
needle = strstr ( needle , " text= \" " ) ;
if ( ! needle ) goto error ;
needle = strstr ( needle , " \" " ) ;
sscanf ( needle , " \" %255[^ \" ] \" " , inst - > forecast [ i ] . desc ) ;
}
json_object * obj_forecasts = json_object_object_get ( obj_main , " forecasts " ) ;
json_object * obj_forecasts_daily = json_object_object_get ( obj_forecasts , " daily " ) ;
for ( i = 0 ; i < FORECASTS ; i + + ) {
json_object * obj_forecast = json_object_array_get_idx ( obj_forecasts_daily , i ) ;
inst - > forecast [ i ] . code = json_object_get_int ( json_object_object_get ( obj_forecast , " conditionCode " ) ) ;
strncpy ( inst - > forecast [ i ] . desc , json_object_get_string ( json_object_object_get ( obj_forecast , " conditionDescription " ) ) , 255 ) ;
json_object * obj_observation_time = json_object_object_get ( obj_forecast , " observationTime " ) ;
strncpy ( inst - > forecast [ i ] . day , json_object_get_string ( json_object_object_get ( obj_observation_time , " day " ) ) , 3 ) ;
struct tm tm ;
memset ( & tm , 0 , sizeof ( struct tm ) ) ;
strptime ( json_object_get_string ( json_object_object_get ( obj_observation_time , " timestamp " ) ) , " %Y-%m-%dT%H:%M:%S " , & tm ) ;
strftime ( inst - > forecast [ i ] . date , 12 , " %d %b %Y " , & tm ) ;
json_object * obj_observation_temp = json_object_object_get ( obj_forecast , " temperature " ) ;
inst - > forecast [ i ] . high = json_object_get_int ( json_object_object_get ( obj_observation_temp , " high " ) ) ;
inst - > forecast [ i ] . low = json_object_get_int ( json_object_object_get ( obj_observation_temp , " low " ) ) ;
}
json_object_put ( obj_root ) ;
return 1 ;
error :