29#include <glib/gi18n.h>
36#include <qofinstance-p.h>
40#include "gnc-locale-utils.h"
46#include <unordered_map>
48static QofLogModule log_module = GNC_MOD_COMMODITY;
77 gnc_commodity_namespace *name_space;
88 gnc_quote_source *quote_source;
96 const char *default_symbol;
99#define GET_PRIVATE(o) \
100 ((gnc_commodityPrivate*)gnc_commodity_get_instance_private((gnc_commodity*)o))
104 QofInstanceClass parent_class;
107static void commodity_free(gnc_commodity * cm);
108static void gnc_commodity_set_default_symbol(gnc_commodity *,
const char *);
116 GHashTable * cm_table;
122 QofInstanceClass parent_class;
127 GHashTable * ns_table;
131static const std::unordered_map<std::string,std::string> gnc_new_iso_codes =
147static std::string fq_version;
152 gboolean m_supported;
154 std::string m_user_name;
155 std::string m_internal_name;
157 bool get_supported ()
const {
return m_supported; }
158 void set_supported (
bool supported) { m_supported = supported; }
160 const char* get_user_name ()
const {
return m_user_name.c_str(); }
161 const char* get_internal_name ()
const {
return m_internal_name.c_str(); }
163 const char* username,
const char* int_name)
164 : m_supported{supported}
166 , m_user_name{username ? username :
""}
167 , m_internal_name{int_name ? int_name:
""} { };
170using QuoteSourceList = std::list<gnc_quote_source>;
180static QuoteSourceList currency_quote_sources =
189static QuoteSourceList single_quote_sources =
191 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Alphavantage"),
"alphavantage" },
192 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Association of Mutual Funds in India"),
"amfiindia" },
193 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Athens Exchange Group, GR"),
"asegr" },
194 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Australian Stock Exchange, AU"),
"asx" },
195 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Italian Stock Exchange, IT"),
"borsa_italiana" },
196 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"BSE India, IN"),
"bseindia" },
197 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Bucharest Stock Exchange, RO"),
"bvb" },
198 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Colombo Stock Exchange, LK"),
"cse" },
199 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"comdirect, DE"),
"comdirect" },
200 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Consors Bank, DE"),
"consorsbank" },
201 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Deka Investments, DE"),
"deka" },
202 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Financial Times Funds service, GB"),
"ftfunds" },
203 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Finanzpartner, DE"),
"finanzpartner" },
204 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Finnhub, US"),
"finnhub" },
205 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"FondsWeb, DE"),
"fondsweb" },
206 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"GoldMoney precious metals"),
"goldmoney" },
207 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Google Web, US Stocks"),
"googleweb" },
208 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Market Watch"),
"marketwatch" },
209 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Morningstar, JP"),
"morningstarjp" },
210 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Motley Fool"),
"fool" },
211 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"New Zealand stock eXchange, NZ"),
"nzx" },
212 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"NSE (National Stock Exchange), IN"),
"nseindia" },
213 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"OnVista, DE"),
"onvista"},
214 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Paris Stock Exchange/Boursorama, FR"),
"bourso" },
215 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"S-Investor, DE"),
"sinvestor"},
216 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Sharenet, ZA"),
"za" },
217 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"SIX Swiss Exchange shares, CH"),
"six" },
218 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"StockData"),
"stockdata" },
219 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Stooq, PL"),
"stooq" },
220 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Swiss Fund Data AG, CH"),
"swissfunddata" },
221 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Tesouro Direto bonds, BR"),
"tesouro_direto" },
222 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Toronto Stock eXchange, CA"),
"tsx" },
223 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Tradegate, DE"),
"tradegate" },
224 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Treasury Direct bonds, US"),
"treasurydirect" },
225 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Twelve Data"),
"twelvedata" },
226 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Union Investment, DE"),
"unionfunds" },
227 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"US Savings Bonds, US"),
"usbonds" },
228 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"US Govt. Thrift Savings Plan"),
"tsp" },
229 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"XETRA, DE"),
"xetra" },
230 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Yahoo as JSON"),
"yahoo_json" },
231 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Yahoo Web"),
"yahooweb" },
232 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"YH Finance (FinanceAPI)"),
"financeapi" },
236static QuoteSourceList multiple_quote_sources =
238 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Canada (Alphavantage, TMX)"),
"canada" },
239 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Europe (ASEGR, Bourso, …)"),
"europe" },
240 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"India (BSEIndia, NSEIndia)"),
"india"},
241 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Nasdaq (Alphavantage, FinanceAPI, …)"),
"nasdaq" },
242 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"NYSE (Alphavantage, FinanceAPI, …)"),
"nyse" },
243 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"U.K. Funds (FTfunds)"),
"ukfunds" },
244 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"USA (Alphavantage, FinanceAPI, …)"),
"usa" },
247static QuoteSourceList new_quote_sources;
250static const std::vector<std::pair<QuoteSourceType,QuoteSourceList&>> quote_sources_map =
267 return (!fq_version.empty());
280 return fq_version.c_str();
283static QuoteSourceList&
286 auto quote_sources_it = std::find_if (quote_sources_map.begin(), quote_sources_map.end(),
287 [type] (
const auto& qs) { return type == qs.first; });
289 if (quote_sources_it != quote_sources_map.end())
290 return quote_sources_it->second;
292 PWARN (
"Invalid Quote Source %d, returning new_quote_sources", type);
293 return new_quote_sources;
303 return get_quote_source_from_type(type).size();
319 DEBUG(
"Creating new source %s", (!source_name ?
"(null)" : source_name));
325 return &new_quote_sources.emplace_back (supported,
SOURCE_UNKNOWN, source_name, source_name);
336 ENTER(
"type/index is %d/%d", type, index);
337 auto& sources = get_quote_source_from_type (type);
338 if ((
size_t) index < sources.size())
340 auto it = std::next(sources.begin(), index);
341 LEAVE(
"found %s", it->get_user_name());
355 for (
const auto& [_, sources] : quote_sources_map)
357 auto source_it = std::find_if (sources.begin(), sources.end(),
358 [name] (
const auto& qs)
359 { return (g_strcmp0(name, qs.get_internal_name()) == 0); });
360 if (source_it != sources.end())
361 return &(*source_it);
364 DEBUG(
"gnc_quote_source_lookup_by_internal: Unknown source %s", name);
383 LEAVE(
"type is %d", source->get_type());
384 return source->get_type();
392 PWARN (
"bad source");
396 auto& sources = get_quote_source_from_type (source->get_type());
397 auto is_source = [&source](
const auto& findif_source)
398 {
return &findif_source == source; };
400 auto iter = std::find_if (sources.begin(), sources.end(), is_source);
401 if (iter != sources.end())
402 return std::distance (sources.begin(), iter);
404 PWARN (
"couldn't locate source");
418 LEAVE(
"%s supported", source && source->get_supported() ?
"" :
"not ");
419 return source->get_supported();
431 LEAVE(
"user name %s", source->get_user_name());
432 return source->get_user_name();
444 LEAVE(
"internal name %s", source->get_internal_name());
445 return source->get_internal_name();
457 const std::vector<std::string>& sources_list)
461 if (sources_list.empty())
465 fq_version = version_string;
469 for (
const auto& source_name_str : sources_list)
471 auto source_name = source_name_str.c_str();
476 DEBUG(
"Found source %s: %s", source_name, source->get_user_name());
477 source->set_supported (
true);
491gnc_commodity_begin_edit (gnc_commodity *cm)
498 PERR (
"Failed to commit: %d", errcode);
499 gnc_engine_signal_commit_error( errcode );
507 commodity_free( GNC_COMMODITY(inst) );
511gnc_commodity_commit_edit (gnc_commodity *cm)
522mark_commodity_dirty (gnc_commodity *cm)
524 qof_instance_set_dirty(&cm->inst);
531 g_free(priv->printname);
532 priv->printname = g_strdup_printf(
"%s (%s)",
533 priv->mnemonic ? priv->mnemonic :
"",
534 priv->fullname ? priv->fullname :
"");
540 gnc_commodity_namespace *ns;
542 g_free(priv->unique_name);
543 ns = priv->name_space;
544 priv->unique_name = g_strdup_printf(
"%s::%s",
546 priv->mnemonic ? priv->mnemonic :
"");
550G_DEFINE_TYPE_WITH_PRIVATE(gnc_commodity, gnc_commodity, QOF_TYPE_INSTANCE)
553gnc_commodity_init(gnc_commodity* com)
557 priv = GET_PRIVATE(com);
559 priv->name_space =
nullptr;
560 priv->fullname = CACHE_INSERT(
"");
561 priv->mnemonic = CACHE_INSERT(
"");
562 priv->cusip = CACHE_INSERT(
"");
563 priv->fraction = 10000;
564 priv->quote_flag = 0;
565 priv->quote_source =
nullptr;
566 priv->quote_tz = CACHE_INSERT(
"");
568 reset_printname(priv);
569 reset_unique_name(priv);
573gnc_commodity_dispose(GObject *comp)
575 G_OBJECT_CLASS(gnc_commodity_parent_class)->dispose(comp);
579gnc_commodity_finalize(GObject* comp)
581 G_OBJECT_CLASS(gnc_commodity_parent_class)->finalize(comp);
590gnc_commodity_get_property (GObject *
object,
595 gnc_commodity *commodity;
598 g_return_if_fail(GNC_IS_COMMODITY(
object));
600 commodity = GNC_COMMODITY(
object);
601 priv = GET_PRIVATE(commodity);
605 g_value_take_object(value, priv->name_space);
608 g_value_set_string(value, priv->fullname);
611 g_value_set_string(value, priv->mnemonic);
614 g_value_set_string(value, priv->printname);
617 g_value_set_string(value, priv->cusip);
620 g_value_set_int(value, priv->fraction);
622 case PROP_UNIQUE_NAME:
623 g_value_set_string(value, priv->unique_name);
625 case PROP_QUOTE_FLAG:
626 g_value_set_boolean(value, priv->quote_flag);
628 case PROP_QUOTE_SOURCE:
629 g_value_set_pointer(value, priv->quote_source);
632 g_value_set_string(value, priv->quote_tz);
635 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
641gnc_commodity_set_property (GObject *
object,
646 gnc_commodity *commodity;
648 g_return_if_fail(GNC_IS_COMMODITY(
object));
650 commodity = GNC_COMMODITY(
object);
651 g_assert (qof_instance_get_editlevel(commodity));
670 case PROP_QUOTE_FLAG:
673 case PROP_QUOTE_SOURCE:
680 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
687 GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
689 gobject_class->dispose = gnc_commodity_dispose;
690 gobject_class->finalize = gnc_commodity_finalize;
691 gobject_class->set_property = gnc_commodity_set_property;
692 gobject_class->get_property = gnc_commodity_get_property;
694 g_object_class_install_property(gobject_class,
696 g_param_spec_object (
"namespace",
698 "The namespace field denotes the "
699 "namespace for this commodity, either "
700 "a currency or symbol from a quote source.",
701 GNC_TYPE_COMMODITY_NAMESPACE,
703 g_object_class_install_property(gobject_class,
705 g_param_spec_string (
"fullname",
706 "Full Commodity Name",
707 "The fullname is the official full name of"
711 g_object_class_install_property(gobject_class,
713 g_param_spec_string (
"mnemonic",
714 "Commodity Mnemonic",
715 "The mnemonic is the official abbreviated"
716 "designation for the currency.",
719 g_object_class_install_property(gobject_class,
721 g_param_spec_string (
"printname",
722 "Commodity Print Name",
723 "Printable form of the commodity name.",
726 g_object_class_install_property(gobject_class,
728 g_param_spec_string (
"cusip",
729 "Commodity CUSIP Code",
733 g_object_class_install_property(gobject_class,
735 g_param_spec_int (
"fraction",
737 "The fraction is the number of sub-units that "
738 "the basic commodity can be divided into.",
743 g_object_class_install_property(gobject_class,
745 g_param_spec_string (
"unique-name",
746 "Commodity Unique Name",
747 "Unique form of the commodity name which combines "
748 "the namespace name and the commodity name.",
751 g_object_class_install_property(gobject_class,
753 g_param_spec_boolean (
"quote_flag",
755 "TRUE if prices are to be downloaded for this "
756 "commodity from a quote source.",
759 g_object_class_install_property(gobject_class,
761 g_param_spec_pointer(
"quote-source",
763 "The quote source from which prices are downloaded.",
765 g_object_class_install_property(gobject_class,
767 g_param_spec_string (
"quote-tz",
768 "Commodity Quote Timezone",
776 const char * name_space,
const char * mnemonic,
777 const char * cusip,
int fraction)
779 auto retval = GNC_COMMODITY(g_object_new(GNC_TYPE_COMMODITY,
nullptr));
782 gnc_commodity_begin_edit(retval);
784 if ( name_space !=
nullptr )
787 if (g_strcmp0 (name_space, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
788 g_strcmp0 (mnemonic,
"template") != 0)
790 PWARN(
"Converting commodity %s from namespace template to "
791 "namespace User", mnemonic);
805 mark_commodity_dirty (retval);
806 gnc_commodity_commit_edit(retval);
819commodity_free(gnc_commodity * cm)
822 gnc_commodity_table *
table;
830 priv = GET_PRIVATE(cm);
835 CACHE_REMOVE (priv->fullname);
836 CACHE_REMOVE (priv->cusip);
837 CACHE_REMOVE (priv->mnemonic);
838 CACHE_REMOVE (priv->quote_tz);
839 priv->name_space =
nullptr;
842 priv->quote_source =
nullptr;
845 g_free(priv->printname);
846 priv->printname =
nullptr;
848 g_free(priv->unique_name);
849 priv->unique_name =
nullptr;
851#ifdef ACCOUNTS_CLEANED_UP
856 if (priv->usage_count != 0)
858 PWARN(
"Destroying commodity (%p) with non-zero usage_count (%d).", cm,
870 gnc_commodity_begin_edit(cm);
871 qof_instance_set_destroying(cm, TRUE);
872 gnc_commodity_commit_edit(cm);
883 dest_priv->name_space = src_priv->name_space;
889 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
898 auto dest = GNC_COMMODITY (g_object_new(GNC_TYPE_COMMODITY,
nullptr));
900 src_priv = GET_PRIVATE(src);
901 dest_priv = GET_PRIVATE(dest);
903 dest_priv->fullname = CACHE_INSERT(src_priv->fullname);
904 dest_priv->mnemonic = CACHE_INSERT(src_priv->mnemonic);
905 dest_priv->cusip = CACHE_INSERT(src_priv->cusip);
906 dest_priv->quote_tz = CACHE_INSERT(src_priv->quote_tz);
908 dest_priv->name_space = src_priv->name_space;
910 dest_priv->fraction = src_priv->fraction;
911 dest_priv->quote_flag = src_priv->quote_flag;
915 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
917 reset_printname(dest_priv);
918 reset_unique_name(dest_priv);
930 if (!cm)
return nullptr;
931 return GET_PRIVATE(cm)->mnemonic;
941 if (!cm)
return nullptr;
942 return GET_PRIVATE(cm)->printname;
953 if (!cm)
return nullptr;
957gnc_commodity_namespace *
960 if (!cm)
return nullptr;
961 return GET_PRIVATE(cm)->name_space;
971 if (!cm)
return nullptr;
972 return GET_PRIVATE(cm)->fullname;
983 if (!cm)
return nullptr;
984 return GET_PRIVATE(cm)->unique_name;
995 if (!cm)
return nullptr;
996 return GET_PRIVATE(cm)->cusip;
1007 return GET_PRIVATE(cm)->fraction;
1015gnc_commodity_get_auto_quote_control_flag(
const gnc_commodity *cm)
1017 if (!cm)
return FALSE;
1018 auto str{qof_instance_get_path_kvp<const char*> (QOF_INSTANCE (cm), {
"auto_quote_control"})};
1019 return !str || g_strcmp0 (*str,
"false");
1029 if (!cm)
return FALSE;
1030 return (GET_PRIVATE(cm)->quote_flag);
1042 if (!cm)
return nullptr;
1043 priv = GET_PRIVATE(cm);
1045 return ¤cy_quote_sources.front();
1046 return priv->quote_source;
1050gnc_commodity_get_default_quote_source(
const gnc_commodity *cm)
1053 return ¤cy_quote_sources.front();
1065 if (!cm)
return nullptr;
1066 return GET_PRIVATE(cm)->quote_tz;
1075 g_return_val_if_fail (GNC_IS_COMMODITY (cm),
nullptr);
1077 auto sym{qof_instance_get_path_kvp<const char*> (QOF_INSTANCE(cm), {
"user_symbol"})};
1078 return sym ? *sym :
nullptr;
1087 if (!cm)
return nullptr;
1088 return GET_PRIVATE(cm)->default_symbol;
1097 const char *nice_symbol;
1099 if (!cm)
return nullptr;
1102 if (nice_symbol && *nice_symbol)
1105 lc = gnc_localeconv();
1106 nice_symbol = lc->currency_symbol;
1111 if (nice_symbol && *nice_symbol)
1127 priv = GET_PRIVATE(cm);
1128 if (priv->mnemonic == mnemonic)
return;
1130 gnc_commodity_begin_edit(cm);
1131 CACHE_REMOVE (priv->mnemonic);
1132 priv->mnemonic = CACHE_INSERT(mnemonic);
1134 mark_commodity_dirty (cm);
1135 reset_printname(priv);
1136 reset_unique_name(priv);
1137 gnc_commodity_commit_edit(cm);
1148 gnc_commodity_table *
table;
1149 gnc_commodity_namespace *nsp;
1153 priv = GET_PRIVATE(cm);
1157 if (priv->name_space == nsp)
1160 gnc_commodity_begin_edit(cm);
1161 priv->name_space = nsp;
1164 mark_commodity_dirty(cm);
1165 reset_printname(priv);
1166 reset_unique_name(priv);
1167 gnc_commodity_commit_edit(cm);
1180 priv = GET_PRIVATE(cm);
1181 if (priv->fullname == fullname)
return;
1183 CACHE_REMOVE (priv->fullname);
1184 priv->fullname = CACHE_INSERT (fullname);
1186 gnc_commodity_begin_edit(cm);
1187 mark_commodity_dirty(cm);
1188 reset_printname(priv);
1189 gnc_commodity_commit_edit(cm);
1204 priv = GET_PRIVATE(cm);
1205 if (priv->cusip == cusip)
return;
1207 gnc_commodity_begin_edit(cm);
1208 CACHE_REMOVE (priv->cusip);
1209 priv->cusip = CACHE_INSERT (cusip);
1210 mark_commodity_dirty(cm);
1211 gnc_commodity_commit_edit(cm);
1222 gnc_commodity_begin_edit(cm);
1223 GET_PRIVATE(cm)->fraction = fraction;
1224 mark_commodity_dirty(cm);
1225 gnc_commodity_commit_edit(cm);
1233gnc_commodity_set_auto_quote_control_flag(gnc_commodity *cm,
1234 const gboolean flag)
1236 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1243 gnc_commodity_begin_edit(cm);
1244 auto val = flag ? std::nullopt : std::make_optional<const char*>(g_strdup(
"false"));
1245 qof_instance_set_path_kvp<const char*> (QOF_INSTANCE (cm), val, {
"auto_quote_control"});
1246 mark_commodity_dirty(cm);
1247 gnc_commodity_commit_edit(cm);
1260 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1268 priv = GET_PRIVATE(cm);
1269 gnc_commodity_begin_edit(cm);
1280 gnc_commodity_set_auto_quote_control_flag(cm,
1281 (!flag && (priv->usage_count == 0)) || (flag && (priv->usage_count != 0)));
1283 gnc_commodity_commit_edit(cm);
1294 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1297 gnc_commodity_begin_edit(cm);
1298 GET_PRIVATE(cm)->quote_flag = flag;
1299 mark_commodity_dirty(cm);
1300 gnc_commodity_commit_edit(cm);
1311 ENTER (
"(cm=%p, src=%p(%s))", cm, src, src ? src->get_internal_name() :
"unknown");
1314 gnc_commodity_begin_edit(cm);
1315 GET_PRIVATE(cm)->quote_source = src;
1316 mark_commodity_dirty(cm);
1317 gnc_commodity_commit_edit(cm);
1332 ENTER (
"(cm=%p, tz=%s)", cm, tz ? tz :
"(null)");
1334 priv = GET_PRIVATE(cm);
1336 if (tz == priv->quote_tz)
1338 LEAVE(
"Already correct TZ");
1342 gnc_commodity_begin_edit(cm);
1343 CACHE_REMOVE (priv->quote_tz);
1344 priv->quote_tz = CACHE_INSERT (tz);
1345 mark_commodity_dirty(cm);
1346 gnc_commodity_commit_edit(cm);
1361 ENTER (
"(cm=%p, symbol=%s)", cm, user_symbol ? user_symbol :
"(null)");
1363 lc = gnc_localeconv();
1364 if (!user_symbol || !*user_symbol)
1365 user_symbol =
nullptr;
1367 !g_strcmp0(lc->currency_symbol, user_symbol))
1370 user_symbol =
nullptr;
1372 user_symbol =
nullptr;
1374 gnc_commodity_begin_edit (cm);
1376 auto val = user_symbol ? std::make_optional<const char*>(g_strdup(user_symbol)) : std::nullopt;
1377 qof_instance_set_path_kvp<const char*> (QOF_INSTANCE(cm), val, {
"user_symbol"});
1379 mark_commodity_dirty(cm);
1380 gnc_commodity_commit_edit(cm);
1391gnc_commodity_set_default_symbol(gnc_commodity * cm,
1392 const char * default_symbol)
1394 GET_PRIVATE(cm)->default_symbol = default_symbol;
1406 ENTER(
"(cm=%p)", cm);
1414 priv = GET_PRIVATE(cm);
1416 if ((priv->usage_count == 0) && !priv->quote_flag
1417 && gnc_commodity_get_auto_quote_control_flag(cm)
1422 gnc_commodity_begin_edit(cm);
1425 gnc_commodity_get_default_quote_source(cm));
1426 gnc_commodity_commit_edit(cm);
1428 priv->usage_count++;
1429 LEAVE(
"(usage_count=%d)", priv->usage_count);
1441 ENTER(
"(cm=%p)", cm);
1449 priv = GET_PRIVATE(cm);
1451 if (priv->usage_count == 0)
1453 PWARN(
"usage_count already zero");
1458 priv->usage_count--;
1459 if ((priv->usage_count == 0) && priv->quote_flag
1460 && gnc_commodity_get_auto_quote_control_flag(cm)
1467 LEAVE(
"(usage_count=%d)", priv->usage_count);
1485 if (a == b)
return TRUE;
1486 if (!a || !b)
return FALSE;
1488 priv_a = GET_PRIVATE(a);
1489 priv_b = GET_PRIVATE(b);
1490 if (priv_a->name_space != priv_b->name_space)
return FALSE;
1491 if (g_strcmp0(priv_a->mnemonic, priv_b->mnemonic) != 0)
return FALSE;
1504 if (a == b)
return 0;
1505 if (a && !b)
return 1;
1506 if (b && !a)
return -1;
1535 if (g_strcmp0 (ns->name, GNC_COMMODITY_NS_CURRENCY) == 0)
1536 return GNC_COMMODITY_NS_ISO_GUI;
1546 return g_list_copy (name_space->cm_list);
1552 return ((g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0) ||
1553 (g_strcmp0(name_space, GNC_COMMODITY_NS_CURRENCY) == 0));
1557gnc_commodity_table_map_namespace(
const char * name_space)
1559 if (g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0)
1560 return GNC_COMMODITY_NS_CURRENCY;
1569gnc_commodity_table *
1572 gnc_commodity_table * retval = g_new0(gnc_commodity_table, 1);
1573 retval->ns_table = g_hash_table_new(&g_str_hash, &g_str_equal);
1574 retval->ns_list =
nullptr;
1582gnc_commodity_table *
1585 if (!book)
return nullptr;
1586 return static_cast<gnc_commodity_table*
>(qof_book_get_data (book, GNC_COMMODITY_TABLE));
1592 gnc_commodity *twin;
1594 gnc_commodity_table * comtbl;
1596 if (!from)
return nullptr;
1598 if (!comtbl)
return nullptr;
1601 twin = gnc_commodity_table_lookup_unique (comtbl, ucom);
1616count_coms(gpointer key, gpointer value, gpointer user_data)
1618 GHashTable *tbl = ((gnc_commodity_namespace*)value)->cm_table;
1619 guint *count = (guint*)user_data;
1621 if (g_strcmp0((
char*)key, GNC_COMMODITY_NS_CURRENCY) == 0)
1629 *count += g_hash_table_size(tbl);
1636 g_return_val_if_fail(tbl, 0);
1637 g_return_val_if_fail(tbl->ns_table, 0);
1639 g_hash_table_foreach(tbl->ns_table, count_coms, (gpointer)&count);
1650gnc_commodity_table_lookup(
const gnc_commodity_table *
table,
1651 const char * name_space,
const char * mnemonic)
1653 gnc_commodity_namespace * nsp =
nullptr;
1655 if (!
table || !name_space || !mnemonic)
return nullptr;
1667 auto it = gnc_new_iso_codes.find (mnemonic);
1668 if (it != gnc_new_iso_codes.end())
1669 mnemonic = it->second.c_str();
1671 return GNC_COMMODITY(g_hash_table_lookup(nsp->cm_table, (gpointer)mnemonic));
1685gnc_commodity_table_lookup_unique(
const gnc_commodity_table *
table,
1686 const char * unique_name)
1690 gnc_commodity *commodity;
1692 if (!
table || !unique_name)
return nullptr;
1694 name_space = g_strdup (unique_name);
1695 mnemonic = strstr (name_space,
"::");
1698 g_free (name_space);
1705 commodity = gnc_commodity_table_lookup (
table, name_space, mnemonic);
1707 g_free (name_space);
1718gnc_commodity_table_find_full(
const gnc_commodity_table *
table,
1719 const char * name_space,
1720 const char * fullname)
1722 gnc_commodity * retval =
nullptr;
1726 if (!fullname || (fullname[0] ==
'\0'))
1731 for (iterator = all; iterator; iterator = iterator->next)
1733 auto commodity = GNC_COMMODITY (iterator->data);
1734 if (!strcmp(fullname,
1755 gnc_commodity * comm)
1757 gnc_commodity_namespace * nsp =
nullptr;
1759 const char *ns_name;
1763 if (!
table)
return nullptr;
1764 if (!comm)
return nullptr;
1766 priv = GET_PRIVATE(comm);
1768 ENTER (
"(table=%p, comm=%p) %s %s",
table, comm,
1769 (priv->mnemonic ==
nullptr ?
"(null)" : priv->mnemonic),
1770 (priv->fullname ==
nullptr ?
"(null)" : priv->fullname));
1772 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1778 LEAVE(
"already in table");
1784 if (priv->name_space->iso4217)
1786 auto it = gnc_new_iso_codes.find (priv->mnemonic);
1787 if (it != gnc_new_iso_codes.end())
1792 LEAVE(
"found at %p", c);
1797 if (g_strcmp0 (ns_name, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
1798 g_strcmp0 (priv->mnemonic,
"template") != 0)
1800 PWARN(
"Converting commodity %s from namespace template to "
1801 "namespace User", priv->mnemonic);
1804 mark_commodity_dirty (comm);
1810 PINFO (
"insert %p %s into nsp=%p %s", priv->mnemonic, priv->mnemonic,
1811 nsp->cm_table, nsp->name);
1812 g_hash_table_insert(nsp->cm_table,
1813 (gpointer)CACHE_INSERT(priv->mnemonic),
1815 nsp->cm_list = g_list_append(nsp->cm_list, comm);
1829 gnc_commodity * comm)
1831 gnc_commodity_namespace * nsp;
1834 const char *ns_name;
1839 priv = GET_PRIVATE(comm);
1841 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1842 if (c != comm)
return;
1849 nsp->cm_list = g_list_remove(nsp->cm_list, comm);
1850 g_hash_table_remove (nsp->cm_table, priv->mnemonic);
1861 const char * name_space)
1863 gnc_commodity_namespace * nsp =
nullptr;
1865 if (!
table || !name_space)
1882hash_keys_helper(gpointer key, gpointer value, gpointer data)
1884 auto l = (GList**)data;
1885 *l = g_list_prepend(*l, key);
1889g_hash_table_keys(GHashTable *
table)
1891 GList * l =
nullptr;
1892 g_hash_table_foreach(
table, &hash_keys_helper, (gpointer) &l);
1897hash_values_helper(gpointer key, gpointer value, gpointer data)
1899 auto l = (GList**)data;
1900 *l = g_list_prepend(*l, value);
1904g_hash_table_values(GHashTable *
table)
1906 GList * l =
nullptr;
1907 g_hash_table_foreach(
table, &hash_values_helper, (gpointer) &l);
1922 return g_hash_table_keys(
table->ns_table);
1931 return g_list_copy (
table->ns_list);
1945 if (!cm)
return FALSE;
1947 priv = GET_PRIVATE(cm);
1948 if ( !priv->name_space)
return FALSE;
1949 return priv->name_space->iso4217;
1955 const char *ns_name;
1956 if (!cm)
return FALSE;
1960 !g_strcmp0(ns_name, GNC_COMMODITY_NS_CURRENCY));
1968static CommodityList*
1969commodity_table_get_all_noncurrency_commodities(
const gnc_commodity_table*
table)
1972 CommodityList *retval =
nullptr;
1973 for (node = nslist; node; node=g_list_next(node))
1975 gnc_commodity_namespace *ns =
nullptr;
1976 if (g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_CURRENCY) == 0
1977 || g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_TEMPLATE) == 0)
1982 retval = g_list_concat(g_hash_table_values(ns->cm_table), retval);
1984 g_list_free(nslist);
1990 const char * name_space)
1992 gnc_commodity_namespace * ns =
nullptr;
1996 if (g_strcmp0(name_space, GNC_COMMODITY_NS_NONISO_GUI) == 0)
1997 return commodity_table_get_all_noncurrency_commodities(
table);
2002 return g_hash_table_values(ns->cm_table);
2011get_quotables_helper1(gpointer key, gpointer value, gpointer data)
2013 auto comm = GNC_COMMODITY(value);
2015 auto l =
static_cast<GList**
>(data);
2017 if (!priv->quote_flag || !priv->quote_source || !priv->quote_source->get_supported())
2019 *l = g_list_prepend(*l, value);
2023get_quotables_helper2 (gnc_commodity *comm, gpointer data)
2025 auto l =
static_cast<GList**
>(data);
2028 if (!priv->quote_flag || priv->quote_source || !priv->quote_source->get_supported())
2030 *l = g_list_prepend(*l, comm);
2037 gnc_commodity_namespace * ns =
nullptr;
2038 const char *name_space;
2039 GList * nslist, * tmp;
2040 GList * l =
nullptr;
2042 const char *expression = gnc_prefs_get_namespace_regexp();
2044 ENTER(
"table=%p, expression=%s",
table, expression);
2048 if (expression && *expression)
2050 if (regcomp(&pattern, expression, REG_EXTENDED | REG_ICASE) != 0)
2052 LEAVE(
"Cannot compile regex");
2057 for (tmp = nslist; tmp; tmp = tmp->next)
2059 name_space =
static_cast<const char*
>(tmp->data);
2060 if (regexec(&pattern, name_space, 0,
nullptr, 0) == 0)
2062 DEBUG(
"Running list of %s commodities", name_space);
2066 g_hash_table_foreach(ns->cm_table, &get_quotables_helper1, (gpointer) &l);
2070 g_list_free(nslist);
2075 gnc_commodity_table_foreach_commodity(
table, get_quotables_helper2,
2078 LEAVE(
"list head %p", l);
2088QOF_GOBJECT_IMPL(gnc_commodity_namespace, gnc_commodity_namespace, QOF_TYPE_INSTANCE)
2091gnc_commodity_namespace_init(gnc_commodity_namespace* ns)
2096gnc_commodity_namespace_dispose_real (GObject *nsp)
2101gnc_commodity_namespace_finalize_real(GObject* nsp)
2105gnc_commodity_namespace *
2107 const char * name_space,
2110 gnc_commodity_namespace * ns =
nullptr;
2112 if (!
table)
return nullptr;
2114 name_space = gnc_commodity_table_map_namespace(name_space);
2118 ns =
static_cast<gnc_commodity_namespace*
>(g_object_new(GNC_TYPE_COMMODITY_NAMESPACE,
nullptr));
2119 ns->cm_table = g_hash_table_new(g_str_hash, g_str_equal);
2120 ns->name = CACHE_INSERT(
static_cast<const char*
>(name_space));
2125 g_hash_table_insert(
table->ns_table,
2126 (gpointer) ns->name,
2128 table->ns_list = g_list_append(
table->ns_list, ns);
2136 const char * namespace_name,
2137 const char * new_namespace_name)
2139 if (!
table || !namespace_name || !new_namespace_name ||
2140 (g_strcmp0 (namespace_name, new_namespace_name) == 0) ||
2141 (g_strcmp0 (new_namespace_name, GNC_COMMODITY_NS_ISO_GUI) == 0) ||
2142 (g_strcmp0 (new_namespace_name, _(GNC_COMMODITY_NS_ISO_GUI)) == 0) ||
2150 ns->name = CACHE_INSERT(
static_cast<const char*
>(new_namespace_name));
2152 g_hash_table_insert (
table->ns_table,
2153 (gpointer) ns->name,
2156 g_hash_table_remove (
table->ns_table,
2157 (gpointer) namespace_name);
2159 CACHE_REMOVE(namespace_name);
2161 qof_instance_set_dirty (&ns->inst);
2166gnc_commodity_namespace *
2168 const char * name_space)
2170 if (!
table || !name_space)
2173 name_space = gnc_commodity_table_map_namespace(name_space);
2174 return static_cast<gnc_commodity_namespace*
>(g_hash_table_lookup(
table->ns_table, (gpointer)name_space));
2179gnc_commodity_find_commodity_by_guid(
const GncGUID *guid,
QofBook *book)
2182 if (!guid || !book)
return nullptr;
2193ns_helper(gpointer key, gpointer value, gpointer user_data)
2195 auto c = GNC_COMMODITY(value);
2197 CACHE_REMOVE(
static_cast<char*
>(key));
2203 const char * name_space)
2205 gnc_commodity_namespace * ns;
2214 g_hash_table_remove(
table->ns_table, name_space);
2215 table->ns_list = g_list_remove(
table->ns_list, ns);
2217 g_list_free(ns->cm_list);
2218 ns->cm_list =
nullptr;
2220 g_hash_table_foreach_remove(ns->cm_table, ns_helper,
nullptr);
2221 g_hash_table_destroy(ns->cm_table);
2222 CACHE_REMOVE(ns->name);
2238 gboolean (*func)(gnc_commodity *, gpointer);
2243iter_commodity (gpointer key, gpointer value, gpointer user_data)
2246 gnc_commodity *cm = (gnc_commodity *) value;
2250 iter_data->ok = (iter_data->func)(cm, iter_data->user_data);
2255iter_namespace (gpointer key, gpointer value, gpointer user_data)
2257 GHashTable *namespace_hash = ((gnc_commodity_namespace *) value)->cm_table;
2258 g_hash_table_foreach (namespace_hash, iter_commodity, user_data);
2262gnc_commodity_table_foreach_commodity (
const gnc_commodity_table * tbl,
2263 gboolean (*f)(gnc_commodity *, gpointer),
2268 if (!tbl || !f)
return FALSE;
2270 iter_data.ok = TRUE;
2272 iter_data.user_data = user_data;
2274 g_hash_table_foreach(tbl->ns_table, iter_namespace, (gpointer)&iter_data);
2276 return iter_data.ok;
2285gnc_commodity_table_destroy(gnc_commodity_table * t)
2287 gnc_commodity_namespace * ns;
2291 ENTER (
"table=%p", t);
2293 for (item = t->ns_list; item; item = next)
2295 next = g_list_next(item);
2296 ns =
static_cast<gnc_commodity_namespace*
>(item->data);
2300 g_list_free(t->ns_list);
2301 t->ns_list =
nullptr;
2302 g_hash_table_destroy(t->ns_table);
2303 t->ns_table =
nullptr;
2304 LEAVE (
"table=%p", t);
2314#define CUR_I18N(String) dgettext ("iso_4217", String)
2324 c =
gnc_commodity_new(book,
"template", GNC_COMMODITY_NS_TEMPLATE,
"template",
"template", 1);
2327#include "iso-4217-currencies.c"
2352static QofObject commodity_object_def =
2355 DI(.e_type = ) GNC_ID_COMMODITY,
2356 DI(.type_label = ) "Commodity",
2357 DI(.create = )
nullptr,
2358 DI(.book_begin = )
nullptr,
2359 DI(.book_end = )
nullptr,
2362 DI(.foreach = ) qof_collection_foreach,
2366static QofObject namespace_object_def =
2369 DI(.e_type = ) GNC_ID_COMMODITY_NAMESPACE,
2370 DI(.type_label = ) "Namespace",
2371 DI(.create = )
nullptr,
2372 DI(.book_begin = )
nullptr,
2373 DI(.book_end = )
nullptr,
2374 DI(.is_dirty = )
nullptr,
2375 DI(.mark_clean = )
nullptr,
2376 DI(.foreach = )
nullptr,
2377 DI(.printable = )
nullptr,
2381commodity_table_book_begin (
QofBook *book)
2383 gnc_commodity_table *ct;
2384 ENTER (
"book=%p", book);
2390 qof_book_set_data (book, GNC_COMMODITY_TABLE, ct);
2394 PWARN(
"unable to initialize book's commodity_table");
2397 LEAVE (
"book=%p", book);
2401commodity_table_book_end (
QofBook *book)
2403 gnc_commodity_table *ct;
2406 qof_book_set_data (book, GNC_COMMODITY_TABLE,
nullptr);
2407 gnc_commodity_table_destroy (ct);
2410static QofObject commodity_table_object_def =
2413 DI(.e_type = ) GNC_ID_COMMODITY_TABLE,
2414 DI(.type_label = ) "CommodityTable",
2415 DI(.create = )
nullptr,
2416 DI(.book_begin = ) commodity_table_book_begin,
2417 DI(.book_end = ) commodity_table_book_end,
2420 DI(.foreach = )
nullptr,
2421 DI(.printable = )
nullptr,
2422 DI(.version_cmp = )
nullptr,
2443 MonetaryList *l = list, *tmp;
2444 for (tmp = list; tmp; tmp = tmp->next)
2446 auto list_mon =
static_cast<gnc_monetary*
>(tmp->data);
2458 auto new_mon =
static_cast<gnc_monetary*
>(g_new0(gnc_monetary, 1));
2460 l = g_list_prepend(l, new_mon);
2471 MonetaryList *node, *next;
2472 for (node = list; node; node = next)
2474 auto mon =
static_cast<gnc_monetary*
>(node->data);
2479 list = g_list_delete_link(list, node);
2490 for (tmp = list; tmp; tmp = tmp->next)
Commodity handling public routines.
Commodity handling public routines (C++ api)
Generic api to store and retrieve preferences.
QofBackendError
The errors that can be reported to the GUI & other front-end users.
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
int gnc_commodity_table_has_namespace(const gnc_commodity_table *table, const char *name_space)
Test to see if the indicated namespace exits in the commodity table.
const char * gnc_quote_source_fq_version(void)
This function returns the version of the Finance::Quote module installed on a user's computer.
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
CommodityList * gnc_commodity_table_get_quotable_commodities(const gnc_commodity_table *table)
This function returns a list of commodities for which price quotes should be retrieved.
const char * gnc_quote_source_get_user_name(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the user friendly name of this quote source.
guint gnc_commodity_table_get_size(const gnc_commodity_table *tbl)
Returns the number of commodities in the commodity table.
#define GNC_COMMODITY_MAX_FRACTION
Max fraction is 10^9 because 10^10 would require changing it to an int64_t.
void gnc_commodity_set_cusip(gnc_commodity *cm, const char *cusip)
Set the 'exchange code' for the specified commodity.
int gnc_commodity_compare(const gnc_commodity *a, const gnc_commodity *b)
This routine returns 0 if the two commodities are equal, 1 otherwise.
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Retrieve the full name for the specified commodity.
gboolean gnc_quote_source_get_supported(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the flag that indicates whether this particular quote...
const char * gnc_commodity_get_user_symbol(const gnc_commodity *cm)
Retrieve the user-defined symbol for the specified commodity.
gnc_commodity_namespace * gnc_commodity_table_find_namespace(const gnc_commodity_table *table, const char *name_space)
This function finds a commodity namespace in the set of existing commodity namespaces.
void gnc_quote_source_set_fq_installed(const char *version_string, const std::vector< std::string > &sources_list)
Update gnucash internal tables based on what Finance::Quote sources are installed.
void gnc_commodity_table_remove(gnc_commodity_table *table, gnc_commodity *comm)
Remove a commodity from the commodity table.
gboolean gnc_quote_source_fq_installed(void)
This function indicates whether or not the Finance::Quote module is installed on a user's computer.
void gnc_commodity_set_namespace(gnc_commodity *cm, const char *name_space)
Set the namespace for the specified commodity.
gint gnc_quote_source_get_index(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the index of this particular quote source within its ...
gnc_quote_source * gnc_quote_source_add_new(const char *source_name, gboolean supported)
Create a new quote source.
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
Retrieve the namespace for the specified commodity.
const char * gnc_quote_source_get_internal_name(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the internal name of this quote source.
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
gnc_commodity_namespace * gnc_commodity_table_add_namespace(gnc_commodity_table *table, const char *name_space, QofBook *book)
This function adds a new string to the list of commodity namespaces.
gnc_commodity * gnc_commodity_new(QofBook *book, const char *fullname, const char *name_space, const char *mnemonic, const char *cusip, int fraction)
Create a new commodity.
void gnc_commodity_set_fullname(gnc_commodity *cm, const char *fullname)
Set the full name for the specified commodity.
GList * gnc_commodity_namespace_get_commodity_list(const gnc_commodity_namespace *name_space)
Return a list of all commodity data structures in the specified namespace.
void gnc_commodity_set_quote_flag(gnc_commodity *cm, const gboolean flag)
Set the automatic price quote flag for the specified commodity.
MonetaryList * gnc_monetary_list_add_monetary(MonetaryList *list, gnc_monetary add_mon)
Add a gnc_monetary to the list.
gnc_commodity * gnc_commodity_obtain_twin(const gnc_commodity *from, QofBook *book)
Given the commodity 'findlike', this routine will find and return the equivalent commodity (commodity...
gboolean gnc_commodity_namespace_is_iso(const char *name_space)
Checks to see if the specified commodity namespace is the namespace for ISO 4217 currencies.
gboolean gnc_commodity_table_add_default_data(gnc_commodity_table *table, QofBook *book)
Add all the standard namespaces and currencies to the commodity table.
const char * gnc_commodity_get_quote_tz(const gnc_commodity *cm)
Retrieve the automatic price quote timezone for the specified commodity.
const char * gnc_commodity_get_default_symbol(const gnc_commodity *cm)
Retrieve the default symbol for the specified commodity.
const char * gnc_commodity_get_nice_symbol(const gnc_commodity *cm)
Retrieve a symbol for the specified commodity, suitable for display to the user.
void gnc_commodity_set_quote_source(gnc_commodity *cm, gnc_quote_source *src)
Set the automatic price quote source for the specified commodity.
int gnc_commodity_compare_void(const void *a, const void *b)
A wrapper around gnc_commodity_compare() which offers the function declaration that is needed for g_l...
gnc_commodity_table * gnc_commodity_table_get_table(QofBook *book)
Returns the commodity table associated with a book.
void gnc_commodity_set_fraction(gnc_commodity *cm, int fraction)
Set the fraction for the specified commodity.
gboolean gnc_commodity_table_register(void)
You should probably not be using gnc_commodity_table_register() It is an internal routine for registe...
gnc_quote_source * gnc_commodity_get_quote_source(const gnc_commodity *cm)
Retrieve the automatic price quote source for the specified commodity.
bool gnc_commodity_table_rename_namespace(const gnc_commodity_table *table, const char *namespace_name, const char *new_namespace_name)
This function renames a namespace.
const char * gnc_commodity_get_cusip(const gnc_commodity *cm)
Retrieve the 'exchange code' for the specified commodity.
gnc_quote_source * gnc_quote_source_lookup_by_ti(QuoteSourceType type, gint index)
Given the type/index of a quote source, find the data structure identified by this pair.
gnc_quote_source * gnc_quote_source_lookup_by_internal(const char *name)
Given the internal (gnucash or F::Q) name of a quote source, find the data structure identified by th...
void gnc_commodity_table_delete_namespace(gnc_commodity_table *table, const char *name_space)
This function deletes a string from the list of commodity namespaces.
void gnc_commodity_increment_usage_count(gnc_commodity *cm)
Increment a commodity's internal counter that tracks how many accounts are using that commodity.
gnc_commodity * gnc_commodity_table_insert(gnc_commodity_table *table, gnc_commodity *comm)
Add a new commodity to the commodity table.
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name for the specified commodity.
GList * gnc_commodity_table_get_namespaces(const gnc_commodity_table *table)
Return a list of all namespaces in the commodity table.
QuoteSourceType
The quote source type enum account types are used to determine how the transaction data in the accoun...
MonetaryList * gnc_monetary_list_delete_zeros(MonetaryList *list)
Delete all entries in the list that have zero value.
GList * gnc_commodity_table_get_namespaces_list(const gnc_commodity_table *table)
Return a list of all namespace data structures in the commodity table.
void gnc_commodity_set_user_symbol(gnc_commodity *cm, const char *user_symbol)
Set a user-defined symbol for the specified commodity.
void gnc_commodity_decrement_usage_count(gnc_commodity *cm)
Decrement a commodity's internal counter that tracks how many accounts are using that commodity.
gnc_commodity * gnc_commodity_clone(const gnc_commodity *src, QofBook *dest_book)
allocate and copy
void gnc_commodity_user_set_quote_flag(gnc_commodity *cm, const gboolean flag)
Set the automatic price quote flag for the specified commodity, based on user input.
void gnc_monetary_list_free(MonetaryList *list)
Free a MonetaryList and all the monetaries it points to.
gboolean gnc_commodity_is_iso(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency.
gnc_commodity_namespace * gnc_commodity_get_namespace_ds(const gnc_commodity *cm)
Retrieve the namespace data structure for the specified commodity.
gnc_commodity_table * gnc_commodity_table_new(void)
You probably shouldn't be using gnc_commodity_table_new() directly, it's for internal use only.
void gnc_commodity_destroy(gnc_commodity *cm)
Destroy a commodity.
const char * gnc_commodity_namespace_get_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure.
#define GNC_COMMODITY_NS_LEGACY
The commodity namespace definitions are used to tag a commodity by its type, or a stocks by the excha...
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
gboolean gnc_commodity_get_quote_flag(const gnc_commodity *cm)
Retrieve the automatic price quote flag for the specified commodity.
void gnc_commodity_set_mnemonic(gnc_commodity *cm, const char *mnemonic)
Set the mnemonic for the specified commodity.
const char * gnc_commodity_namespace_get_gui_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure in a form suitable to present to the user.
void gnc_commodity_set_quote_tz(gnc_commodity *cm, const char *tz)
Set the automatic price quote timezone for the specified commodity.
QuoteSourceType gnc_quote_source_get_type(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the type of this particular quote source.
CommodityList * gnc_commodity_table_get_commodities(const gnc_commodity_table *table, const char *name_space)
Return a list of all commodities in the commodity table that are in the given namespace.
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the 'unique' name for the specified commodity.
void gnc_commodity_copy(gnc_commodity *dest, const gnc_commodity *src)
Copy src into dest.
gboolean gnc_commodity_is_currency(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency or a legacy currency.
gint gnc_quote_source_num_entries(QuoteSourceType type)
Return the number of entries for a given type of quote source.
@ SOURCE_MULTI
This quote source may pull from multiple web sites.
@ SOURCE_SINGLE
This quote source pulls from a single specific web site.
@ SOURCE_CURRENCY
The special currency quote source.
@ SOURCE_UNKNOWN
This is a locally installed quote source that gnucash knows nothing about.
QofInstance * qof_collection_lookup_entity(const QofCollection *col, const GncGUID *guid)
Find the entity going only from its guid.
gboolean qof_collection_is_dirty(const QofCollection *col)
Return value of 'dirty' flag on collection.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
void qof_instance_init_data(QofInstance *inst, QofIdType type, QofBook *book)
Initialise the settings associated with an instance.
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.
#define PINFO(format, args...)
Print an informational note.
#define DEBUG(format, args...)
Print a debugging message.
#define LEAVE(format, args...)
Print a function exit debugging message.
#define PERR(format, args...)
Log a serious error.
#define PWARN(format, args...)
Log a warning.
#define ENTER(format, args...)
Print a function entry debugging message.
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
@ GNC_HOW_DENOM_EXACT
Use any denominator which gives an exactly correct ratio of numerator to denominator.
void qof_collection_mark_clean(QofCollection *)
reset value of dirty flag
#define QOF_OBJECT_VERSION
Defines the version of the core object object registration interface.
gboolean qof_object_register(const QofObject *object)
Register new types of object objects.
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
part2 – deal with the backend
gboolean qof_commit_edit(QofInstance *inst)
commit_edit helpers
gboolean qof_begin_edit(QofInstance *inst)
begin_edit
globally unique ID User API
Object instance holds common fields that most gnucash objects use.
The type used to store guids in C.
A gnc_commodity_namespace is an collection of commodities.
An article that is bought and sold.
A gnc_commodity_table is a database of commodity info.