Enlightenment CVS committal Author : kiwi Project : e_modules Module : news
Dir : e_modules/news/src/module Modified Files: e_mod_main.c news_config_dialog_feed.c news_config_dialog_langs.c news_feed.c news_feed.h news_menu.c news_parse.c news_parse_rss.c news_viewer.c Log Message: Fixes, support more feeds, display parse errors ... Note : ATOM feeds do NOT work for the moment ! Please report to [EMAIL PROTECTED] if you have RSS feeds that doesnt not work If you have feeds that you want to see in the default configuration, you can send me an email too. I want News to have many feeds, in many different languages by default. * [parse] handle feeds with no title / no date / no link / no description * [parse] fix parse with rss version 0.91 * [dialog] feed: fix select default language * [viewer] better display of feeds with no date / no description * [viewer] simple click on content opens browser, and show a message 'click here to open in browser' * [viewer] display if there where errors during parse, and where to report, or if the feed is ATOM and not supported yet =================================================================== RCS file: /cvs/e/e_modules/news/src/module/e_mod_main.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- e_mod_main.c 16 May 2007 12:06:03 -0000 1.1 +++ e_mod_main.c 17 May 2007 14:21:29 -0000 1.2 @@ -104,7 +104,7 @@ e_modapi_about(E_Module *m) { news_util_message_show(_("Module to display information feeds<br>" - "like Rss or Atom, on youre desktop<br><br>" + "like Rss (and soon Atom), on youre desktop<br><br>" "[EMAIL PROTECTED]<br>" "http://oooo.zapto.org")); return 1; =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_config_dialog_feed.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_config_dialog_feed.c 16 May 2007 12:06:03 -0000 1.1 +++ news_config_dialog_feed.c 17 May 2007 14:21:29 -0000 1.2 @@ -204,6 +204,8 @@ e_widget_ilist_selected_set(ilist, pos_to_select); else e_widget_ilist_selected_set(ilist, 0); + _cb_lang_change(cfdata, NULL); + e_widget_min_size_get(ilist, &w, NULL); e_widget_min_size_set(ilist, w, 110); =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_config_dialog_langs.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_config_dialog_langs.c 16 May 2007 12:06:03 -0000 1.1 +++ news_config_dialog_langs.c 17 May 2007 14:21:29 -0000 1.2 @@ -1,5 +1,7 @@ #include "News.h" +#define DIALOG_CLASS "_e_mod_news_config_dialog_langs" + struct _Lang_Choice { News_Feed_Lang *lang; @@ -30,6 +32,9 @@ E_Config_Dialog *cfd; E_Config_Dialog_View *v; + if (e_config_dialog_find("E", DIALOG_CLASS)) + return 0; + v = E_NEW(E_Config_Dialog_View, 1); v->create_cfdata = _create_data; @@ -38,7 +43,7 @@ cfd = e_config_dialog_new(e_container_current_get(e_manager_current_get()), _("News Feeds Language Configuration"), - "E", "_e_mod_news_config_dialog_langs", + "E", DIALOG_CLASS, news->theme, 0, v, NULL); return 1; } =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_feed.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_feed.c 16 May 2007 12:06:03 -0000 1.1 +++ news_feed.c 17 May 2007 14:21:29 -0000 1.2 @@ -300,10 +300,10 @@ if ( f2 && (f != f2) ) { news_util_message_error_show(_("A feed with the <hilight>name</hilight> %s <hilight>already exists</hilight><br>" - "in the %s category<br/><br/>" - "Its not possible to have feeds with the same name<br/>" + "in the %s category<br><br>" + "Its not possible to have feeds with the same name<br>" "in one category."), - f->name, f->category->name); + name, category->name); return 0; } if (!language || !language[0]) @@ -1081,21 +1081,15 @@ static char * _get_host_from_url(const char *url) { - char *host; - char *tmp, *p; + char *host, *p; + char buf[4096]; - if (strncmp(url, "http://", 7)) + strncpy(buf, url, sizeof(buf)); + if (strncmp(buf, "http://", 7)) return NULL; - tmp = strdup(url + 7); - p = strchr(tmp, '/'); - if (!p) - { - free(tmp); - return NULL; - } - *p = '\0'; - host = strdup(tmp); - free(tmp); + p = strchr(buf+7, '/'); + if (p) *p = '\0'; + host = strdup(buf+7); return host; } @@ -1103,8 +1097,7 @@ static char * _get_file_from_url(const char *url) { - char *file; - char *p; + char *file, *p; p = strstr(url, "://"); if (!p) @@ -1112,9 +1105,9 @@ p += 3; p = strstr(p, "/"); if (!p) - return NULL; - - file = strdup(p); + file = strdup("/"); + else + file = strdup(p); return file; } @@ -1307,6 +1300,7 @@ doc->parse.last_time = ecore_time_get(); //TODO with popups + doc->parse.error = error; switch(error) { case NEWS_PARSE_ERROR_NO: =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_feed.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_feed.h 16 May 2007 12:06:03 -0000 1.1 +++ news_feed.h 17 May 2007 14:21:29 -0000 1.2 @@ -279,9 +279,10 @@ const char *meta_date; const char *charset; - News_Parse *parser; - int got_infos : 1; - time_t last_time; + News_Parse *parser; + int got_infos : 1; + time_t last_time; + News_Parse_Error error; } parse; }; =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_menu.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_menu.c 16 May 2007 12:06:03 -0000 1.1 +++ news_menu.c 17 May 2007 14:21:29 -0000 1.2 @@ -207,7 +207,6 @@ _cb_configure_main(void *data, E_Menu *m, E_Menu_Item *mi) { if (!news) return; - if (news->config_dialog) return; news_config_dialog_show(); } @@ -216,7 +215,6 @@ _cb_configure_feeds(void *data, E_Menu *m, E_Menu_Item *mi) { if (!news) return; - if (news->config_dialog_feeds) return; news_config_dialog_feeds_show(); } =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_parse.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_parse.c 16 May 2007 12:06:03 -0000 1.1 +++ news_parse.c 17 May 2007 14:21:29 -0000 1.2 @@ -284,6 +284,7 @@ { doc->parse.type = NEWS_FEED_TYPE_ATOM; doc->parse.version = 1.0; + return 1; } doc->parse.type = NEWS_FEED_TYPE_UNKNOWN; =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_parse_rss.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_parse_rss.c 16 May 2007 12:06:03 -0000 1.1 +++ news_parse_rss.c 17 May 2007 14:21:29 -0000 1.2 @@ -42,6 +42,8 @@ parser = data; + //DD(("%d", parser->oc.action)); + switch(parser->oc.action) { case NEWS_PARSE_OC_DETECT_METAS: @@ -101,7 +103,7 @@ } /* error returned */ - if (err) + if (err) //FIXME: != NEWS_PARSE_ERROR_TYPE_NO { parser->error = err; parser->oc.action = NEWS_PARSE_OC_END; @@ -142,7 +144,7 @@ { News_Feed *feed; News_Feed_Document *doc; - int ver; + float ver; doc = parser->doc; feed = doc->feed; @@ -334,20 +336,18 @@ pos = parser->buffer_pos; p1 = strstr(pos, "<title"); - p2 = news_parse_meta_block_find(&p1); - if (!p2) return NEWS_PARSE_ERROR_BROKEN_FEED; - - if (p2 < art->pos_end) + if (p1 && (p1 < art->pos_end)) { + p2 = news_parse_meta_block_find(&p1); + if (!p2 || (p2 > art->pos_end)) + return NEWS_PARSE_ERROR_BROKEN_FEED; len = p2 - p1; art->title = E_NEW(char, len+1); memcpy(art->title, p1, len); art->title[len] = '\0'; } else - { - art->title = strdup("No title"); - } + art->title = strdup("No title"); return NEWS_PARSE_ERROR_NO; } @@ -365,52 +365,53 @@ pos = parser->buffer_pos; p1 = strstr(pos, parser->doc->parse.meta_date); - p2 = news_parse_meta_block_find(&p1); - if (!p2) return NEWS_PARSE_ERROR_BROKEN_FEED; - if (p2 >= art->pos_end) return NEWS_PARSE_ERROR_BROKEN_FEED; - - len = p2 - p1; - date = p1; - tm = &art->date; - DD(("DATE LEN %d", len)); - - if ((parser->doc->parse.version == 1.0) && - (len >= 22)) - { - sscanf(date, "%4d", &i); - tm->tm_year = i - 1900; - sscanf(date+5, "%2d", &tm->tm_mon); - tm->tm_mon--; /* tm works with 0-11 */ - sscanf(date+8, "%2d", &tm->tm_mday); - sscanf(date+11, "%2d", &tm->tm_hour); - sscanf(date+14, "%2d", &tm->tm_min); - if (date[16] == ':') /* seconds are precised ? */ - sscanf(date+17, "%2d", &tm->tm_sec); - else - tm->tm_sec = 0; - DD(("DATE seconds %d", tm->tm_sec)); - } - else if (len >= 25) + if (p1 && (p1 < art->pos_end)) { - sscanf(date+5, "%2d", &tm->tm_mday); - if (!strncmp(date+8, "Jan", 3)) tm->tm_mon = 0; - else if (!strncmp(date+8, "Feb", 3)) tm->tm_mon = 1; - else if (!strncmp(date+8, "Mar", 3)) tm->tm_mon = 2; - else if (!strncmp(date+8, "Apr", 3)) tm->tm_mon = 3; - else if (!strncmp(date+8, "May", 3)) tm->tm_mon = 4; - else if (!strncmp(date+8, "Jun", 3)) tm->tm_mon = 5; - else if (!strncmp(date+8, "Jul", 3)) tm->tm_mon = 6; - else if (!strncmp(date+8, "Aug", 3)) tm->tm_mon = 7; - else if (!strncmp(date+8, "Sep", 3)) tm->tm_mon = 8; - else if (!strncmp(date+8, "Oct", 3)) tm->tm_mon = 9; - else if (!strncmp(date+8, "Nov", 3)) tm->tm_mon = 10; - else if (!strncmp(date+8, "Dec", 3)) tm->tm_mon = 11; - else tm->tm_mon = 0; - sscanf(date+12, "%4d", &i); - tm->tm_year = i - 1900; - sscanf(date+17, "%2d", &tm->tm_hour); - sscanf(date+20, "%2d", &tm->tm_min); - sscanf(date+23, "%2d", &tm->tm_sec); + p2 = news_parse_meta_block_find(&p1); + if (!p2 || p2 > art->pos_end) + return NEWS_PARSE_ERROR_BROKEN_FEED; + + len = p2 - p1; + date = p1; + tm = &art->date; + + if ((parser->doc->parse.version == 1.0) && + (len >= 22)) + { + sscanf(date, "%4d", &i); + tm->tm_year = i - 1900; + sscanf(date+5, "%2d", &tm->tm_mon); + tm->tm_mon--; /* tm works with 0-11 */ + sscanf(date+8, "%2d", &tm->tm_mday); + sscanf(date+11, "%2d", &tm->tm_hour); + sscanf(date+14, "%2d", &tm->tm_min); + if (date[16] == ':') /* seconds are precised ? */ + sscanf(date+17, "%2d", &tm->tm_sec); + else + tm->tm_sec = 0; + } + else if (len >= 25) + { + sscanf(date+5, "%2d", &tm->tm_mday); + if (!strncmp(date+8, "Jan", 3)) tm->tm_mon = 0; + else if (!strncmp(date+8, "Feb", 3)) tm->tm_mon = 1; + else if (!strncmp(date+8, "Mar", 3)) tm->tm_mon = 2; + else if (!strncmp(date+8, "Apr", 3)) tm->tm_mon = 3; + else if (!strncmp(date+8, "May", 3)) tm->tm_mon = 4; + else if (!strncmp(date+8, "Jun", 3)) tm->tm_mon = 5; + else if (!strncmp(date+8, "Jul", 3)) tm->tm_mon = 6; + else if (!strncmp(date+8, "Aug", 3)) tm->tm_mon = 7; + else if (!strncmp(date+8, "Sep", 3)) tm->tm_mon = 8; + else if (!strncmp(date+8, "Oct", 3)) tm->tm_mon = 9; + else if (!strncmp(date+8, "Nov", 3)) tm->tm_mon = 10; + else if (!strncmp(date+8, "Dec", 3)) tm->tm_mon = 11; + else tm->tm_mon = 0; + sscanf(date+12, "%4d", &i); + tm->tm_year = i - 1900; + sscanf(date+17, "%2d", &tm->tm_hour); + sscanf(date+20, "%2d", &tm->tm_min); + sscanf(date+23, "%2d", &tm->tm_sec); + } } return NEWS_PARSE_ERROR_NO; @@ -436,20 +437,16 @@ pos = parser->buffer_pos; p1 = strstr(pos, "<link"); - p2 = news_parse_meta_block_find(&p1); - if (!p2) return NEWS_PARSE_ERROR_BROKEN_FEED; - - if (p2 < art->pos_end) + if (p1 && (p1 < art->pos_end)) { + p2 = news_parse_meta_block_find(&p1); + if (!p2 || (p2 > art->pos_end)) + return NEWS_PARSE_ERROR_BROKEN_FEED; len = p2 - p1; art->url = E_NEW(char, len+1); memcpy(art->url, p1, len); art->url[len] = '\0'; } - else - { - art->url = strdup("No link"); - } return NEWS_PARSE_ERROR_NO; } @@ -466,19 +463,15 @@ pos = parser->buffer_pos; p1 = strstr(pos, "<description"); - p2 = news_parse_meta_block_find(&p1); - if (!p2) return NEWS_PARSE_ERROR_BROKEN_FEED; - - if (p2 < art->pos_end) + if (p1 && (p1 < art->pos_end)) { + p2 = news_parse_meta_block_find(&p1); + if (!p2 || (p2 > art->pos_end)) + return NEWS_PARSE_ERROR_BROKEN_FEED; len = p2 - p1; art->description = E_NEW(char, len+1); memcpy(art->description, p1, len); art->description[len] = '\0'; - } - else - { - art->description = strdup("No content"); } return NEWS_PARSE_ERROR_NO; =================================================================== RCS file: /cvs/e/e_modules/news/src/module/news_viewer.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- news_viewer.c 16 May 2007 12:06:03 -0000 1.1 +++ news_viewer.c 17 May 2007 14:21:29 -0000 1.2 @@ -591,15 +591,18 @@ DD(("TRIGGERED cb article ilist (%s)", art->title)); nv->varticles.selected = art; - strftime(buf_date, sizeof(buf_date), "%Y-%m-%d %H:%M:%S", &art->date); + if (art->date.tm_year != 0) + strftime(buf_date, sizeof(buf_date), "%Y-%m-%d %H:%M:%S", &art->date); snprintf(buf, sizeof(buf), "<underline=on underline_color=%s>%s</><br>" "%s<br><br>" - "%s<br><br>", + "%s<br><br>" + "%s", news->config->viewer.vcontent.font_color, (art->title && art->title[0]) ? art->title : "No title", buf_date, - (art->description && art->description[0])? art->description : "No description text"); + (art->description && art->description[0])? art->description : "No description text", + (art->url) ? "||click here to open article in a browser||" : ""); _vcontent_text_set(nv, buf); if (art->unread) @@ -747,11 +750,12 @@ { News_Feed_Article *art; char label[4096]; - char buf_date[4096] = "-- --:--"; + char buf_date[4096] = ""; art = l->data; /* append the article to the article ilist */ - strftime(buf_date, sizeof(buf_date), "%d %H:%M", &art->date); + if (art->date.tm_year) + strftime(buf_date, sizeof(buf_date), "%d %H:%M", &art->date); snprintf(label, sizeof(label), "%s %s", buf_date, art->title); e_widget_ilist_append(ilist, _article_icon_get(art, evas_object_evas_get(ilist)), label, @@ -810,6 +814,7 @@ _vcontent_feed_infos_set(News_Viewer *nv) { News_Feed *f; + char buf_error[1024] = ""; char buf_infos[1024] = ""; char buf_conn[200] = ""; char buf_unread[1024] = "No unread articles"; @@ -821,6 +826,18 @@ if (f->doc) { + switch(f->doc->parse.error) + { + case NEWS_PARSE_ERROR_NO: + case NEWS_PARSE_ERROR_NOT_IMPLEMENTED: + break; + case NEWS_PARSE_ERROR_BROKEN_FEED: + case NEWS_PARSE_ERROR_TYPE_UNKNOWN: + snprintf(buf_error, sizeof(buf_error), + "<br><color=#ff0000>An error happend during the parse of this feed !<br>" + "You can report error at [EMAIL PROTECTED] to get it fixed</><br><br>"); + break; + } if (f->doc->parse.last_time) { char buf_mtime[200]; @@ -831,7 +848,7 @@ case NEWS_FEED_TYPE_RSS: type = "RSS"; break; case NEWS_FEED_TYPE_ATOM: - type = "ATOM"; break; + type = "ATOM <color=#ff0000>(not supported for now)</>"; break; default: type = "UNKNOWN"; } @@ -865,12 +882,14 @@ } snprintf(buf, sizeof(buf), "<underline=on underline_color=%s>%s</> <i>in %s</i><br>" + "%s" "%s<br><br>" "%s%s<br>" "%s", news->config->viewer.vcontent.font_color, f->name, f->category->name, + buf_error, (f->description && f->description[0]) ? f->description : "No description for this feed", buf_infos, buf_conn, buf_unread); @@ -886,20 +905,16 @@ nv = data; ev = event_info; - if (ev->flags == EVAS_BUTTON_DOUBLE_CLICK) + if (nv->varticles.selected) { - if (nv->varticles.selected) - { - if (nv->varticles.selected->url) - news_util_browser_open(nv->varticles.selected->url); - } - else if (nv->vfeeds.selected) - { - if (nv->vfeeds.selected->url_home) - news_util_browser_open(nv->vfeeds.selected->url_home); - } + if (nv->varticles.selected->url) + news_util_browser_open(nv->varticles.selected->url); + } + else if (nv->vfeeds.selected) + { + if (nv->vfeeds.selected->url_home) + news_util_browser_open(nv->vfeeds.selected->url_home); } - } static Evas_Object * ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs