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,
"Alphavantage, US",
"alphavantage" },
192 {
false,
SOURCE_SINGLE,
"Amsterdam Euronext eXchange, NL",
"aex" },
193 {
false,
SOURCE_SINGLE,
"Association of Mutual Funds in India",
"amfiindia" },
194 {
false,
SOURCE_SINGLE,
"Australian Stock Exchange, AU",
"asx" },
199 {
false,
SOURCE_SINGLE,
"Financial Times Funds service, GB",
"ftfunds" },
200 {
false,
SOURCE_SINGLE,
"Finanzpartner, DE",
"finanzpartner" },
201 {
false,
SOURCE_SINGLE,
"GoldMoney spot rates, JE",
"goldmoney" },
202 {
false,
SOURCE_SINGLE,
"Google Web, US Stocks",
"googleweb" },
204 {
false,
SOURCE_SINGLE,
"Morningstar, GB",
"morningstaruk" },
205 {
false,
SOURCE_SINGLE,
"Morningstar, JP",
"morningstarjp" },
206 {
false,
SOURCE_SINGLE,
"New Zealand stock eXchange, NZ",
"nzx" },
207 {
false,
SOURCE_SINGLE,
"Paris Stock Exchange/Boursorama, FR",
"bourso" },
209 {
false,
SOURCE_SINGLE,
"SIX Swiss Exchange shares, CH",
"six" },
210 {
false,
SOURCE_SINGLE,
"Skandinaviska Enskilda Banken, SE",
"seb_funds" },
213 {
false,
SOURCE_SINGLE,
"Toronto Stock eXchange, CA",
"tsx" },
215 {
false,
SOURCE_SINGLE,
"T. Rowe Price, US",
"troweprice_direct" },
216 {
false,
SOURCE_SINGLE,
"Union Investment, DE",
"unionfunds" },
217 {
false,
SOURCE_SINGLE,
"US Govt. Thrift Savings Plan",
"tsp" },
222 static QuoteSourceList multiple_quote_sources =
224 {
false,
SOURCE_MULTI,
"Australia (ASX, ...)",
"australia" },
225 {
false,
SOURCE_MULTI,
"Canada (Alphavantage, TSX, ...)",
"canada" },
226 {
false,
SOURCE_MULTI,
"Canada Mutual (Fund Library, StockHouse, ...)",
"canadamutual" },
228 {
false,
SOURCE_MULTI,
"Europe (asegr,.bsero, hex ...)",
"europe" },
229 {
false,
SOURCE_MULTI,
"India Mutual (AMFI, ...)",
"indiamutual" },
230 {
false,
SOURCE_MULTI,
"France (bourso, ĺerevenu, ...)",
"france" },
231 {
false,
SOURCE_MULTI,
"Nasdaq (alphavantage, yahoo_json, ...)",
"nasdaq" },
232 {
false,
SOURCE_MULTI,
"NYSE (alphavantage, yahoo_json, ...)",
"nyse" },
233 {
false,
SOURCE_MULTI,
"South Africa (Sharenet, ...)",
"za" },
234 {
false,
SOURCE_MULTI,
"Romania (BSE-RO, ...)",
"romania" },
236 {
false,
SOURCE_MULTI,
"U.K. Funds (citywire, FTfunds, MStar, tnetuk, ...)",
"ukfunds" },
237 {
false,
SOURCE_MULTI,
"USA (alphavantage, yahoo_json, ...)",
"usa" },
240 static QuoteSourceList new_quote_sources;
243 static const std::vector<std::pair<QuoteSourceType,QuoteSourceList&>> quote_sources_map =
260 return (!fq_version.empty());
273 return fq_version.c_str();
276 static QuoteSourceList&
279 auto quote_sources_it = std::find_if (quote_sources_map.begin(), quote_sources_map.end(),
280 [type] (
const auto& qs) {
return type == qs.first; });
282 if (quote_sources_it != quote_sources_map.end())
283 return quote_sources_it->second;
285 PWARN (
"Invalid Quote Source %d, returning new_quote_sources", type);
286 return new_quote_sources;
296 auto source{get_quote_source_from_type(type)};
297 return std::distance(source.begin(), source.end());
313 DEBUG(
"Creating new source %s", (!source_name ?
"(null)" : source_name));
319 return &new_quote_sources.emplace_back (supported,
SOURCE_UNKNOWN, source_name, source_name);
330 ENTER(
"type/index is %d/%d", type, index);
331 auto& sources = get_quote_source_from_type (type);
332 if ((
size_t) index < sources.size())
334 auto it = std::next(sources.begin(), index);
335 LEAVE(
"found %s", it->get_user_name());
349 for (
const auto& [_, sources] : quote_sources_map)
351 auto source_it = std::find_if (sources.begin(), sources.end(),
352 [name] (
const auto& qs)
353 {
return (g_strcmp0(name, qs.get_internal_name()) == 0); });
354 if (source_it != sources.end())
355 return &(*source_it);
358 DEBUG(
"gnc_quote_source_lookup_by_internal: Unknown source %s", name);
377 LEAVE(
"type is %d", source->get_type());
378 return source->get_type();
386 PWARN (
"bad source");
390 auto& sources = get_quote_source_from_type (source->get_type());
391 auto is_source = [&source](
const auto& findif_source)
392 {
return &findif_source == source; };
394 auto iter = std::find_if (sources.begin(), sources.end(), is_source);
395 if (iter != sources.end())
396 return std::distance (sources.begin(), iter);
398 PWARN (
"couldn't locate source");
412 LEAVE(
"%s supported", source && source->get_supported() ?
"" :
"not ");
413 return source->get_supported();
425 LEAVE(
"user name %s", source->get_user_name());
426 return source->get_user_name();
438 LEAVE(
"internal name %s", source->get_internal_name());
439 return source->get_internal_name();
451 const std::vector<std::string>& sources_list)
455 if (sources_list.empty())
459 fq_version = version_string;
463 for (
const auto& source_name_str : sources_list)
465 auto source_name = source_name_str.c_str();
470 DEBUG(
"Found source %s: %s", source_name, source->get_user_name());
471 source->set_supported (
true);
485 gnc_commodity_begin_edit (gnc_commodity *cm)
492 PERR (
"Failed to commit: %d", errcode);
493 gnc_engine_signal_commit_error( errcode );
501 commodity_free( GNC_COMMODITY(inst) );
505 gnc_commodity_commit_edit (gnc_commodity *cm)
516 mark_commodity_dirty (gnc_commodity *cm)
518 qof_instance_set_dirty(&cm->inst);
525 g_free(priv->printname);
526 priv->printname = g_strdup_printf(
"%s (%s)",
527 priv->mnemonic ? priv->mnemonic :
"",
528 priv->fullname ? priv->fullname :
"");
534 gnc_commodity_namespace *ns;
536 g_free(priv->unique_name);
537 ns = priv->name_space;
538 priv->unique_name = g_strdup_printf(
"%s::%s",
540 priv->mnemonic ? priv->mnemonic :
"");
544 G_DEFINE_TYPE_WITH_PRIVATE(gnc_commodity, gnc_commodity, QOF_TYPE_INSTANCE)
547 gnc_commodity_init(gnc_commodity* com)
551 priv = GET_PRIVATE(com);
553 priv->name_space =
nullptr;
554 priv->fullname = CACHE_INSERT(
"");
555 priv->mnemonic = CACHE_INSERT(
"");
556 priv->cusip = CACHE_INSERT(
"");
557 priv->fraction = 10000;
558 priv->quote_flag = 0;
559 priv->quote_source =
nullptr;
560 priv->quote_tz = CACHE_INSERT(
"");
562 reset_printname(priv);
563 reset_unique_name(priv);
567 gnc_commodity_dispose(GObject *comp)
569 G_OBJECT_CLASS(gnc_commodity_parent_class)->dispose(comp);
573 gnc_commodity_finalize(GObject* comp)
575 G_OBJECT_CLASS(gnc_commodity_parent_class)->finalize(comp);
584 gnc_commodity_get_property (GObject *
object,
589 gnc_commodity *commodity;
592 g_return_if_fail(GNC_IS_COMMODITY(
object));
594 commodity = GNC_COMMODITY(
object);
595 priv = GET_PRIVATE(commodity);
599 g_value_take_object(value, priv->name_space);
602 g_value_set_string(value, priv->fullname);
605 g_value_set_string(value, priv->mnemonic);
608 g_value_set_string(value, priv->printname);
611 g_value_set_string(value, priv->cusip);
614 g_value_set_int(value, priv->fraction);
616 case PROP_UNIQUE_NAME:
617 g_value_set_string(value, priv->unique_name);
619 case PROP_QUOTE_FLAG:
620 g_value_set_boolean(value, priv->quote_flag);
622 case PROP_QUOTE_SOURCE:
623 g_value_set_pointer(value, priv->quote_source);
626 g_value_set_string(value, priv->quote_tz);
629 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
635 gnc_commodity_set_property (GObject *
object,
640 gnc_commodity *commodity;
642 g_return_if_fail(GNC_IS_COMMODITY(
object));
644 commodity = GNC_COMMODITY(
object);
645 g_assert (qof_instance_get_editlevel(commodity));
664 case PROP_QUOTE_FLAG:
667 case PROP_QUOTE_SOURCE:
674 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
681 GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
683 gobject_class->dispose = gnc_commodity_dispose;
684 gobject_class->finalize = gnc_commodity_finalize;
685 gobject_class->set_property = gnc_commodity_set_property;
686 gobject_class->get_property = gnc_commodity_get_property;
688 g_object_class_install_property(gobject_class,
690 g_param_spec_object (
"namespace",
692 "The namespace field denotes the " 693 "namespace for this commodity, either " 694 "a currency or symbol from a quote source.",
695 GNC_TYPE_COMMODITY_NAMESPACE,
697 g_object_class_install_property(gobject_class,
699 g_param_spec_string (
"fullname",
700 "Full Commodity Name",
701 "The fullname is the official full name of" 705 g_object_class_install_property(gobject_class,
707 g_param_spec_string (
"mnemonic",
708 "Commodity Mnemonic",
709 "The mnemonic is the official abbreviated" 710 "designation for the currency.",
713 g_object_class_install_property(gobject_class,
715 g_param_spec_string (
"printname",
716 "Commodity Print Name",
717 "Printable form of the commodity name.",
720 g_object_class_install_property(gobject_class,
722 g_param_spec_string (
"cusip",
723 "Commodity CUSIP Code",
727 g_object_class_install_property(gobject_class,
729 g_param_spec_int (
"fraction",
731 "The fraction is the number of sub-units that " 732 "the basic commodity can be divided into.",
737 g_object_class_install_property(gobject_class,
739 g_param_spec_string (
"unique-name",
740 "Commodity Unique Name",
741 "Unique form of the commodity name which combines " 742 "the namespace name and the commodity name.",
745 g_object_class_install_property(gobject_class,
747 g_param_spec_boolean (
"quote_flag",
749 "TRUE if prices are to be downloaded for this " 750 "commodity from a quote source.",
753 g_object_class_install_property(gobject_class,
755 g_param_spec_pointer(
"quote-source",
757 "The quote source from which prices are downloaded.",
759 g_object_class_install_property(gobject_class,
761 g_param_spec_string (
"quote-tz",
762 "Commodity Quote Timezone",
770 const char * name_space,
const char * mnemonic,
771 const char * cusip,
int fraction)
773 auto retval = GNC_COMMODITY(g_object_new(GNC_TYPE_COMMODITY,
nullptr));
776 gnc_commodity_begin_edit(retval);
778 if ( name_space !=
nullptr )
781 if (g_strcmp0 (name_space, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
782 g_strcmp0 (mnemonic,
"template") != 0)
784 PWARN(
"Converting commodity %s from namespace template to " 785 "namespace User", mnemonic);
799 mark_commodity_dirty (retval);
800 gnc_commodity_commit_edit(retval);
813 commodity_free(gnc_commodity * cm)
816 gnc_commodity_table *
table;
824 priv = GET_PRIVATE(cm);
829 CACHE_REMOVE (priv->fullname);
830 CACHE_REMOVE (priv->cusip);
831 CACHE_REMOVE (priv->mnemonic);
832 CACHE_REMOVE (priv->quote_tz);
833 priv->name_space =
nullptr;
836 priv->quote_source =
nullptr;
839 g_free(priv->printname);
840 priv->printname =
nullptr;
842 g_free(priv->unique_name);
843 priv->unique_name =
nullptr;
845 #ifdef ACCOUNTS_CLEANED_UP 850 if (priv->usage_count != 0)
852 PWARN(
"Destroying commodity (%p) with non-zero usage_count (%d).", cm,
864 gnc_commodity_begin_edit(cm);
865 qof_instance_set_destroying(cm, TRUE);
866 gnc_commodity_commit_edit(cm);
877 dest_priv->name_space = src_priv->name_space;
883 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
892 auto dest = GNC_COMMODITY (g_object_new(GNC_TYPE_COMMODITY,
nullptr));
894 src_priv = GET_PRIVATE(src);
895 dest_priv = GET_PRIVATE(dest);
897 dest_priv->fullname = CACHE_INSERT(src_priv->fullname);
898 dest_priv->mnemonic = CACHE_INSERT(src_priv->mnemonic);
899 dest_priv->cusip = CACHE_INSERT(src_priv->cusip);
900 dest_priv->quote_tz = CACHE_INSERT(src_priv->quote_tz);
902 dest_priv->name_space = src_priv->name_space;
904 dest_priv->fraction = src_priv->fraction;
905 dest_priv->quote_flag = src_priv->quote_flag;
909 qof_instance_copy_kvp (QOF_INSTANCE (dest), QOF_INSTANCE (src));
911 reset_printname(dest_priv);
912 reset_unique_name(dest_priv);
924 if (!cm)
return nullptr;
925 return GET_PRIVATE(cm)->mnemonic;
935 if (!cm)
return nullptr;
936 return GET_PRIVATE(cm)->printname;
947 if (!cm)
return nullptr;
951 gnc_commodity_namespace *
954 if (!cm)
return nullptr;
955 return GET_PRIVATE(cm)->name_space;
965 if (!cm)
return nullptr;
966 return GET_PRIVATE(cm)->fullname;
977 if (!cm)
return nullptr;
978 return GET_PRIVATE(cm)->unique_name;
989 if (!cm)
return nullptr;
990 return GET_PRIVATE(cm)->cusip;
1001 return GET_PRIVATE(cm)->fraction;
1009 gnc_commodity_get_auto_quote_control_flag(
const gnc_commodity *cm)
1011 GValue v = G_VALUE_INIT;
1012 gboolean retval = TRUE;
1014 if (!cm)
return FALSE;
1016 if (G_VALUE_HOLDS_STRING (&v) &&
1017 strcmp(g_value_get_string (&v),
"false") == 0)
1030 if (!cm)
return FALSE;
1031 return (GET_PRIVATE(cm)->quote_flag);
1043 if (!cm)
return nullptr;
1044 priv = GET_PRIVATE(cm);
1046 return ¤cy_quote_sources.front();
1047 return priv->quote_source;
1051 gnc_commodity_get_default_quote_source(
const gnc_commodity *cm)
1054 return ¤cy_quote_sources.front();
1066 if (!cm)
return nullptr;
1067 return GET_PRIVATE(cm)->quote_tz;
1076 g_return_val_if_fail (GNC_IS_COMMODITY (cm),
nullptr);
1078 GValue v = G_VALUE_INIT;
1080 const char *rv = G_VALUE_HOLDS_STRING (&v) ? g_value_get_string (&v) :
nullptr;
1091 if (!cm)
return nullptr;
1092 return GET_PRIVATE(cm)->default_symbol;
1101 const char *nice_symbol;
1103 if (!cm)
return nullptr;
1106 if (nice_symbol && *nice_symbol)
1109 lc = gnc_localeconv();
1110 nice_symbol = lc->currency_symbol;
1115 if (nice_symbol && *nice_symbol)
1131 priv = GET_PRIVATE(cm);
1132 if (priv->mnemonic == mnemonic)
return;
1134 gnc_commodity_begin_edit(cm);
1135 CACHE_REMOVE (priv->mnemonic);
1136 priv->mnemonic = CACHE_INSERT(mnemonic);
1138 mark_commodity_dirty (cm);
1139 reset_printname(priv);
1140 reset_unique_name(priv);
1141 gnc_commodity_commit_edit(cm);
1152 gnc_commodity_table *
table;
1153 gnc_commodity_namespace *nsp;
1157 priv = GET_PRIVATE(cm);
1161 if (priv->name_space == nsp)
1164 gnc_commodity_begin_edit(cm);
1165 priv->name_space = nsp;
1168 mark_commodity_dirty(cm);
1169 reset_printname(priv);
1170 reset_unique_name(priv);
1171 gnc_commodity_commit_edit(cm);
1184 priv = GET_PRIVATE(cm);
1185 if (priv->fullname == fullname)
return;
1187 CACHE_REMOVE (priv->fullname);
1188 priv->fullname = CACHE_INSERT (fullname);
1190 gnc_commodity_begin_edit(cm);
1191 mark_commodity_dirty(cm);
1192 reset_printname(priv);
1193 gnc_commodity_commit_edit(cm);
1208 priv = GET_PRIVATE(cm);
1209 if (priv->cusip == cusip)
return;
1211 gnc_commodity_begin_edit(cm);
1212 CACHE_REMOVE (priv->cusip);
1213 priv->cusip = CACHE_INSERT (cusip);
1214 mark_commodity_dirty(cm);
1215 gnc_commodity_commit_edit(cm);
1226 gnc_commodity_begin_edit(cm);
1227 GET_PRIVATE(cm)->fraction = fraction;
1228 mark_commodity_dirty(cm);
1229 gnc_commodity_commit_edit(cm);
1237 gnc_commodity_set_auto_quote_control_flag(gnc_commodity *cm,
1238 const gboolean flag)
1240 GValue v = G_VALUE_INIT;
1241 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1248 gnc_commodity_begin_edit(cm);
1253 g_value_init (&v, G_TYPE_STRING);
1254 g_value_set_string (&v,
"false");
1258 mark_commodity_dirty(cm);
1259 gnc_commodity_commit_edit(cm);
1272 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1280 priv = GET_PRIVATE(cm);
1281 gnc_commodity_begin_edit(cm);
1292 gnc_commodity_set_auto_quote_control_flag(cm,
1293 (!flag && (priv->usage_count == 0)) || (flag && (priv->usage_count != 0)));
1295 gnc_commodity_commit_edit(cm);
1306 ENTER (
"(cm=%p, flag=%d)", cm, flag);
1309 gnc_commodity_begin_edit(cm);
1310 GET_PRIVATE(cm)->quote_flag = flag;
1311 mark_commodity_dirty(cm);
1312 gnc_commodity_commit_edit(cm);
1323 ENTER (
"(cm=%p, src=%p(%s))", cm, src, src ? src->get_internal_name() :
"unknown");
1326 gnc_commodity_begin_edit(cm);
1327 GET_PRIVATE(cm)->quote_source = src;
1328 mark_commodity_dirty(cm);
1329 gnc_commodity_commit_edit(cm);
1344 ENTER (
"(cm=%p, tz=%s)", cm, tz ? tz :
"(null)");
1346 priv = GET_PRIVATE(cm);
1348 if (tz == priv->quote_tz)
1350 LEAVE(
"Already correct TZ");
1354 gnc_commodity_begin_edit(cm);
1355 CACHE_REMOVE (priv->quote_tz);
1356 priv->quote_tz = CACHE_INSERT (tz);
1357 mark_commodity_dirty(cm);
1358 gnc_commodity_commit_edit(cm);
1373 ENTER (
"(cm=%p, symbol=%s)", cm, user_symbol ? user_symbol :
"(null)");
1375 lc = gnc_localeconv();
1376 if (!user_symbol || !*user_symbol)
1377 user_symbol =
nullptr;
1379 !g_strcmp0(lc->currency_symbol, user_symbol))
1382 user_symbol =
nullptr;
1384 user_symbol =
nullptr;
1386 gnc_commodity_begin_edit (cm);
1390 GValue v = G_VALUE_INIT;
1391 g_value_init (&v, G_TYPE_STRING);
1392 g_value_set_static_string (&v, user_symbol);
1401 mark_commodity_dirty(cm);
1402 gnc_commodity_commit_edit(cm);
1413 gnc_commodity_set_default_symbol(gnc_commodity * cm,
1414 const char * default_symbol)
1416 GET_PRIVATE(cm)->default_symbol = default_symbol;
1428 ENTER(
"(cm=%p)", cm);
1436 priv = GET_PRIVATE(cm);
1438 if ((priv->usage_count == 0) && !priv->quote_flag
1439 && gnc_commodity_get_auto_quote_control_flag(cm)
1444 gnc_commodity_begin_edit(cm);
1447 gnc_commodity_get_default_quote_source(cm));
1448 gnc_commodity_commit_edit(cm);
1450 priv->usage_count++;
1451 LEAVE(
"(usage_count=%d)", priv->usage_count);
1463 ENTER(
"(cm=%p)", cm);
1471 priv = GET_PRIVATE(cm);
1473 if (priv->usage_count == 0)
1475 PWARN(
"usage_count already zero");
1480 priv->usage_count--;
1481 if ((priv->usage_count == 0) && priv->quote_flag
1482 && gnc_commodity_get_auto_quote_control_flag(cm)
1489 LEAVE(
"(usage_count=%d)", priv->usage_count);
1507 if (a == b)
return TRUE;
1508 if (!a || !b)
return FALSE;
1510 priv_a = GET_PRIVATE(a);
1511 priv_b = GET_PRIVATE(b);
1512 if (priv_a->name_space != priv_b->name_space)
return FALSE;
1513 if (g_strcmp0(priv_a->mnemonic, priv_b->mnemonic) != 0)
return FALSE;
1528 if (a == b)
return 0;
1529 if (a && !b)
return 1;
1530 if (b && !a)
return -1;
1557 if (g_strcmp0 (ns->name, GNC_COMMODITY_NS_CURRENCY) == 0)
1558 return GNC_COMMODITY_NS_ISO_GUI;
1568 return name_space->cm_list;
1574 return ((g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0) ||
1575 (g_strcmp0(name_space, GNC_COMMODITY_NS_CURRENCY) == 0));
1578 static const gchar *
1579 gnc_commodity_table_map_namespace(
const char * name_space)
1581 if (g_strcmp0(name_space, GNC_COMMODITY_NS_ISO) == 0)
1582 return GNC_COMMODITY_NS_CURRENCY;
1591 gnc_commodity_table *
1594 gnc_commodity_table * retval = g_new0(gnc_commodity_table, 1);
1595 retval->ns_table = g_hash_table_new(&g_str_hash, &g_str_equal);
1596 retval->ns_list =
nullptr;
1604 gnc_commodity_table *
1607 if (!book)
return nullptr;
1608 return static_cast<gnc_commodity_table*
>(
qof_book_get_data (book, GNC_COMMODITY_TABLE));
1614 gnc_commodity *twin;
1616 gnc_commodity_table * comtbl;
1618 if (!from)
return nullptr;
1620 if (!comtbl)
return nullptr;
1623 twin = gnc_commodity_table_lookup_unique (comtbl, ucom);
1638 count_coms(gpointer key, gpointer value, gpointer user_data)
1640 GHashTable *tbl = ((gnc_commodity_namespace*)value)->cm_table;
1641 guint *count = (guint*)user_data;
1643 if (g_strcmp0((
char*)key, GNC_COMMODITY_NS_CURRENCY) == 0)
1651 *count += g_hash_table_size(tbl);
1658 g_return_val_if_fail(tbl, 0);
1659 g_return_val_if_fail(tbl->ns_table, 0);
1661 g_hash_table_foreach(tbl->ns_table, count_coms, (gpointer)&count);
1672 gnc_commodity_table_lookup(
const gnc_commodity_table *
table,
1673 const char * name_space,
const char * mnemonic)
1675 gnc_commodity_namespace * nsp =
nullptr;
1677 if (!
table || !name_space || !mnemonic)
return nullptr;
1689 auto it = gnc_new_iso_codes.find (mnemonic);
1690 if (it != gnc_new_iso_codes.end())
1691 mnemonic = it->second.c_str();
1693 return GNC_COMMODITY(g_hash_table_lookup(nsp->cm_table, (gpointer)mnemonic));
1707 gnc_commodity_table_lookup_unique(
const gnc_commodity_table *
table,
1708 const char * unique_name)
1712 gnc_commodity *commodity;
1714 if (!
table || !unique_name)
return nullptr;
1716 name_space = g_strdup (unique_name);
1717 mnemonic = strstr (name_space,
"::");
1720 g_free (name_space);
1727 commodity = gnc_commodity_table_lookup (
table, name_space, mnemonic);
1729 g_free (name_space);
1740 gnc_commodity_table_find_full(
const gnc_commodity_table *
table,
1741 const char * name_space,
1742 const char * fullname)
1744 gnc_commodity * retval =
nullptr;
1748 if (!fullname || (fullname[0] ==
'\0'))
1753 for (iterator = all; iterator; iterator = iterator->next)
1755 auto commodity = GNC_COMMODITY (iterator->data);
1756 if (!strcmp(fullname,
1777 gnc_commodity * comm)
1779 gnc_commodity_namespace * nsp =
nullptr;
1781 const char *ns_name;
1785 if (!
table)
return nullptr;
1786 if (!comm)
return nullptr;
1788 priv = GET_PRIVATE(comm);
1790 ENTER (
"(table=%p, comm=%p) %s %s",
table, comm,
1791 (priv->mnemonic ==
nullptr ?
"(null)" : priv->mnemonic),
1792 (priv->fullname ==
nullptr ?
"(null)" : priv->fullname));
1794 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1800 LEAVE(
"already in table");
1806 if (priv->name_space->iso4217)
1808 auto it = gnc_new_iso_codes.find (priv->mnemonic);
1809 if (it != gnc_new_iso_codes.end())
1814 LEAVE(
"found at %p", c);
1819 if (g_strcmp0 (ns_name, GNC_COMMODITY_NS_TEMPLATE) == 0 &&
1820 g_strcmp0 (priv->mnemonic,
"template") != 0)
1822 PWARN(
"Converting commodity %s from namespace template to " 1823 "namespace User", priv->mnemonic);
1826 mark_commodity_dirty (comm);
1832 PINFO (
"insert %p %s into nsp=%p %s", priv->mnemonic, priv->mnemonic,
1833 nsp->cm_table, nsp->name);
1834 g_hash_table_insert(nsp->cm_table,
1835 (gpointer)CACHE_INSERT(priv->mnemonic),
1837 nsp->cm_list = g_list_append(nsp->cm_list, comm);
1851 gnc_commodity * comm)
1853 gnc_commodity_namespace * nsp;
1856 const char *ns_name;
1861 priv = GET_PRIVATE(comm);
1863 c = gnc_commodity_table_lookup (
table, ns_name, priv->mnemonic);
1864 if (c != comm)
return;
1871 nsp->cm_list = g_list_remove(nsp->cm_list, comm);
1872 g_hash_table_remove (nsp->cm_table, priv->mnemonic);
1883 const char * name_space)
1885 gnc_commodity_namespace * nsp =
nullptr;
1887 if (!
table || !name_space)
1904 hash_keys_helper(gpointer key, gpointer value, gpointer data)
1906 auto l = (GList**)data;
1907 *l = g_list_prepend(*l, key);
1911 g_hash_table_keys(GHashTable *
table)
1913 GList * l =
nullptr;
1914 g_hash_table_foreach(
table, &hash_keys_helper, (gpointer) &l);
1919 hash_values_helper(gpointer key, gpointer value, gpointer data)
1921 auto l = (GList**)data;
1922 *l = g_list_prepend(*l, value);
1926 g_hash_table_values(GHashTable *
table)
1928 GList * l =
nullptr;
1929 g_hash_table_foreach(
table, &hash_values_helper, (gpointer) &l);
1944 return g_hash_table_keys(
table->ns_table);
1953 return table->ns_list;
1967 if (!cm)
return FALSE;
1969 priv = GET_PRIVATE(cm);
1970 if ( !priv->name_space)
return FALSE;
1971 return priv->name_space->iso4217;
1977 const char *ns_name;
1978 if (!cm)
return FALSE;
1982 !g_strcmp0(ns_name, GNC_COMMODITY_NS_CURRENCY));
1990 static CommodityList*
1991 commodity_table_get_all_noncurrency_commodities(
const gnc_commodity_table*
table)
1994 CommodityList *retval =
nullptr;
1995 for (node = nslist; node; node=g_list_next(node))
1997 gnc_commodity_namespace *ns =
nullptr;
1998 if (g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_CURRENCY) == 0
1999 || g_strcmp0((
char*)(node->data), GNC_COMMODITY_NS_TEMPLATE) == 0)
2004 retval = g_list_concat(g_hash_table_values(ns->cm_table), retval);
2006 g_list_free(nslist);
2012 const char * name_space)
2014 gnc_commodity_namespace * ns =
nullptr;
2018 if (g_strcmp0(name_space, GNC_COMMODITY_NS_NONISO_GUI) == 0)
2019 return commodity_table_get_all_noncurrency_commodities(
table);
2024 return g_hash_table_values(ns->cm_table);
2033 get_quotables_helper1(gpointer key, gpointer value, gpointer data)
2035 auto comm = GNC_COMMODITY(value);
2037 auto l =
static_cast<GList**
>(data);
2039 if (!priv->quote_flag || !priv->quote_source || !priv->quote_source->get_supported())
2041 *l = g_list_prepend(*l, value);
2045 get_quotables_helper2 (gnc_commodity *comm, gpointer data)
2047 auto l =
static_cast<GList**
>(data);
2050 if (!priv->quote_flag || priv->quote_source || !priv->quote_source->get_supported())
2052 *l = g_list_prepend(*l, comm);
2059 gnc_commodity_namespace * ns =
nullptr;
2060 const char *name_space;
2061 GList * nslist, * tmp;
2062 GList * l =
nullptr;
2064 const char *expression = gnc_prefs_get_namespace_regexp();
2066 ENTER(
"table=%p, expression=%s",
table, expression);
2070 if (expression && *expression)
2072 if (regcomp(&pattern, expression, REG_EXTENDED | REG_ICASE) != 0)
2074 LEAVE(
"Cannot compile regex");
2079 for (tmp = nslist; tmp; tmp = tmp->next)
2081 name_space =
static_cast<const char*
>(tmp->data);
2082 if (regexec(&pattern, name_space, 0,
nullptr, 0) == 0)
2084 DEBUG(
"Running list of %s commodities", name_space);
2088 g_hash_table_foreach(ns->cm_table, &get_quotables_helper1, (gpointer) &l);
2092 g_list_free(nslist);
2100 LEAVE(
"list head %p", l);
2110 QOF_GOBJECT_IMPL(gnc_commodity_namespace, gnc_commodity_namespace, QOF_TYPE_INSTANCE)
2113 gnc_commodity_namespace_init(gnc_commodity_namespace* ns)
2118 gnc_commodity_namespace_dispose_real (GObject *nsp)
2123 gnc_commodity_namespace_finalize_real(GObject* nsp)
2127 gnc_commodity_namespace *
2129 const char * name_space,
2132 gnc_commodity_namespace * ns =
nullptr;
2134 if (!
table)
return nullptr;
2136 name_space = gnc_commodity_table_map_namespace(name_space);
2140 ns =
static_cast<gnc_commodity_namespace*
>(g_object_new(GNC_TYPE_COMMODITY_NAMESPACE,
nullptr));
2141 ns->cm_table = g_hash_table_new(g_str_hash, g_str_equal);
2142 ns->name = CACHE_INSERT(static_cast<const char*>(name_space));
2147 g_hash_table_insert(
table->ns_table,
2148 (gpointer) ns->name,
2150 table->ns_list = g_list_append(
table->ns_list, ns);
2157 gnc_commodity_namespace *
2159 const char * name_space)
2161 if (!
table || !name_space)
2164 name_space = gnc_commodity_table_map_namespace(name_space);
2165 return static_cast<gnc_commodity_namespace*
>(g_hash_table_lookup(
table->ns_table, (gpointer)name_space));
2170 gnc_commodity_find_commodity_by_guid(
const GncGUID *guid, QofBook *book)
2173 if (!guid || !book)
return nullptr;
2184 ns_helper(gpointer key, gpointer value, gpointer user_data)
2186 auto c = GNC_COMMODITY(value);
2188 CACHE_REMOVE(static_cast<char*>(key));
2194 const char * name_space)
2196 gnc_commodity_namespace * ns;
2205 g_hash_table_remove(
table->ns_table, name_space);
2206 table->ns_list = g_list_remove(
table->ns_list, ns);
2208 g_list_free(ns->cm_list);
2209 ns->cm_list =
nullptr;
2211 g_hash_table_foreach_remove(ns->cm_table, ns_helper,
nullptr);
2212 g_hash_table_destroy(ns->cm_table);
2213 CACHE_REMOVE(ns->name);
2229 gboolean (*func)(gnc_commodity *, gpointer);
2234 iter_commodity (gpointer key, gpointer value, gpointer user_data)
2237 gnc_commodity *cm = (gnc_commodity *) value;
2241 iter_data->ok = (iter_data->func)(cm, iter_data->user_data);
2246 iter_namespace (gpointer key, gpointer value, gpointer user_data)
2248 GHashTable *namespace_hash = ((gnc_commodity_namespace *) value)->cm_table;
2249 g_hash_table_foreach (namespace_hash, iter_commodity, user_data);
2254 gboolean (*f)(gnc_commodity *, gpointer),
2259 if (!tbl || !f)
return FALSE;
2261 iter_data.ok = TRUE;
2263 iter_data.user_data = user_data;
2265 g_hash_table_foreach(tbl->ns_table, iter_namespace, (gpointer)&iter_data);
2267 return iter_data.ok;
2276 gnc_commodity_table_destroy(gnc_commodity_table * t)
2278 gnc_commodity_namespace * ns;
2282 ENTER (
"table=%p", t);
2284 for (item = t->ns_list; item; item = next)
2286 next = g_list_next(item);
2287 ns =
static_cast<gnc_commodity_namespace*
>(item->data);
2291 g_list_free(t->ns_list);
2292 t->ns_list =
nullptr;
2293 g_hash_table_destroy(t->ns_table);
2294 t->ns_table =
nullptr;
2295 LEAVE (
"table=%p", t);
2305 #define CUR_I18N(String) dgettext ("iso_4217", String) 2315 c =
gnc_commodity_new(book,
"template", GNC_COMMODITY_NS_TEMPLATE,
"template",
"template", 1);
2318 #include "iso-4217-currencies.c" 2343 static QofObject commodity_object_def =
2346 DI(.e_type = ) GNC_ID_COMMODITY,
2347 DI(.type_label = ) "Commodity",
2348 DI(.create = )
nullptr,
2349 DI(.book_begin = )
nullptr,
2350 DI(.book_end = )
nullptr,
2357 static QofObject namespace_object_def =
2360 DI(.e_type = ) GNC_ID_COMMODITY_NAMESPACE,
2361 DI(.type_label = ) "Namespace",
2362 DI(.create = )
nullptr,
2363 DI(.book_begin = )
nullptr,
2364 DI(.book_end = )
nullptr,
2365 DI(.is_dirty = )
nullptr,
2366 DI(.mark_clean = )
nullptr,
2367 DI(.foreach = )
nullptr,
2368 DI(.printable = )
nullptr,
2372 commodity_table_book_begin (QofBook *book)
2374 gnc_commodity_table *ct;
2375 ENTER (
"book=%p", book);
2385 PWARN(
"unable to initialize book's commodity_table");
2388 LEAVE (
"book=%p", book);
2392 commodity_table_book_end (QofBook *book)
2394 gnc_commodity_table *ct;
2398 gnc_commodity_table_destroy (ct);
2401 static QofObject commodity_table_object_def =
2404 DI(.e_type = ) GNC_ID_COMMODITY_TABLE,
2405 DI(.type_label = ) "CommodityTable",
2406 DI(.create = )
nullptr,
2407 DI(.book_begin = ) commodity_table_book_begin,
2408 DI(.book_end = ) commodity_table_book_end,
2411 DI(.foreach = )
nullptr,
2412 DI(.printable = )
nullptr,
2413 DI(.version_cmp = )
nullptr,
2434 MonetaryList *l = list, *tmp;
2435 for (tmp = list; tmp; tmp = tmp->next)
2437 auto list_mon =
static_cast<gnc_monetary*
>(tmp->data);
2449 auto new_mon =
static_cast<gnc_monetary*
>(g_new0(gnc_monetary, 1));
2451 l = g_list_prepend(l, new_mon);
2462 MonetaryList *node, *next;
2463 for (node = list; node; node = next)
2465 auto mon =
static_cast<gnc_monetary*
>(node->data);
2470 list = g_list_delete_link(list, node);
2481 for (tmp = list; tmp; tmp = tmp->next)
gnc_commodity * gnc_commodity_table_insert(gnc_commodity_table *table, gnc_commodity *comm)
Add a new commodity to the commodity table.
const char * gnc_commodity_get_cusip(const gnc_commodity *cm)
Retrieve the 'exchange code' for the specified commodity.
gboolean gnc_commodity_table_foreach_commodity(const gnc_commodity_table *table, gboolean(*f)(gnc_commodity *cm, gpointer user_data), gpointer user_data)
Call a function once for each commodity in the commodity table.
gnc_commodity_table * gnc_commodity_table_get_table(QofBook *book)
Returns the commodity table associated with a book.
A gnc_commodity_table is a database of commodity info.
gboolean gnc_commodity_is_currency(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency or a legacy currency...
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
gboolean gnc_commodity_table_add_default_data(gnc_commodity_table *table, QofBook *book)
Add all the standard namespaces and currencies to the commodity table.
const char * gnc_quote_source_get_user_name(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the user friendly name of this quote source...
void qof_instance_set_kvp(QofInstance *, GValue const *value, unsigned count,...)
Sets a KVP slot to a value from a GValue.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
#define GNC_COMMODITY_MAX_FRACTION
Max fraction is 10^9 because 10^10 would require changing it to an int64_t.
This quote source pulls from a single specific web site.
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
gboolean qof_collection_is_dirty(const QofCollection *col)
Return value of 'dirty' flag on collection.
gnc_quote_source * gnc_quote_source_add_new(const char *source_name, gboolean supported)
Create a new quote source.
const char * gnc_commodity_namespace_get_gui_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure in a form suitable to present to the user...
QofInstance * qof_collection_lookup_entity(const QofCollection *col, const GncGUID *guid)
Find the entity going only from its guid.
#define PINFO(format, args...)
Print an informational note.
gboolean gnc_commodity_get_quote_flag(const gnc_commodity *cm)
Retrieve the automatic price quote flag for the specified commodity.
QofBackendError
The errors that can be reported to the GUI & other front-end users.
const char * gnc_commodity_get_user_symbol(const gnc_commodity *cm)
Retrieve the user-defined symbol for the specified commodity.
void gnc_commodity_set_quote_tz(gnc_commodity *cm, const char *tz)
Set the automatic price quote timezone for the specified commodity.
void gnc_commodity_decrement_usage_count(gnc_commodity *cm)
Decrement a commodity's internal counter that tracks how many accounts are using that commodity...
Commodity handling public routines (C++ api)
const char * gnc_commodity_get_quote_tz(const gnc_commodity *cm)
Retrieve the automatic price quote timezone for the specified commodity.
#define DEBUG(format, args...)
Print a debugging message.
void gnc_commodity_set_fraction(gnc_commodity *cm, int fraction)
Set the fraction for the specified commodity.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
gboolean gnc_quote_source_get_supported(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the flag that indicates whether this particular quote...
globally unique ID User API
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
QuoteSourceType gnc_quote_source_get_type(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the type of this particular quote source...
The special currency quote source.
int gnc_commodity_compare_void(const void *a, const void *b)
A wrapper around gnc_commodity_compare() which offers the function declaration that is needed for g_l...
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Object instance holds common fields that most gnucash objects use.
gnc_commodity * gnc_commodity_clone(const gnc_commodity *src, QofBook *dest_book)
allocate and copy
This is a locally installed quote source that gnucash knows nothing about.
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
Retrieve the namespace for the specified commodity.
Use any denominator which gives an exactly correct ratio of numerator to denominator.
A gnc_commodity_namespace is an collection of commodities.
void gnc_commodity_set_quote_flag(gnc_commodity *cm, const gboolean flag)
Set the automatic price quote flag for the specified commodity.
#define QOF_OBJECT_VERSION
Defines the version of the core object object registration interface.
QuoteSourceType
The quote source type enum account types are used to determine how the transaction data in the accoun...
gnc_quote_source * gnc_quote_source_lookup_by_ti(QuoteSourceType type, gint index)
Given the type/index of a quote source, find the data structure identified by this pair...
gboolean qof_commit_edit(QofInstance *inst)
commit_edit helpers
#define PERR(format, args...)
Log a serious error.
#define ENTER(format, args...)
Print a function entry debugging message.
void gnc_commodity_user_set_quote_flag(gnc_commodity *cm, const gboolean flag)
Set the automatic price quote flag for the specified commodity, based on user input.
gnc_commodity_namespace * gnc_commodity_table_add_namespace(gnc_commodity_table *table, const char *name_space, QofBook *book)
This function adds a new string to the list of commodity namespaces.
void qof_collection_foreach(const QofCollection *col, QofInstanceForeachCB cb_func, gpointer user_data)
Call the callback for each entity in the collection.
GList * gnc_commodity_namespace_get_commodity_list(const gnc_commodity_namespace *name_space)
Return a list of all commodity data structures in the specified namespace.
void qof_instance_get_kvp(QofInstance *, GValue *value, unsigned count,...)
Retrieves the contents of a KVP slot into a provided GValue.
void gnc_commodity_set_user_symbol(gnc_commodity *cm, const char *user_symbol)
Set a user-defined symbol for the specified commodity.
const char * gnc_commodity_namespace_get_name(const gnc_commodity_namespace *ns)
Return the textual name of a namespace data structure.
#define PWARN(format, args...)
Log a warning.
void qof_instance_init_data(QofInstance *inst, QofIdType type, QofBook *book)
Initialise the settings associated with an instance.
MonetaryList * gnc_monetary_list_delete_zeros(MonetaryList *list)
Delete all entries in the list that have zero value.
gboolean qof_begin_edit(QofInstance *inst)
begin_edit
void gnc_commodity_set_quote_source(gnc_commodity *cm, gnc_quote_source *src)
Set the automatic price quote source for the specified commodity.
gint gnc_quote_source_num_entries(QuoteSourceType type)
Return the number of entries for a given type of quote source.
GList * gnc_commodity_table_get_namespaces(const gnc_commodity_table *table)
Return a list of all namespaces in the commodity table.
gboolean gnc_commodity_table_register(void)
You should probably not be using gnc_commodity_table_register() It is an internal routine for registe...
void gnc_commodity_increment_usage_count(gnc_commodity *cm)
Increment a commodity's internal counter that tracks how many accounts are using that commodity...
void gnc_commodity_set_cusip(gnc_commodity *cm, const char *cusip)
Set the 'exchange code' for the specified commodity.
void gnc_monetary_list_free(MonetaryList *list)
Free a MonetaryList and all the monetaries it points to.
gnc_commodity * gnc_commodity_new(QofBook *book, const char *fullname, const char *name_space, const char *mnemonic, const char *cusip, int fraction)
Create a new commodity.
int gnc_commodity_table_has_namespace(const gnc_commodity_table *table, const char *name_space)
Test to see if the indicated namespace exits in the commodity table.
void gnc_commodity_table_delete_namespace(gnc_commodity_table *table, const char *name_space)
This function deletes a string from the list of commodity namespaces.
gboolean gnc_commodity_namespace_is_iso(const char *name_space)
Checks to see if the specified commodity namespace is the namespace for ISO 4217 currencies.
const char * gnc_commodity_get_fullname(const gnc_commodity *cm)
Retrieve the full name for the specified commodity.
#define GNC_COMMODITY_NS_LEGACY
The commodity namespace definitions are used to tag a commodity by its type, or a stocks by the excha...
void qof_book_set_data(QofBook *book, const gchar *key, gpointer data)
The qof_book_set_data() allows arbitrary pointers to structs to be stored in QofBook.
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
part2 – deal with the backend
const char * gnc_commodity_get_nice_symbol(const gnc_commodity *cm)
Retrieve a symbol for the specified commodity, suitable for display to the user.
void qof_collection_mark_clean(QofCollection *)
reset value of dirty flag
void gnc_quote_source_set_fq_installed(const char *version_string, const std::vector< std::string > &sources_list)
Update gnucash internal tables based on what Finance::Quote sources are installed.
const char * gnc_quote_source_fq_version(void)
This function returns the version of the Finance::Quote module installed on a user's computer...
Generic api to store and retrieve preferences.
CommodityList * gnc_commodity_table_get_commodities(const gnc_commodity_table *table, const char *name_space)
Return a list of all commodities in the commodity table that are in the given namespace.
gnc_quote_source * gnc_quote_source_lookup_by_internal(const char *name)
Given the internal (gnucash or F::Q) name of a quote source, find the data structure identified by th...
const char * gnc_commodity_get_printname(const gnc_commodity *cm)
Retrieve the 'print' name for the specified commodity.
int gnc_commodity_compare(const gnc_commodity *a, const gnc_commodity *b)
This routine returns 0 if the two commodities are equal, 1 otherwise.
void gnc_commodity_set_fullname(gnc_commodity *cm, const char *fullname)
Set the full name for the specified commodity.
This quote source may pull from multiple web sites.
gnc_quote_source * gnc_commodity_get_quote_source(const gnc_commodity *cm)
Retrieve the automatic price quote source for the specified commodity.
gnc_commodity_namespace * gnc_commodity_table_find_namespace(const gnc_commodity_table *table, const char *name_space)
This function finds a commodity namespace in the set of existing commodity namespaces.
void gnc_commodity_set_mnemonic(gnc_commodity *cm, const char *mnemonic)
Set the mnemonic for the specified commodity.
const char * gnc_commodity_get_default_symbol(const gnc_commodity *cm)
Retrieve the default symbol for the specified commodity.
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.
CommodityList * gnc_commodity_table_get_quotable_commodities(const gnc_commodity_table *table)
This function returns a list of commodities for which price quotes should be retrieved.
gnc_commodity_table * gnc_commodity_table_new(void)
You probably shouldn't be using gnc_commodity_table_new() directly, it's for internal use only...
gint gnc_quote_source_get_index(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the index of this particular quote source within its ...
gnc_commodity_namespace * gnc_commodity_get_namespace_ds(const gnc_commodity *cm)
Retrieve the namespace data structure for the specified commodity.
#define LEAVE(format, args...)
Print a function exit debugging message.
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the 'unique' name for the specified commodity.
MonetaryList * gnc_monetary_list_add_monetary(MonetaryList *list, gnc_monetary add_mon)
Add a gnc_monetary to the list.
void gnc_commodity_table_remove(gnc_commodity_table *table, gnc_commodity *comm)
Remove a commodity from the commodity table.
void gnc_commodity_set_namespace(gnc_commodity *cm, const char *name_space)
Set the namespace for the specified commodity.
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
guint gnc_commodity_table_get_size(const gnc_commodity_table *tbl)
Returns the number of commodities in the commodity table.
const char * gnc_quote_source_get_internal_name(const gnc_quote_source *source)
Given a gnc_quote_source data structure, return the internal name of this quote source.
gboolean qof_object_register(const QofObject *object)
Register new types of object objects.
An article that is bought and sold.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
The type used to store guids in C.
void gnc_commodity_copy(gnc_commodity *dest, const gnc_commodity *src)
Copy src into dest.
gpointer qof_book_get_data(const QofBook *book, const gchar *key)
Retrieves arbitrary pointers to structs stored by qof_book_set_data.
GList * gnc_commodity_table_get_namespaces_list(const gnc_commodity_table *table)
Return a list of all namespace data structures in the commodity table.
gnc_commodity * gnc_commodity_obtain_twin(const gnc_commodity *from, QofBook *book)
Given the commodity 'findlike', this routine will find and return the equivalent commodity (commodity...
Commodity handling public routines.
void gnc_commodity_destroy(gnc_commodity *cm)
Destroy a commodity.
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
gboolean gnc_commodity_is_iso(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency.
gboolean gnc_quote_source_fq_installed(void)
This function indicates whether or not the Finance::Quote module is installed on a user's computer...