X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fmultimedia_link.c;h=44e9a2df79d6afec7bcabc99eeb2f827fdb93d46;hb=f197c791489f1537db4aebc7ce29b6d4f9adc2b3;hp=2b5a1f13fc36af873dc8356e543b9707b3287135;hpb=bdf47fdee469d5a1d7ddfd06a0e4b26f3b40b0f4;p=gedcom-parse.git diff --git a/gom/multimedia_link.c b/gom/multimedia_link.c index 2b5a1f1..44e9a2d 100644 --- a/gom/multimedia_link.c +++ b/gom/multimedia_link.c @@ -44,12 +44,8 @@ Gedcom_ctxt sub_obje_start(_ELT_PARAMS_) if (! ctxt) NO_CONTEXT; else { - struct multimedia_link *mm - = (struct multimedia_link *)malloc(sizeof(struct multimedia_link)); - if (! mm) - MEMORY_ERROR; - else { - memset (mm, 0, sizeof(struct multimedia_link)); + struct multimedia_link *mm = SUB_MAKEFUNC(multimedia_link)(); + if (mm) { if (GEDCOM_IS_XREF_PTR(parsed_value)) mm->reference = GEDCOM_XREF_PTR(parsed_value); @@ -62,17 +58,17 @@ Gedcom_ctxt sub_obje_start(_ELT_PARAMS_) case ELT_SUB_INDIV_GEN: case ELT_SUB_INDIV_ADOP: case ELT_SUB_INDIV_EVEN: - event_add_mm_link(ctxt, mm); break; + ADDFUNC2(event,multimedia_link)(ctxt, mm); break; case ELT_SUB_SOUR: - citation_add_mm_link(ctxt, mm); break; + ADDFUNC2(source_citation,multimedia_link)(ctxt, mm); break; case REC_FAM: - family_add_mm_link(ctxt, mm); break; + ADDFUNC2(family,multimedia_link)(ctxt, mm); break; case REC_INDI: - individual_add_mm_link(ctxt, mm); break; + ADDFUNC2(individual,multimedia_link)(ctxt, mm); break; case REC_SOUR: - source_add_mm_link(ctxt, mm); break; + ADDFUNC2(source,multimedia_link)(ctxt, mm); break; case REC_SUBM: - submitter_add_mm_link(ctxt, mm); break; + ADDFUNC2(submitter,multimedia_link)(ctxt, mm); break; default: UNEXPECTED_CONTEXT(ctxt->ctxt_type); } @@ -83,9 +79,14 @@ Gedcom_ctxt sub_obje_start(_ELT_PARAMS_) return (Gedcom_ctxt)result; } -STRING_CB(multimedia_link, sub_obje_form_start, form) -STRING_CB(multimedia_link, sub_obje_titl_start, title) -STRING_CB(multimedia_link, sub_obje_file_start, file) +DEFINE_SUB_MAKEFUNC(multimedia_link) + +DEFINE_STRING_CB(multimedia_link, sub_obje_form_start, form) +DEFINE_STRING_CB(multimedia_link, sub_obje_titl_start, title) +DEFINE_STRING_CB(multimedia_link, sub_obje_file_start, file) + +DEFINE_ADDFUNC2(multimedia_link, note_sub, note) +DEFINE_ADDFUNC2(multimedia_link, user_data, extra) void multimedia_link_subscribe() { @@ -99,27 +100,60 @@ void multimedia_link_subscribe() sub_obje_file_start, def_elt_end); } -void multimedia_link_add_note(Gom_ctxt ctxt, struct note_sub* note) +void UNREFALLFUNC(multimedia_link)(struct multimedia_link* obj) { - struct multimedia_link *mm = SAFE_CTXT_CAST(multimedia_link, ctxt); - if (mm) - LINK_CHAIN_ELT(note_sub, mm->note, note); -} - -void multimedia_link_add_user_data(Gom_ctxt ctxt, struct user_data* data) -{ - struct multimedia_link *obj = SAFE_CTXT_CAST(multimedia_link, ctxt); - if (obj) - LINK_CHAIN_ELT(user_data, obj->extra, data); + if (obj) { + struct multimedia_link* runner; + for (runner = obj; runner; runner = runner->next) { + unref_xref_value(runner->reference); + UNREFALLFUNC(note_sub)(runner->note); + UNREFALLFUNC(user_data)(runner->extra); + } + } } -void multimedia_link_cleanup(struct multimedia_link* mm) +void CLEANFUNC(multimedia_link)(struct multimedia_link* mm) { if (mm) { SAFE_FREE(mm->form); SAFE_FREE(mm->title); SAFE_FREE(mm->file); - DESTROY_CHAIN_ELTS(note_sub, mm->note, note_sub_cleanup); - DESTROY_CHAIN_ELTS(user_data, mm->extra, user_data_cleanup); + DESTROY_CHAIN_ELTS(note_sub, mm->note); + DESTROY_CHAIN_ELTS(user_data, mm->extra); + } +} + +int write_multimedia_links(Gedcom_write_hndl hndl, int parent, + struct multimedia_link* mm) +{ + int result = 0; + struct multimedia_link* obj; + + if (!mm) return 1; + + for (obj = mm; obj; obj = obj->next) { + if (obj->reference) { + result |= gedcom_write_element_xref(hndl, ELT_SUB_MULTIM_OBJE, 0, + parent, obj->reference); + } + else { + result |= gedcom_write_element_str(hndl, ELT_SUB_MULTIM_OBJE, 0, + parent, NULL); + if (obj->form) + result |= gedcom_write_element_str(hndl, ELT_SUB_MULTIM_OBJE_FORM, 0, + ELT_SUB_MULTIM_OBJE, obj->form); + if (obj->title) + result |= gedcom_write_element_str(hndl, ELT_SUB_MULTIM_OBJE_TITL, 0, + ELT_SUB_MULTIM_OBJE, obj->title); + if (obj->file) + result |= gedcom_write_element_str(hndl, ELT_SUB_MULTIM_OBJE_FILE, 0, + ELT_SUB_MULTIM_OBJE, obj->file); + if (obj->note) + result |= write_note_subs(hndl, ELT_SUB_MULTIM_OBJE, obj->note); + if (obj->extra) + result |= write_user_data(hndl, obj->extra); + } } + + return result; }