r20036 - gnucash/trunk/src/engine - Add gnc_budget_clone() and make some functions arguments 'const'
Phil Longstaff
plongstaff at code.gnucash.org
Fri Jan 7 12:45:19 EST 2011
Author: plongstaff
Date: 2011-01-07 12:45:18 -0500 (Fri, 07 Jan 2011)
New Revision: 20036
Trac: http://svn.gnucash.org/trac/changeset/20036
Modified:
gnucash/trunk/src/engine/gnc-budget.c
gnucash/trunk/src/engine/gnc-budget.h
Log:
Add gnc_budget_clone() and make some functions arguments 'const'
Modified: gnucash/trunk/src/engine/gnc-budget.c
===================================================================
--- gnucash/trunk/src/engine/gnc-budget.c 2011-01-07 14:05:07 UTC (rev 20035)
+++ gnucash/trunk/src/engine/gnc-budget.c 2011-01-07 17:45:18 UTC (rev 20036)
@@ -307,6 +307,61 @@
gnc_budget_commit_edit(budget);
}
+/** Data structure for containing info while cloning budget values */
+typedef struct
+{
+ const GncBudget* old_b;
+ GncBudget* new_b;
+ guint num_periods;
+} CloneBudgetData_t;
+
+static void
+clone_budget_values_cb(Account* a, gpointer user_data)
+{
+ CloneBudgetData_t* data = (CloneBudgetData_t*)user_data;
+ guint i;
+
+ for ( i = 0; i < data->num_periods; ++i )
+ {
+ if ( gnc_budget_is_account_period_value_set(data->old_b, a, i) )
+ {
+ gnc_budget_set_account_period_value(data->new_b, a, i,
+ gnc_budget_get_account_period_value(data->old_b, a, i));
+ }
+ }
+}
+
+GncBudget*
+gnc_budget_clone(const GncBudget* old_b)
+{
+ GncBudget* new_b;
+ Account* root;
+ CloneBudgetData_t clone_data;
+
+ g_return_val_if_fail(old_b != NULL, NULL);
+
+ ENTER(" ");
+
+ new_b = gnc_budget_new(qof_instance_get_book(old_b));
+ gnc_budget_begin_edit(new_b);
+ gnc_budget_set_name(new_b, gnc_budget_get_name(old_b));
+ gnc_budget_set_description(new_b, gnc_budget_get_description(old_b));
+ gnc_budget_set_recurrence(new_b, gnc_budget_get_recurrence(old_b));
+ gnc_budget_set_num_periods(new_b, gnc_budget_get_num_periods(old_b));
+
+ root = gnc_book_get_root_account(qof_instance_get_book(old_b));
+ clone_data.old_b = old_b;
+ clone_data.new_b = new_b;
+ clone_data.num_periods = gnc_budget_get_num_periods(new_b);
+ gnc_account_foreach_descendant(root, clone_budget_values_cb, &clone_data);
+
+ gnc_budget_commit_edit(new_b);
+
+ LEAVE(" ");
+
+ return new_b;
+}
+
void
gnc_budget_set_name(GncBudget* budget, const gchar* name)
{
@@ -326,7 +381,7 @@
}
const gchar*
-gnc_budget_get_name(GncBudget* budget)
+gnc_budget_get_name(const GncBudget* budget)
{
g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
return GET_PRIVATE(budget)->name;
@@ -351,7 +406,7 @@
}
const gchar*
-gnc_budget_get_description(GncBudget* budget)
+gnc_budget_get_description(const GncBudget* budget)
{
g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
return GET_PRIVATE(budget)->description;
@@ -374,14 +429,14 @@
}
const Recurrence *
-gnc_budget_get_recurrence(GncBudget *budget)
+gnc_budget_get_recurrence(const GncBudget *budget)
{
g_return_val_if_fail(budget, NULL);
return (&GET_PRIVATE(budget)->recurrence);
}
const GncGUID*
-gnc_budget_get_guid(GncBudget* budget)
+gnc_budget_get_guid(const GncBudget* budget)
{
g_return_val_if_fail(budget, NULL);
g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
@@ -407,7 +462,7 @@
}
guint
-gnc_budget_get_num_periods(GncBudget* budget)
+gnc_budget_get_num_periods(const GncBudget* budget)
{
g_return_val_if_fail(GNC_IS_BUDGET(budget), 0);
return GET_PRIVATE(budget)->num_periods;
@@ -419,7 +474,7 @@
/* period_num is zero-based */
/* What happens when account is deleted, after we have an entry for it? */
void
-gnc_budget_unset_account_period_value(GncBudget *budget, Account *account,
+gnc_budget_unset_account_period_value(GncBudget *budget, const Account *account,
guint period_num)
{
const GncGUID *guid;
@@ -444,7 +499,7 @@
/* period_num is zero-based */
/* What happens when account is deleted, after we have an entry for it? */
void
-gnc_budget_set_account_period_value(GncBudget *budget, Account *account,
+gnc_budget_set_account_period_value(GncBudget *budget, const Account *account,
guint period_num, gnc_numeric val)
{
const GncGUID *guid;
@@ -501,7 +556,7 @@
gboolean
-gnc_budget_is_account_period_value_set(GncBudget *budget, Account *account,
+gnc_budget_is_account_period_value_set(const GncBudget *budget, const Account *account,
guint period_num)
{
gchar path[BUF_SIZE];
@@ -518,7 +573,7 @@
}
gnc_numeric
-gnc_budget_get_account_period_value(GncBudget *budget, Account *account,
+gnc_budget_get_account_period_value(const GncBudget *budget, const Account *account,
guint period_num)
{
gnc_numeric numeric;
@@ -541,7 +596,7 @@
Timespec
-gnc_budget_get_period_start_date(GncBudget *budget, guint period_num)
+gnc_budget_get_period_start_date(const GncBudget *budget, guint period_num)
{
Timespec ts;
timespecFromTime_t(
@@ -550,7 +605,7 @@
}
Timespec
-gnc_budget_get_period_end_date(GncBudget *budget, guint period_num)
+gnc_budget_get_period_end_date(const GncBudget *budget, guint period_num)
{
Timespec ts;
timespecFromTime_t(
@@ -560,7 +615,7 @@
gnc_numeric
gnc_budget_get_account_period_actual_value(
- GncBudget *budget, Account *acc, guint period_num)
+ const GncBudget *budget, Account *acc, guint period_num)
{
// FIXME: maybe zero is not best error return val.
g_return_val_if_fail(GNC_IS_BUDGET(budget) && acc, gnc_numeric_zero());
@@ -569,14 +624,14 @@
}
QofBook*
-gnc_budget_get_book(GncBudget* budget)
+gnc_budget_get_book(const GncBudget* budget)
{
g_return_val_if_fail(GNC_IS_BUDGET(budget), NULL);
return qof_instance_get_book(&budget->inst);
}
GncBudget*
-gnc_budget_lookup (const GncGUID *guid, QofBook *book)
+gnc_budget_lookup (const GncGUID *guid, const QofBook *book)
{
QofCollection *col;
Modified: gnucash/trunk/src/engine/gnc-budget.h
===================================================================
--- gnucash/trunk/src/engine/gnc-budget.h 2011-01-07 14:05:07 UTC (rev 20035)
+++ gnucash/trunk/src/engine/gnc-budget.h 2011-01-07 17:45:18 UTC (rev 20036)
@@ -104,58 +104,61 @@
void gnc_budget_begin_edit(GncBudget *bgt);
void gnc_budget_commit_edit(GncBudget *bgt);
+/** Clones a budget creating a copy */
+GncBudget *gnc_budget_clone(const GncBudget* budget);
+
/*@ dependent @*/
-const GncGUID* gnc_budget_get_guid(GncBudget* budget);
+const GncGUID* gnc_budget_get_guid(const GncBudget* budget);
#define gnc_budget_return_guid(X) \
(X ? *(qof_entity_get_guid(QOF_INSTANCE(X))) : *(guid_null()))
/** Set/Get the name of the Budget */
void gnc_budget_set_name(GncBudget* budget, const gchar* name);
/*@ dependent @*/
-const gchar* gnc_budget_get_name(GncBudget* budget);
+const gchar* gnc_budget_get_name(const GncBudget* budget);
/** Set/Get the description of the Budget */
void gnc_budget_set_description(GncBudget* budget, const gchar* description);
/*@ dependent @*/
-const gchar* gnc_budget_get_description(GncBudget* budget);
+const gchar* gnc_budget_get_description(const GncBudget* budget);
/** Set/Get the number of periods in the Budget */
void gnc_budget_set_num_periods(GncBudget* budget, guint num_periods);
-guint gnc_budget_get_num_periods(GncBudget* budget);
+guint gnc_budget_get_num_periods(const GncBudget* budget);
void gnc_budget_set_recurrence(GncBudget *budget, const Recurrence *r);
/*@ dependent @*/
-const Recurrence * gnc_budget_get_recurrence(GncBudget *budget);
+const Recurrence * gnc_budget_get_recurrence(const GncBudget *budget);
/** Get the starting date of the Budget period*/
-Timespec gnc_budget_get_period_start_date(GncBudget* budget, guint period_num);
+Timespec gnc_budget_get_period_start_date(const GncBudget* budget, guint period_num);
/** Get the ending date of the Budget period*/
-Timespec gnc_budget_get_period_end_date(GncBudget* budget, guint period_num);
+Timespec gnc_budget_get_period_end_date(const GncBudget* budget, guint period_num);
/* Period indices are zero-based. */
void gnc_budget_set_account_period_value(
- GncBudget* budget, Account* account, guint period_num, gnc_numeric val);
+ GncBudget* budget, const Account* account, guint period_num, gnc_numeric val);
void gnc_budget_unset_account_period_value(
- GncBudget* budget, Account* account, guint period_num);
+ GncBudget* budget, const Account* account, guint period_num);
gboolean gnc_budget_is_account_period_value_set(
- GncBudget *budget, Account *account, guint period_num);
+ const GncBudget *budget, const Account *account, guint period_num);
gnc_numeric gnc_budget_get_account_period_value(
- GncBudget *budget, Account *account, guint period_num);
+ const GncBudget *budget, const Account *account, guint period_num);
gnc_numeric gnc_budget_get_account_period_actual_value(
- GncBudget *budget, Account *account, guint period_num);
+ const GncBudget *budget, Account *account, guint period_num);
/** Get the book that this budget is associated with. */
-QofBook* gnc_budget_get_book(GncBudget* budget);
+QofBook* gnc_budget_get_book(const GncBudget* budget);
/* Returns some budget in the book, or NULL. */
GncBudget* gnc_budget_get_default(QofBook *book);
/* Get the budget associated with the given GncGUID from the given book. */
/*@ dependent @*/
-GncBudget* gnc_budget_lookup (const GncGUID *guid, QofBook *book);
+GncBudget* gnc_budget_lookup (const GncGUID *guid, const QofBook *book);
#define gnc_budget_lookup_direct(g,b) gnc_budget_lookup(&(g),(b))
#endif // __BUDGET_H__
More information about the gnucash-changes
mailing list