* [parse] better handle for html chars (not finished)

* [parse] speed optimisations
 * [dialog] feeds/feed: better ui
 * [dialog] feeds: fix moving feeds up and down
 * [dialog] item: fix po problem
 * [dialog/viewer] fix reselect item on ilist refresh


SVN revision: 30050
This commit is contained in:
kiwi 2007-05-21 12:30:41 +00:00 committed by kiwi
parent 7f90441a22
commit 293bae0b7e
12 changed files with 216 additions and 171 deletions

20
TODO
View File

@ -4,13 +4,31 @@ make install CFLAGS="-g -Wall -Werror -DDEBUG -DDEBUG_MAIN -DDEBUG_CONFIG -DDEBU
BUGS
----------------------------------------------------
- X - ? rarely, on viewer open, it crashes in news_viewer_refresh, on e_icon_file_set (in evas engine loader func)
the evas object seems ok, the string passed to the loader too ...
----------------------------------------------------
FEEDS TO ADD
----------------------------------------------------
<skyghis> sinon pur les feeds humour : http://www.lelombrik.net/ http://www.bashfr.org/
<skyghis> pour les feeds info tech: clubic pcimpact
mails juan
mails ludger
----------------------------------------------------
NEEDED (to do more or less in this order)
----------------------------------------------------
- parse html chars (in _item_clean ?)
- debug html chars parse with test.rss
-> add support for & alone in evas_textblock
- ? merge news_parse_rss.c/h to news_parse.c/h ?
- atom feeds
- viewer: a way to set vcontent bg color ?
- feed icons (new file ?)
Evas_Object *news_feed_icon_add(News_Feed *feed)
void news_feed_icon_del(Evas_Object *obj)

View File

@ -203,7 +203,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
of = e_widget_frametable_add(evas, _("Feeds"), 0);
ob = e_widget_check_add(evas, _("Sort lists by name"), &(cfdata->feed.sort_name));
ob = e_widget_check_add(evas, _("Sort lists by name (disable Move action)"), &(cfdata->feed.sort_name));
e_widget_frametable_object_append(of, ob, 0, 1, 2, 1, 1, 1, 1, 0);
e_widget_list_object_append(o, of, 1, 1, 0.5);

View File

@ -11,8 +11,6 @@ struct _E_Config_Dialog_Data
Evas_Object *icon_sel;
E_Dialog *icon_sel_dia;
int in_advanced;
} gui;
char *name;
@ -26,7 +24,7 @@ struct _E_Config_Dialog_Data
char *url_feed;
char *icon;
int icon_ovrw;
int urgent;
int urgent;
News_Feed_Category *category;
News_Feed *feed;
@ -111,7 +109,6 @@ news_config_dialog_feed_refresh_categories(News_Feed *feed)
if (!news->config_dialog_feed_new) return;
cfdata = news->config_dialog_feed_new->cfdata;
}
if (cfdata->gui.in_advanced) return;
ilist = cfdata->gui.ilist_categories;
e_widget_ilist_freeze(ilist);
@ -144,6 +141,7 @@ news_config_dialog_feed_refresh_categories(News_Feed *feed)
pos++;
}
e_widget_ilist_go(ilist);
e_widget_ilist_thaw(ilist);
if (pos_to_select != -1)
{
@ -153,8 +151,6 @@ news_config_dialog_feed_refresh_categories(News_Feed *feed)
e_widget_min_size_get(ilist, &w, NULL);
e_widget_min_size_set(ilist, w, 110);
e_widget_ilist_thaw(ilist);
}
void
@ -177,7 +173,6 @@ news_config_dialog_feed_refresh_langs(News_Feed *feed)
if (!news->config_dialog_feed_new) return;
cfdata = news->config_dialog_feed_new->cfdata;
}
if (cfdata->gui.in_advanced) return;
ilist = cfdata->gui.ilist_langs;
e_widget_ilist_freeze(ilist);
@ -199,6 +194,7 @@ news_config_dialog_feed_refresh_langs(News_Feed *feed)
pos++;
}
e_widget_ilist_go(ilist);
e_widget_ilist_thaw(ilist);
if (pos_to_select != -1)
e_widget_ilist_selected_set(ilist, pos_to_select);
@ -209,8 +205,6 @@ news_config_dialog_feed_refresh_langs(News_Feed *feed)
e_widget_min_size_get(ilist, &w, NULL);
e_widget_min_size_set(ilist, w, 110);
e_widget_ilist_thaw(ilist);
}
/*
@ -311,35 +305,11 @@ static Evas_Object *
_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
{
Evas_Object *o;
Evas_Object *of, *ob;
cfdata->gui.in_advanced = 0;
o = e_widget_table_add(evas, 0);
_common_create_widgets(cfd, evas, cfdata, o);
of = e_widget_framelist_add(evas, _("Category"), 0);
ob = e_widget_ilist_add(evas, 16, 16, NULL);
e_widget_ilist_selector_set(ob, 1);
cfdata->gui.ilist_categories = ob;
news_config_dialog_feed_refresh_categories(cfdata->feed);
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 0, 1, 1, 1, 1, 1, 1, 1);
of = e_widget_framelist_add(evas, _("Language"), 0);
ob = e_widget_ilist_add(evas, 16, 16, NULL);
e_widget_ilist_selector_set(ob, 1);
e_widget_on_change_hook_set(ob, _cb_lang_change, cfdata);
cfdata->gui.ilist_langs = ob;
news_config_dialog_feed_refresh_langs(cfdata->feed);
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 1, 1, 1, 1, 1, 1, 1, 1);
e_dialog_resizable_set(cfd->dia, 1);
return o;
@ -350,7 +320,7 @@ _common_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *c
{
Evas_Object *of, *ob;
of = e_widget_frametable_add(evas, _("Icon"), 0);
of = e_widget_frametable_add(evas, _("Basic informations"), 0);
ob = e_widget_button_add(evas, "", NULL,
_icon_select, cfdata, NULL);
@ -358,34 +328,49 @@ _common_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *c
if (cfdata->icon)
_icon_select_changed(cfdata);
e_widget_min_size_set(ob, 48, 48);
e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 1, 0, 1, 0);
e_widget_frametable_object_append(of, ob, 0, 0, 1, 1, 0, 0, 0, 0);
ob = e_widget_check_add(evas, _("Get from the server"), &(cfdata->icon_ovrw));
//ob = e_widget_check_add(evas, _("Get from the server"), &(cfdata->icon_ovrw));
//TODO: NOT IMPLEMENTED YET
e_widget_check_checked_set(ob, 0);
e_widget_disabled_set(ob, 1);
e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 1, 1, 1);
e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 0);
of = e_widget_framelist_add(evas, _("Basic informations"), 0);
//e_widget_check_checked_set(ob, 0);
//e_widget_disabled_set(ob, 1);
// e_widget_list_object_append(o2, of, 1, 1, 0.5);
ob = e_widget_label_add(evas, _("Name :"));
e_widget_framelist_object_append(of, ob);
e_widget_frametable_object_append(of, ob, 0, 1, 1, 1, 1, 0, 1, 0);
ob = e_widget_entry_add(evas, &(cfdata->name));
e_widget_framelist_object_append(of, ob);
e_widget_frametable_object_append(of, ob, 0, 2, 1, 1, 1, 0, 1, 0);
ob = e_widget_label_add(evas, _("Feed url :"));
e_widget_framelist_object_append(of, ob);
e_widget_frametable_object_append(of, ob, 0, 3, 1, 1, 1, 0, 1, 0);
ob = e_widget_entry_add(evas, &(cfdata->url_feed));
e_widget_framelist_object_append(of, ob);
e_widget_frametable_object_append(of, ob, 0, 4, 1, 1, 1, 0, 1, 0);
ob = e_widget_check_add(evas, _("Mark as important feed"), &(cfdata->urgent));
//TODO: NOT IMPLEMENTED YET
e_widget_disabled_set(ob, 1);
e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 0, 1, 0);
e_widget_table_object_append(o, of, 0, 0, 2, 1, 1, 1, 1, 1);
of = e_widget_framelist_add(evas, _("Category"), 0);
ob = e_widget_ilist_add(evas, 16, 16, NULL);
e_widget_ilist_selector_set(ob, 1);
cfdata->gui.ilist_categories = ob;
news_config_dialog_feed_refresh_categories(cfdata->feed);
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 1, 0, 1, 1, 1, 1, 1, 0);
e_widget_table_object_append(o, of, 2, 0, 2, 1, 1, 1, 1, 1);
of = e_widget_framelist_add(evas, _("Language"), 0);
ob = e_widget_ilist_add(evas, 16, 16, NULL);
e_widget_ilist_selector_set(ob, 1);
e_widget_on_change_hook_set(ob, _cb_lang_change, cfdata);
cfdata->gui.ilist_langs = ob;
news_config_dialog_feed_refresh_langs(cfdata->feed);
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 4, 0, 2, 1, 1, 1, 1, 1);
}
static Evas_Object *
@ -394,8 +379,6 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
Evas_Object *o;
Evas_Object *of, *ob;
cfdata->gui.in_advanced = 1;
o = e_widget_table_add(evas, 0);
_common_create_widgets(cfd, evas, cfdata, o);
@ -412,7 +395,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
ob = e_widget_entry_add(evas, &(cfdata->url_home));
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 0, 2, 2, 1, 1, 1, 1, 1);
e_widget_table_object_append(o, of, 0, 1, 3, 1, 1, 0, 1, 0);
of = e_widget_framelist_add(evas, _("Server informations"), 0);
@ -429,7 +412,9 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data
ob = e_widget_check_add(evas, _("Home url"), &(cfdata->url_home_ovrw));
e_widget_framelist_object_append(of, ob);
e_widget_table_object_append(o, of, 0, 4, 2, 1, 1, 1, 1, 1);
e_widget_table_object_append(o, of, 3, 1, 3, 1, 1, 0, 1, 0);
e_dialog_resizable_set(cfd->dia, 1);
return o;
}

View File

@ -159,6 +159,7 @@ news_config_dialog_feeds_refresh_feeds(void)
}
}
e_widget_ilist_go(ilist);
e_widget_ilist_thaw(ilist);
/* select a feed */
if (pos_to_select != -1)
@ -176,8 +177,6 @@ news_config_dialog_feeds_refresh_feeds(void)
e_widget_min_size_get(ilist, &wmw, &wmh);
e_widget_min_size_set(ilist, wmw, 180);
}
e_widget_ilist_thaw(ilist);
}
void
@ -225,11 +224,13 @@ news_config_dialog_feeds_refresh_categories(void)
if (cfdata->selected_category == fc)
pos_to_select = pos;
}
e_widget_ilist_go(ilist);
e_widget_ilist_thaw(ilist);
if (pos_to_select != -1)
{
e_widget_ilist_selected_set(ilist, pos_to_select);
_cb_category_list(cfdata->selected_category);
//_cb_category_list(cfdata->selected_category);
}
if (pos == -1)
@ -240,9 +241,6 @@ news_config_dialog_feeds_refresh_categories(void)
e_widget_min_size_get(ilist, &wmw, &wmh);
e_widget_min_size_set(ilist, wmw, 120);
}
e_widget_ilist_go(ilist);
e_widget_ilist_thaw(ilist);
}
/*
@ -300,29 +298,32 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_ilist_selector_set(ob, 1);
cfdata->ilist_categories = ob;
news_config_dialog_feeds_refresh_categories();
e_widget_frametable_object_append(of, ob, 1, 0, 3, 4, 1, 1, 1, 1);
e_widget_frametable_object_append(of, ob, 0, 0, 6, 1, 1, 1, 1, 1);
if (!news->config->feed.sort_name)
{
ob = e_widget_button_add(evas, "", "widget/up_arrow", _cb_category_up, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 4, 1, 1, 1, 0, 0, 0, 0);
ob = e_widget_button_add(evas, "", "widget/down_arrow", _cb_category_down, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 4, 2, 1, 1, 0, 0, 0, 0);
ob = e_widget_button_add(evas, "Move", "widget/up_arrow", _cb_category_up, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 0, 1, 3, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, "Move", "widget/down_arrow", _cb_category_down, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 3, 1, 3, 1, 1, 0, 1, 0);
}
ob = e_widget_button_add(evas, _("Add"), NULL, _cb_category_add, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 1, 4, 1, 1, 1, 0, 1, 0);
e_widget_frametable_object_append(of, ob, 0, 2, 2, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, _("Delete"), NULL, _cb_category_del, cfdata, NULL);
e_widget_disabled_set(ob, 1);
cfdata->button_cat_del = ob;
e_widget_frametable_object_append(of, ob, 2, 4, 1, 1, 1, 0, 1, 0);
e_widget_frametable_object_append(of, ob, 2, 2, 2, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, _("Configure"), NULL, _cb_category_config, cfdata, NULL);
e_widget_disabled_set(ob, 1);
cfdata->button_cat_conf = ob;
e_widget_frametable_object_append(of, ob, 3, 4, 1, 1, 1, 0, 1, 0);
e_widget_frametable_object_append(of, ob, 4, 2, 2, 1, 1, 0, 1, 0);
e_widget_list_object_append(o2, of, 1, 1, 0.5);
ob = e_widget_label_add(evas, "");
e_widget_list_object_append(o2, ob, 0, 0, 0.5);
o3 = e_widget_list_add(evas, 0, 1);
of = e_widget_framelist_add(evas, _("Languages"), 1);
@ -358,34 +359,34 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
cfdata->textblock_feed_infos = ob;
e_widget_min_size_get(ob, &wmw, &wmh);
e_widget_min_size_set(ob, wmw, 40);
e_widget_frametable_object_append(of, ob, 0, 0, 4, 1, 1, 1, 0, 0);
e_widget_frametable_object_append(of, ob, 0, 0, 6, 1, 1, 1, 0, 0);
cfdata->selected_feed = NULL;
ob = e_widget_ilist_add(evas, 16, 16, NULL);
e_widget_ilist_selector_set(ob, 1);
cfdata->ilist_feeds = ob;
news_config_dialog_feeds_refresh_feeds();
e_widget_frametable_object_append(of, ob, 0, 1, 3, 4, 1, 1, 1, 1);
ob = e_widget_button_add(evas, _("Add"), NULL, _cb_feed_add, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 0, 5, 1, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, _("Delete"), NULL, _cb_feed_del, cfdata, NULL);
e_widget_disabled_set(ob, 1);
cfdata->button_feed_del = ob;
e_widget_frametable_object_append(of, ob, 1, 5, 1, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, _("Configure"), NULL, _cb_feed_config, cfdata, NULL);
e_widget_disabled_set(ob, 1);
cfdata->button_feed_conf = ob;
e_widget_frametable_object_append(of, ob, 2, 5, 1, 1, 1, 0, 1, 0);
e_widget_frametable_object_append(of, ob, 0, 1, 6, 1, 1, 1, 1, 1);
if (!news->config->feed.sort_name)
{
ob = e_widget_button_add(evas, "", "widget/up_arrow", _cb_feed_up, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 3, 2, 1, 1, 0, 0, 0, 0);
ob = e_widget_button_add(evas, "", "widget/down_arrow", _cb_feed_down, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 3, 3, 1, 1, 0, 0, 0, 0);
ob = e_widget_button_add(evas, "Move", "widget/up_arrow", _cb_feed_up, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 0, 2, 3, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, "Move", "widget/down_arrow", _cb_feed_down, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 3, 2, 3, 1, 1, 0, 1, 0);
}
ob = e_widget_button_add(evas, _("Add"), NULL, _cb_feed_add, cfdata, NULL);
e_widget_frametable_object_append(of, ob, 0, 3, 2, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, _("Delete"), NULL, _cb_feed_del, cfdata, NULL);
e_widget_disabled_set(ob, 1);
cfdata->button_feed_del = ob;
e_widget_frametable_object_append(of, ob, 2, 3, 2, 1, 1, 0, 1, 0);
ob = e_widget_button_add(evas, _("Configure"), NULL, _cb_feed_config, cfdata, NULL);
e_widget_disabled_set(ob, 1);
cfdata->button_feed_conf = ob;
e_widget_frametable_object_append(of, ob, 4, 3, 2, 1, 1, 0, 1, 0);
e_widget_list_object_append(o, of, 1, 1, 0.5);
e_dialog_resizable_set(cfd->dia, 1);
@ -595,26 +596,29 @@ _cb_category_list(void *data)
if (cfdata->button_cat_conf)
e_widget_disabled_set(cfdata->button_cat_conf, 0);
cfdata->selected_category = c;
/* select the first feed in this category */
if (c->feeds_visible)
if (cfdata->selected_category != c)
{
pos = 0;
while ((label = e_widget_ilist_nth_label_get(cfdata->ilist_feeds, pos)))
cfdata->selected_category = c;
/* select the first feed in this category */
if (c->feeds_visible)
{
if (e_widget_ilist_nth_is_header(cfdata->ilist_feeds, pos))
pos = 0;
while ((label = e_widget_ilist_nth_label_get(cfdata->ilist_feeds, pos)))
{
if (!strcmp(label, c->name))
if (e_widget_ilist_nth_is_header(cfdata->ilist_feeds, pos))
{
/* trick to call the callback in selected_set */
e_widget_ilist_selector_set(cfdata->ilist_feeds, 0);
e_widget_ilist_selected_set(cfdata->ilist_feeds, pos+1);
e_widget_ilist_selector_set(cfdata->ilist_feeds, 1);
break;
if (!strcmp(label, c->name))
{
/* trick to call the callback in selected_set */
e_widget_ilist_selector_set(cfdata->ilist_feeds, 0);
e_widget_ilist_selected_set(cfdata->ilist_feeds, pos+1);
e_widget_ilist_selector_set(cfdata->ilist_feeds, 1);
break;
}
}
pos++;
}
pos++;
}
}
}

View File

@ -127,7 +127,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_list_object_append(o, of, 1, 1, 0.0);
ob = e_widget_label_add(evas, _(""));
ob = e_widget_label_add(evas, "");
e_widget_list_object_append(o, ob, 1, 1, 0.0);
ob = e_widget_check_add(evas, _("Apply this to all News gadgets"), &(cfdata->apply_to_all));
e_widget_list_object_append(o, ob, 1, 1, 0.0);

View File

@ -134,6 +134,7 @@ news_config_dialog_item_content_refresh_feeds(News_Item *ni)
e_widget_ilist_multi_select(ilist, pos);
}
}
e_widget_ilist_thaw(ilist);
e_widget_min_size_get(ilist, &iw, &ih);
if (iw < 200) iw = 200;
@ -141,7 +142,6 @@ news_config_dialog_item_content_refresh_feeds(News_Item *ni)
e_widget_ilist_go(ilist);
_cb_feed_change(cfdata, NULL);
e_widget_ilist_thaw(ilist);
/* restore the callback */
e_widget_on_change_hook_set(ilist, _cb_feed_change, cfdata);
}
@ -195,8 +195,8 @@ news_config_dialog_item_content_refresh_selected_feeds(News_Item *ni)
e_widget_min_size_set(ilist, iw, 250);
e_widget_ilist_go(ilist);
_cb_selected_feed_change(cfdata, NULL);
e_widget_ilist_thaw(ilist);
_cb_selected_feed_change(cfdata, NULL);
/* restore the callback */
e_widget_on_change_hook_set(ilist, _cb_selected_feed_change, cfdata);
}

View File

@ -124,7 +124,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_list_object_append(o, ob, 1, 1, 0.5);
ob = e_widget_label_add(evas, _("Please select the languages that you are able to read"));
e_widget_list_object_append(o, ob, 1, 1, 0.0);
ob = e_widget_label_add(evas, _(""));
ob = e_widget_label_add(evas, "");
e_widget_list_object_append(o, ob, 1, 1, 0.0);
}

View File

@ -255,7 +255,7 @@ struct _News_Feed_Document
News_Popup_Warn *popw;
Evas_List *articles;
int unread_count;
int ui_needrefresh : 1;
unsigned char ui_needrefresh : 1;
struct
{
@ -264,10 +264,10 @@ struct _News_Feed_Document
Ecore_Event_Handler *handler_del;
Ecore_Event_Handler *handler_data;
int waiting_reply : 1;
int nb_tries;
char *buffer;
int buffer_size;
unsigned char waiting_reply : 1;
int nb_tries;
char *buffer;
int buffer_size;
} server;
struct
@ -280,7 +280,7 @@ struct _News_Feed_Document
const char *charset;
News_Parse *parser;
int got_infos : 1;
unsigned char got_infos : 1;
time_t last_time;
News_Parse_Error error;
} parse;
@ -290,8 +290,8 @@ struct _News_Feed_Article
{
News_Feed_Document *doc;
int unread : 1;
int reused : 1;
unsigned char unread : 1;
unsigned char reused : 1;
char *title;
char *url;

View File

@ -261,7 +261,7 @@ _parse_type(News_Feed_Document *doc)
buf = doc->server.buffer;
p = strstr(buf, "<rss"); // FIXME: valgrind says "Invalid read of size 1" ... ??? maybe valgrind is lost
p = strstr(buf, "<rss");
if (p)
{
p = strstr(p, "version");

View File

@ -38,8 +38,8 @@ struct _News_Parse
Evas_List *articles;
Ecore_Idler *idler;
News_Parse_Article *art;
int error;
int changes : 1;
int error;
unsigned char changes : 1;
};
struct _News_Parse_Article

View File

@ -103,7 +103,7 @@ _idler(void *data)
}
/* error returned */
if (err) //FIXME: != NEWS_PARSE_ERROR_TYPE_NO
if (err != NEWS_PARSE_ERROR_NO)
{
parser->error = err;
parser->oc.action = NEWS_PARSE_OC_END;
@ -246,7 +246,7 @@ _parse_article_init(News_Parse *parser)
return NEWS_PARSE_ERROR_NO;
}
p1 = strstr(pos, parser->doc->parse.meta_article); // FIXME: valgrind says "Invalid read of size 1" ... ??? maybe valgrind is lost
p1 = strstr(pos, parser->doc->parse.meta_article);
if (!p1)
{
if (evas_list_count(parser->articles))
@ -506,11 +506,11 @@ _parse_item_clean(News_Parse *parser)
size = strlen(buf) + 1;
new_size = size;
//FIXME use macros for nicer code
while (*p)
{
//DPARSE(("%d %d ------\n%30.30s", size, new_size, p));
/* skip metas inside text */
if (*p == '<')
if (*p == '<') /* meta open, we are going to skip metas inside text */
{
char *p2;
@ -519,11 +519,11 @@ _parse_item_clean(News_Parse *parser)
{
if (!strncmp(p, "<![CDATA[", 9))
{
memmove(p, p + 9, strlen(p + 9) + 1);
memmove(p, p + 9, (buf + new_size) - (p + 9));
new_size -= 9;
}
else
p++; /* next char */
p++; /* next char */
}
else
{
@ -545,7 +545,7 @@ _parse_item_clean(News_Parse *parser)
while (*p2 && (*p2 != '>'));
if (*p2)
{
memmove(p, p2 + 1, strlen(p2 + 1) + 1);
memmove(p, p2 + 1, (buf + new_size) - (p2 + 1));
new_size -= ((p2 + 1) - p);
}
else
@ -555,21 +555,22 @@ _parse_item_clean(News_Parse *parser)
}
}
}
else if (*p == ']') /* skip end cfdata */
else if (*p == ']') /* skip end cfdata */
{
if (!strncmp(p + 1, "]>", 2))
{
memmove(p, p + 3, strlen(p + 3) + 1);
memmove(p, p + 3, (buf + new_size) - (p + 3));
new_size -= 3;
}
else
p++; /* next char */
}
else if (*p == 0xa) /* \n */
else if (*p == 0xa) /* \n */
{
if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE)
if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE_CLEAN)
{
memmove(p, p + 1, strlen(p + 1) + 1);
/* remove \n when in title */
memmove(p, p + 1, (buf + new_size) - (p + 1));
new_size -= 1;
}
else
@ -584,8 +585,8 @@ _parse_item_clean(News_Parse *parser)
buf = realloc(buf, size);
p = buf + diff;
}
DPARSE(("buf %p p %p new_size %d strlen(buf) %d strlen(p) %d\np :\n%30.30s\n", buf, p, new_size, (int)strlen(buf), (int)strlen(p), p ));
memmove(p + 3, p, strlen(p) + 1);
DPARSE(("buf %p p %p new_size %d strlen(buf) %d strlen(p) %d\np :\n%30.30s\n", buf, p, new_size, (int)strlen(buf), (int)strlen(p), p));
memmove(p + 3, p, (buf + (new_size - 3)) - (p));
*p = '<';
*(p + 1) = 'b';
*(p + 2) = 'r';
@ -593,11 +594,12 @@ _parse_item_clean(News_Parse *parser)
p = p + 4;
}
}
else if (*p == 0x9) /* \t */
else if (*p == 0x9) /* \t */
{
if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE)
if (parser->oc.action == NEWS_PARSE_OC_ITEM_TITLE_CLEAN)
{
memmove(p, p + 1, strlen(p + 1) + 1); //FIXME : strlen(p) ? EVERYWHERE ?
/* remove \t when in title */
memmove(p, p + 1, (buf + new_size) - (p + 1));
new_size -= 1;
}
else
@ -612,7 +614,7 @@ _parse_item_clean(News_Parse *parser)
buf = realloc(buf, size);
p = buf + diff;
}
memmove(p + 4, p, strlen(p) + 1);
memmove(p + 4, p, (buf + (new_size - 4)) - (p));
*p = '<';
*(p + 1) = 't';
*(p + 2) = 'a';
@ -621,58 +623,95 @@ _parse_item_clean(News_Parse *parser)
p = p + 5;
}
}
else if (*p == 0xd) /* \??? (newline) to nothing */
else if (*p == 0xd) /* \<???> (newline) to nothing */
{
memmove(p, p + 1, strlen(p + 1) + 1);
memmove(p, p + 1, (buf + new_size) - (p + 1));
new_size -= 1;
}
else if (*p == '&') /* html codes */
else if (*p == '&') /* html codes */
{
/* &lt convertion to <
* &gt is checked when skipping meta */
if (!strncmp(p + 1, "lt;", 3))
{
memmove(p + 1, p + 4, strlen(p + 4) + 1);
new_size -= 3;
*p = '<';
}
else if (0) /* TODO: add html chars convertion */
{
}
else if (*(p + 1) == '#') /* ascii hexadecimal char */
char *p_inc;
p_inc = p + 1;
if (*p_inc == '#') /* html numbers = ascii hexadecimal char */
{
char b[4];
unsigned int i;
int len;
char *p2 = p + 2;
/* dec->hex */
//TODO: FIX !
while (*p2 != ';')
while (*p2 && (*p2 != ';'))
p2++;
p2++;
if (((p2 - p) == 3) || (p2 - p) > 6)
p = p2; /* next char */
else //TODO: STOPPED HERE
len = p2 - p;
if ((len <= 3) || (len > 7) || !sscanf(p + 2, "%d", &i))
p = p_inc; /* next char (invalid html char number) */
else if ((i == 8216) || (i == 8217)) /* html num ' */
{
if (!sscanf(p + 2, "%d", &i))
p = p2 + 1; /* next char */
else
{
snprintf(b, sizeof(b), "%c", i);
len = strlen(b);
memmove(p + 1, p2, strlen(p2) + 1);
new_size -= (p2 - p - 1);
memcpy(p, b, len);
}
memmove(p_inc, p + 7, (buf + new_size) - (p + 7));
new_size -= 6;
*p = '\'';
p = p_inc; /* next char */
}
else if ((i == 171) || (i == 187)) /* html num " */
{
memmove(p_inc, p + 6, (buf + new_size) - (p + 6));
new_size -= 5;
*p = '"';
p = p_inc; /* next char */
}
else /* html code convertion dec->hex */
{
snprintf(b, sizeof(b), "%c", i);
memmove(p_inc, p2, (buf + new_size) - (p2));
new_size -= (p2 - p - 1);
*p = b[0];
/* stay on the same char, could be the start of meta/html char */
}
}
else if (!strncmp(p_inc, "lt;", 3)) /* html < */
{
memmove(p_inc, p + 4, (buf + new_size) - (p + 4));
new_size -= 3;
*p = '<';
/* stay on the same char, could be start of a meta */
} /* &gt is checked when skipping meta */
else if ( !strncmp(p_inc, "amp;", 4) && /* html & */
( (parser->oc.action != NEWS_PARSE_OC_ITEM_DESCRIPTION_CLEAN) ||
(*(p_inc+4) == '#') ) ) /* but if we are going to write on a tb, we must not convert, except if the next char is an html num char (cause we need to parse it next) */
//FIXME thats a quick fix, must fix evas_object_textblock so it supports & alone
{
memmove(p_inc, p + 5, (buf + new_size) - (p + 5));
new_size -= 4;
*p = '&';
/* stay on the same char, could be start of an html char */
}
else if (!strncmp(p_inc, "quot;", 5)) /* html " */
{
memmove(p_inc, p + 6, (buf + new_size) - (p + 6));
new_size -= 5;
*p = '"';
p = p_inc; /* next char */
}
else if (!strncmp(p_inc, "apos;", 5)) /* html ' */
{
memmove(p_inc, p + 6, (buf + new_size) - (p + 6));
new_size -= 5;
*p = '\'';
p = p_inc; /* next char */
}
else if (!strncmp(p_inc, "nbsp;", 5)) /* html space */
{
memmove(p_inc, p + 6, (buf + new_size) - (p + 6));
new_size -= 5;
*p = ' ';
p = p_inc; /* next char */
}
else
p++; /* next char */
p = p_inc; /* next char */
}
else
p++; /* nothing interesting :) next char */
p++; /* nothing interesting :) next char */
}

View File

@ -198,6 +198,7 @@ news_viewer_refresh(News_Viewer *nv)
}
NEWS_ITEM_FEEDS_FOREACH_END();
e_widget_ilist_go(ilist);
e_widget_ilist_thaw(ilist);
/* select a feed */
if (toselect_pos != -1)
@ -230,8 +231,6 @@ news_viewer_refresh(News_Viewer *nv)
nv->vfeeds.list_own = feed_refs_own;
_vfeeds_buttons_state_refresh(nv);
e_widget_ilist_thaw(ilist);
}
int
@ -767,6 +766,7 @@ _varticles_refresh(News_Viewer *nv)
}
}
e_widget_ilist_go(ilist);
e_widget_ilist_thaw(ilist);
/* select a feed,
of if no articles are selected
@ -788,7 +788,6 @@ _varticles_refresh(News_Viewer *nv)
nv->varticles.list = articles;
nv->varticles.list_own = articles_own;
e_widget_ilist_thaw(ilist);
feed->doc->ui_needrefresh = 0;
}