diff --git a/libgnucash/engine/gnc-commodity.c b/libgnucash/engine/gnc-commodity.c index 56763e7a03..745be68bc6 100644 --- a/libgnucash/engine/gnc-commodity.c +++ b/libgnucash/engine/gnc-commodity.c @@ -76,6 +76,7 @@ typedef struct gnc_commodityPrivate const char *cusip; /* CUSIP or other identifying code */ int fraction; char *unique_name; + char *user_symbol; gboolean quote_flag; /* user wants price quotes */ gnc_quote_source *quote_source; /* current/old source of quotes */ @@ -89,6 +90,9 @@ typedef struct gnc_commodityPrivate const char *default_symbol; } gnc_commodityPrivate; +static const char* +is_unset = "unset"; + #define GET_PRIVATE(o) \ ((gnc_commodityPrivate*)g_type_instance_get_private((GTypeInstance*)o, GNC_TYPE_COMMODITY)) @@ -667,6 +671,7 @@ gnc_commodity_init(gnc_commodity* com) priv->quote_flag = 0; priv->quote_source = NULL; priv->quote_tz = CACHE_INSERT(""); + priv->user_symbol = (char*) is_unset; reset_printname(priv); reset_unique_name(priv); @@ -951,6 +956,10 @@ commodity_free(gnc_commodity * cm) g_free(priv->unique_name); priv->unique_name = NULL; + if (priv->user_symbol != is_unset) + g_free (priv->user_symbol); + priv->user_symbol = NULL; + #ifdef ACCOUNTS_CLEANED_UP /* Account objects are not actually cleaned up when a book is closed (in fact * a memory leak), but commodities are, so in currently this warning gets hit @@ -1182,14 +1191,17 @@ gnc_commodity_get_quote_tz(const gnc_commodity *cm) const char* gnc_commodity_get_user_symbol(const gnc_commodity *cm) { - GValue v = G_VALUE_INIT; - static char* retval = NULL; - if (!cm) return NULL; - qof_instance_get_kvp (QOF_INSTANCE(cm), &v, 1, "user_symbol"); - g_free (retval); - retval = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v): NULL; - g_value_unset (&v); - return retval; + gnc_commodityPrivate* priv; + g_return_val_if_fail (GNC_IS_COMMODITY (cm), NULL); + priv = GET_PRIVATE(cm); + if (priv->user_symbol == is_unset) + { + GValue v = G_VALUE_INIT; + qof_instance_get_kvp (QOF_INSTANCE(cm), &v, 1, "user_symbol"); + priv->user_symbol = G_VALUE_HOLDS_STRING (&v) ? g_value_dup_string (&v) : NULL; + g_value_unset (&v); + } + return priv->user_symbol; } /******************************************************************** @@ -1477,13 +1489,13 @@ void gnc_commodity_set_user_symbol(gnc_commodity * cm, const char * user_symbol) { struct lconv *lc; - GValue v = G_VALUE_INIT; + gnc_commodityPrivate* priv; + if (!cm) return; + priv = GET_PRIVATE(cm); ENTER ("(cm=%p, symbol=%s)", cm, user_symbol ? user_symbol : "(null)"); - gnc_commodity_begin_edit(cm); - lc = gnc_localeconv(); if (!user_symbol || !*user_symbol) user_symbol = NULL; @@ -1494,15 +1506,33 @@ gnc_commodity_set_user_symbol(gnc_commodity * cm, const char * user_symbol) user_symbol = NULL; else if (!g_strcmp0(user_symbol, gnc_commodity_get_default_symbol(cm))) user_symbol = NULL; + + if (priv->user_symbol != is_unset) + { + if (!g_strcmp0 (user_symbol, priv->user_symbol)) + { + LEAVE ("gnc_commodity_set_user_symbol: no change"); + return; + } + g_free (priv->user_symbol); + } + + gnc_commodity_begin_edit (cm); + if (user_symbol) { + GValue v = G_VALUE_INIT; g_value_init (&v, G_TYPE_STRING); g_value_set_string (&v, user_symbol); qof_instance_set_kvp (QOF_INSTANCE(cm), &v, 1, "user_symbol"); + priv->user_symbol = g_strdup (user_symbol); g_value_unset (&v); } else + { qof_instance_set_kvp (QOF_INSTANCE(cm), NULL, 1, "user_symbol"); + priv->user_symbol = NULL; + } mark_commodity_dirty(cm); gnc_commodity_commit_edit(cm);