edje_edit: image_del fixed

Summary: fixed segfault on broken refs in edje object

Reviewers: cedric, seoz, raster

CC: reutskiy.v.v, cedric

Differential Revision: https://phab.enlightenment.org/D759

Signed-off-by: Cedric Bail <cedric.bail@free.fr>
This commit is contained in:
Andrii Kroitor 2014-04-17 19:40:34 +02:00 committed by Cedric Bail
parent 80b1ca8e43
commit c17d08d2ab
1 changed files with 46 additions and 43 deletions

View File

@ -5069,8 +5069,10 @@ edje_edit_image_usage_list_get(Evas_Object *obj, const char *name, Eina_Bool fir
EINA_ITERATOR_FOREACH(it, pce)
{
if (!pce->ref) continue;
for (i = 0; i < pce->ref->parts_count; i++)
{
if (!pce->ref->parts) continue;
part = pce->ref->parts[i];
if (part->type == EDJE_PART_TYPE_IMAGE)
{
@ -5175,6 +5177,50 @@ edje_edit_image_del(Evas_Object *obj, const char* name)
eet_delete(eetf, last_entry);
eet_write(eetf, entry, data, size, 0);
}
_edje_if_string_free(ed, de->entry);
--ed->file->image_dir->entries_count;
if (de_last->id != de->id)
{
Edje_Part *part;
Edje_Part_Description_Image *part_desc_image;
de->entry = de_last->entry;
it = eina_hash_iterator_data_new(ed->file->collection);
EINA_ITERATOR_FOREACH(it, pce)
{
if (!pce->ref) continue;
for (i = 0; i < pce->ref->parts_count; i++)
{
if (!pce->ref->parts) continue;
part = pce->ref->parts[i];
if (part->type == EDJE_PART_TYPE_IMAGE)
{
part_desc_image = (Edje_Part_Description_Image *)part->default_desc;
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
for (k = 0; k < part_desc_image->image.tweens_count; k++)
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
for (j = 0; j < part->other.desc_count; j++)
{
part_desc_image = (Edje_Part_Description_Image *)part->other.desc[j];
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
for (k = 0; k < part_desc_image->image.tweens_count; k++)
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
}
}
}
}
eina_iterator_free(it);
}
ed->file->image_dir->entries = realloc(ed->file->image_dir->entries,
sizeof(Edje_Image_Directory_Entry) *
ed->file->image_dir->entries_count);
/* write the edje_file */
if (!_edje_edit_edje_file_save(eetf, ed->file))
{
@ -5184,49 +5230,6 @@ edje_edit_image_del(Evas_Object *obj, const char* name)
eet_close(eetf);
}
_edje_if_string_free(ed, de->entry);
--ed->file->image_dir->entries_count;
if (de_last->id != de->id)
{
Edje_Part *part;
Edje_Part_Description_Image *part_desc_image;
de->entry = de_last->entry;
it = eina_hash_iterator_data_new(ed->file->collection);
EINA_ITERATOR_FOREACH(it, pce)
{
for (i = 0; i < pce->ref->parts_count; i++)
{
part = pce->ref->parts[i];
if (part->type == EDJE_PART_TYPE_IMAGE)
{
part_desc_image = (Edje_Part_Description_Image *)part->default_desc;
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
for (k = 0; k < part_desc_image->image.tweens_count; k++)
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
for (j = 0; j < part->other.desc_count; j++)
{
part_desc_image = (Edje_Part_Description_Image *)part->other.desc[j];
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
for (k = 0; k < part_desc_image->image.tweens_count; k++)
if (part_desc_image->image.id == de_last->id)
part_desc_image->image.id = de->id;
}
}
}
}
eina_iterator_free(it);
}
ed->file->image_dir->entries = realloc(ed->file->image_dir->entries,
sizeof(Edje_Image_Directory_Entry) *
ed->file->image_dir->entries_count);
_edje_edit_flag_script_dirty(eed, EINA_TRUE);
return EINA_TRUE;