New function to update timestamp.
[gedcom-parse.git] / gom / header.c
1 /* Header object in the gedcom object model.
2    Copyright (C) 2002 The Genes Development Team
3    This file is part of the Gedcom parser library.
4    Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2002.
5
6    The Gedcom parser library is free software; you can redistribute it
7    and/or modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The Gedcom parser library is distributed in the hope that it will be
12    useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the Gedcom parser library; if not, write to the
18    Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 /* $Id$ */
22 /* $Name$ */
23
24 #include <time.h>
25 #include "header.h"
26 #include "submission.h"
27 #include "submitter.h"
28 #include "address.h"
29 #include "user_rec.h"
30 #include "gom.h"
31 #include "gedcom.h"
32 #include "gom_internal.h"
33
34 struct header gom_header;
35
36 Gedcom_ctxt head_start(_REC_PARAMS_)
37 {
38   /* Nothing special */
39   return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, header, &gom_header);
40 }
41
42 STRING_CB(header, head_sour_start, source.id)
43 STRING_CB(header, head_sour_name_start, source.name)
44 STRING_CB(header, head_sour_vers_start, source.version)
45 STRING_CB(header, head_sour_corp_start, source.corporation.name)
46 STRING_CB(header, head_sour_data_start, source.data.name)
47 DATE_CB(header, head_sour_data_date_start, source.data.date)
48 STRING_CB(header, head_sour_data_copr_start, source.data.copyright)
49 STRING_CB(header, head_dest_start, destination)
50 XREF_CB(header, head_subm_start, submitter, make_submitter_record)
51 XREF_CB(header, head_subn_start, submission, make_submission_record)
52 DATE_CB(header, head_date_start, date)
53 STRING_CB(header, head_date_time_start, time)
54 STRING_CB(header, head_file_start, filename)
55 STRING_CB(header, head_copr_start, copyright)
56 NULL_CB(header, head_gedc_start)
57 STRING_CB(header, head_gedc_vers_start, gedcom.version)
58 STRING_CB(header, head_gedc_form_start, gedcom.form)
59 STRING_CB(header, head_char_start, charset.name)
60 STRING_CB(header, head_char_vers_start, charset.version)
61 STRING_CB(header, head_lang_start, language)
62 NULL_CB(header, head_plac_start)
63 STRING_CB(header, head_plac_form_start, place_hierarchy)
64 NULL_CB(header, head_note_start) /* the end callback will fill the value */
65 STRING_END_CB(header, head_note_end, note)
66      
67 void header_add_address(Gom_ctxt ctxt, struct address* addr)
68 {
69   struct header *head = SAFE_CTXT_CAST(header, ctxt);
70   if (head)
71     head->source.corporation.address = addr;
72 }
73
74 void header_add_phone(Gom_ctxt ctxt, const char* phone)
75 {
76   struct header *head = SAFE_CTXT_CAST(header, ctxt);
77   if (head) {
78     struct header_corporation *corp = &(head->source.corporation);
79     int i = 0;
80     while (i<2 && corp->phone[i]) i++;
81     if (! corp->phone[i]) {
82       corp->phone[i] = strdup(phone);
83       if (! corp->phone[i]) MEMORY_ERROR;
84     }
85   }
86 }
87
88 void header_add_user_data(Gom_ctxt ctxt, struct user_data* data)
89 {
90   struct header *head = SAFE_CTXT_CAST(header, ctxt);
91   if (head)
92     LINK_CHAIN_ELT(user_data, head->extra, data);
93 }
94
95 void header_subscribe()
96 {
97   gedcom_subscribe_to_record(REC_HEAD, head_start, def_rec_end);
98   gedcom_subscribe_to_element(ELT_HEAD_SOUR, head_sour_start, def_elt_end);
99   gedcom_subscribe_to_element(ELT_HEAD_SOUR_NAME, head_sour_name_start,
100                               def_elt_end);
101   gedcom_subscribe_to_element(ELT_HEAD_SOUR_VERS, head_sour_vers_start,
102                               def_elt_end);
103   gedcom_subscribe_to_element(ELT_HEAD_SOUR_CORP, head_sour_corp_start,
104                               def_elt_end);
105   gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA, head_sour_data_start,
106                               def_elt_end);
107   gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA_DATE,
108                               head_sour_data_date_start, def_elt_end);
109   gedcom_subscribe_to_element(ELT_HEAD_SOUR_DATA_COPR,
110                               head_sour_data_copr_start, def_elt_end);
111   gedcom_subscribe_to_element(ELT_HEAD_DEST, head_dest_start, def_elt_end);
112   gedcom_subscribe_to_element(ELT_HEAD_DATE, head_date_start, def_elt_end);
113   gedcom_subscribe_to_element(ELT_HEAD_DATE_TIME,
114                               head_date_time_start, def_elt_end);
115   gedcom_subscribe_to_element(ELT_HEAD_SUBM, head_subm_start, def_elt_end);
116   gedcom_subscribe_to_element(ELT_HEAD_SUBN, head_subn_start, def_elt_end);
117   gedcom_subscribe_to_element(ELT_HEAD_FILE, head_file_start, def_elt_end);
118   gedcom_subscribe_to_element(ELT_HEAD_COPR, head_copr_start, def_elt_end);
119   gedcom_subscribe_to_element(ELT_HEAD_GEDC, head_gedc_start, def_elt_end);
120   gedcom_subscribe_to_element(ELT_HEAD_GEDC_VERS,
121                               head_gedc_vers_start, def_elt_end);
122   gedcom_subscribe_to_element(ELT_HEAD_GEDC_FORM,
123                               head_gedc_form_start, def_elt_end);
124   gedcom_subscribe_to_element(ELT_HEAD_CHAR, head_char_start, def_elt_end);
125   gedcom_subscribe_to_element(ELT_HEAD_CHAR_VERS,
126                               head_char_vers_start, def_elt_end);
127   gedcom_subscribe_to_element(ELT_HEAD_LANG, head_lang_start, def_elt_end);
128   gedcom_subscribe_to_element(ELT_HEAD_PLAC, head_plac_start, def_elt_end);
129   gedcom_subscribe_to_element(ELT_HEAD_PLAC_FORM,
130                               head_plac_form_start, def_elt_end);
131   gedcom_subscribe_to_element(ELT_HEAD_NOTE, head_note_start, head_note_end);
132 }
133
134 void header_cleanup()
135 {
136   SAFE_FREE(gom_header.source.id);
137   SAFE_FREE(gom_header.source.name);
138   SAFE_FREE(gom_header.source.version);
139   SAFE_FREE(gom_header.source.corporation.name);
140   address_cleanup(gom_header.source.corporation.address);
141   SAFE_FREE(gom_header.source.corporation.phone[0]);
142   SAFE_FREE(gom_header.source.corporation.phone[1]);
143   SAFE_FREE(gom_header.source.corporation.phone[2]);
144   SAFE_FREE(gom_header.source.data.name);
145   SAFE_FREE(gom_header.source.data.date);
146   SAFE_FREE(gom_header.source.data.copyright);
147   SAFE_FREE(gom_header.destination);
148   SAFE_FREE(gom_header.date);
149   SAFE_FREE(gom_header.time);
150   SAFE_FREE(gom_header.filename);
151   SAFE_FREE(gom_header.copyright);
152   SAFE_FREE(gom_header.gedcom.version);
153   SAFE_FREE(gom_header.gedcom.form);
154   SAFE_FREE(gom_header.charset.name);
155   SAFE_FREE(gom_header.charset.version);
156   SAFE_FREE(gom_header.language);
157   SAFE_FREE(gom_header.place_hierarchy);
158   SAFE_FREE(gom_header.note);
159   DESTROY_CHAIN_ELTS(user_data, gom_header.extra, user_data_cleanup);
160 }
161
162 struct header* gom_get_header()
163 {
164   return &gom_header;
165 }
166
167 int gom_header_update_timestamp(time_t t)
168 {
169   int result = 0;
170   struct tm *tm_ptr = localtime(&t);
171   result |= update_date(&gom_header.date, tm_ptr);
172   result |= update_time(&gom_header.time, tm_ptr);
173   return result;
174 }
175
176 int write_header(Gedcom_write_hndl hndl)
177 {
178   int result = 0;
179   int i;
180   
181   result |= gedcom_write_record_str(hndl, REC_HEAD, NULL, NULL);
182   if (gom_header.charset.name)
183     result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR, 0, REC_HEAD,
184                                        gom_header.charset.name);
185   if (gom_header.charset.version)
186     result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR_VERS, 0,
187                                        ELT_HEAD_CHAR,
188                                        gom_header.charset.version);
189   if (gom_header.source.id)
190     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR, 0, REC_HEAD,
191                                        gom_header.source.id);
192   if (gom_header.source.name)
193     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_NAME, 0,
194                                        ELT_HEAD_SOUR,
195                                        gom_header.source.name);
196   if (gom_header.source.version)
197     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_VERS, 0,
198                                        ELT_HEAD_SOUR,
199                                        gom_header.source.version);
200   if (gom_header.source.corporation.name)
201     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_CORP, 0,
202                                        ELT_HEAD_SOUR,
203                                        gom_header.source.corporation.name);
204   if (gom_header.source.corporation.address)
205     result |= write_address(hndl, ELT_HEAD_SOUR_CORP,
206                             gom_header.source.corporation.address);
207   for (i = 0; i < 3 && gom_header.source.corporation.phone[i]; i++)
208     result |= gedcom_write_element_str(hndl, ELT_SUB_PHON, 0, ELT_HEAD_SOUR_CORP,
209                                        gom_header.source.corporation.phone[i]);
210   if (gom_header.source.data.name)
211     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA, 0,
212                                        ELT_HEAD_SOUR,
213                                        gom_header.source.data.name);
214   if (gom_header.source.data.date)
215     result |= gedcom_write_element_date(hndl, ELT_HEAD_SOUR_DATA_DATE, 0,
216                                         ELT_HEAD_SOUR_DATA,
217                                         gom_header.source.data.date);
218   if (gom_header.source.data.copyright)
219     result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA_COPR, 0,
220                                        ELT_HEAD_SOUR_DATA,
221                                        gom_header.source.data.copyright);
222   if (gom_header.destination)
223     result |= gedcom_write_element_str(hndl, ELT_HEAD_DEST, 0, REC_HEAD,
224                                        gom_header.destination);
225   if (gom_header.date)
226     result |= gedcom_write_element_date(hndl, ELT_HEAD_DATE, 0, REC_HEAD,
227                                         gom_header.date);
228   if (gom_header.time)
229     result |= gedcom_write_element_str(hndl, ELT_HEAD_DATE_TIME, 0,
230                                        ELT_HEAD_DATE, gom_header.time);
231   if (gom_header.submitter)
232     result |= gedcom_write_element_xref(hndl, ELT_HEAD_SUBM, 0, REC_HEAD,
233                                         gom_header.submitter);
234   if (gom_header.submission)
235     result |= gedcom_write_element_xref(hndl, ELT_HEAD_SUBN, 0, REC_HEAD,
236                                         gom_header.submission);
237   if (gom_header.filename)
238     result |= gedcom_write_element_str(hndl, ELT_HEAD_FILE, 0, REC_HEAD,
239                                        gom_header.filename);
240   if (gom_header.copyright)
241     result |= gedcom_write_element_str(hndl, ELT_HEAD_COPR, 0, REC_HEAD,
242                                        gom_header.copyright);
243   result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC, 0, REC_HEAD,
244                                      NULL);
245   if (gom_header.gedcom.version)
246     result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_VERS, 0,
247                                        ELT_HEAD_GEDC,
248                                        gom_header.gedcom.version);
249   if (gom_header.gedcom.form)
250     result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_FORM, 0,
251                                        ELT_HEAD_GEDC,
252                                        gom_header.gedcom.form);
253   if (gom_header.language)
254     result |= gedcom_write_element_str(hndl, ELT_HEAD_LANG, 0,
255                                        REC_HEAD,
256                                        gom_header.language);
257   if (gom_header.place_hierarchy) {
258     result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC, 0, REC_HEAD,
259                                        NULL);
260     result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC_FORM, 0,
261                                        ELT_HEAD_PLAC,
262                                        gom_header.place_hierarchy);
263   }
264   if (gom_header.note)
265     result |= gedcom_write_element_str(hndl, ELT_HEAD_NOTE, 0,
266                                        REC_HEAD,
267                                        gom_header.note);
268   if (gom_header.extra)
269     result |= write_user_data(hndl, gom_header.extra);
270   return result;
271 }