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",
"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" },
236 static 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" },
247 static QuoteSourceList new_quote_sources;
250 static const std::vector<std::pair<QuoteSourceType,QuoteSourceList&>> quote_sources_map =
267 return (!fq_version.empty());
280 return fq_version.c_str();
283 static 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);
491 gnc_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) );
511 gnc_commodity_commit_edit (gnc_commodity *cm)
522 mark_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 :
"");
550 G_DEFINE_TYPE_WITH_PRIVATE(gnc_commodity, gnc_commodity, QOF_TYPE_INSTANCE)
553 gnc_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);
573 gnc_commodity_dispose(GObject *comp)
575 G_OBJECT_CLASS(gnc_commodity_parent_class)->dispose(comp);
579 gnc_commodity_finalize(GObject* comp)
581 G_OBJECT_CLASS(gnc_commodity_parent_class)->finalize(comp);
590 gnc_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);
641 gnc_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);
819 commodity_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;
957 gnc_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;
1015 gnc_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;
1050 gnc_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);
1233 gnc_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);
1391 gnc_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));
1556 static const gchar *
1557 gnc_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;
1569 gnc_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;
1582 gnc_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);
1616 count_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);
1650 gnc_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));
1685 gnc_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);
1718 gnc_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)
1882 hash_keys_helper(gpointer key, gpointer value, gpointer data)
1884 auto l = (GList**)data;
1885 *l = g_list_prepend(*l, key);
1889 g_hash_table_keys(GHashTable *
table)
1891 GList * l =
nullptr;
1892 g_hash_table_foreach(
table, &hash_keys_helper, (gpointer) &l);
1897 hash_values_helper(gpointer key, gpointer value, gpointer data)
1899 auto l = (GList**)data;
1900 *l = g_list_prepend(*l, value);
1904 g_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));
1968 static CommodityList*
1969 commodity_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);
2011 get_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);
2023 get_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);
2078 LEAVE(
"list head %p", l);
2088 QOF_GOBJECT_IMPL(gnc_commodity_namespace, gnc_commodity_namespace, QOF_TYPE_INSTANCE)
2091 gnc_commodity_namespace_init(gnc_commodity_namespace* ns)
2096 gnc_commodity_namespace_dispose_real (GObject *nsp)
2101 gnc_commodity_namespace_finalize_real(GObject* nsp)
2105 gnc_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);
2166 gnc_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));
2179 gnc_commodity_find_commodity_by_guid(
const GncGUID *guid,
QofBook *book)
2182 if (!guid || !book)
return nullptr;
2193 ns_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);
2243 iter_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);
2255 iter_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);
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;
2285 gnc_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" 2352 static 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,
2366 static 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,
2381 commodity_table_book_begin (
QofBook *book)
2383 gnc_commodity_table *ct;
2384 ENTER (
"book=%p", book);
2394 PWARN(
"unable to initialize book's commodity_table");
2397 LEAVE (
"book=%p", book);
2401 commodity_table_book_end (
QofBook *book)
2403 gnc_commodity_table *ct;
2407 gnc_commodity_table_destroy (ct);
2410 static 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)
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...
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 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...
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.
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...