void gnc_sx_incr_temporal_state(const SchedXaction *sx, SXTmpStateData *tsd ) { g_return_if_fail(tsd != NULL); tsd->last_date = xaccSchedXactionGetNextInstance (sx, tsd); if (xaccSchedXactionHasOccurDef (sx)) { --tsd->num_occur_rem; } ++tsd->num_inst; }
static GncSxInstances* _gnc_sx_gen_instances(gpointer *data, gpointer user_data) { GncSxInstances *instances = g_new0(GncSxInstances, 1); SchedXaction *sx = (SchedXaction*)data; GDate *range_end = (GDate*)user_data; GDate creation_end, remind_end; GDate cur_date; void *sequence_ctx; instances->sx = sx; creation_end = *range_end; g_date_add_days(&creation_end, xaccSchedXactionGetAdvanceCreation(sx)); remind_end = creation_end; g_date_add_days(&remind_end, xaccSchedXactionGetAdvanceReminder(sx)); /* postponed */ { GList *postponed = gnc_sx_get_defer_instances(sx); for ( ; postponed != NULL; postponed = postponed->next) { GDate inst_date; int seq_num; GncSxInstance *inst; g_date_clear(&inst_date, 1); inst_date = xaccSchedXactionGetNextInstance(sx, postponed->data); seq_num = gnc_sx_get_instance_count(sx, postponed->data); inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_POSTPONED, &inst_date, postponed->data, seq_num); instances->instance_list = g_list_append(instances->instance_list, inst); } } /* to-create */ g_date_clear(&cur_date, 1); sequence_ctx = gnc_sx_create_temporal_state(sx); cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx); instances->next_instance_date = cur_date; while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &creation_end) <= 0) { GncSxInstance *inst; int seq_num; seq_num = gnc_sx_get_instance_count(sx, sequence_ctx); inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_TO_CREATE, &cur_date, sequence_ctx, seq_num); instances->instance_list = g_list_append(instances->instance_list, inst); gnc_sx_incr_temporal_state(sx, sequence_ctx); cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx); } /* reminders */ while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &remind_end) <= 0) { GncSxInstance *inst; int seq_num; seq_num = gnc_sx_get_instance_count(sx, sequence_ctx); inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_REMINDER, &cur_date, sequence_ctx, seq_num); instances->instance_list = g_list_append(instances->instance_list, inst); gnc_sx_incr_temporal_state(sx, sequence_ctx); cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx); } return instances; }