33 #include "gnc-xml-helper.h" 35 #include "sixtp-utils.h" 36 #include "sixtp-parsers.h" 37 #include "sixtp-utils.h" 38 #include "sixtp-dom-parsers.h" 39 #include "sixtp-dom-generators.h" 45 #include "sixtp-dom-parsers.h" 47 const gchar* freqspec_version_string =
"1.0.0";
61 {
"monthly", MONTHLY },
62 {
"month_relative", MONTH_RELATIVE },
63 {
"composite", COMPOSITE },
64 { NULL,
static_cast<FreqType> (-1) },
98 GList* recurrence_list;
117 fspd->recurrence_list = NULL;
124 fspd->weekend_adj = WEEKEND_ADJ_NONE;
125 g_date_clear (&fspd->once_day, 1);
130 gnc_fs_handler (xmlNodePtr node, gpointer d);
134 fs_uift_handler (xmlNodePtr node, gpointer data)
136 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
139 auto nodeTxt = dom_tree_to_text (node);
141 g_return_val_if_fail (nodeTxt, FALSE);
142 for (i = 0; uiFreqTypeStrs[i].str != NULL; i++)
144 if (g_strcmp0 (nodeTxt->c_str(), uiFreqTypeStrs[i].str) == 0)
146 fspd->uift = uiFreqTypeStrs[i].uift;
155 fs_date_handler (xmlNodePtr node, gpointer data)
157 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
159 foo = dom_tree_to_gdate (node);
162 fspd->once_day = *foo;
169 fs_interval_handler (xmlNodePtr node, gpointer data)
171 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
175 ret = dom_tree_to_integer (node, &foo);
180 fspd->interval = foo;
186 fs_offset_handler (xmlNodePtr node, gpointer data)
188 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
192 ret = dom_tree_to_integer (node, &foo);
201 fs_day_handler (xmlNodePtr node, gpointer data)
203 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
207 ret = dom_tree_to_integer (node, &foo);
216 fs_weekday_handler (xmlNodePtr node, gpointer data)
218 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
221 ret = dom_tree_to_integer (node, &foo);
230 fs_occurrence_handler (xmlNodePtr node, gpointer data)
232 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
235 ret = dom_tree_to_integer (node, &foo);
238 fspd->occurrence = foo;
244 fs_weekend_adj_handler (xmlNodePtr node, gpointer data)
246 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
249 ret = dom_tree_to_integer (node, &foo);
252 fspd->weekend_adj = foo;
258 fs_subelement_handler (xmlNodePtr node, gpointer data)
260 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
263 recurrences = dom_tree_freqSpec_to_recurrences (node, fspd->book);
264 if (recurrences == NULL)
269 for (r_iter = recurrences; r_iter != NULL; r_iter = r_iter->next)
272 GDate recurrence_date;
276 recurrence_date = recurrenceGetDate (r);
277 recurrenceSet (r, recurrenceGetMultiplier (r), PERIOD_MONTH, &recurrence_date,
278 recurrenceGetWeekendAdjust (r));
280 fspd->recurrence_list = g_list_append (fspd->recurrence_list, r);
288 {
"fs:date", fs_date_handler, 0, 0 },
289 {
"fs:interval", fs_interval_handler, 0, 0 },
290 {
"fs:offset", fs_offset_handler, 0, 0 },
291 {
"fs:day", fs_day_handler, 0, 0 },
292 {
"fs:weekday", fs_weekday_handler, 0, 0 },
293 {
"fs:occurrence", fs_occurrence_handler, 0, 0 },
294 {
"fs:weekend_adj", fs_weekend_adj_handler, 0, 0 },
295 {
"gnc:freqspec", fs_subelement_handler, 0, 0 },
296 { NULL, NULL, 0, 0 },
300 fs_none_handler (xmlNodePtr node, gpointer data)
302 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
304 successful = dom_tree_generic_parse (node,
305 fs_union_dom_handlers,
312 fs_once_handler (xmlNodePtr node, gpointer data)
314 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
317 successful = dom_tree_generic_parse (node,
318 fs_union_dom_handlers,
322 recurrenceSet (fspd->recurrence, 0, PERIOD_ONCE, &fspd->once_day,
329 fs_daily_handler (xmlNodePtr node, gpointer data)
331 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
334 successful = dom_tree_generic_parse (node, fs_union_dom_handlers, fspd);
338 g_date_clear (&offset_date, 1);
339 g_date_set_julian (&offset_date, fspd->offset == 0 ? 7 : fspd->offset);
340 recurrenceSet (fspd->recurrence, fspd->interval, PERIOD_DAY, &offset_date,
348 fs_weekly_handler (xmlNodePtr node, gpointer data)
350 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
353 successful = dom_tree_generic_parse (node,
354 fs_union_dom_handlers,
359 g_date_clear (&offset_date, 1);
360 g_date_set_julian (&offset_date, fspd->offset == 0 ? 7 : fspd->offset);
361 recurrenceSet (fspd->recurrence, fspd->interval, PERIOD_WEEK, &offset_date,
369 fs_monthly_handler (xmlNodePtr node, gpointer data)
371 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
374 successful = dom_tree_generic_parse (node,
375 fs_union_dom_handlers,
381 g_date_clear (&offset_date, 1);
382 g_date_set_julian (&offset_date, 1);
383 g_date_add_months (&offset_date, fspd->offset);
384 g_date_set_day (&offset_date, fspd->day);
388 recurrenceSet (fspd->recurrence, fspd->interval, PERIOD_ONCE, &offset_date,
393 recurrenceSet (fspd->recurrence, fspd->interval,
394 PERIOD_MONTH, &offset_date,
395 static_cast<WeekendAdjust> (fspd->weekend_adj));
403 fs_month_relative_handler (xmlNodePtr node, gpointer data)
405 g_critical (
"this was never supported, how is it in the datafile?");
411 fs_guid_handler (xmlNodePtr node, gpointer data)
418 fs_composite_handler (xmlNodePtr node, gpointer data)
420 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
422 successful = dom_tree_generic_parse (node,
423 fs_union_dom_handlers,
430 {
"gnc:freqspec", gnc_fs_handler, 0, 0 },
431 {
"fs:ui_type", fs_uift_handler, 1, 0 },
432 {
"fs:id", fs_guid_handler, 1, 0 },
433 {
"fs:none", fs_none_handler, 0, 0 },
434 {
"fs:once", fs_once_handler, 0, 0 },
435 {
"fs:daily", fs_daily_handler, 0, 0 },
436 {
"fs:weekly", fs_weekly_handler, 0, 0 },
437 {
"fs:monthly", fs_monthly_handler, 0, 0 },
438 {
"fs:month_relative", fs_month_relative_handler, 0, 0 },
439 {
"fs:composite", fs_composite_handler, 0, 0 },
445 gnc_fs_handler (xmlNodePtr node, gpointer d)
447 return dom_tree_generic_parse (node, fs_dom_handlers, d);
452 gnc_freqSpec_end_handler (gpointer data_for_children,
453 GSList* data_from_children, GSList* sibling_data,
454 gpointer parent_data, gpointer global_data,
455 gpointer* result,
const gchar* tag)
458 gboolean successful = FALSE;
459 xmlNodePtr tree = (xmlNodePtr)data_for_children;
463 fspd.book = globaldata->book;
473 g_return_val_if_fail (tree, FALSE);
475 successful = dom_tree_generic_parse (tree, fs_dom_handlers, &fspd);
478 xmlElemDump (stdout, NULL, tree);
487 gnc_freqSpec_sixtp_parser_create (
void)
489 return sixtp_dom_parser_new (gnc_freqSpec_end_handler, NULL, NULL);
493 common_parse (
fsParseData* fspd, xmlNodePtr node, QofBook* book)
498 successful = dom_tree_generic_parse (node, fs_dom_handlers, fspd);
501 xmlElemDump (stdout, NULL, node);
506 dom_tree_freqSpec_to_recurrences (xmlNodePtr node, QofBook* book)
510 common_parse (&fspd, node, book);
511 if (fspd.recurrence_list == NULL)
513 fspd.recurrence_list = g_list_append (fspd.recurrence_list, fspd.recurrence);
515 return fspd.recurrence_list;
Repeat three times a year.
api for GnuCash version 2 XML-based file format
Period / Date Frequency Specification.
Struct passed around as user-data when parsing the FreqSpec.
Repeat Monday to Friday, skip weekend.
UIFreqType
The user's conception of the frequency.
FreqType
Frequency specification.
Scheduled Transactions public handling routines.