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);
140 nodeTxt = dom_tree_to_text (node);
142 g_return_val_if_fail (nodeTxt, FALSE);
143 for (i = 0; uiFreqTypeStrs[i].str != NULL; i++)
145 if (g_strcmp0 (nodeTxt, uiFreqTypeStrs[i].str) == 0)
147 fspd->uift = uiFreqTypeStrs[i].uift;
158 fs_date_handler (xmlNodePtr node, gpointer data)
160 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
162 foo = dom_tree_to_gdate (node);
165 fspd->once_day = *foo;
172 fs_interval_handler (xmlNodePtr node, gpointer data)
174 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
178 ret = dom_tree_to_integer (node, &foo);
183 fspd->interval = foo;
189 fs_offset_handler (xmlNodePtr node, gpointer data)
191 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
195 ret = dom_tree_to_integer (node, &foo);
204 fs_day_handler (xmlNodePtr node, gpointer data)
206 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
210 ret = dom_tree_to_integer (node, &foo);
219 fs_weekday_handler (xmlNodePtr node, gpointer data)
221 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
224 ret = dom_tree_to_integer (node, &foo);
233 fs_occurrence_handler (xmlNodePtr node, gpointer data)
235 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
238 ret = dom_tree_to_integer (node, &foo);
241 fspd->occurrence = foo;
247 fs_weekend_adj_handler (xmlNodePtr node, gpointer data)
249 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
252 ret = dom_tree_to_integer (node, &foo);
255 fspd->weekend_adj = foo;
261 fs_subelement_handler (xmlNodePtr node, gpointer data)
263 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
266 recurrences = dom_tree_freqSpec_to_recurrences (node, fspd->book);
267 if (recurrences == NULL)
272 for (r_iter = recurrences; r_iter != NULL; r_iter = r_iter->next)
275 GDate recurrence_date;
279 recurrence_date = recurrenceGetDate (r);
280 recurrenceSet (r, recurrenceGetMultiplier (r), PERIOD_MONTH, &recurrence_date,
281 recurrenceGetWeekendAdjust (r));
283 fspd->recurrence_list = g_list_append (fspd->recurrence_list, r);
291 {
"fs:date", fs_date_handler, 0, 0 },
292 {
"fs:interval", fs_interval_handler, 0, 0 },
293 {
"fs:offset", fs_offset_handler, 0, 0 },
294 {
"fs:day", fs_day_handler, 0, 0 },
295 {
"fs:weekday", fs_weekday_handler, 0, 0 },
296 {
"fs:occurrence", fs_occurrence_handler, 0, 0 },
297 {
"fs:weekend_adj", fs_weekend_adj_handler, 0, 0 },
298 {
"gnc:freqspec", fs_subelement_handler, 0, 0 },
299 { NULL, NULL, 0, 0 },
303 fs_none_handler (xmlNodePtr node, gpointer data)
305 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
307 successful = dom_tree_generic_parse (node,
308 fs_union_dom_handlers,
315 fs_once_handler (xmlNodePtr node, gpointer data)
317 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
320 successful = dom_tree_generic_parse (node,
321 fs_union_dom_handlers,
325 recurrenceSet (fspd->recurrence, 0, PERIOD_ONCE, &fspd->once_day,
332 fs_daily_handler (xmlNodePtr node, gpointer data)
334 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
337 successful = dom_tree_generic_parse (node, fs_union_dom_handlers, fspd);
341 g_date_clear (&offset_date, 1);
342 g_date_set_julian (&offset_date, fspd->offset == 0 ? 7 : fspd->offset);
343 recurrenceSet (fspd->recurrence, fspd->interval, PERIOD_DAY, &offset_date,
351 fs_weekly_handler (xmlNodePtr node, gpointer data)
353 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
356 successful = dom_tree_generic_parse (node,
357 fs_union_dom_handlers,
362 g_date_clear (&offset_date, 1);
363 g_date_set_julian (&offset_date, fspd->offset == 0 ? 7 : fspd->offset);
364 recurrenceSet (fspd->recurrence, fspd->interval, PERIOD_WEEK, &offset_date,
372 fs_monthly_handler (xmlNodePtr node, gpointer data)
374 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
377 successful = dom_tree_generic_parse (node,
378 fs_union_dom_handlers,
384 g_date_clear (&offset_date, 1);
385 g_date_set_julian (&offset_date, 1);
386 g_date_add_months (&offset_date, fspd->offset);
387 g_date_set_day (&offset_date, fspd->day);
391 recurrenceSet (fspd->recurrence, fspd->interval, PERIOD_ONCE, &offset_date,
396 recurrenceSet (fspd->recurrence, fspd->interval,
397 PERIOD_MONTH, &offset_date,
398 static_cast<WeekendAdjust> (fspd->weekend_adj));
406 fs_month_relative_handler (xmlNodePtr node, gpointer data)
408 g_critical (
"this was never supported, how is it in the datafile?");
414 fs_guid_handler (xmlNodePtr node, gpointer data)
421 fs_composite_handler (xmlNodePtr node, gpointer data)
423 fsParseData* fspd =
static_cast<decltype (fspd)
> (data);
425 successful = dom_tree_generic_parse (node,
426 fs_union_dom_handlers,
433 {
"gnc:freqspec", gnc_fs_handler, 0, 0 },
434 {
"fs:ui_type", fs_uift_handler, 1, 0 },
435 {
"fs:id", fs_guid_handler, 1, 0 },
436 {
"fs:none", fs_none_handler, 0, 0 },
437 {
"fs:once", fs_once_handler, 0, 0 },
438 {
"fs:daily", fs_daily_handler, 0, 0 },
439 {
"fs:weekly", fs_weekly_handler, 0, 0 },
440 {
"fs:monthly", fs_monthly_handler, 0, 0 },
441 {
"fs:month_relative", fs_month_relative_handler, 0, 0 },
442 {
"fs:composite", fs_composite_handler, 0, 0 },
448 gnc_fs_handler (xmlNodePtr node, gpointer d)
450 return dom_tree_generic_parse (node, fs_dom_handlers, d);
455 gnc_freqSpec_end_handler (gpointer data_for_children,
456 GSList* data_from_children, GSList* sibling_data,
457 gpointer parent_data, gpointer global_data,
458 gpointer* result,
const gchar* tag)
461 gboolean successful = FALSE;
462 xmlNodePtr tree = (xmlNodePtr)data_for_children;
466 fspd.book = globaldata->book;
476 g_return_val_if_fail (tree, FALSE);
478 successful = dom_tree_generic_parse (tree, fs_dom_handlers, &fspd);
481 xmlElemDump (stdout, NULL, tree);
490 gnc_freqSpec_sixtp_parser_create (
void)
492 return sixtp_dom_parser_new (gnc_freqSpec_end_handler, NULL, NULL);
496 common_parse (
fsParseData* fspd, xmlNodePtr node, QofBook* book)
501 successful = dom_tree_generic_parse (node, fs_dom_handlers, fspd);
504 xmlElemDump (stdout, NULL, node);
509 dom_tree_freqSpec_to_recurrences (xmlNodePtr node, QofBook* book)
513 common_parse (&fspd, node, book);
514 if (fspd.recurrence_list == NULL)
516 fspd.recurrence_list = g_list_append (fspd.recurrence_list, fspd.recurrence);
518 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.