29 #include <glib/gi18n.h> 36 #include <qofinstance-p.h> 40 #include "gnc-locale-utils.h" 46 #include <unordered_map> 48 static 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;
107 static void commodity_free(gnc_commodity * cm);
108 static void gnc_commodity_set_default_symbol(gnc_commodity *,
const char *);
116 GHashTable * cm_table;
122 QofInstanceClass parent_class;
127 GHashTable * ns_table;
131 static const std::unordered_map<std::string,std::string> gnc_new_iso_codes =
147 static 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:
""} { };
170 using QuoteSourceList = std::list<gnc_quote_source>;
180 static QuoteSourceList currency_quote_sources =
189 static QuoteSourceList single_quote_sources =
191 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Alphavantage"),
"alphavantage" },
192 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Amsterdam Euronext eXchange, NL"),
"aex" },
193 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Association of Mutual Funds in India"),
"amfiindia" },
194 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Athens Exchange Group, GR"),
"asegr" },
195 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Australian Stock Exchange, AU"),
"asx" },
196 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Italian Stock Exchange, IT"),
"borsa_italiana" },
197 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"BSE India, IN"),
"bseindia" },
198 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Bucharest Stock Exchange, RO"),
"bvb" },
199 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"China Merchants Bank, CN"),
"cmbchina" },
200 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Colombo Stock Exchange, LK"),
"cse" },
201 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"comdirect, DE"),
"comdirect" },
202 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Consors Bank, DE"),
"consorsbank" },
203 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Deka Investments, DE"),
"deka" },
204 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Financial Times Funds service, GB"),
"ftfunds" },
205 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Finanzpartner, DE"),
"finanzpartner" },
206 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"FondsWeb, DE"),
"fondsweb" },
207 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"GoldMoney precious metals"),
"goldmoney" },
208 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Google Web, US Stocks"),
"googleweb" },
209 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Market Watch"),
"marketwatch" },
210 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Morningstar, CH"),
"morningstarch" },
211 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Morningstar, GB"),
"morningstaruk" },
212 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Morningstar, JP"),
"morningstarjp" },
213 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Motley Fool"),
"fool" },
214 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"New Zealand stock eXchange, NZ"),
"nzx" },
215 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"NSE (National Stock Exchange), IN"),
"nseindia" },
216 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"OnVista, DE"),
"onvista"},
217 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Paris Stock Exchange/Boursorama, FR"),
"bourso" },
218 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"S-Investor, DE"),
"sinvestor"},
219 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Sharenet, ZA"),
"za" },
220 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"SIX Swiss Exchange shares, CH"),
"six" },
221 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"StockData"),
"stockdata" },
222 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Stooq, PL"),
"stooq" },
223 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Tesouro Direto bonds, BR"),
"tesouro_direto" },
224 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Toronto Stock eXchange, CA"),
"tsx" },
225 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Tradegate, DE"),
"tradegate" },
226 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Treasury Direct bonds, US"),
"treasurydirect" },
227 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Twelve Data"),
"twelvedata" },
228 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Union Investment, DE"),
"unionfunds" },
229 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"US Govt. Thrift Savings Plan"),
"tsp" },
230 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"XETRA, DE"),
"xetra" },
231 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Yahoo as JSON"),
"yahoo_json" },
232 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Yahoo Web"),
"yahooweb" },
233 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"YH Finance (FinanceAPI)"),
"financeapi" },
237 static QuoteSourceList multiple_quote_sources =
239 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Canada (Alphavantage, TMX)"),
"canada" },
240 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Europe (ASEGR, Bourso, …)"),
"europe" },
241 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"India (BSEIndia, NSEIndia)"),
"india"},
242 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Nasdaq (Alphavantage, FinanceAPI, …)"),
"nasdaq" },
243 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"NYSE (Alphavantage, FinanceAPI, …)"),
"nyse" },
244 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"U.K. Funds (FTfunds, MorningstarUK)"),
"ukfunds" },
245 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"USA (Alphavantage, FinanceAPI, …)"),
"usa" },
248 static QuoteSourceList new_quote_sources;
251 static const std::vector<std::pair<QuoteSourceType,QuoteSourceList&>> quote_sources_map =
268 return (!fq_version.empty());
281 return fq_version.c_str();
284 static QuoteSourceList&
287 auto quote_sources_it = std::find_if (quote_sources_map.begin(), quote_sources_map.end(),
288 [type] (
const auto& qs) {
return type == qs.first; });
290 if (quote_sources_it != quote_sources_map.end())
291 return quote_sources_it->second;
293 PWARN (
"Invalid Quote Source %d, returning new_quote_sources", type);
294 return new_quote_sources;
304 auto source{get_quote_source_from_type(type)};
305 return std::distance(source.begin(), source.end());
321 DEBUG(
"Creating new source %s", (!source_name ?
"(null)" : source_name));
327 return &new_quote_sources.emplace_back (supported,
SOURCE_UNKNOWN, source_name, source_name);
338 ENTER(
"type/index is %d/%d", type, index);
339 auto& sources = get_quote_source_from_type (type);
340 if ((
size_t) index < sources.size())
342 auto it = std::next(sources.begin(), index);
343 LEAVE(
"found %s", it->get_user_name());
357 for (
const auto& [_, sources] : quote_sources_map)
359 auto source_it = std::find_if (sources.begin(), sources.end(),
360 [name] (
const auto& qs)
361 {
return (g_strcmp0(name, qs.get_internal_name()) == 0); });
362 if (source_it != sources.end())
363 return &(*source_it);
366 DEBUG(
"gnc_quote_source_lookup_by_internal: Unknown source %s", name);
385 LEAVE(
"type is %d", source->get_type());
386 return source->get_type();
394 PWARN (
"bad source");
398 auto& sources = get_quote_source_from_type (source->get_type());
399 auto is_source = [&source](
const auto& findif_source)
400 {
return &findif_source == source; };
402 auto iter = std::find_if (sources.begin(), sources.end(), is_source);
403 if (iter != sources.end())
404 return std::distance (sources.begin(), iter);
406 PWARN (
"couldn't locate source");
420 LEAVE(
"%s supported", source && source->get_supported() ?
"" :
"not ");
421 return source->get_supported();
433 LEAVE(
"user name %s", source->get_user_name());
434 return source->get_user_name();
446 LEAVE(
"internal name %s", source->get_internal_name());
447 return source->get_internal_name();
459 const std::vector<std::string>& sources_list)
463 if (sources_list.empty())
467 fq_version = version_string;
471 for (
const auto& source_name_str : sources_list)
473 auto source_name = source_name_str.c_str();
478 DEBUG(
"Found source %s: %s", source_name, source->get_user_name());
479 source->set_supported (
true);
493 gnc_commodity_begin_edit (gnc_commodity *cm)
500 PERR (
"Failed to commit: %d", errcode);
501 gnc_engine_signal_commit_error( errcode );
509 commodity_free( GNC_COMMODITY(inst) );
513 gnc_commodity_commit_edit (gnc_commodity *cm)
524 mark_commodity_dirty (gnc_commodity *cm)
526 qof_instance_set_dirty(&cm->inst);
533 g_free(priv->printname);
534 priv->printname = g_strdup_printf(
"%s (%s)",
535 priv->mnemonic ? priv->mnemonic :
"",
536 priv->fullname ? priv->fullname :
"");
542 gnc_commodity_namespace *ns;
544 g_free(priv->unique_name);
545 ns = priv->name_space;
546 priv->unique_name = g_strdup_printf(
"%s::%s",
548 priv->mnemonic ? priv->mnemonic :
"");
552 G_DEFINE_TYPE_WITH_PRIVATE(gnc_commodity, gnc_commodity, QOF_TYPE_INSTANCE)
555 gnc_commodity_init(gnc_commodity* com)
559 priv = GET_PRIVATE(com);
561 priv->name_space =
nullptr;
562 priv->fullname = CACHE_INSERT(
"");
563 priv->mnemonic = CACHE_INSERT(
"");
564 priv->cusip = CACHE_INSERT(
"");
565 priv->fraction = 10000;
566 priv->quote_flag = 0;
567 priv->quote_source =
nullptr;
568 priv->quote_tz = CACHE_INSERT(
"");
570 reset_printname(priv);
571 reset_unique_name(priv);
575 gnc_commodity_dispose(GObject *comp)
577 G_OBJECT_CLASS(gnc_commodity_parent_class)->dispose(comp);
581 gnc_commodity_finalize(GObject* comp)
583 G_OBJECT_CLASS(gnc_commodity_parent_class)->finalize(comp);
592 gnc_commodity_get_property (GObject *
object,
597 gnc_commodity *commodity;
600 g_return_if_fail(GNC_IS_COMMODITY(
object));
602 commodity = GNC_COMMODITY(
object);
603 priv = GET_PRIVATE(commodity);
607 g_value_take_object(value, priv->name_space);
610 g_value_set_string(value, priv->fullname);
613 g_value_set_string(value, priv->mnemonic);
616 g_value_set_string(value, priv->printname);
619 g_value_set_string(value, priv->cusip);
622 g_value_set_int(value, priv->fraction);
624 case PROP_UNIQUE_NAME:
625 g_value_set_string(value, priv->unique_name);
627 case PROP_QUOTE_FLAG:
628 g_value_set_boolean(value, priv->quote_flag);
630 case PROP_QUOTE_SOURCE:
631 g_value_set_pointer(value, priv->quote_source);
634 g_value_set_string(value, priv->quote_tz);
637 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
643 gnc_commodity_set_property (GObject *
object,
648 gnc_commodity *commodity;
650 g_return_if_fail(GNC_IS_COMMODITY(
object));
652 commodity = GNC_COMMODITY(
object);
653 g_assert (qof_instance_get_editlevel(commodity));
672 case PROP_QUOTE_FLAG:
675 case PROP_QUOTE_SOURCE:
682 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
689 GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
691 gobject_class->dispose = gnc_commodity_dispose;
692 gobject_class->finalize = gnc_commodity_finalize;
693 gobject_class->set_property = gnc_commodity_set_property;
694 gobject_class->get_property = gnc_commodity_get_property;
696 g_object_class_install_property(gobject_class,
698 g_param_spec_object (
"namespace",
700 "The namespace field denotes the " 701 "namespace for this commodity, either " 702 "a currency or symbol from a quote source.",
703 GNC_TYPE_COMMODITY_NAMESPACE,
705 g_object_class_install_property(gobject_class,
707 g_param_spec_string (
"fullname",
708 "Full Commodity Name",
709 "The fullname is the official full name of" 713 g_object_class_install_property(gobject_class,
715 g_param_spec_string (
"mnemonic",
716 "Commodity Mnemonic",
717 "The mnemonic is the official abbreviated" 718 "designation for the currency.",
721 g_object_class_install_property(gobject_class,
723 g_param_spec_string (
"printname",
724 "Commodity Print Name",
725 "Printable form of the commodity name.",
728 g_object_class_install_property(gobject_class,
730 g_param_spec_string (
"cusip",
731 "Commodity CUSIP Code",
735 g_object_class_install_property(gobject_class,
737 g_param_spec_int (
"fraction",
739 "The fraction is the number of sub-units that " 740 "the basic commodity can be divided into.",
745 g_object_class_install_property(gobject_class,
747 g_param_spec_string (
"unique-name",
748 "Commodity Unique Name",
749 "Unique form of the commodity name which combines " 750 "the namespace name and the commodity name.",
753 g_object_class_install_property(gobject_class,
755 g_param_spec_boolean (
"quote_flag",
757 "TRUE if prices are to be downloaded for this " 758 "commodity from a quote source.",
761 g_object_class_install_property(gobject_class,
763 g_param_spec_pointer(
"quote-source",
765 "The quote source from which prices are downloaded.",
767 g_object_class_install_property(gobject_class,
769 g_param_spec_string (
"quote-tz",
770 "Commodity Quote Timezone",
778 const char * name_space,
const char * mnemonic,
779 const char * cusip,
int fraction)
781 auto retval = GNC_COMMODITY(g_object_new(GNC_TYPE_COMMODITY,
nullptr));
784 gnc_commodity_begin_edit(retval);
786 if ( name_space !=
nullptr )
789 if (g_strcmp0 (name_space, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
790 g_strcmp0 (mnemonic,
"template") != 0)
792 PWARN(
"Converting commodity %s from namespace template to " 793 "namespace User", mnemonic);
807 mark_commodity_dirty (retval);
808 gnc_commodity_commit_edit(retval);
821 commodity_free(gnc_commodity * cm)
824 gnc_commodity_table *
table;
832 priv = GET_PRIVATE(cm);
837 CACHE_REMOVE (priv->fullname);
838 CACHE_REMOVE (priv->cusip);
839 CACHE_REMOVE (priv->mnemonic);
840 CACHE_REMOVE (priv->quote_tz);
841 priv->name_space =
nullptr;
844 priv->quote_source =
nullptr;
847 g_free(priv->printname);
848 priv->printname =
nullptr;
850 g_free(priv->unique_name);
851 priv->unique_name =
nullptr;
853 #ifdef ACCOUNTS_CLEANED_UP 858 if (priv->usage_count != 0)
860 PWARN(
"Destroying commodity (%p) with non-zero usage_count (%d).", cm,
872 gnc_commodity_begin_edit(cm);
873 qof_instance_set_destroying(cm, TRUE);
874 gnc_commodity_commit_edit(cm);
885 dest_priv->name_space = src_priv->name_space;
891 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
900 auto dest = GNC_COMMODITY (g_object_new(GNC_TYPE_COMMODITY,
nullptr));
902 src_priv = GET_PRIVATE(src);
903 dest_priv = GET_PRIVATE(dest);
905 dest_priv->fullname = CACHE_INSERT(src_priv->fullname);
906 dest_priv->mnemonic = CACHE_INSERT(src_priv->mnemonic);
907 dest_priv->cusip = CACHE_INSERT(src_priv->cusip);
908 dest_priv->quote_tz = CACHE_INSERT(src_priv->quote_tz);
910 dest_priv->name_space = src_priv->name_space;
912 dest_priv->fraction = src_priv->fraction;
913 dest_priv->quote_flag = src_priv->quote_flag;
917 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
919 reset_printname(dest_priv);
920 reset_unique_name(dest_priv);
932 if (!cm)
return nullptr;
933 return GET_PRIVATE(cm)->mnemonic;
943 if (!cm)
return nullptr;
944 return GET_PRIVATE(cm)->printname;
955 if (!cm)
return nullptr;
959 gnc_commodity_namespace *
962 if (!cm)
return nullptr;
963 return GET_PRIVATE(cm)->name_space;
973 if (!cm)
return nullptr;
974 return GET_PRIVATE(cm)->fullname;
985 if (!cm)
return nullptr;
986 return GET_PRIVATE(cm)->unique_name;
997 if (!cm)
return nullptr;
998 return GET_PRIVATE(cm)->cusip;
1009 return GET_PRIVATE(cm)->fraction;
1017 gnc_commodity_get_auto_quote_control_flag(
const gnc_commodity *cm)
1019 GValue v = G_VALUE_INIT;
1020 gboolean retval = TRUE;
1022 if (!cm)
return FALSE;
1024 if (G_VALUE_HOLDS_STRING (&v) &&
1025 strcmp(g_value_get_string (&v),
"false") == 0)
1038 if (!cm)
return FALSE;
1039 return (GET_PRIVATE(cm)->quote_flag);
1051 if (!cm)
return nullptr;
1052 priv = GET_PRIVATE(cm);
1054 return ¤cy_quote_sources.front();
1055 return priv->quote_source;
1059 gnc_commodity_get_default_quote_source(
const gnc_commodity *cm)
1062 return ¤cy_quote_sources.front();
1074 if (!cm)
return nullptr;
1075 return GET_PRIVATE(cm)->quote_tz;
1084 g_return_val_if_fail (GNC_IS_COMMODITY (cm),
nullptr);
1086 GValue v = G_VALUE_INIT;
1088 const char *rv = G_VALUE_HOLDS_STRING (&v) ? g_value_get_string (&v) :
nullptr;
1099 if (!cm)
return nullptr;
1100 return GET_PRIVATE(cm)->default_symbol;
1109 const char *nice_symbol;
1111 if (!cm)
return nullptr;
1114 if (nice_symbol && *nice_symbol)
1117 lc = gnc_localeconv();
1118 nice_symbol = lc->currency_symbol;
1123 if (nice_symbol && *nice_symbol)
1139 priv = GET_PRIVATE(cm);
1140 if (priv->mnemonic == mnemonic)
return;
1142 gnc_commodity_begin_edit(cm);
1143 CACHE_REMOVE (priv->mnemonic);
1144 priv->mnemonic = CACHE_INSERT(mnemonic);
1146 mark_commodity_dirty (cm);
1147 reset_printname(priv);
1148 reset_unique_name(priv);
1149 gnc_commodity_commit_edit(cm);
1160 gnc_commodity_table *
table;
1161 gnc_commodity_namespace *nsp;
1165 priv = GET_PRIVATE(cm);
1169 if (priv->name_space == nsp)
1172 gnc_commodity_begin_edit(cm);
1173 priv->name_space = nsp;
1176 mark_commodity_dirty(cm);
1177 reset_printname(priv);
1178 reset_unique_name(priv);
1179 gnc_commodity_commit_edit(cm);
1192 priv = GET_PRIVATE(cm);
1193 if (priv->fullname == fullname)
return;
1195 CACHE_REMOVE (priv->fullname);
1196 priv->fullname = CACHE_INSERT (fullname);
1198 gnc_commodity_begin_edit(cm);
1199 mark_commodity_dirty(cm);
1200 reset_printname(priv);
1201 gnc_commodity_commit_edit(cm);
1216 priv = GET_PRIVATE(cm);
1217 if (priv->cusip == cusip)
return;
1219 gnc_commodity_begin_edit(cm);
1220 CACHE_REMOVE (priv->cusip);
1221 priv->cusip = CACHE_INSERT (cusip);
1222 mark_commodity_dirty(cm);
1223 gnc_commodity_commit_edit(cm);
1234 gnc_commodity_begin_edit(cm);
1235 GET_PRIVATE(cm)->fraction = fraction;
1236 mark_commodity_dirty(cm);
1237 gnc_commodity_commit_edit(cm);
1245 gnc_commodity_set_auto_quote_control_flag(gnc_commodity *cm,
1246 const gboolean flag)
1248 GValue v = G_VALUE_INIT;
1249 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1256 gnc_commodity_begin_edit(cm);
1261 g_value_init (&v, G_TYPE_STRING);
1262 g_value_set_string (&v,
"false");
1266 mark_commodity_dirty(cm);
1267 gnc_commodity_commit_edit(cm);
1280 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1288 priv = GET_PRIVATE(cm);
1289 gnc_commodity_begin_edit(cm);
1300 gnc_commodity_set_auto_quote_control_flag(cm,
1301 (!flag && (priv->usage_count == 0)) || (flag && (priv->usage_count != 0)));
1303 gnc_commodity_commit_edit(cm);
1314 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1317 gnc_commodity_begin_edit(cm);
1318 GET_PRIVATE(cm)->quote_flag = flag;
1319 mark_commodity_dirty(cm);
1320 gnc_commodity_commit_edit(cm);
1331 ENTER (
"(cm=%p, src=%p(%s))", cm, src, src ? src->get_internal_name() :
"unknown");
1334 gnc_commodity_begin_edit(cm);
1335 GET_PRIVATE(cm)->quote_source = src;
1336 mark_commodity_dirty(cm);
1337 gnc_commodity_commit_edit(cm);
1352 ENTER (
"(cm=%p, tz=%s)", cm, tz ? tz :
"(null)");
1354 priv = GET_PRIVATE(cm);
1356 if (tz == priv->quote_tz)
1358 LEAVE(
"Already correct TZ");
1362 gnc_commodity_begin_edit(cm);
1363 CACHE_REMOVE (priv->quote_tz);
1364 priv->quote_tz = CACHE_INSERT (tz);
1365 mark_commodity_dirty(cm);
1366 gnc_commodity_commit_edit(cm);
1381 ENTER (
"(cm=%p, symbol=%s)", cm, user_symbol ? user_symbol :
"(null)");
1383 lc = gnc_localeconv();
1384 if (!user_symbol || !*user_symbol)
1385 user_symbol =
nullptr;
1387 !g_strcmp0(lc->currency_symbol, user_symbol))
1390 user_symbol =
nullptr;
1392 user_symbol =
nullptr;
1394 gnc_commodity_begin_edit (cm);
1398 GValue v = G_VALUE_INIT;
1399 g_value_init (&v, G_TYPE_STRING);
1400 g_value_set_static_string (&v, user_symbol);
1409 mark_commodity_dirty(cm);
1410 gnc_commodity_commit_edit(cm);
1421 gnc_commodity_set_default_symbol(gnc_commodity * cm,
1422 const char * default_symbol)
1424 GET_PRIVATE(cm)->default_symbol = default_symbol;
1436 ENTER(
"(cm=%p)", cm);
1444 priv = GET_PRIVATE(cm);
1446 if ((priv->usage_count == 0) && !priv->quote_flag
1447 && gnc_commodity_get_auto_quote_control_flag(cm)
1452 gnc_commodity_begin_edit(cm);
1455 gnc_commodity_get_default_quote_source(cm));
1456 gnc_commodity_commit_edit(cm);
1458 priv->usage_count++;
1459 LEAVE(
"(usage_count=%d)", priv->usage_count);
1471 ENTER(
"(cm=%p)", cm);
1479 priv = GET_PRIVATE(cm);
1481 if (priv->usage_count == 0)
1483 PWARN(
"usage_count already zero");
1488 priv->usage_count--;
1489 if ((priv->usage_count == 0) && priv->quote_flag
1490 && gnc_commodity_get_auto_quote_control_flag(cm)
1497 LEAVE(
"(usage_count=%d)", priv->usage_count);
1515 if (a == b)
return TRUE;
1516 if (!a || !b)
return FALSE;
1518 priv_a = GET_PRIVATE(a);
1519 priv_b = GET_PRIVATE(b);
1520 if (priv_a->name_space != priv_b->name_space)
return FALSE;
1521 if (g_strcmp0(priv_a->mnemonic, priv_b->mnemonic) != 0)
return FALSE;
1536 if (a == b)
return 0;
1537 if (a && !b)
return 1;
1538 if (b && !a)
return -1;
1565 if (g_strcmp0 (ns->name, GNC_COMMODITY_NS_CURRENCY) == 0)
1566 return GNC_COMMODITY_NS_ISO_GUI;
1576 return g_list_copy (name_space->cm_list);
1582 return ((g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0) ||
1583 (g_strcmp0(name_space, GNC_COMMODITY_NS_CURRENCY) == 0));
1586 static const gchar *
1587 gnc_commodity_table_map_namespace(
const char * name_space)
1589 if (g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0)
1590 return GNC_COMMODITY_NS_CURRENCY;
1599 gnc_commodity_table *
1602 gnc_commodity_table * retval = g_new0(gnc_commodity_table, 1);
1603 retval->ns_table = g_hash_table_new(&g_str_hash, &g_str_equal);
1604 retval->ns_list =
nullptr;
1612 gnc_commodity_table *
1615 if (!book)
return nullptr;
1616 return static_cast<gnc_commodity_table*
>(
qof_book_get_data (book, GNC_COMMODITY_TABLE));
1622 gnc_commodity *twin;
1624 gnc_commodity_table * comtbl;
1626 if (!from)
return nullptr;
1628 if (!comtbl)
return nullptr;
1631 twin = gnc_commodity_table_lookup_unique (comtbl, ucom);
1646 count_coms(gpointer key, gpointer value, gpointer user_data)
1648 GHashTable *tbl = ((gnc_commodity_namespace*)value)->cm_table;
1649 guint *count = (guint*)user_data;
1651 if (g_strcmp0((
char*)key, GNC_COMMODITY_NS_CURRENCY) == 0)
1659 *count += g_hash_table_size(tbl);
1666 g_return_val_if_fail(tbl, 0);
1667 g_return_val_if_fail(tbl->ns_table, 0);
1669 g_hash_table_foreach(tbl->ns_table, count_coms, (gpointer)&count);
1680 gnc_commodity_table_lookup(
const gnc_commodity_table *
table,
1681 const char * name_space,
const char * mnemonic)
1683 gnc_commodity_namespace * nsp =
nullptr;
1685 if (!
table || !name_space || !mnemonic)
return nullptr;
1697 auto it = gnc_new_iso_codes.find (mnemonic);
1698 if (it != gnc_new_iso_codes.end())
1699 mnemonic = it->second.c_str();
1701 return GNC_COMMODITY(g_hash_table_lookup(nsp->cm_table, (gpointer)mnemonic));
1715 gnc_commodity_table_lookup_unique(
const gnc_commodity_table *
table,
1716 const char * unique_name)
1720 gnc_commodity *commodity;
1722 if (!
table || !unique_name)
return nullptr;
1724 name_space = g_strdup (unique_name);
1725 mnemonic = strstr (name_space,
"::");
1728 g_free (name_space);
1735 commodity = gnc_commodity_table_lookup (
table, name_space, mnemonic);
1737 g_free (name_space);
1748 gnc_commodity_table_find_full(
const gnc_commodity_table *
table,
1749 const char * name_space,
1750 const char * fullname)
1752 gnc_commodity * retval =
nullptr;
1756 if (!fullname || (fullname[0] ==
'\0'))
1761 for (iterator = all; iterator; iterator = iterator->next)
1763 auto commodity = GNC_COMMODITY (iterator->data);
1764 if (!strcmp(fullname,
1785 gnc_commodity * comm)
1787 gnc_commodity_namespace * nsp =
nullptr;
1789 const char *ns_name;
1793 if (!
table)
return nullptr;
1794 if (!comm)
return nullptr;
1796 priv = GET_PRIVATE(comm);
1798 ENTER (
"(table=%p, comm=%p) %s %s",
table, comm,
1799 (priv->mnemonic ==
nullptr ?
"(null)" : priv->mnemonic),
1800 (priv->fullname ==
nullptr ?
"(null)" : priv->fullname));
1802 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1808 LEAVE(
"already in table");
1814 if (priv->name_space->iso4217)
1816 auto it = gnc_new_iso_codes.find (priv->mnemonic);
1817 if (it != gnc_new_iso_codes.end())
1822 LEAVE(
"found at %p", c);
1827 if (g_strcmp0 (ns_name, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
1828 g_strcmp0 (priv->mnemonic,
"template") != 0)
1830 PWARN(
"Converting commodity %s from namespace template to " 1831 "namespace User", priv->mnemonic);
1834 mark_commodity_dirty (comm);
1840 PINFO (
"insert %p %s into nsp=%p %s", priv->mnemonic, priv->mnemonic,
1841 nsp->cm_table, nsp->name);
1842 g_hash_table_insert(nsp->cm_table,
1843 (gpointer)CACHE_INSERT(priv->mnemonic),
1845 nsp->cm_list = g_list_append(nsp->cm_list, comm);
1859 gnc_commodity * comm)
1861 gnc_commodity_namespace * nsp;
1864 const char *ns_name;
1869 priv = GET_PRIVATE(comm);
1871 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1872 if (c != comm)
return;
1879 nsp->cm_list = g_list_remove(nsp->cm_list, comm);
1880 g_hash_table_remove (nsp->cm_table, priv->mnemonic);
1891 const char * name_space)
1893 gnc_commodity_namespace * nsp =
nullptr;
1895 if (!
table || !name_space)
1912 hash_keys_helper(gpointer key, gpointer value, gpointer data)
1914 auto l = (GList**)data;
1915 *l = g_list_prepend(*l, key);
1919 g_hash_table_keys(GHashTable *
table)
1921 GList * l =
nullptr;
1922 g_hash_table_foreach(
table, &hash_keys_helper, (gpointer) &l);
1927 hash_values_helper(gpointer key, gpointer value, gpointer data)
1929 auto l = (GList**)data;
1930 *l = g_list_prepend(*l, value);
1934 g_hash_table_values(GHashTable *
table)
1936 GList * l =
nullptr;
1937 g_hash_table_foreach(
table, &hash_values_helper, (gpointer) &l);
1952 return g_hash_table_keys(
table->ns_table);
1961 return g_list_copy (
table->ns_list);
1975 if (!cm)
return FALSE;
1977 priv = GET_PRIVATE(cm);
1978 if ( !priv->name_space)
return FALSE;
1979 return priv->name_space->iso4217;
1985 const char *ns_name;
1986 if (!cm)
return FALSE;
1990 !g_strcmp0(ns_name, GNC_COMMODITY_NS_CURRENCY));
1998 static CommodityList*
1999 commodity_table_get_all_noncurrency_commodities(
const gnc_commodity_table*
table)
2002 CommodityList *retval =
nullptr;
2003 for (node = nslist; node; node=g_list_next(node))
2005 gnc_commodity_namespace *ns =
nullptr;
2006 if (g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_CURRENCY) == 0
2007 || g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_TEMPLATE) == 0)
2012 retval = g_list_concat(g_hash_table_values(ns->cm_table), retval);
2014 g_list_free(nslist);
2020 const char * name_space)
2022 gnc_commodity_namespace * ns =
nullptr;
2026 if (g_strcmp0(name_space, GNC_COMMODITY_NS_NONISO_GUI) == 0)
2027 return commodity_table_get_all_noncurrency_commodities(
table);
2032 return g_hash_table_values(ns->cm_table);
2041 get_quotables_helper1(gpointer key, gpointer value, gpointer data)
2043 auto comm = GNC_COMMODITY(value);
2045 auto l =
static_cast<GList**
>(data);
2047 if (!priv->quote_flag || !priv->quote_source || !priv->quote_source->get_supported())
2049 *l = g_list_prepend(*l, value);
2053 get_quotables_helper2 (gnc_commodity *comm, gpointer data)
2055 auto l =
static_cast<GList**
>(data);
2058 if (!priv->quote_flag || priv->quote_source || !priv->quote_source->get_supported())
2060 *l = g_list_prepend(*l, comm);
2067 gnc_commodity_namespace * ns =
nullptr;
2068 const char *name_space;
2069 GList * nslist, * tmp;
2070 GList * l =
nullptr;
2072 const char *expression = gnc_prefs_get_namespace_regexp();
2074 ENTER(
"table=%p, expression=%s",
table, expression);
2078 if (expression && *expression)
2080 if (regcomp(&pattern, expression, REG_EXTENDED | REG_ICASE) != 0)
2082 LEAVE(
"Cannot compile regex");
2087 for (tmp = nslist; tmp; tmp = tmp->next)
2089 name_space =
static_cast<const char*
>(tmp->data);
2090 if (regexec(&pattern, name_space, 0,
nullptr, 0) == 0)
2092 DEBUG(
"Running list of %s commodities", name_space);
2096 g_hash_table_foreach(ns->cm_table, &get_quotables_helper1, (gpointer) &l);
2100 g_list_free(nslist);
2108 LEAVE(
"list head %p", l);
2118 QOF_GOBJECT_IMPL(gnc_commodity_namespace, gnc_commodity_namespace, QOF_TYPE_INSTANCE)
2121 gnc_commodity_namespace_init(gnc_commodity_namespace* ns)
2126 gnc_commodity_namespace_dispose_real (GObject *nsp)
2131 gnc_commodity_namespace_finalize_real(GObject* nsp)
2135 gnc_commodity_namespace *
2137 const char * name_space,
2140 gnc_commodity_namespace * ns =
nullptr;
2142 if (!
table)
return nullptr;
2144 name_space = gnc_commodity_table_map_namespace(name_space);
2148 ns =
static_cast<gnc_commodity_namespace*
>(g_object_new(GNC_TYPE_COMMODITY_NAMESPACE,
nullptr));
2149 ns->cm_table = g_hash_table_new(g_str_hash, g_str_equal);
2150 ns->name = CACHE_INSERT(static_cast<const char*>(name_space));
2155 g_hash_table_insert(
table->ns_table,
2156 (gpointer) ns->name,
2158 table->ns_list = g_list_append(
table->ns_list, ns);
2165 gnc_commodity_namespace *
2167 const char * name_space)
2169 if (!
table || !name_space)
2172 name_space = gnc_commodity_table_map_namespace(name_space);
2173 return static_cast<gnc_commodity_namespace*
>(g_hash_table_lookup(
table->ns_table, (gpointer)name_space));
2178 gnc_commodity_find_commodity_by_guid(
const GncGUID *guid, QofBook *book)
2181 if (!guid || !book)
return nullptr;
2192 ns_helper(gpointer key, gpointer value, gpointer user_data)
2194 auto c = GNC_COMMODITY(value);
2196 CACHE_REMOVE(static_cast<char*>(key));
2202 const char * name_space)
2204 gnc_commodity_namespace * ns;
2213 g_hash_table_remove(
table->ns_table, name_space);
2214 table->ns_list = g_list_remove(
table->ns_list, ns);
2216 g_list_free(ns->cm_list);
2217 ns->cm_list =
nullptr;
2219 g_hash_table_foreach_remove(ns->cm_table, ns_helper,
nullptr);
2220 g_hash_table_destroy(ns->cm_table);
2221 CACHE_REMOVE(ns->name);
2237 gboolean (*func)(gnc_commodity *, gpointer);
2242 iter_commodity (gpointer key, gpointer value, gpointer user_data)
2245 gnc_commodity *cm = (gnc_commodity *) value;
2249 iter_data->ok = (iter_data->func)(cm, iter_data->user_data);
2254 iter_namespace (gpointer key, gpointer value, gpointer user_data)
2256 GHashTable *namespace_hash = ((gnc_commodity_namespace *) value)->cm_table;
2257 g_hash_table_foreach (namespace_hash, iter_commodity, user_data);
2262 gboolean (*f)(gnc_commodity *, gpointer),
2267 if (!tbl || !f)
return FALSE;
2269 iter_data.ok = TRUE;
2271 iter_data.user_data = user_data;
2273 g_hash_table_foreach(tbl->ns_table, iter_namespace, (gpointer)&iter_data);
2275 return iter_data.ok;
2284 gnc_commodity_table_destroy(gnc_commodity_table * t)
2286 gnc_commodity_namespace * ns;
2290 ENTER (
"table=%p", t);
2292 for (item = t->ns_list; item; item = next)
2294 next = g_list_next(item);
2295 ns =
static_cast<gnc_commodity_namespace*
>(item->data);
2299 g_list_free(t->ns_list);
2300 t->ns_list =
nullptr;
2301 g_hash_table_destroy(t->ns_table);
2302 t->ns_table =
nullptr;
2303 LEAVE (
"table=%p", t);
2313 #define CUR_I18N(String) dgettext ("iso_4217", String) 2323 c =
gnc_commodity_new(book,
"template", GNC_COMMODITY_NS_TEMPLATE,
"template",
"template", 1);
2326 #include "iso-4217-currencies.c" 2351 static QofObject commodity_object_def =
2354 DI(.e_type = ) GNC_ID_COMMODITY,
2355 DI(.type_label = ) "Commodity",
2356 DI(.create = )
nullptr,
2357 DI(.book_begin = )
nullptr,
2358 DI(.book_end = )
nullptr,
2361 DI(.foreach = ) qof_collection_foreach,
2365 static QofObject namespace_object_def =
2368 DI(.e_type = ) GNC_ID_COMMODITY_NAMESPACE,
2369 DI(.type_label = ) "Namespace",
2370 DI(.create = )
nullptr,
2371 DI(.book_begin = )
nullptr,
2372 DI(.book_end = )
nullptr,
2373 DI(.is_dirty = )
nullptr,
2374 DI(.mark_clean = )
nullptr,
2375 DI(.foreach = )
nullptr,
2376 DI(.printable = )
nullptr,
2380 commodity_table_book_begin (QofBook *book)
2382 gnc_commodity_table *ct;
2383 ENTER (
"book=%p", book);
2393 PWARN(
"unable to initialize book's commodity_table");
2396 LEAVE (
"book=%p", book);
2400 commodity_table_book_end (QofBook *book)
2402 gnc_commodity_table *ct;
2406 gnc_commodity_table_destroy (ct);
2409 static QofObject commodity_table_object_def =
2412 DI(.e_type = ) GNC_ID_COMMODITY_TABLE,
2413 DI(.type_label = ) "CommodityTable",
2414 DI(.create = )
nullptr,
2415 DI(.book_begin = ) commodity_table_book_begin,
2416 DI(.book_end = ) commodity_table_book_end,
2419 DI(.foreach = )
nullptr,
2420 DI(.printable = )
nullptr,
2421 DI(.version_cmp = )
nullptr,
2442 MonetaryList *l = list, *tmp;
2443 for (tmp = list; tmp; tmp = tmp->next)
2445 auto list_mon =
static_cast<gnc_monetary*
>(tmp->data);
2457 auto new_mon =
static_cast<gnc_monetary*
>(g_new0(gnc_monetary, 1));
2459 l = g_list_prepend(l, new_mon);
2470 MonetaryList *node, *next;
2471 for (node = list; node; node = next)
2473 auto mon =
static_cast<gnc_monetary*
>(node->data);
2478 list = g_list_delete_link(list, node);
2489 for (tmp = list; tmp; tmp = tmp->next)
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_cusip(const gnc_commodity *cm)
Retrieve the 'exchange code' for the specified commodity.
gboolean gnc_commodity_table_foreach_commodity(const gnc_commodity_table *table, gboolean(*f)(gnc_commodity *cm, gpointer user_data), gpointer user_data)
Call a function once for each commodity in the commodity table.
gnc_commodity_table * gnc_commodity_table_get_table(QofBook *book)
Returns the commodity table associated with a book.
A gnc_commodity_table is a database of commodity info.
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...
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
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_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...
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
#define GNC_COMMODITY_MAX_FRACTION
Max fraction is 10^9 because 10^10 would require changing it to an int64_t.
This quote source pulls from a single specific web site.
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
gboolean qof_collection_is_dirty(const QofCollection *col)
Return value of 'dirty' flag on collection.
gnc_quote_source * gnc_quote_source_add_new(const char *source_name, gboolean supported)
Create a new quote source.
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...
QofInstance * qof_collection_lookup_entity(const QofCollection *col, const GncGUID *guid)
Find the entity going only from its guid.
#define PINFO(format, args...)
Print an informational note.
gboolean gnc_commodity_get_quote_flag(const gnc_commodity *cm)
Retrieve the automatic price quote flag for the specified commodity.
QofBackendError
The errors that can be reported to the GUI & other front-end users.
const char * gnc_commodity_get_user_symbol(const gnc_commodity *cm)
Retrieve the user-defined symbol for the specified commodity.
void gnc_commodity_set_quote_tz(gnc_commodity *cm, const char *tz)
Set the automatic price quote timezone 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...
Commodity handling public routines (C++ api)
const char * gnc_commodity_get_quote_tz(const gnc_commodity *cm)
Retrieve the automatic price quote timezone for the specified commodity.
#define DEBUG(format, args...)
Print a debugging message.
void gnc_commodity_set_fraction(gnc_commodity *cm, int fraction)
Set the fraction for the specified commodity.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
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...
globally unique ID User API
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
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...
The special currency quote source.
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...
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Object instance holds common fields that most gnucash objects use.
gnc_commodity * gnc_commodity_clone(const gnc_commodity *src, QofBook *dest_book)
allocate and copy
This is a locally installed quote source that gnucash knows nothing about.
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
Retrieve the namespace for the specified commodity.
Use any denominator which gives an exactly correct ratio of numerator to denominator.
A gnc_commodity_namespace is an collection of commodities.
void gnc_commodity_set_quote_flag(gnc_commodity *cm, const gboolean flag)
Set the automatic price quote flag for the specified commodity.
#define QOF_OBJECT_VERSION
Defines the version of the core object object registration interface.
QuoteSourceType
The quote source type enum account types are used to determine how the transaction data in the accoun...
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...
gboolean qof_commit_edit(QofInstance *inst)
commit_edit helpers
#define PERR(format, args...)
Log a serious error.
#define ENTER(format, args...)
Print a function entry debugging message.
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.
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.
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 qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
void gnc_commodity_set_user_symbol(gnc_commodity *cm, const char *user_symbol)
Set a user-defined symbol for the specified commodity.
const char * gnc_commodity_namespace_get_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure.
#define PWARN(format, args...)
Log a warning.
void qof_instance_init_data(QofInstance *inst, QofIdType type, QofBook *book)
Initialise the settings associated with an instance.
MonetaryList * gnc_monetary_list_delete_zeros(MonetaryList *list)
Delete all entries in the list that have zero value.
gboolean qof_begin_edit(QofInstance *inst)
begin_edit
void gnc_commodity_set_quote_source(gnc_commodity *cm, gnc_quote_source *src)
Set the automatic price quote source for the specified commodity.
gint gnc_quote_source_num_entries(QuoteSourceType type)
Return the number of entries for a given type of quote source.
GList * gnc_commodity_table_get_namespaces(const gnc_commodity_table *table)
Return a list of all namespaces in the commodity table.
gboolean gnc_commodity_table_register(void)
You should probably not be using gnc_commodity_table_register() It is an internal routine for registe...
void gnc_commodity_increment_usage_count(gnc_commodity *cm)
Increment a commodity's internal counter that tracks how many accounts are using that commodity...
void gnc_commodity_set_cusip(gnc_commodity *cm, const char *cusip)
Set the 'exchange code' for the specified commodity.
void gnc_monetary_list_free(MonetaryList *list)
Free a MonetaryList and all the monetaries it points to.
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.
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.
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.
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.
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Retrieve the full name for the specified commodity.
#define GNC_COMMODITY_NS_LEGACY
The commodity namespace definitions are used to tag a commodity by its type, or a stocks by the excha...
void qof_book_set_data(QofBook *book, const gchar *key, gpointer data)
The qof_book_set_data() allows arbitrary pointers to structs to be stored in QofBook.
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
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 qof_collection_mark_clean(QofCollection *)
reset value of dirty flag
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.
const char * gnc_quote_source_fq_version(void)
This function returns the version of the Finance::Quote module installed on a user's computer...
Generic api to store and retrieve preferences.
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.
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...
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name 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.
void gnc_commodity_set_fullname(gnc_commodity *cm, const char *fullname)
Set the full name for the specified commodity.
This quote source may pull from multiple web sites.
gnc_quote_source * gnc_commodity_get_quote_source(const gnc_commodity *cm)
Retrieve the automatic price quote source 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_commodity_set_mnemonic(gnc_commodity *cm, const char *mnemonic)
Set the mnemonic for the specified commodity.
const char * gnc_commodity_get_default_symbol(const gnc_commodity *cm)
Retrieve the default symbol for the specified commodity.
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.
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.
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...
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_commodity_namespace * gnc_commodity_get_namespace_ds(const gnc_commodity *cm)
Retrieve the namespace data structure for the specified commodity.
#define LEAVE(format, args...)
Print a function exit debugging message.
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the 'unique' name for the specified commodity.
MonetaryList * gnc_monetary_list_add_monetary(MonetaryList *list, gnc_monetary add_mon)
Add a gnc_monetary to the list.
void gnc_commodity_table_remove(gnc_commodity_table *table, gnc_commodity *comm)
Remove a commodity from the commodity table.
void gnc_commodity_set_namespace(gnc_commodity *cm, const char *name_space)
Set the namespace for the specified commodity.
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
guint gnc_commodity_table_get_size(const gnc_commodity_table *tbl)
Returns the number of commodities in the commodity table.
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.
gboolean qof_object_register(const QofObject *object)
Register new types of object objects.
An article that is bought and sold.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
The type used to store guids in C.
void gnc_commodity_copy(gnc_commodity *dest, const gnc_commodity *src)
Copy src into dest.
gpointer qof_book_get_data(const QofBook *book, const gchar *key)
Retrieves arbitrary pointers to structs stored by qof_book_set_data.
GList * gnc_commodity_table_get_namespaces_list(const gnc_commodity_table *table)
Return a list of all namespace data structures in the commodity table.
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...
Commodity handling public routines.
void gnc_commodity_destroy(gnc_commodity *cm)
Destroy a commodity.
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_is_iso(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency.
gboolean gnc_quote_source_fq_installed(void)
This function indicates whether or not the Finance::Quote module is installed on a user's computer...