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",
"Swiss Fund Data AG, CH"),
"swissfunddata" },
224 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Tesouro Direto bonds, BR"),
"tesouro_direto" },
225 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Toronto Stock eXchange, CA"),
"tsx" },
226 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Tradegate, DE"),
"tradegate" },
227 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Treasury Direct bonds, US"),
"treasurydirect" },
228 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Twelve Data"),
"twelvedata" },
229 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Union Investment, DE"),
"unionfunds" },
230 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"US Govt. Thrift Savings Plan"),
"tsp" },
231 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"XETRA, DE"),
"xetra" },
232 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Yahoo as JSON"),
"yahoo_json" },
233 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"Yahoo Web"),
"yahooweb" },
234 {
false,
SOURCE_SINGLE, NC_(
"FQ Source",
"YH Finance (FinanceAPI)"),
"financeapi" },
238 static QuoteSourceList multiple_quote_sources =
240 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Canada (Alphavantage, TMX)"),
"canada" },
241 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Europe (ASEGR, Bourso, …)"),
"europe" },
242 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"India (BSEIndia, NSEIndia)"),
"india"},
243 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"Nasdaq (Alphavantage, FinanceAPI, …)"),
"nasdaq" },
244 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"NYSE (Alphavantage, FinanceAPI, …)"),
"nyse" },
245 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"U.K. Funds (FTfunds, MorningstarUK)"),
"ukfunds" },
246 {
false,
SOURCE_MULTI, NC_(
"FQ Source",
"USA (Alphavantage, FinanceAPI, …)"),
"usa" },
249 static QuoteSourceList new_quote_sources;
252 static const std::vector<std::pair<QuoteSourceType,QuoteSourceList&>> quote_sources_map =
269 return (!fq_version.empty());
282 return fq_version.c_str();
285 static QuoteSourceList&
288 auto quote_sources_it = std::find_if (quote_sources_map.begin(), quote_sources_map.end(),
289 [type] (
const auto& qs) {
return type == qs.first; });
291 if (quote_sources_it != quote_sources_map.end())
292 return quote_sources_it->second;
294 PWARN (
"Invalid Quote Source %d, returning new_quote_sources", type);
295 return new_quote_sources;
305 auto source{get_quote_source_from_type(type)};
306 return std::distance(source.begin(), source.end());
322 DEBUG(
"Creating new source %s", (!source_name ?
"(null)" : source_name));
328 return &new_quote_sources.emplace_back (supported,
SOURCE_UNKNOWN, source_name, source_name);
339 ENTER(
"type/index is %d/%d", type, index);
340 auto& sources = get_quote_source_from_type (type);
341 if ((
size_t) index < sources.size())
343 auto it = std::next(sources.begin(), index);
344 LEAVE(
"found %s", it->get_user_name());
358 for (
const auto& [_, sources] : quote_sources_map)
360 auto source_it = std::find_if (sources.begin(), sources.end(),
361 [name] (
const auto& qs)
362 {
return (g_strcmp0(name, qs.get_internal_name()) == 0); });
363 if (source_it != sources.end())
364 return &(*source_it);
367 DEBUG(
"gnc_quote_source_lookup_by_internal: Unknown source %s", name);
386 LEAVE(
"type is %d", source->get_type());
387 return source->get_type();
395 PWARN (
"bad source");
399 auto& sources = get_quote_source_from_type (source->get_type());
400 auto is_source = [&source](
const auto& findif_source)
401 {
return &findif_source == source; };
403 auto iter = std::find_if (sources.begin(), sources.end(), is_source);
404 if (iter != sources.end())
405 return std::distance (sources.begin(), iter);
407 PWARN (
"couldn't locate source");
421 LEAVE(
"%s supported", source && source->get_supported() ?
"" :
"not ");
422 return source->get_supported();
434 LEAVE(
"user name %s", source->get_user_name());
435 return source->get_user_name();
447 LEAVE(
"internal name %s", source->get_internal_name());
448 return source->get_internal_name();
460 const std::vector<std::string>& sources_list)
464 if (sources_list.empty())
468 fq_version = version_string;
472 for (
const auto& source_name_str : sources_list)
474 auto source_name = source_name_str.c_str();
479 DEBUG(
"Found source %s: %s", source_name, source->get_user_name());
480 source->set_supported (
true);
494 gnc_commodity_begin_edit (gnc_commodity *cm)
501 PERR (
"Failed to commit: %d", errcode);
502 gnc_engine_signal_commit_error( errcode );
510 commodity_free( GNC_COMMODITY(inst) );
514 gnc_commodity_commit_edit (gnc_commodity *cm)
525 mark_commodity_dirty (gnc_commodity *cm)
527 qof_instance_set_dirty(&cm->inst);
534 g_free(priv->printname);
535 priv->printname = g_strdup_printf(
"%s (%s)",
536 priv->mnemonic ? priv->mnemonic :
"",
537 priv->fullname ? priv->fullname :
"");
543 gnc_commodity_namespace *ns;
545 g_free(priv->unique_name);
546 ns = priv->name_space;
547 priv->unique_name = g_strdup_printf(
"%s::%s",
549 priv->mnemonic ? priv->mnemonic :
"");
553 G_DEFINE_TYPE_WITH_PRIVATE(gnc_commodity, gnc_commodity, QOF_TYPE_INSTANCE)
556 gnc_commodity_init(gnc_commodity* com)
560 priv = GET_PRIVATE(com);
562 priv->name_space =
nullptr;
563 priv->fullname = CACHE_INSERT(
"");
564 priv->mnemonic = CACHE_INSERT(
"");
565 priv->cusip = CACHE_INSERT(
"");
566 priv->fraction = 10000;
567 priv->quote_flag = 0;
568 priv->quote_source =
nullptr;
569 priv->quote_tz = CACHE_INSERT(
"");
571 reset_printname(priv);
572 reset_unique_name(priv);
576 gnc_commodity_dispose(GObject *comp)
578 G_OBJECT_CLASS(gnc_commodity_parent_class)->dispose(comp);
582 gnc_commodity_finalize(GObject* comp)
584 G_OBJECT_CLASS(gnc_commodity_parent_class)->finalize(comp);
593 gnc_commodity_get_property (GObject *
object,
598 gnc_commodity *commodity;
601 g_return_if_fail(GNC_IS_COMMODITY(
object));
603 commodity = GNC_COMMODITY(
object);
604 priv = GET_PRIVATE(commodity);
608 g_value_take_object(value, priv->name_space);
611 g_value_set_string(value, priv->fullname);
614 g_value_set_string(value, priv->mnemonic);
617 g_value_set_string(value, priv->printname);
620 g_value_set_string(value, priv->cusip);
623 g_value_set_int(value, priv->fraction);
625 case PROP_UNIQUE_NAME:
626 g_value_set_string(value, priv->unique_name);
628 case PROP_QUOTE_FLAG:
629 g_value_set_boolean(value, priv->quote_flag);
631 case PROP_QUOTE_SOURCE:
632 g_value_set_pointer(value, priv->quote_source);
635 g_value_set_string(value, priv->quote_tz);
638 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
644 gnc_commodity_set_property (GObject *
object,
649 gnc_commodity *commodity;
651 g_return_if_fail(GNC_IS_COMMODITY(
object));
653 commodity = GNC_COMMODITY(
object);
654 g_assert (qof_instance_get_editlevel(commodity));
673 case PROP_QUOTE_FLAG:
676 case PROP_QUOTE_SOURCE:
683 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
690 GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
692 gobject_class->dispose = gnc_commodity_dispose;
693 gobject_class->finalize = gnc_commodity_finalize;
694 gobject_class->set_property = gnc_commodity_set_property;
695 gobject_class->get_property = gnc_commodity_get_property;
697 g_object_class_install_property(gobject_class,
699 g_param_spec_object (
"namespace",
701 "The namespace field denotes the " 702 "namespace for this commodity, either " 703 "a currency or symbol from a quote source.",
704 GNC_TYPE_COMMODITY_NAMESPACE,
706 g_object_class_install_property(gobject_class,
708 g_param_spec_string (
"fullname",
709 "Full Commodity Name",
710 "The fullname is the official full name of" 714 g_object_class_install_property(gobject_class,
716 g_param_spec_string (
"mnemonic",
717 "Commodity Mnemonic",
718 "The mnemonic is the official abbreviated" 719 "designation for the currency.",
722 g_object_class_install_property(gobject_class,
724 g_param_spec_string (
"printname",
725 "Commodity Print Name",
726 "Printable form of the commodity name.",
729 g_object_class_install_property(gobject_class,
731 g_param_spec_string (
"cusip",
732 "Commodity CUSIP Code",
736 g_object_class_install_property(gobject_class,
738 g_param_spec_int (
"fraction",
740 "The fraction is the number of sub-units that " 741 "the basic commodity can be divided into.",
746 g_object_class_install_property(gobject_class,
748 g_param_spec_string (
"unique-name",
749 "Commodity Unique Name",
750 "Unique form of the commodity name which combines " 751 "the namespace name and the commodity name.",
754 g_object_class_install_property(gobject_class,
756 g_param_spec_boolean (
"quote_flag",
758 "TRUE if prices are to be downloaded for this " 759 "commodity from a quote source.",
762 g_object_class_install_property(gobject_class,
764 g_param_spec_pointer(
"quote-source",
766 "The quote source from which prices are downloaded.",
768 g_object_class_install_property(gobject_class,
770 g_param_spec_string (
"quote-tz",
771 "Commodity Quote Timezone",
779 const char * name_space,
const char * mnemonic,
780 const char * cusip,
int fraction)
782 auto retval = GNC_COMMODITY(g_object_new(GNC_TYPE_COMMODITY,
nullptr));
785 gnc_commodity_begin_edit(retval);
787 if ( name_space !=
nullptr )
790 if (g_strcmp0 (name_space, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
791 g_strcmp0 (mnemonic,
"template") != 0)
793 PWARN(
"Converting commodity %s from namespace template to " 794 "namespace User", mnemonic);
808 mark_commodity_dirty (retval);
809 gnc_commodity_commit_edit(retval);
822 commodity_free(gnc_commodity * cm)
825 gnc_commodity_table *
table;
833 priv = GET_PRIVATE(cm);
838 CACHE_REMOVE (priv->fullname);
839 CACHE_REMOVE (priv->cusip);
840 CACHE_REMOVE (priv->mnemonic);
841 CACHE_REMOVE (priv->quote_tz);
842 priv->name_space =
nullptr;
845 priv->quote_source =
nullptr;
848 g_free(priv->printname);
849 priv->printname =
nullptr;
851 g_free(priv->unique_name);
852 priv->unique_name =
nullptr;
854 #ifdef ACCOUNTS_CLEANED_UP 859 if (priv->usage_count != 0)
861 PWARN(
"Destroying commodity (%p) with non-zero usage_count (%d).", cm,
873 gnc_commodity_begin_edit(cm);
874 qof_instance_set_destroying(cm, TRUE);
875 gnc_commodity_commit_edit(cm);
886 dest_priv->name_space = src_priv->name_space;
892 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
901 auto dest = GNC_COMMODITY (g_object_new(GNC_TYPE_COMMODITY,
nullptr));
903 src_priv = GET_PRIVATE(src);
904 dest_priv = GET_PRIVATE(dest);
906 dest_priv->fullname = CACHE_INSERT(src_priv->fullname);
907 dest_priv->mnemonic = CACHE_INSERT(src_priv->mnemonic);
908 dest_priv->cusip = CACHE_INSERT(src_priv->cusip);
909 dest_priv->quote_tz = CACHE_INSERT(src_priv->quote_tz);
911 dest_priv->name_space = src_priv->name_space;
913 dest_priv->fraction = src_priv->fraction;
914 dest_priv->quote_flag = src_priv->quote_flag;
918 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
920 reset_printname(dest_priv);
921 reset_unique_name(dest_priv);
933 if (!cm)
return nullptr;
934 return GET_PRIVATE(cm)->mnemonic;
944 if (!cm)
return nullptr;
945 return GET_PRIVATE(cm)->printname;
956 if (!cm)
return nullptr;
960 gnc_commodity_namespace *
963 if (!cm)
return nullptr;
964 return GET_PRIVATE(cm)->name_space;
974 if (!cm)
return nullptr;
975 return GET_PRIVATE(cm)->fullname;
986 if (!cm)
return nullptr;
987 return GET_PRIVATE(cm)->unique_name;
998 if (!cm)
return nullptr;
999 return GET_PRIVATE(cm)->cusip;
1010 return GET_PRIVATE(cm)->fraction;
1018 gnc_commodity_get_auto_quote_control_flag(
const gnc_commodity *cm)
1020 if (!cm)
return FALSE;
1021 auto str{qof_instance_get_path_kvp<const char*> (QOF_INSTANCE (cm), {
"auto_quote_control"})};
1022 return !str || g_strcmp0 (*str,
"false");
1032 if (!cm)
return FALSE;
1033 return (GET_PRIVATE(cm)->quote_flag);
1045 if (!cm)
return nullptr;
1046 priv = GET_PRIVATE(cm);
1048 return ¤cy_quote_sources.front();
1049 return priv->quote_source;
1053 gnc_commodity_get_default_quote_source(
const gnc_commodity *cm)
1056 return ¤cy_quote_sources.front();
1068 if (!cm)
return nullptr;
1069 return GET_PRIVATE(cm)->quote_tz;
1078 g_return_val_if_fail (GNC_IS_COMMODITY (cm),
nullptr);
1080 auto sym{qof_instance_get_path_kvp<const char*> (QOF_INSTANCE(cm), {
"user_symbol"})};
1081 return sym ? *sym :
nullptr;
1090 if (!cm)
return nullptr;
1091 return GET_PRIVATE(cm)->default_symbol;
1100 const char *nice_symbol;
1102 if (!cm)
return nullptr;
1105 if (nice_symbol && *nice_symbol)
1108 lc = gnc_localeconv();
1109 nice_symbol = lc->currency_symbol;
1114 if (nice_symbol && *nice_symbol)
1130 priv = GET_PRIVATE(cm);
1131 if (priv->mnemonic == mnemonic)
return;
1133 gnc_commodity_begin_edit(cm);
1134 CACHE_REMOVE (priv->mnemonic);
1135 priv->mnemonic = CACHE_INSERT(mnemonic);
1137 mark_commodity_dirty (cm);
1138 reset_printname(priv);
1139 reset_unique_name(priv);
1140 gnc_commodity_commit_edit(cm);
1151 gnc_commodity_table *
table;
1152 gnc_commodity_namespace *nsp;
1156 priv = GET_PRIVATE(cm);
1160 if (priv->name_space == nsp)
1163 gnc_commodity_begin_edit(cm);
1164 priv->name_space = nsp;
1167 mark_commodity_dirty(cm);
1168 reset_printname(priv);
1169 reset_unique_name(priv);
1170 gnc_commodity_commit_edit(cm);
1183 priv = GET_PRIVATE(cm);
1184 if (priv->fullname == fullname)
return;
1186 CACHE_REMOVE (priv->fullname);
1187 priv->fullname = CACHE_INSERT (fullname);
1189 gnc_commodity_begin_edit(cm);
1190 mark_commodity_dirty(cm);
1191 reset_printname(priv);
1192 gnc_commodity_commit_edit(cm);
1207 priv = GET_PRIVATE(cm);
1208 if (priv->cusip == cusip)
return;
1210 gnc_commodity_begin_edit(cm);
1211 CACHE_REMOVE (priv->cusip);
1212 priv->cusip = CACHE_INSERT (cusip);
1213 mark_commodity_dirty(cm);
1214 gnc_commodity_commit_edit(cm);
1225 gnc_commodity_begin_edit(cm);
1226 GET_PRIVATE(cm)->fraction = fraction;
1227 mark_commodity_dirty(cm);
1228 gnc_commodity_commit_edit(cm);
1236 gnc_commodity_set_auto_quote_control_flag(gnc_commodity *cm,
1237 const gboolean flag)
1239 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1246 gnc_commodity_begin_edit(cm);
1247 auto val = flag ? std::nullopt : std::make_optional<const char*>(g_strdup(
"false"));
1248 qof_instance_set_path_kvp<const char*> (QOF_INSTANCE (cm), val, {
"auto_quote_control"});
1249 mark_commodity_dirty(cm);
1250 gnc_commodity_commit_edit(cm);
1263 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1271 priv = GET_PRIVATE(cm);
1272 gnc_commodity_begin_edit(cm);
1283 gnc_commodity_set_auto_quote_control_flag(cm,
1284 (!flag && (priv->usage_count == 0)) || (flag && (priv->usage_count != 0)));
1286 gnc_commodity_commit_edit(cm);
1297 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1300 gnc_commodity_begin_edit(cm);
1301 GET_PRIVATE(cm)->quote_flag = flag;
1302 mark_commodity_dirty(cm);
1303 gnc_commodity_commit_edit(cm);
1314 ENTER (
"(cm=%p, src=%p(%s))", cm, src, src ? src->get_internal_name() :
"unknown");
1317 gnc_commodity_begin_edit(cm);
1318 GET_PRIVATE(cm)->quote_source = src;
1319 mark_commodity_dirty(cm);
1320 gnc_commodity_commit_edit(cm);
1335 ENTER (
"(cm=%p, tz=%s)", cm, tz ? tz :
"(null)");
1337 priv = GET_PRIVATE(cm);
1339 if (tz == priv->quote_tz)
1341 LEAVE(
"Already correct TZ");
1345 gnc_commodity_begin_edit(cm);
1346 CACHE_REMOVE (priv->quote_tz);
1347 priv->quote_tz = CACHE_INSERT (tz);
1348 mark_commodity_dirty(cm);
1349 gnc_commodity_commit_edit(cm);
1364 ENTER (
"(cm=%p, symbol=%s)", cm, user_symbol ? user_symbol :
"(null)");
1366 lc = gnc_localeconv();
1367 if (!user_symbol || !*user_symbol)
1368 user_symbol =
nullptr;
1370 !g_strcmp0(lc->currency_symbol, user_symbol))
1373 user_symbol =
nullptr;
1375 user_symbol =
nullptr;
1377 gnc_commodity_begin_edit (cm);
1379 auto val = user_symbol ? std::make_optional<const char*>(g_strdup(user_symbol)) : std::nullopt;
1380 qof_instance_set_path_kvp<const char*> (QOF_INSTANCE(cm), val, {
"user_symbol"});
1382 mark_commodity_dirty(cm);
1383 gnc_commodity_commit_edit(cm);
1394 gnc_commodity_set_default_symbol(gnc_commodity * cm,
1395 const char * default_symbol)
1397 GET_PRIVATE(cm)->default_symbol = default_symbol;
1409 ENTER(
"(cm=%p)", cm);
1417 priv = GET_PRIVATE(cm);
1419 if ((priv->usage_count == 0) && !priv->quote_flag
1420 && gnc_commodity_get_auto_quote_control_flag(cm)
1425 gnc_commodity_begin_edit(cm);
1428 gnc_commodity_get_default_quote_source(cm));
1429 gnc_commodity_commit_edit(cm);
1431 priv->usage_count++;
1432 LEAVE(
"(usage_count=%d)", priv->usage_count);
1444 ENTER(
"(cm=%p)", cm);
1452 priv = GET_PRIVATE(cm);
1454 if (priv->usage_count == 0)
1456 PWARN(
"usage_count already zero");
1461 priv->usage_count--;
1462 if ((priv->usage_count == 0) && priv->quote_flag
1463 && gnc_commodity_get_auto_quote_control_flag(cm)
1470 LEAVE(
"(usage_count=%d)", priv->usage_count);
1488 if (a == b)
return TRUE;
1489 if (!a || !b)
return FALSE;
1491 priv_a = GET_PRIVATE(a);
1492 priv_b = GET_PRIVATE(b);
1493 if (priv_a->name_space != priv_b->name_space)
return FALSE;
1494 if (g_strcmp0(priv_a->mnemonic, priv_b->mnemonic) != 0)
return FALSE;
1509 if (a == b)
return 0;
1510 if (a && !b)
return 1;
1511 if (b && !a)
return -1;
1538 if (g_strcmp0 (ns->name, GNC_COMMODITY_NS_CURRENCY) == 0)
1539 return GNC_COMMODITY_NS_ISO_GUI;
1549 return g_list_copy (name_space->cm_list);
1555 return ((g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0) ||
1556 (g_strcmp0(name_space, GNC_COMMODITY_NS_CURRENCY) == 0));
1559 static const gchar *
1560 gnc_commodity_table_map_namespace(
const char * name_space)
1562 if (g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0)
1563 return GNC_COMMODITY_NS_CURRENCY;
1572 gnc_commodity_table *
1575 gnc_commodity_table * retval = g_new0(gnc_commodity_table, 1);
1576 retval->ns_table = g_hash_table_new(&g_str_hash, &g_str_equal);
1577 retval->ns_list =
nullptr;
1585 gnc_commodity_table *
1588 if (!book)
return nullptr;
1589 return static_cast<gnc_commodity_table*
>(
qof_book_get_data (book, GNC_COMMODITY_TABLE));
1595 gnc_commodity *twin;
1597 gnc_commodity_table * comtbl;
1599 if (!from)
return nullptr;
1601 if (!comtbl)
return nullptr;
1604 twin = gnc_commodity_table_lookup_unique (comtbl, ucom);
1619 count_coms(gpointer key, gpointer value, gpointer user_data)
1621 GHashTable *tbl = ((gnc_commodity_namespace*)value)->cm_table;
1622 guint *count = (guint*)user_data;
1624 if (g_strcmp0((
char*)key, GNC_COMMODITY_NS_CURRENCY) == 0)
1632 *count += g_hash_table_size(tbl);
1639 g_return_val_if_fail(tbl, 0);
1640 g_return_val_if_fail(tbl->ns_table, 0);
1642 g_hash_table_foreach(tbl->ns_table, count_coms, (gpointer)&count);
1653 gnc_commodity_table_lookup(
const gnc_commodity_table *
table,
1654 const char * name_space,
const char * mnemonic)
1656 gnc_commodity_namespace * nsp =
nullptr;
1658 if (!
table || !name_space || !mnemonic)
return nullptr;
1670 auto it = gnc_new_iso_codes.find (mnemonic);
1671 if (it != gnc_new_iso_codes.end())
1672 mnemonic = it->second.c_str();
1674 return GNC_COMMODITY(g_hash_table_lookup(nsp->cm_table, (gpointer)mnemonic));
1688 gnc_commodity_table_lookup_unique(
const gnc_commodity_table *
table,
1689 const char * unique_name)
1693 gnc_commodity *commodity;
1695 if (!
table || !unique_name)
return nullptr;
1697 name_space = g_strdup (unique_name);
1698 mnemonic = strstr (name_space,
"::");
1701 g_free (name_space);
1708 commodity = gnc_commodity_table_lookup (
table, name_space, mnemonic);
1710 g_free (name_space);
1721 gnc_commodity_table_find_full(
const gnc_commodity_table *
table,
1722 const char * name_space,
1723 const char * fullname)
1725 gnc_commodity * retval =
nullptr;
1729 if (!fullname || (fullname[0] ==
'\0'))
1734 for (iterator = all; iterator; iterator = iterator->next)
1736 auto commodity = GNC_COMMODITY (iterator->data);
1737 if (!strcmp(fullname,
1758 gnc_commodity * comm)
1760 gnc_commodity_namespace * nsp =
nullptr;
1762 const char *ns_name;
1766 if (!
table)
return nullptr;
1767 if (!comm)
return nullptr;
1769 priv = GET_PRIVATE(comm);
1771 ENTER (
"(table=%p, comm=%p) %s %s",
table, comm,
1772 (priv->mnemonic ==
nullptr ?
"(null)" : priv->mnemonic),
1773 (priv->fullname ==
nullptr ?
"(null)" : priv->fullname));
1775 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1781 LEAVE(
"already in table");
1787 if (priv->name_space->iso4217)
1789 auto it = gnc_new_iso_codes.find (priv->mnemonic);
1790 if (it != gnc_new_iso_codes.end())
1795 LEAVE(
"found at %p", c);
1800 if (g_strcmp0 (ns_name, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
1801 g_strcmp0 (priv->mnemonic,
"template") != 0)
1803 PWARN(
"Converting commodity %s from namespace template to " 1804 "namespace User", priv->mnemonic);
1807 mark_commodity_dirty (comm);
1813 PINFO (
"insert %p %s into nsp=%p %s", priv->mnemonic, priv->mnemonic,
1814 nsp->cm_table, nsp->name);
1815 g_hash_table_insert(nsp->cm_table,
1816 (gpointer)CACHE_INSERT(priv->mnemonic),
1818 nsp->cm_list = g_list_append(nsp->cm_list, comm);
1832 gnc_commodity * comm)
1834 gnc_commodity_namespace * nsp;
1837 const char *ns_name;
1842 priv = GET_PRIVATE(comm);
1844 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1845 if (c != comm)
return;
1852 nsp->cm_list = g_list_remove(nsp->cm_list, comm);
1853 g_hash_table_remove (nsp->cm_table, priv->mnemonic);
1864 const char * name_space)
1866 gnc_commodity_namespace * nsp =
nullptr;
1868 if (!
table || !name_space)
1885 hash_keys_helper(gpointer key, gpointer value, gpointer data)
1887 auto l = (GList**)data;
1888 *l = g_list_prepend(*l, key);
1892 g_hash_table_keys(GHashTable *
table)
1894 GList * l =
nullptr;
1895 g_hash_table_foreach(
table, &hash_keys_helper, (gpointer) &l);
1900 hash_values_helper(gpointer key, gpointer value, gpointer data)
1902 auto l = (GList**)data;
1903 *l = g_list_prepend(*l, value);
1907 g_hash_table_values(GHashTable *
table)
1909 GList * l =
nullptr;
1910 g_hash_table_foreach(
table, &hash_values_helper, (gpointer) &l);
1925 return g_hash_table_keys(
table->ns_table);
1934 return g_list_copy (
table->ns_list);
1948 if (!cm)
return FALSE;
1950 priv = GET_PRIVATE(cm);
1951 if ( !priv->name_space)
return FALSE;
1952 return priv->name_space->iso4217;
1958 const char *ns_name;
1959 if (!cm)
return FALSE;
1963 !g_strcmp0(ns_name, GNC_COMMODITY_NS_CURRENCY));
1971 static CommodityList*
1972 commodity_table_get_all_noncurrency_commodities(
const gnc_commodity_table*
table)
1975 CommodityList *retval =
nullptr;
1976 for (node = nslist; node; node=g_list_next(node))
1978 gnc_commodity_namespace *ns =
nullptr;
1979 if (g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_CURRENCY) == 0
1980 || g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_TEMPLATE) == 0)
1985 retval = g_list_concat(g_hash_table_values(ns->cm_table), retval);
1987 g_list_free(nslist);
1993 const char * name_space)
1995 gnc_commodity_namespace * ns =
nullptr;
1999 if (g_strcmp0(name_space, GNC_COMMODITY_NS_NONISO_GUI) == 0)
2000 return commodity_table_get_all_noncurrency_commodities(
table);
2005 return g_hash_table_values(ns->cm_table);
2014 get_quotables_helper1(gpointer key, gpointer value, gpointer data)
2016 auto comm = GNC_COMMODITY(value);
2018 auto l =
static_cast<GList**
>(data);
2020 if (!priv->quote_flag || !priv->quote_source || !priv->quote_source->get_supported())
2022 *l = g_list_prepend(*l, value);
2026 get_quotables_helper2 (gnc_commodity *comm, gpointer data)
2028 auto l =
static_cast<GList**
>(data);
2031 if (!priv->quote_flag || priv->quote_source || !priv->quote_source->get_supported())
2033 *l = g_list_prepend(*l, comm);
2040 gnc_commodity_namespace * ns =
nullptr;
2041 const char *name_space;
2042 GList * nslist, * tmp;
2043 GList * l =
nullptr;
2045 const char *expression = gnc_prefs_get_namespace_regexp();
2047 ENTER(
"table=%p, expression=%s",
table, expression);
2051 if (expression && *expression)
2053 if (regcomp(&pattern, expression, REG_EXTENDED | REG_ICASE) != 0)
2055 LEAVE(
"Cannot compile regex");
2060 for (tmp = nslist; tmp; tmp = tmp->next)
2062 name_space =
static_cast<const char*
>(tmp->data);
2063 if (regexec(&pattern, name_space, 0,
nullptr, 0) == 0)
2065 DEBUG(
"Running list of %s commodities", name_space);
2069 g_hash_table_foreach(ns->cm_table, &get_quotables_helper1, (gpointer) &l);
2073 g_list_free(nslist);
2081 LEAVE(
"list head %p", l);
2091 QOF_GOBJECT_IMPL(gnc_commodity_namespace, gnc_commodity_namespace, QOF_TYPE_INSTANCE)
2094 gnc_commodity_namespace_init(gnc_commodity_namespace* ns)
2099 gnc_commodity_namespace_dispose_real (GObject *nsp)
2104 gnc_commodity_namespace_finalize_real(GObject* nsp)
2108 gnc_commodity_namespace *
2110 const char * name_space,
2113 gnc_commodity_namespace * ns =
nullptr;
2115 if (!
table)
return nullptr;
2117 name_space = gnc_commodity_table_map_namespace(name_space);
2121 ns =
static_cast<gnc_commodity_namespace*
>(g_object_new(GNC_TYPE_COMMODITY_NAMESPACE,
nullptr));
2122 ns->cm_table = g_hash_table_new(g_str_hash, g_str_equal);
2123 ns->name = CACHE_INSERT(static_cast<const char*>(name_space));
2128 g_hash_table_insert(
table->ns_table,
2129 (gpointer) ns->name,
2131 table->ns_list = g_list_append(
table->ns_list, ns);
2138 gnc_commodity_namespace *
2140 const char * name_space)
2142 if (!
table || !name_space)
2145 name_space = gnc_commodity_table_map_namespace(name_space);
2146 return static_cast<gnc_commodity_namespace*
>(g_hash_table_lookup(
table->ns_table, (gpointer)name_space));
2151 gnc_commodity_find_commodity_by_guid(
const GncGUID *guid, QofBook *book)
2154 if (!guid || !book)
return nullptr;
2165 ns_helper(gpointer key, gpointer value, gpointer user_data)
2167 auto c = GNC_COMMODITY(value);
2169 CACHE_REMOVE(static_cast<char*>(key));
2175 const char * name_space)
2177 gnc_commodity_namespace * ns;
2186 g_hash_table_remove(
table->ns_table, name_space);
2187 table->ns_list = g_list_remove(
table->ns_list, ns);
2189 g_list_free(ns->cm_list);
2190 ns->cm_list =
nullptr;
2192 g_hash_table_foreach_remove(ns->cm_table, ns_helper,
nullptr);
2193 g_hash_table_destroy(ns->cm_table);
2194 CACHE_REMOVE(ns->name);
2210 gboolean (*func)(gnc_commodity *, gpointer);
2215 iter_commodity (gpointer key, gpointer value, gpointer user_data)
2218 gnc_commodity *cm = (gnc_commodity *) value;
2222 iter_data->ok = (iter_data->func)(cm, iter_data->user_data);
2227 iter_namespace (gpointer key, gpointer value, gpointer user_data)
2229 GHashTable *namespace_hash = ((gnc_commodity_namespace *) value)->cm_table;
2230 g_hash_table_foreach (namespace_hash, iter_commodity, user_data);
2235 gboolean (*f)(gnc_commodity *, gpointer),
2240 if (!tbl || !f)
return FALSE;
2242 iter_data.ok = TRUE;
2244 iter_data.user_data = user_data;
2246 g_hash_table_foreach(tbl->ns_table, iter_namespace, (gpointer)&iter_data);
2248 return iter_data.ok;
2257 gnc_commodity_table_destroy(gnc_commodity_table * t)
2259 gnc_commodity_namespace * ns;
2263 ENTER (
"table=%p", t);
2265 for (item = t->ns_list; item; item = next)
2267 next = g_list_next(item);
2268 ns =
static_cast<gnc_commodity_namespace*
>(item->data);
2272 g_list_free(t->ns_list);
2273 t->ns_list =
nullptr;
2274 g_hash_table_destroy(t->ns_table);
2275 t->ns_table =
nullptr;
2276 LEAVE (
"table=%p", t);
2286 #define CUR_I18N(String) dgettext ("iso_4217", String) 2296 c =
gnc_commodity_new(book,
"template", GNC_COMMODITY_NS_TEMPLATE,
"template",
"template", 1);
2299 #include "iso-4217-currencies.c" 2324 static QofObject commodity_object_def =
2327 DI(.e_type = ) GNC_ID_COMMODITY,
2328 DI(.type_label = ) "Commodity",
2329 DI(.create = )
nullptr,
2330 DI(.book_begin = )
nullptr,
2331 DI(.book_end = )
nullptr,
2334 DI(.foreach = ) qof_collection_foreach,
2338 static QofObject namespace_object_def =
2341 DI(.e_type = ) GNC_ID_COMMODITY_NAMESPACE,
2342 DI(.type_label = ) "Namespace",
2343 DI(.create = )
nullptr,
2344 DI(.book_begin = )
nullptr,
2345 DI(.book_end = )
nullptr,
2346 DI(.is_dirty = )
nullptr,
2347 DI(.mark_clean = )
nullptr,
2348 DI(.foreach = )
nullptr,
2349 DI(.printable = )
nullptr,
2353 commodity_table_book_begin (QofBook *book)
2355 gnc_commodity_table *ct;
2356 ENTER (
"book=%p", book);
2366 PWARN(
"unable to initialize book's commodity_table");
2369 LEAVE (
"book=%p", book);
2373 commodity_table_book_end (QofBook *book)
2375 gnc_commodity_table *ct;
2379 gnc_commodity_table_destroy (ct);
2382 static QofObject commodity_table_object_def =
2385 DI(.e_type = ) GNC_ID_COMMODITY_TABLE,
2386 DI(.type_label = ) "CommodityTable",
2387 DI(.create = )
nullptr,
2388 DI(.book_begin = ) commodity_table_book_begin,
2389 DI(.book_end = ) commodity_table_book_end,
2392 DI(.foreach = )
nullptr,
2393 DI(.printable = )
nullptr,
2394 DI(.version_cmp = )
nullptr,
2415 MonetaryList *l = list, *tmp;
2416 for (tmp = list; tmp; tmp = tmp->next)
2418 auto list_mon =
static_cast<gnc_monetary*
>(tmp->data);
2430 auto new_mon =
static_cast<gnc_monetary*
>(g_new0(gnc_monetary, 1));
2432 l = g_list_prepend(l, new_mon);
2443 MonetaryList *node, *next;
2444 for (node = list; node; node = next)
2446 auto mon =
static_cast<gnc_monetary*
>(node->data);
2451 list = g_list_delete_link(list, node);
2462 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...
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...