Line data Source code
1 : /********************************************************************
2 : * gnc-commodity.h -- API for tradable commodities (incl. currency) *
3 : * *
4 : * This program is free software; you can redistribute it and/or *
5 : * modify it under the terms of the GNU General Public License as *
6 : * published by the Free Software Foundation; either version 2 of *
7 : * the License, or (at your option) any later version. *
8 : * *
9 : * This program is distributed in the hope that it will be useful, *
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 : * GNU General Public License for more details. *
13 : * *
14 : * You should have received a copy of the GNU General Public License*
15 : * along with this program; if not, contact: *
16 : * *
17 : * Free Software Foundation Voice: +1-617-542-5942 *
18 : * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
19 : * Boston, MA 02110-1301, USA gnu@gnu.org *
20 : * *
21 : *******************************************************************/
22 :
23 : /** @addtogroup Engine
24 : @{ */
25 : /** @addtogroup Commodity Commodities
26 : A commodity is something of value that is easily tradeable or
27 : sellable; for example, currencies, stocks, bonds, grain,
28 : copper, and oil are all commodities. This file provides
29 : an API for defining a commodities, and for working with
30 : collections of commodities. All GnuCash financial transactions
31 : must identify the commodity that is being traded.
32 :
33 : @warning The system used here does not follow the object
34 : handling and identification system (GncGUID's, Entities, etc.)
35 : that the other parts of GnuCash use. The API really should be
36 : ported over. This would allow us to get rid of the
37 : commodity table routines defined below.
38 :
39 : @{ */
40 : /** @file gnc-commodity.h
41 : * @brief Commodity handling public routines
42 : * @author Copyright (C) 2000 Bill Gribble
43 : * @author Copyright (C) 2001 Linas Vepstas <linas@linas.org>
44 : */
45 :
46 : #ifndef GNC_COMMODITY_H
47 : #define GNC_COMMODITY_H
48 :
49 : typedef struct _GncCommodityClass gnc_commodityClass;
50 : typedef struct _GncCommodityNamespaceClass gnc_commodity_namespaceClass;
51 :
52 : #include <glib.h>
53 : #include <glib/gi18n.h>
54 :
55 : #include "gnc-engine.h"
56 :
57 : #ifdef __cplusplus
58 : extern "C" {
59 : #endif
60 :
61 : /* --- type macros --- */
62 : #define GNC_TYPE_COMMODITY (gnc_commodity_get_type ())
63 : #define GNC_COMMODITY(o) \
64 : (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_COMMODITY, gnc_commodity))
65 : #define GNC_COMMODITY_CLASS(k) \
66 : (G_TYPE_CHECK_CLASS_CAST((k), GNC_TYPE_COMMODITY, gnc_commodityClass))
67 : #define GNC_IS_COMMODITY(o) \
68 : (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_COMMODITY))
69 : #define GNC_IS_COMMODITY_CLASS(k) \
70 : (G_TYPE_CHECK_CLASS_TYPE ((k), GNC_TYPE_COMMODITY))
71 : #define GNC_COMMODITY_GET_CLASS(o) \
72 : (G_TYPE_INSTANCE_GET_CLASS ((o), GNC_TYPE_COMMODITY, gnc_commodityClass))
73 : GType gnc_commodity_get_type(void);
74 :
75 : /* --- type macros --- */
76 : #define GNC_TYPE_COMMODITY_NAMESPACE (gnc_commodity_namespace_get_type ())
77 : #define GNC_COMMODITY_NAMESPACE(o) \
78 : (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_COMMODITY_NAMESPACE, gnc_commodity_namespace))
79 : #define GNC_COMMODITY_NAMESPACE_CLASS(k) \
80 : (G_TYPE_CHECK_CLASS_CAST((k), GNC_TYPE_COMMODITY_NAMESPACE, gnc_commodity_namespaceClass))
81 : #define GNC_IS_COMMODITY_NAMESPACE(o) \
82 : (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_COMMODITY_NAMESPACE))
83 : #define GNC_IS_COMMODITY_NAMESPACE_CLASS(k) \
84 : (G_TYPE_CHECK_CLASS_TYPE ((k), GNC_TYPE_COMMODITY_NAMESPACE))
85 : #define GNC_COMMODITY_NAMESPACE_GET_CLASS(o) \
86 : (G_TYPE_INSTANCE_GET_CLASS ((o), GNC_TYPE_COMMODITY_NAMESPACE, gnc_commodity_namespaceClass))
87 : GType gnc_commodity_namespace_get_type(void);
88 :
89 :
90 : #define GNC_COMMODITY_TABLE "gnc_commodity_table"
91 :
92 : /** The commodity namespace definitions are used to tag a commodity by
93 : * its type, or a stocks by the exchange where it is traded.
94 : *
95 : * The LEGACY name is only used by the file i/o routines, and is
96 : * converted to another commodity namespace before it is seen by the
97 : * rest of the system. The ISO namespace represents currencies.
98 : * With the exception of the NASDAQ namespace (which is used once in
99 : * the binary importer) the rest of the namespace declarations are
100 : * only used to populate an option menu in the commodity selection
101 : * window.
102 : */
103 : #define GNC_COMMODITY_NS_LEGACY "GNC_LEGACY_CURRENCIES"
104 : #define GNC_COMMODITY_NS_TEMPLATE "template"
105 : /* The ISO define is deprecated in favor of CURRENCY */
106 : #define GNC_COMMODITY_NS_ISO "ISO4217"
107 : #define GNC_COMMODITY_NS_CURRENCY "CURRENCY"
108 : #define GNC_COMMODITY_NS_NONCURRENCY "NONCURRENCY"
109 :
110 : #define GNC_COMMODITY_NS_NONISO_GUI NC_("Commodity Type", "All non-currency")
111 : #define GNC_COMMODITY_NS_ISO_GUI NC_("Commodity Type", "Currencies")
112 :
113 : /** Max fraction is 10^9 because 10^10 would require changing it to an
114 : * int64_t.
115 : */
116 : #define GNC_COMMODITY_MAX_FRACTION 1000000000
117 :
118 : typedef GList CommodityList;
119 :
120 : /** @name Commodity Quote Source functions
121 : @{
122 : */
123 :
124 : /** The quote source type enum account types are used to determine how
125 : * the transaction data in the account is displayed. These values
126 : * can be safely changed from one release to the next.
127 : */
128 : typedef enum
129 : {
130 : SOURCE_SINGLE = 0, /**< This quote source pulls from a single
131 : * specific web site. For example, the
132 : * yahoo_australia source only pulls from
133 : * the yahoo web site. */
134 : SOURCE_MULTI, /**< This quote source may pull from multiple
135 : * web sites. For example, the australia
136 : * source may pull from ASX, yahoo, etc. */
137 : SOURCE_UNKNOWN, /**< This is a locally installed quote source
138 : * that gnucash knows nothing about. May
139 : * pull from single or multiple
140 : * locations. */
141 : SOURCE_MAX,
142 : SOURCE_CURRENCY = SOURCE_MAX, /**< The special currency quote source. */
143 : } QuoteSourceType;
144 :
145 : /** This function indicates whether or not the Finance::Quote module
146 : * is installed on a user's computer. This includes any other related
147 : * modules that gnucash need to process F::Q information.
148 : *
149 : * @return TRUE is F::Q is installed properly.
150 : */
151 : gboolean gnc_quote_source_fq_installed (void);
152 :
153 : /** This function returns the version of the Finance::Quote module
154 : * installed on a user's computer. If no proper installation is found
155 : * it will return NULL.
156 : *
157 : * @return a version string or NULL
158 : */
159 : const char* gnc_quote_source_fq_version (void);
160 :
161 : /** Return the number of entries for a given type of quote source.
162 : *
163 : * @param type The quote source type whose count should be returned.
164 : *
165 : * @return The number of entries for this type of quote source.
166 : */
167 : gint gnc_quote_source_num_entries(QuoteSourceType type);
168 :
169 : /** Create a new quote source. This is called by the F::Q startup code
170 : * or the XML parsing code to add new entries to the list of
171 : * available quote sources.
172 : *
173 : * @param name The internal name for this new quote source.
174 : *
175 : * @param supported TRUE if this quote source is supported by F::Q.
176 : * Should only be set by the F::Q startup routine.
177 : *
178 : * @return A pointer to the newly created quote source.
179 : */
180 : gnc_quote_source *gnc_quote_source_add_new(const char * name, gboolean supported);
181 :
182 : /** Given the internal (gnucash or F::Q) name of a quote source, find
183 : * the data structure identified by this name.
184 : *
185 : * @param internal_name The name of this quote source.
186 : *
187 : * @return A pointer to the price quote source that has the specified
188 : * internal name.
189 : */
190 : /*@ dependent @*/
191 : gnc_quote_source *gnc_quote_source_lookup_by_internal(const char * internal_name);
192 :
193 : /** Given the type/index of a quote source, find the data structure
194 : * identified by this pair.
195 : *
196 : * @param type The type of this quote source.
197 : *
198 : * @param index The index of this quote source within its type.
199 : *
200 : * @return A pointer to the price quote source that has the specified
201 : * type/index.
202 : */
203 : gnc_quote_source *gnc_quote_source_lookup_by_ti(QuoteSourceType type, gint index);
204 :
205 : /** Given a gnc_quote_source data structure, return the flag that
206 : * indicates whether this particular quote source is supported by
207 : * the user's F::Q installation.
208 : *
209 : * @param source The quote source in question.
210 : *
211 : * @return TRUE if the user's computer supports this quote source.
212 : */
213 : gboolean gnc_quote_source_get_supported (const gnc_quote_source *source);
214 :
215 : /** Given a gnc_quote_source data structure, return the type of this
216 : * particular quote source. (SINGLE, MULTI, UNKNOWN)
217 : *
218 : * @param source The quote source in question.
219 : *
220 : * @return The type of this quote source.
221 : */
222 : QuoteSourceType gnc_quote_source_get_type (const gnc_quote_source *source);
223 :
224 : /** Given a gnc_quote_source data structure, return the index of this
225 : * particular quote source within its type.
226 : *
227 : * @param source The quote source in question.
228 : *
229 : * @return The index of this quote source in its type.
230 : */
231 : gint gnc_quote_source_get_index (const gnc_quote_source *source);
232 :
233 : /** Given a gnc_quote_source data structure, return the user friendly
234 : * name of this quote source. E.G. "Yahoo Australia" or "Australia
235 : * (Yahoo, ASX, ...)"
236 : *
237 : * @param source The quote source in question.
238 : *
239 : * @return The user friendly name.
240 : */
241 : /*@ dependent @*/
242 : const char *gnc_quote_source_get_user_name (const gnc_quote_source *source);
243 :
244 : /** Given a gnc_quote_source data structure, return the internal name
245 : * of this quote source. This is the name used by both gnucash and
246 : * by Finance::Quote. E.G. "yahoo_australia" or "australia"
247 : *
248 : * @param source The quote source in question.
249 : *
250 : * @return The internal name.
251 : */
252 : /*@ dependent @*/
253 : const char *gnc_quote_source_get_internal_name (const gnc_quote_source *source);
254 :
255 : /** @} */
256 :
257 :
258 : /** @name Commodity Creation
259 : @{
260 : */
261 :
262 : /** Create a new commodity. This function allocates a new commodity
263 : * data structure, populates it with the data provided, and then
264 : * generates the dynamic names that exist as part of a commodity.
265 : *
266 : * @note This function does not check to see if the commodity exists
267 : * before adding a new commodity.
268 : *
269 : * @param book The book that the new commodity will belong to.
270 : *
271 : * @param fullname The complete name of this commodity. E.G. "Acme
272 : * Systems, Inc."
273 : *
274 : * @param commodity_namespace An aggregation of commodities. E.G. ISO4217,
275 : * Nasdaq, Downbelow, etc.
276 : *
277 : * @param mnemonic An abbreviation for this stock. For publicly
278 : * traced stocks, this field should contain the stock ticker
279 : * symbol. This field is used to get online price quotes, so it must
280 : * match the stock ticker symbol used by the exchange where you want
281 : * to get automatic stock quote updates. E.G. ACME, ACME.US, etc.
282 : *
283 : * @param cusip A string containing the CUSIP code or similar
284 : * UNIQUE code for this commodity like the ISIN. The stock ticker is
285 : * NOT appropriate as that goes in the mnemonic field.
286 : *
287 : * @param fraction The smallest division of this commodity
288 : * allowed. I.E. If this is 1, then the commodity must be traded in
289 : * whole units; if 100 then the commodity may be traded in 0.01
290 : * units, etc.
291 : *
292 : * @return A pointer to the new commodity.
293 : */
294 : /*@ dependent @*/
295 : gnc_commodity * gnc_commodity_new(QofBook *book,
296 : /*@ null @*/ const char * fullname,
297 : /*@ null @*/ const char * commodity_namespace,
298 : /*@ null @*/ const char * mnemonic,
299 : /*@ null @*/ const char * cusip,
300 : int fraction);
301 :
302 : /** Destroy a commodity. Release all memory attached to this data structure.
303 : * @note This function does not (can not) check to see if the
304 : * commodity is referenced anywhere.
305 : * @param cm The commodity to destroy.
306 : */
307 : void gnc_commodity_destroy(gnc_commodity * cm);
308 :
309 : /** Copy src into dest */
310 : void gnc_commodity_copy(gnc_commodity * dest, const gnc_commodity *src);
311 :
312 : /** allocate and copy */
313 : gnc_commodity * gnc_commodity_clone(const gnc_commodity *src, QofBook *dest_book);
314 : /** @} */
315 :
316 :
317 :
318 : /** @name Commodity Accessor Routines - Get
319 : @{
320 : */
321 :
322 : gboolean gnc_commodity_get_auto_quote_control_flag (const gnc_commodity *cm);
323 :
324 : /** Retrieve the mnemonic for the specified commodity. This will be a
325 : * pointer to a null terminated string of the form "ACME", "QWER",
326 : * etc.
327 : *
328 : * @param cm A pointer to a commodity data structure.
329 : *
330 : * @return A pointer to the mnemonic for this commodity. This string
331 : * is owned by the engine and should not be freed by the caller.
332 : */
333 : const char * gnc_commodity_get_mnemonic(const gnc_commodity * cm);
334 :
335 : /** Retrieve the namespace for the specified commodity. This will be
336 : * a pointer to a null terminated string of the form "AMEX",
337 : * "NASDAQ", etc.
338 : *
339 : * @param cm A pointer to a commodity data structure.
340 : *
341 : * @return A pointer to the namespace for this commodity. This string
342 : * is owned by the engine and should not be freed by the caller.
343 : */
344 : const char * gnc_commodity_get_namespace(const gnc_commodity * cm);
345 :
346 : /** Retrieve the namespace data structure for the specified commodity.
347 : * This will be a pointer to another data structure.
348 : *
349 : * @param cm A pointer to a commodity data structure.
350 : *
351 : * @return A pointer to the namespace data structure for this
352 : * commodity.
353 : */
354 : gnc_commodity_namespace *gnc_commodity_get_namespace_ds(const gnc_commodity * cm);
355 :
356 : /** Retrieve the full name for the specified commodity. This will be
357 : * a pointer to a null terminated string of the form "Acme Systems,
358 : * Inc.", etc.
359 : *
360 : * @param cm A pointer to a commodity data structure.
361 : *
362 : * @return A pointer to the full name for this commodity. This string
363 : * is owned by the engine and should not be freed by the caller.
364 : */
365 : const char * gnc_commodity_get_fullname(const gnc_commodity * cm);
366 :
367 : /** Retrieve the 'print' name for the specified commodity. This will
368 : * be a pointer to a null terminated string of the form "Acme
369 : * Systems, Inc. (ACME)", etc.
370 : *
371 : * @param cm A pointer to a commodity data structure.
372 : *
373 : * @return A pointer to the print name for this commodity. This
374 : * string is owned by the engine and should not be freed by the
375 : * caller.
376 : */
377 : const char * gnc_commodity_get_printname(const gnc_commodity * cm);
378 :
379 : /** Retrieve the 'exchange code' for the specified commodity. This
380 : * will be a pointer to a null terminated string of the form
381 : * "AXQ14728", etc. This field is often used when presenting
382 : * information to the user.
383 : *
384 : * @note This is a unique code that specifies a particular item or
385 : * set of shares of a commodity, not a code that specifies a stock
386 : * exchange. That is the namespace field.
387 : *
388 : * @param cm A pointer to a commodity data structure.
389 : *
390 : * @return A pointer to the exchange code for this commodity. This
391 : * string is owned by the engine and should not be freed by the
392 : * caller.
393 : */
394 : const char * gnc_commodity_get_cusip(const gnc_commodity * cm);
395 :
396 : /** Retrieve the 'unique' name for the specified commodity. This will
397 : * be a pointer to a null terminated string of the form "AMEX::ACME",
398 : * etc. This field is often used when performing comparisons or
399 : * other functions invisible to the user.
400 : *
401 : * @param cm A pointer to a commodity data structure.
402 : *
403 : * @return A pointer to the 'unique' name for this commodity. This
404 : * string is owned by the engine and should not be freed by the
405 : * caller.
406 : */
407 : const char * gnc_commodity_get_unique_name(const gnc_commodity * cm);
408 :
409 : /** Retrieve the fraction for the specified commodity. This will be
410 : * an integer value specifying the number of fractional units that
411 : * one of these commodities can be divided into. Should always be a
412 : * power of 10.
413 : *
414 : * @param cm A pointer to a commodity data structure.
415 : *
416 : * @return The number of fractional units that one of these
417 : * commodities can be divided into.
418 : */
419 : int gnc_commodity_get_fraction(const gnc_commodity * cm);
420 :
421 : /** Retrieve the automatic price quote flag for the specified
422 : * commodity. This flag indicates whether stock quotes should be
423 : * retrieved for the specified stock.
424 : *
425 : * @param cm A pointer to a commodity data structure.
426 : *
427 : * @return TRUE if quotes should be pulled for this commodity, FALSE
428 : * otherwise.
429 : */
430 : gboolean gnc_commodity_get_quote_flag(const gnc_commodity *cm);
431 :
432 : /** Retrieve the automatic price quote source for the specified
433 : * commodity. This will be a pointer to a null terminated string of
434 : * the form "Yahoo (Asia)", etc.
435 : *
436 : * @param cm A pointer to a commodity data structure.
437 : *
438 : * @return A pointer to the price quote source for this commodity.
439 : */
440 : /*@ dependent @*/
441 : gnc_quote_source* gnc_commodity_get_quote_source(const gnc_commodity *cm);
442 : /*@ dependent @*/
443 : gnc_quote_source* gnc_commodity_get_default_quote_source(const gnc_commodity *cm);
444 :
445 : /** Retrieve the automatic price quote timezone for the specified
446 : * commodity. This will be a pointer to a null terminated string of
447 : * the form "America/New_York", etc.
448 : *
449 : * @param cm A pointer to a commodity data structure.
450 : *
451 : * @return A pointer to the price quote timezone for this commodity.
452 : * This string is owned by the engine and should not be freed by the
453 : * caller.
454 : */
455 : const char* gnc_commodity_get_quote_tz(const gnc_commodity *cm);
456 :
457 : /** Retrieve the user-defined symbol for the specified commodity. This
458 : * will be a pointer to a nul terminated string like "£", "US$", etc.
459 : *
460 : * @param cm A pointer to a commodity data structure.
461 : *
462 : * @return A pointer to the user-defined symbol for this commodity.
463 : * NULL means that the user didn't define any symbol, and that fallback to
464 : * e.g. the mnemonic is in order. This string is owned by the engine and
465 : * should not be freed by the caller.
466 : */
467 : const char* gnc_commodity_get_user_symbol(const gnc_commodity *cm);
468 :
469 : /** Retrieve the default symbol for the specified commodity. This will
470 : * be a pointer to a nul terminated string like "£", "US$", etc. Note
471 : * that for the locale currency, you probably want to look at the
472 : * system-provided symbol first. See gnc_commodity_get_nice_symbol.
473 : *
474 : * @param cm A pointer to a commodity data structure.
475 : *
476 : * @return A pointer to the default symbol for this commodity.
477 : */
478 : const char* gnc_commodity_get_default_symbol(const gnc_commodity *cm);
479 :
480 : /** Retrieve a symbol for the specified commodity, suitable for
481 : * display to the user. This will be a pointer to a nul terminated
482 : * string like "£", "US$", etc. That function is locale-aware and
483 : * will base its choice of symbol on the user-configured symbol,
484 : * the locale a
485 : *
486 : * @param cm A pointer to a commodity data structure.
487 : *
488 : * @return A pointer to the symbol for this commodity.
489 : */
490 : const char*gnc_commodity_get_nice_symbol(const gnc_commodity *cm);
491 : /** @} */
492 :
493 : /** @name Commodity Accessor Routines - Set
494 : @{
495 : */
496 :
497 : void gnc_commodity_set_auto_quote_control_flag (gnc_commodity *cm, const gboolean flag);
498 :
499 : /** Set the mnemonic for the specified commodity. This should be a
500 : * pointer to a null terminated string of the form "ACME", "QWER",
501 : * etc.
502 : *
503 : * @param cm A pointer to a commodity data structure.
504 : *
505 : * @param mnemonic A pointer to the mnemonic for this commodity.
506 : * This string belongs to the caller and will be duplicated by the
507 : * engine.
508 : */
509 : void gnc_commodity_set_mnemonic(gnc_commodity * cm, const char * mnemonic);
510 :
511 : /** Set the namespace for the specified commodity. This should be a
512 : * pointer to a null terminated string of the form "AMEX", "NASDAQ",
513 : * etc.
514 : *
515 : * @param cm A pointer to a commodity data structure.
516 : *
517 : * @param new_namespace A pointer to the namespace for this commodity.
518 : * This string belongs to the caller and will be duplicated by the
519 : * engine.
520 : */
521 : void gnc_commodity_set_namespace(gnc_commodity * cm, const char * new_namespace);
522 :
523 : /** Set the full name for the specified commodity. This should be
524 : * a pointer to a null terminated string of the form "Acme Systems,
525 : * Inc.", etc.
526 : *
527 : * @param cm A pointer to a commodity data structure.
528 : *
529 : * @param fullname A pointer to the full name for this commodity.
530 : * This string belongs to the caller and will be duplicated by the
531 : * engine.
532 : */
533 : void gnc_commodity_set_fullname(gnc_commodity * cm, const char * fullname);
534 :
535 : /** Set the 'exchange code' for the specified commodity. This should
536 : * be a pointer to a null terminated string of the form "AXQ14728",
537 : * etc.
538 : *
539 : * @note This is a unique code that specifies a particular item or
540 : * set of shares of a commodity, not a code that specifies a stock
541 : * exchange. That is the namespace field.
542 : *
543 : * @param cm A pointer to a commodity data structure.
544 : *
545 : * @param cusip A pointer to the cusip or other exchange specific
546 : * data for this commodity. This string belongs to the caller and
547 : * will be duplicated by the engine.
548 : */
549 : void gnc_commodity_set_cusip(gnc_commodity * cm, const char * cusip);
550 :
551 : /** Set the fraction for the specified commodity. This should be
552 : * an integer value specifying the number of fractional units that
553 : * one of these commodities can be divided into. Should always be a
554 : * power of 10.
555 : *
556 : * @param cm A pointer to a commodity data structure.
557 : *
558 : * @param smallest_fraction The number of fractional units that one of
559 : * these commodities can be divided into.
560 : */
561 : void gnc_commodity_set_fraction(gnc_commodity * cm, int smallest_fraction);
562 :
563 : /** Set the automatic price quote flag for the specified commodity,
564 : * based on user input. This flag indicates whether stock quotes
565 : * should be retrieved for the specified stock.
566 : *
567 : * It is necessary to have a separate function to distinguish when
568 : * this setting is being modified by a user so that the
569 : * auto-enabling/auto-disabling of currencies can be handled
570 : * properly.
571 : *
572 : * @param cm A pointer to a commodity data structure.
573 : *
574 : * @param flag TRUE if quotes should be pulled for this commodity, FALSE
575 : * otherwise.
576 : */
577 : void gnc_commodity_user_set_quote_flag(gnc_commodity *cm,
578 : const gboolean flag);
579 :
580 : /** Set the automatic price quote flag for the specified commodity.
581 : * This flag indicates whether stock quotes should be retrieved for
582 : * the specified stock.
583 : *
584 : * @param cm A pointer to a commodity data structure.
585 : *
586 : * @param flag TRUE if quotes should be pulled for this commodity, FALSE
587 : * otherwise.
588 : */
589 : void gnc_commodity_set_quote_flag(gnc_commodity *cm, const gboolean flag);
590 :
591 : /** Set the automatic price quote source for the specified commodity.
592 : * This should be a pointer to a null terminated string of the form
593 : * "Yahoo (Asia)", etc. Legal values can be found in the
594 : * quote_sources array in the file gnc-ui-util.c.
595 : *
596 : * @param cm A pointer to a commodity data structure.
597 : *
598 : * @param src A pointer to the price quote source for this commodity.
599 : */
600 : void gnc_commodity_set_quote_source(gnc_commodity *cm, gnc_quote_source *src);
601 :
602 : /** Set the automatic price quote timezone for the specified
603 : * commodity. This should be a pointer to a null terminated string
604 : * of the form "America/New_York", etc. Legal values can be found in
605 : * the known_timezones array in the file src/gnome-utils/dialog-commodity.c.
606 : *
607 : * @param cm A pointer to a commodity data structure.
608 : *
609 : * @param tz A pointer to the price quote timezone for this commodity.
610 : * This string belongs to the caller and will be duplicated by the
611 : * engine.
612 : */
613 : void gnc_commodity_set_quote_tz(gnc_commodity *cm, const char *tz);
614 :
615 : /** Set a user-defined symbol for the specified commodity. This should
616 : * be a pointer to a nul terminated string like "£", "US$", etc.
617 : *
618 : * @param cm A pointer to a commodity data structure.
619 : *
620 : * @param tz A pointer to the symbol for this commodity. This string
621 : * belongs to the caller and will be duplicated by the engine.
622 : */
623 : void gnc_commodity_set_user_symbol(gnc_commodity *cm, const char *user_symbol);
624 : /** @} */
625 :
626 : /** @name Commodity Usage Count Adjustment Routines
627 : @{
628 : */
629 :
630 : /** Increment a commodity's internal counter that tracks how many
631 : * accounts are using that commodity. For currencies, this may have
632 : * the side effect of enabling the commodity's quote flag.
633 : *
634 : * @param cm A pointer to a commodity data structure.
635 : */
636 : void
637 : gnc_commodity_increment_usage_count(gnc_commodity *cm);
638 :
639 : /** Decrement a commodity's internal counter that tracks how many
640 : * accounts are using that commodity. For currencies, this may have
641 : * the side effect of disabling the commodity's quote flag.
642 : *
643 : * @param cm A pointer to a commodity data structure.
644 : */
645 : void
646 : gnc_commodity_decrement_usage_count(gnc_commodity *cm);
647 : /** @} */
648 :
649 :
650 : /** @name Commodity Comparison
651 : @{
652 : */
653 :
654 : /** This routine returns TRUE if the two commodities are equivalent.
655 : * Commodities are equivalent if they have the same namespace and
656 : * mnemonic. Equivalent commodities may belong to different
657 : * exchanges, may have different fullnames, and may have different
658 : * fractions.
659 : */
660 : gboolean gnc_commodity_equiv(const gnc_commodity * a, const gnc_commodity * b);
661 :
662 : /** This routine returns TRUE if the two commodities are equal.
663 : * Commodities are equal if they have the same namespace, mnemonic,
664 : * fullname, exchange private code and fraction.
665 : */
666 : gboolean gnc_commodity_equal(const gnc_commodity * a, const gnc_commodity * b);
667 :
668 : /** This routine returns 0 if the two commodities are equal, 1 otherwise.
669 : * Commodities are equal if they have the same namespace, mnemonic,
670 : * fullname, exchange private code and fraction.
671 : * This function is useful for list-traversal comparison purposes where
672 : * The semantics are 0, <0, or >0 (equal, greater than, less than) rather
673 : * than "true or false"
674 : */
675 : int gnc_commodity_compare(const gnc_commodity * a, const gnc_commodity * b);
676 :
677 : /** A wrapper around gnc_commodity_compare() which offers the function
678 : * declaration that is needed for g_list_find_custom(), which needs
679 : * void pointers instead of gnc_commodity ones.
680 : */
681 : int gnc_commodity_compare_void(const void * a, const void * b);
682 : /** @} */
683 :
684 :
685 : /** @name Currency Checks
686 : @{
687 : */
688 :
689 : /** Checks to see if the specified commodity namespace is the
690 : * namespace for ISO 4217 currencies.
691 : *
692 : * @param commodity_namespace The string to check.
693 : *
694 : * @return TRUE if the string indicates an ISO currency, FALSE otherwise. */
695 : gboolean gnc_commodity_namespace_is_iso(const char *commodity_namespace);
696 :
697 : /** Checks to see if the specified commodity is an ISO 4217 recognized currency.
698 : *
699 : * @param cm The commodity to check.
700 : *
701 : * @return TRUE if the commodity represents a currency, FALSE otherwise. */
702 : gboolean gnc_commodity_is_iso(const gnc_commodity * cm);
703 :
704 : /** Checks to see if the specified commodity is an ISO 4217 recognized
705 : * currency or a legacy currency.
706 : *
707 : * @param cm The commodity to check.
708 : *
709 : * @return TRUE if the commodity represents a currency, FALSE otherwise. */
710 : gboolean gnc_commodity_is_currency(const gnc_commodity *cm);
711 :
712 : /** @} */
713 :
714 :
715 : /* =============================================================== */
716 : /** @name Commodity Table
717 : @{
718 : */
719 :
720 : /** Returns the commodity table associated with a book.
721 : */
722 : /*@ dependent @*/
723 : gnc_commodity_table * gnc_commodity_table_get_table(QofBook *book);
724 :
725 : /** @} */
726 : /* ---------------------------------------------------------- */
727 : /** @name Commodity Table Lookup functions
728 : @{
729 : */
730 : gnc_commodity * gnc_commodity_table_lookup(const gnc_commodity_table * table,
731 : const char * commodity_namespace,
732 : const char * mnemonic);
733 : gnc_commodity *
734 : gnc_commodity_table_lookup_unique(const gnc_commodity_table *table,
735 : const char * unique_name);
736 : gnc_commodity * gnc_commodity_table_find_full(const gnc_commodity_table * t,
737 : const char * commodity_namespace,
738 : const char * fullname);
739 :
740 : /*@ dependent @*/
741 : gnc_commodity * gnc_commodity_find_commodity_by_guid(const GncGUID *guid,
742 : QofBook *book);
743 :
744 : /** @} */
745 : /* ---------------------------------------------------------- */
746 :
747 : /** @name Commodity Table Maintenance functions
748 : @{
749 : */
750 :
751 : /** Add a new commodity to the commodity table. This routine handles
752 : * the cases where the commodity already exists in the database (does
753 : * nothing), or another entries has the same namespace and mnemonic
754 : * (updates the existing entry).
755 : *
756 : * @param table A pointer to the commodity table
757 : *
758 : * @param comm A pointer to the commodity to add.
759 : *
760 : * @return The added commodity. Null on error.
761 : *
762 : * @note The commodity pointer passed to this function should not be
763 : * used after its return, as it may have been destroyed. Use the
764 : * return value which is guaranteed to be valid. */
765 : /*@ dependent @*/
766 : gnc_commodity * gnc_commodity_table_insert(gnc_commodity_table * table,
767 : gnc_commodity * comm);
768 :
769 : /** Remove a commodity from the commodity table. If the commodity to
770 : * remove doesn't exist, nothing happens.
771 : *
772 : * @param table A pointer to the commodity table
773 : *
774 : * @param comm A pointer to the commodity to remove. */
775 : void gnc_commodity_table_remove(gnc_commodity_table * table,
776 : gnc_commodity * comm);
777 :
778 : /** Add all the standard namespaces and currencies to the commodity
779 : * table. This routine creates the namespaces for the NYSE, NASDAQ,
780 : * etc. It also adds all of the ISO 4217 currencies to the commodity
781 : * table.
782 : *
783 : * @param table A pointer to the commodity table.
784 : *
785 : * @param book Unused. */
786 : gboolean gnc_commodity_table_add_default_data(gnc_commodity_table *table, QofBook *book);
787 :
788 : /** @} */
789 : /* ---------------------------------------------------------- */
790 : /** @name Commodity Table Namespace functions
791 : @{
792 : */
793 :
794 : /** Return the textual name of a namespace data structure.
795 : *
796 : * @param ns A pointer to the namespace data structure.
797 : *
798 : * @return A pointer to the name of the namespace. This string is
799 : * owned by the engine and should not be freed by the caller. */
800 : const char * gnc_commodity_namespace_get_name (const gnc_commodity_namespace *ns) ;
801 :
802 : /** Return the textual name of a namespace data structure in a form suitable to
803 : * present to the user.
804 : *
805 : * @param ns A pointer to the namespace data structure.
806 : *
807 : * @return A pointer to the gui friendly name of the namespace. This string is
808 : * owned by the engine and should not be freed by the caller.
809 : *
810 : * @notes The returned string is marked for translation, but not translated yet.
811 : * If you want it translated pass the return value on to gettext.
812 : */
813 : const char * gnc_commodity_namespace_get_gui_name (const gnc_commodity_namespace *ns) ;
814 :
815 :
816 : /** Return a list of all commodity data structures in the specified namespace.
817 : *
818 : * @return A pointer to the list of structures. NULL if an invalid
819 : * argument was supplied.
820 : *
821 : * @note This list is owned by the caller who must free the list. */
822 : GList * gnc_commodity_namespace_get_commodity_list(const gnc_commodity_namespace * ns);
823 :
824 :
825 : /** Test to see if the indicated namespace exits in the commodity table.
826 : *
827 : * @param table A pointer to the commodity table
828 : *
829 : * @param commodity_namespace The new namespace to check.
830 : *
831 : * @return 1 if the namespace exists. 0 if it doesn't exist, or the
832 : * routine was passed a bad argument. */
833 : int gnc_commodity_table_has_namespace(const gnc_commodity_table * table,
834 : const char * commodity_namespace);
835 :
836 : /** Return a list of all namespaces in the commodity table. This
837 : * returns both system and user defined namespaces.
838 : *
839 : * @return A pointer to the list of names. NULL if an invalid
840 : * argument was supplied.
841 : *
842 : * @note It is the callers responsibility to free the list. */
843 : GList * gnc_commodity_table_get_namespaces(const gnc_commodity_table * t);
844 :
845 : /** Return a list of all namespace data structures in the commodity table. This
846 : * returns both system and user defined namespace structures.
847 : *
848 : * @return A pointer to the list of structures. NULL if an invalid
849 : * argument was supplied.
850 : *
851 : * @note This list is owned by the caller who must free the list. */
852 : GList * gnc_commodity_table_get_namespaces_list(const gnc_commodity_table * t);
853 :
854 : /** This function adds a new string to the list of commodity namespaces.
855 : * If the new namespace already exists, nothing happens.
856 : *
857 : * @param table A pointer to the commodity table
858 : *
859 : * @param commodity_namespace The new namespace to be added.
860 : *
861 : * @param book The book that the new namespace will belong to.
862 : *
863 : * @return A pointer to the newly created namespace. */
864 : gnc_commodity_namespace * gnc_commodity_table_add_namespace(gnc_commodity_table * table,
865 : const char * commodity_namespace,
866 : QofBook *book);
867 :
868 : /** This function finds a commodity namespace in the set of existing commodity namespaces.
869 : *
870 : * @param table A pointer to the commodity table
871 : *
872 : * @param commodity_namespace The new namespace to be added.
873 : *
874 : * @return The a pointer to the namespace found, or NULL if the
875 : * namespace doesn't exist. */
876 : gnc_commodity_namespace * gnc_commodity_table_find_namespace(const gnc_commodity_table * table,
877 : const char * commodity_namespace);
878 :
879 : /** This function deletes a string from the list of commodity namespaces.
880 : * If the namespace does not exist, nothing happens.
881 : *
882 : * @param table A pointer to the commodity table
883 : *
884 : * @param commodity_namespace The namespace to be deleted.
885 : *
886 : * @note This routine will destroy any commodities that exist as part
887 : * of this namespace. Use it carefully. */
888 : void gnc_commodity_table_delete_namespace(gnc_commodity_table * table,
889 : const char * commodity_namespace);
890 : /** @} */
891 : /* ---------------------------------------------------------- */
892 : /** @name Commodity Table Accessor functions
893 : @{
894 : */
895 :
896 : /** Returns the number of commodities in the commodity table.
897 : *
898 : * @param tbl A pointer to the commodity table
899 : *
900 : * @return The number of commodities in the table. 0 if there are no
901 : * commodities, or the routine was passed a bad argument. */
902 : guint gnc_commodity_table_get_size(const gnc_commodity_table* tbl);
903 :
904 : /** Return a list of all commodities in the commodity table that are
905 : * in the given namespace.
906 : *
907 : * @param table A pointer to the commodity table
908 : *
909 : * @param commodity_namespace A string indicating which commodities should be
910 : * returned. It is a required argument.
911 : *
912 : * @return A pointer to the list of commodities. NULL if an invalid
913 : * argument was supplied, or the namespace could not be found.
914 : *
915 : * @note It is the callers responsibility to free the list. */
916 : CommodityList * gnc_commodity_table_get_commodities(
917 : const gnc_commodity_table * table, const char * commodity_namespace);
918 :
919 : /** This function returns a list of commodities for which price quotes
920 : * should be retrieved. It will scan the entire commodity table (or
921 : * a subset) and check each commodity to see if the price_quote_flag
922 : * field has been set. All matching commodities are queued onto a
923 : * list, and the head of that list is returned. Use the command-line
924 : * given expression as a filter on the commodities to be returned. If
925 : * non-null, only commodities in namespace that match the specified
926 : * regular expression are checked. If none was given, all
927 : * commodities are checked.
928 : *
929 : * @param table A pointer to the commodity table
930 : *
931 : * @return A pointer to a list of commodities. NULL if invalid
932 : * arguments were supplied or if there no commodities are flagged for
933 : * quote retrieval.
934 : *
935 : * @note It is the callers responsibility to free the list. */
936 : CommodityList * gnc_commodity_table_get_quotable_commodities(
937 : const gnc_commodity_table * table);
938 :
939 : /** Call a function once for each commodity in the commodity table.
940 : * This table walk returns whenever the end of the table is reached,
941 : * or the function returns FALSE.
942 : *
943 : * @param table A pointer to the commodity table
944 : *
945 : * @param f The function to call for each commodity.
946 : *
947 : * @param user_data A pointer that is passed into the function
948 : * unchanged by the table walk routine. */
949 : gboolean gnc_commodity_table_foreach_commodity(const gnc_commodity_table * table,
950 : gboolean (*f)(gnc_commodity *cm,
951 : gpointer user_data),
952 : gpointer user_data);
953 : /** @} */
954 :
955 :
956 : /* ---------------------------------------------------------- */
957 : /** @name Commodity Table Private/Internal-Use Only Routines
958 : @{
959 : */
960 :
961 : /** You probably shouldn't be using gnc_commodity_table_new() directly,
962 : * it's for internal use only. You should probably be using
963 : * gnc_commodity_table_get_table()
964 : */
965 : gnc_commodity_table * gnc_commodity_table_new(void);
966 : void gnc_commodity_table_destroy(gnc_commodity_table * table);
967 :
968 : /** Given the commodity 'findlike', this routine will find and return the
969 : * equivalent commodity (commodity with the same 'unique name') in
970 : * the indicated book. This routine is primarily useful for setting
971 : * up clones of things across multiple books.
972 : */
973 : gnc_commodity * gnc_commodity_obtain_twin (const gnc_commodity *findlike, QofBook *book);
974 :
975 : /** You should probably not be using gnc_commodity_table_register()
976 : * It is an internal routine for registering the gncObject for the
977 : * commodity table.
978 : */
979 : gboolean gnc_commodity_table_register (void);
980 :
981 : void gnc_commodity_begin_edit (gnc_commodity *cm);
982 : void gnc_commodity_commit_edit (gnc_commodity *cm);
983 :
984 : /** Get the internal KVP from of the currency.
985 : * You should rather use the individual accessors for individual properties
986 : */
987 : #define gnc_commodity_get_kvp_frame(cm) \
988 : qof_instance_get_slots(QOF_INSTANCE(cm))
989 :
990 : /** @} */
991 :
992 : /** @name Monetary value, commodity identity and numeric value
993 : @{
994 : */
995 : struct _gnc_monetary
996 : {
997 : gnc_commodity *commodity;
998 : gnc_numeric value;
999 : };
1000 :
1001 : typedef struct _gnc_monetary gnc_monetary;
1002 :
1003 : /* A list of monetary values. This could be a hash table, but as currently
1004 : * used it rarely contains more than one or two different commodities so
1005 : * it doesn't seem worth the trouble.
1006 : */
1007 : typedef GList MonetaryList;
1008 :
1009 : /** @name Constructors
1010 : @{
1011 : Make a gnc_monetary from a gnc_commodity and gnc_numeric */
1012 : static inline
1013 44 : gnc_monetary gnc_monetary_create(gnc_commodity *commod, gnc_numeric val)
1014 : {
1015 : gnc_monetary out;
1016 44 : out.commodity = commod;
1017 44 : out.value = val;
1018 44 : return out;
1019 : }
1020 : /** @} */
1021 :
1022 : /** @name Accessors
1023 : @{
1024 : */
1025 : static inline
1026 0 : gnc_commodity * gnc_monetary_commodity(gnc_monetary a)
1027 : {
1028 0 : return a.commodity;
1029 : }
1030 :
1031 : static inline
1032 0 : gnc_numeric gnc_monetary_value(gnc_monetary a)
1033 : {
1034 0 : return a.value;
1035 : }
1036 : /** @} */
1037 :
1038 : /** @name Manipulate MonetaryList lists
1039 : @{
1040 : */
1041 :
1042 : /** Add a gnc_monetary to the list */
1043 : MonetaryList *gnc_monetary_list_add_monetary(MonetaryList *list, gnc_monetary mon);
1044 :
1045 : /** Add something to the list given a commodity and value */
1046 : static inline
1047 44 : MonetaryList *gnc_monetary_list_add_value(MonetaryList *list,
1048 : gnc_commodity *commod,
1049 : gnc_numeric value)
1050 : {
1051 44 : return gnc_monetary_list_add_monetary(list,
1052 44 : gnc_monetary_create(commod, value));
1053 : }
1054 :
1055 : /** Delete all the zero-value entries from a list */
1056 : MonetaryList *gnc_monetary_list_delete_zeros(MonetaryList *list);
1057 :
1058 : /** Free a monetary list and all the items it points to */
1059 : void gnc_monetary_list_free(MonetaryList *list);
1060 : /** @} */
1061 :
1062 : /** @} */
1063 :
1064 : #ifdef __cplusplus
1065 : } /* extern "C" */
1066 : #endif
1067 :
1068 : #endif /* GNC_COMMODITY_H */
1069 : /** @} */
1070 : /** @} */
|