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