source: titan/plugins/weather/weather.h @ 16512

Last change on this file since 16512 was 16512, checked in by nit, 8 years ago

[titan] update all plugins

File size: 13.8 KB
Line 
1#ifndef WEATHER_H
2#define WEATHER_H
3
4struct weather
5{
6        char* city;
7        char* date;
8        char* day0;
9        char* day0_low;
10        char* day0_high;
11        char* day0_condition;
12        char* day0_icon;
13        char* day0_temp;
14        char* day0_humidity;
15        char* day0_wind;
16        char* day1;
17        char* day1_low;
18        char* day1_high;
19        char* day1_condition;
20        char* day1_icon;
21        char* day2;
22        char* day2_low;
23        char* day2_high;
24        char* day2_condition;
25        char* day2_icon;
26        char* day3;
27        char* day3_low;
28        char* day3_high;
29        char* day3_condition;
30        char* day3_icon;
31};
32
33int writeweather(const char *filename, struct skin* listbox);
34
35char* readweather(const char* filename, struct skin* weather, struct skin* listbox)
36{
37        debug(1000, "in");
38        FILE *fd = NULL;
39        char *fileline = NULL;
40        char *location = NULL;
41        struct skin* tmp = NULL;
42        int len = 0;
43
44        if(weather == NULL || listbox == NULL) return NULL;
45
46        fileline = malloc(MINMALLOC);
47        if(fileline == NULL)
48        {
49                err("no memory");
50                return NULL;
51        }
52
53        fd = fopen(filename, "r");
54        if(fd == NULL)
55        {
56                perr("can't open %s", filename);
57                free(fileline);
58                return NULL;
59        }
60
61        while(fgets(fileline, MINMALLOC, fd) != NULL)
62        {
63                if(fileline[0] == '#' || fileline[0] == '\n')
64                        continue;
65                len = strlen(fileline) - 1;
66                if(len >= 0 && fileline[len] == '\n')
67                        fileline[len] = '\0';
68                len--;
69                if(len >= 0 && fileline[len] == '\r')
70                        fileline[len] = '\0';
71
72                tmp = addlistbox(weather, listbox, tmp, 1);
73                if(tmp != NULL)
74                {
75                        changetext(tmp, fileline);
76                        changename(tmp, fileline);
77                        if(location == NULL)
78                                location = ostrcat(location, fileline, 1, 0);
79                }
80
81        }
82
83        free(fileline);
84        fclose(fd);
85        return location;
86}
87
88void freeweather(struct weather* node)
89{
90        if(node == NULL) return;
91
92        free(node->city); node->city = NULL;
93        free(node->date); node->date = NULL;
94
95        free(node->day0); node->day0 = NULL;
96        free(node->day0_low); node->day0_low = NULL;
97        free(node->day0_high); node->day0_high = NULL;
98        free(node->day0_condition); node->day0_condition = NULL;
99        free(node->day0_icon); node->day0_icon = NULL;
100        free(node->day0_temp); node->day0_temp = NULL;
101        free(node->day0_humidity); node->day0_humidity = NULL;
102        free(node->day0_wind); node->day0_wind = NULL;
103
104        free(node->day1); node->day1 = NULL;
105        free(node->day1_low); node->day1_low = NULL;
106        free(node->day1_high); node->day1_high = NULL;
107        free(node->day1_condition); node->day1_condition = NULL;
108        free(node->day1_icon); node->day1_icon = NULL;
109
110        free(node->day2); node->day2 = NULL;
111        free(node->day2_low); node->day2_low = NULL;
112        free(node->day2_high); node->day2_high = NULL;
113        free(node->day2_condition); node->day2_condition = NULL;
114        free(node->day2_icon); node->day2_icon = NULL;
115
116        free(node->day3); node->day3 = NULL;
117        free(node->day3_low); node->day3_low = NULL;
118        free(node->day3_high); node->day3_high = NULL;
119        free(node->day3_condition); node->day3_condition = NULL;
120        free(node->day3_icon); node->day3_icon = NULL;
121
122        free(node); node = NULL;
123}
124
125struct weather* getweather(char* location)
126{
127        struct weather* weather = NULL;
128        char* tmpstr = NULL, *tmpstr1 = NULL, *tmpstr2 = NULL;
129        char* tmpsearch = NULL;
130
131        tmpsearch = ostrcat("ig/api?weather=", location, 0, 0);
132        //TODO: implement auto language (from titan.cfg)
133        tmpsearch = ostrcat(tmpsearch, "&hl=de", 1, 0);
134        tmpsearch = stringreplacechar(tmpsearch, ' ', '+');
135
136        tmpstr = gethttp("www.google.com", tmpsearch, 80, NULL, NULL, NULL, 0);
137
138        free(tmpsearch); tmpsearch = NULL;
139
140        if(tmpstr != NULL)
141        {
142                weather = (struct weather*)malloc(sizeof(struct weather));
143                if(weather == NULL)
144                {
145                        err("no mem");
146                        free(tmpstr); tmpstr = NULL;
147                        return NULL;
148                }
149                memset(weather, 0, sizeof(struct weather));
150
151                tmpstr1 = tmpstr;
152                tmpstr2 = tmpstr;
153
154                tmpstr2 = ostrstr(tmpstr1, "<forecast_information>");
155                if(tmpstr2 != NULL)
156                {
157                        tmpstr1 = tmpstr2 + 5;
158                        weather->date = getxmlentry(tmpstr2, "forecast_date data=");
159                        weather->city = getxmlentry(tmpstr2, "postal_code data=");
160                }
161
162                tmpstr2 = ostrstr(tmpstr1, "<current_conditions>");
163                if(tmpstr2 != NULL)
164                {
165                        tmpstr1 = tmpstr2 + 5;
166                        weather->day0_temp = getxmlentry(tmpstr2, "temp_c data=");
167                        weather->day0_humidity = getxmlentry(tmpstr2, "humidity data=");
168                        weather->day0_wind = getxmlentry(tmpstr2, "wind_condition data=");
169                }
170               
171                tmpstr2 = ostrstr(tmpstr1, "<forecast_conditions>");
172                if(tmpstr2 != NULL)
173                {
174                        tmpstr1 = tmpstr2 + 5;
175                        weather->day0 = getxmlentry(tmpstr2, "day_of_week data=");
176                        weather->day0_low = getxmlentry(tmpstr2, "low data=");
177                        weather->day0_high = getxmlentry(tmpstr2, "high data=");
178                        weather->day0_condition = getxmlentry(tmpstr2, "condition data=");
179                        weather->day0_icon = getxmlentry(tmpstr2, "icon data=");
180
181                }
182
183                tmpstr2 = ostrstr(tmpstr1, "<forecast_conditions>");
184                if(tmpstr2 != NULL)
185                {
186                        tmpstr1 = tmpstr2 + 5;
187                        weather->day1 = getxmlentry(tmpstr2, "day_of_week data=");
188                        weather->day1_low = getxmlentry(tmpstr2, "low data=");
189                        weather->day1_high = getxmlentry(tmpstr2, "high data=");
190                        weather->day1_condition = getxmlentry(tmpstr2, "condition data=");
191                        weather->day1_icon = getxmlentry(tmpstr2, "icon data=");
192
193                }
194
195                tmpstr2 = ostrstr(tmpstr1, "<forecast_conditions>");
196                if(tmpstr2 != NULL)
197                {
198                        tmpstr1 = tmpstr2 + 5;
199                        weather->day2 = getxmlentry(tmpstr2, "day_of_week data=");
200                        weather->day2_low = getxmlentry(tmpstr2, "low data=");
201                        weather->day2_high = getxmlentry(tmpstr2, "high data=");
202                        weather->day2_condition = getxmlentry(tmpstr2, "condition data=");
203                        weather->day2_icon = getxmlentry(tmpstr2, "icon data=");
204
205                }
206
207                tmpstr2 = ostrstr(tmpstr1, "<forecast_conditions>");
208                if(tmpstr2 != NULL)
209                {
210                        tmpstr1 = tmpstr2 + 5;
211                        weather->day3 = getxmlentry(tmpstr2, "day_of_week data=");
212                        weather->day3_low = getxmlentry(tmpstr2, "low data=");
213                        weather->day3_high = getxmlentry(tmpstr2, "high data=");
214                        weather->day3_condition = getxmlentry(tmpstr2, "condition data=");
215                        weather->day3_icon = getxmlentry(tmpstr2, "icon data=");
216
217                }
218
219                free(tmpstr); tmpstr = NULL;
220        }
221
222        return weather;
223}
224
225void changeweatherpic(struct skin* node, char* icon)
226{
227        if(node == NULL) return;
228
229        if(icon == NULL)
230                changepic(node, NULL);
231        else if(ostrstr(icon, "/sunny.gif") != NULL)
232                changepic(node, "%pluginpath%/weather/skin/sunny.png");
233        else if(ostrstr(icon, "/mostly_sunny.gif") != NULL)
234                changepic(node, "%pluginpath%/weather/skin/mostly_sunny.png");
235  else if(ostrstr(icon, "/chance_of_rain.gif") != NULL)
236                changepic(node, "%pluginpath%/weather/skin/chance_of_rain.png"); 
237  else if(ostrstr(icon, "/partly_cloudy.gif") != NULL)
238                changepic(node, "%pluginpath%/weather/skin/partly_cloudy.png");
239  else if(ostrstr(icon, "/mostly_cloudy.gif") != NULL)
240                changepic(node, "%pluginpath%/weather/skin/cloudy.png");
241  else if(ostrstr(icon, "/chance_of_storm.gif") != NULL)
242                changepic(node, "%pluginpath%/weather/skin/chance_of_storm.png");
243  else if(ostrstr(icon, "/showers.gif") != NULL)
244                changepic(node, "%pluginpath%/weather/skin/showers.png"); 
245  else if(ostrstr(icon, "/rain.gif") != NULL)
246                changepic(node, "%pluginpath%/weather/skin/rain.png");
247  else if(ostrstr(icon, "/chance_of_snow.gif") != NULL)
248                changepic(node, "%pluginpath%/weather/skin/chance_of_snow.png");
249  else if(ostrstr(icon, "/cloudy.gif") != NULL)
250                changepic(node, "%pluginpath%/weather/skin/cloudy.png");
251  else if(ostrstr(icon, "/storm.gif") != NULL)
252                changepic(node, "%pluginpath%/weather/skin/storm.png");
253  else if(ostrstr(icon, "/thunderstorm.gif") != NULL)
254                changepic(node, "%pluginpath%/weather/skin/storm.png");
255  else if(ostrstr(icon, "/chance_of_tstorm.gif") != NULL)
256                changepic(node, "%pluginpath%/weather/skin/chance_of_storm.png"); 
257  else if(ostrstr(icon, "/sleet.gif") != NULL)
258                changepic(node, "%pluginpath%/weather/skin/snow.png");
259  else if(ostrstr(icon, "/snow.gif") != NULL)
260                changepic(node, "%pluginpath%/weather/skin/snow.png");
261  else if(ostrstr(icon, "/icy.gif") != NULL)
262                changepic(node, "%pluginpath%/weather/skin/icy.png");
263  else if(ostrstr(icon, "/dust.gif") != NULL)
264                changepic(node, "%pluginpath%/weather/skin/fog.png"); 
265  else if(ostrstr(icon, "/fog.gif") != NULL)
266                changepic(node, "%pluginpath%/weather/skin/fog.png");
267  else if(ostrstr(icon, "/smoke.gif") != NULL)
268                changepic(node, "%pluginpath%/weather/skin/fog.png");
269  else if(ostrstr(icon, "/haze.gif") != NULL)
270                changepic(node, "%pluginpath%/weather/skin/fog.png");
271  else if(ostrstr(icon, "/flurries.gif") != NULL)
272                changepic(node, "%pluginpath%/weather/skin/flurries.png");
273}
274
275void screenweather()
276{
277        int rcret = 0;
278        struct skin* weather = getscreen("weather");
279        struct skin* listbox = getscreennode(weather, "listbox");
280        struct skin* date = getscreennode(weather, "date");
281        struct skin* day0 = getscreennode(weather, "day0");
282        struct skin* day0_low = getscreennode(weather, "day0_low");
283        struct skin* day0_high = getscreennode(weather, "day0_high");
284        struct skin* day0_condition = getscreennode(weather, "day0_condition");
285        struct skin* day0_icon = getscreennode(weather, "day0_icon");
286        struct skin* day1 = getscreennode(weather, "day1");
287        struct skin* day1_low = getscreennode(weather, "day1_low");
288        struct skin* day1_high = getscreennode(weather, "day1_high");
289        struct skin* day1_condition = getscreennode(weather, "day1_condition");
290        struct skin* day1_icon = getscreennode(weather, "day1_icon");
291        struct skin* day2 = getscreennode(weather, "day2");
292        struct skin* day2_low = getscreennode(weather, "day2_low");
293        struct skin* day2_high = getscreennode(weather, "day2_high");
294        struct skin* day2_condition = getscreennode(weather, "day2_condition");
295        struct skin* day2_icon = getscreennode(weather, "day2_icon");
296        struct skin* day3 = getscreennode(weather, "day3");
297        struct skin* day3_low = getscreennode(weather, "day3_low");
298        struct skin* day3_high = getscreennode(weather, "day3_high");
299        struct skin* day3_condition = getscreennode(weather, "day3_condition");
300        struct skin* day3_icon = getscreennode(weather, "day3_icon");
301        struct weather* node = NULL;
302        char* tmpstr = NULL, *location = NULL;
303
304        location = readweather(getconfig("weatherfile", NULL), weather, listbox);
305        addscreenrc(weather, listbox);
306
307start:
308
309        tmpstr = ostrcat(_("Weather"), " - ", 0, 0);
310        tmpstr = ostrcat(tmpstr, location, 1, 0);
311        changetitle(weather, tmpstr);
312        free(tmpstr); tmpstr = NULL;
313
314        node = getweather(location);
315        free(location); location = NULL;
316
317        if(node != NULL)
318        {
319                changetext(date, node->date);
320
321                tmpstr = ostrcat(_("Day: "), node->day0, 0, 0);
322                changetext(day0, tmpstr);
323                free(tmpstr); tmpstr = NULL;
324
325                tmpstr = ostrcat(_("Lowest temp: "), node->day0_low, 0, 0);
326                changetext(day0_low, tmpstr);
327                free(tmpstr); tmpstr = NULL;
328
329                tmpstr = ostrcat(_("Highest temp: "), node->day0_high, 0, 0);
330                changetext(day0_high, tmpstr);
331                free(tmpstr); tmpstr = NULL;
332
333                tmpstr = ostrcat(_("Condition: "), node->day0_condition, 0, 0);
334                changetext(day0_condition, tmpstr);
335                free(tmpstr); tmpstr = NULL;
336
337                changeweatherpic(day0_icon, node->day0_icon);
338
339                tmpstr = ostrcat(_("Day: "), node->day1, 0, 0);
340                changetext(day1, tmpstr);
341                free(tmpstr); tmpstr = NULL;
342
343                tmpstr = ostrcat(_("Lowest temp: "), node->day1_low, 0, 0);
344                changetext(day1_low, tmpstr);
345                free(tmpstr); tmpstr = NULL;
346
347                tmpstr = ostrcat(_("Highest temp: "), node->day1_high, 0, 0);
348                changetext(day1_high, tmpstr);
349                free(tmpstr); tmpstr = NULL;
350
351                tmpstr = ostrcat(_("Condition: "), node->day1_condition, 0, 0);
352                changetext(day1_condition, tmpstr);
353                free(tmpstr); tmpstr = NULL;
354
355                changeweatherpic(day1_icon, node->day1_icon);
356
357                tmpstr = ostrcat(_("Day: "), node->day2, 0, 0);
358                changetext(day2, tmpstr);
359                free(tmpstr); tmpstr = NULL;
360
361                tmpstr = ostrcat(_("Lowest temp: "), node->day2_low, 0, 0);
362                changetext(day2_low, tmpstr);
363                free(tmpstr); tmpstr = NULL;
364
365                tmpstr = ostrcat(_("Highest temp: "), node->day2_high, 0, 0);
366                changetext(day2_high, tmpstr);
367                free(tmpstr); tmpstr = NULL;
368
369                tmpstr = ostrcat(_("Condition: "), node->day2_condition, 0, 0);
370                changetext(day2_condition, tmpstr);
371                free(tmpstr); tmpstr = NULL;
372
373                changeweatherpic(day2_icon, node->day2_icon);
374
375                tmpstr = ostrcat(_("Day: "), node->day3, 0, 0);
376                changetext(day3, tmpstr);
377                free(tmpstr); tmpstr = NULL;
378
379                tmpstr = ostrcat(_("Lowest temp: "), node->day3_low, 0, 0);
380                changetext(day3_low, tmpstr);
381                free(tmpstr); tmpstr = NULL;
382
383                tmpstr = ostrcat(_("Highest temp: "), node->day3_high, 0, 0);
384                changetext(day3_high, tmpstr);
385                free(tmpstr); tmpstr = NULL;
386
387                tmpstr = ostrcat(_("Condition: "), node->day3_condition, 0, 0);
388                changetext(day3_condition, tmpstr);
389                free(tmpstr); tmpstr = NULL;
390
391                changeweatherpic(day3_icon, node->day3_icon);
392        }
393
394        drawscreen(weather, 0, 0);
395
396        while(1)
397        {
398                rcret = waitrc(weather, 0, 0);
399       
400                if(rcret == getrcconfigint("rcexit", NULL)) break;
401                if(rcret == getrcconfigint("rcok", NULL)) break;
402
403                if(rcret == getrcconfigint("rcred", NULL))
404    {
405                        free(location); location = NULL;
406                        location = textinput("Location", NULL);
407      if(location != NULL)
408      {
409                                struct skin* tmp = addlistbox(weather, listbox, NULL, 1);
410                                if(tmp != NULL)
411                                {
412                                        changetext(tmp, location);
413                                        changename(tmp, location);
414                                }
415      }
416      drawscreen(weather, 0, 0);
417                        if(location == NULL)
418                                continue;
419                        free(location); location = NULL;
420    }
421
422                if(rcret == getrcconfigint("rcyellow", NULL))
423                {
424                        writeweather(getconfig("weatherfile", NULL), listbox);
425                        continue;
426                }
427
428                if(listbox->select != NULL && rcret == getrcconfigint("rcgreen", NULL))
429                {
430                        delscreennode(weather, listbox->select->name);
431                        drawscreen(weather, 0, 0);
432                }
433
434                if(listbox->select != NULL)
435                {
436                        freeweather(node); node = NULL;
437                        location = ostrcat(location, listbox->select->text, 1, 0);
438                        goto start;
439                }
440        }
441
442        delownerrc(weather);
443        delmarkedscreennodes(weather, 1);
444        freeweather(node); node = NULL;
445        clearscreen(weather);
446}
447
448int writeweather(const char *filename, struct skin* listbox)
449{
450        debug(1000, "in");
451        FILE *fd = NULL;
452        struct skin* node = listbox;
453        int ret = 0;
454
455        fd = fopen(filename, "w");
456        if(fd == NULL)
457        {
458                perr("can't open %s", filename);
459                return 1;
460        }
461
462        while(node != NULL)
463        {
464                if(node->del == 1)
465                {
466                        ret = fprintf(fd, "%s\n", node->text);
467                        if(ret < 0)
468                        {
469                                perr("writting file %s", filename);
470                        }
471                }
472                node = node->next;
473        }
474
475        fclose(fd);
476        debug(1000, "out");
477        return 0;
478}
479
480#endif
Note: See TracBrowser for help on using the repository browser.