libofx.h
Go to the documentation of this file.

    00001 /*-*-c-*-*******************************************************************
    00002               libofx.h  -  Main header file for the libofx API
    00003                              -------------------
    00004     copyright            : (C) 2002-2011 by Benoit Grégoire
    00005     email                : benoitg@coeus.ca
    00006 ***************************************************************************/
    00026 /***************************************************************************
    00027  *                                                                         *
    00028  *   This program is free software; you can redistribute it and/or modify  *
    00029  *   it under the terms of the GNU General Public License as published by  *
    00030  *   the Free Software Foundation; either version 2 of the License, or     *
    00031  *   (at your option) any later version.                                   *
    00032  *                                                                         *
    00033  ***************************************************************************/
    00034
    00035 #ifndef LIBOFX_H
    00036 #define LIBOFX_H
    00037 #include <time.h>
    00038
    00039 #define LIBOFX_MAJOR_VERSION 0
    00040 #define LIBOFX_MINOR_VERSION 9
    00041 #define LIBOFX_MICRO_VERSION 5
    00042 #define LIBOFX_BUILD_VERSION 0
    00043 #define LIBOFX_VERSION_RELEASE_STRING "0.9.5"
    00044
    00045 #ifdef IN_LIBOFX
    00046 #  include "config.h"
    00047 #  ifdef HAVE_GCC_VISIBILITY_EXTS
    00048 #    pragma GCC visibility push(default)
    00049 #  endif
    00050 #endif
    00051
    00052 #ifdef __cplusplus
    00053 extern "C" {
    00054 #else
    00055 #define true 1
    00056 #define false 0
    00057 #endif
    00058
    00059 #define OFX_ELEMENT_NAME_LENGTH         100
    00060 #define OFX_SVRTID2_LENGTH             (36 + 1)
    00061 #define OFX_CHECK_NUMBER_LENGTH        (12 + 1)
    00062 #define OFX_REFERENCE_NUMBER_LENGTH    (32 + 1)
    00063 #define OFX_FITID_LENGTH               (255 + 1)
    00064 #define OFX_TOKEN2_LENGTH              (36 + 1)
    00065 #define OFX_MEMO_LENGTH                (255 + 1)
    00066 #define OFX_FIID_LENGTH                (32 + 1)
    00067 #define OFX_MEMO2_LENGTH               (390 + 1)
    00068 #define OFX_BALANCE_NAME_LENGTH        (32 + 1)
    00069 #define OFX_BALANCE_DESCRIPTION_LENGTH (80 + 1)
    00070 #define OFX_CURRENCY_LENGTH            (3 + 1) /* In ISO-4217 format */
    00071 #define OFX_BANKID_LENGTH              (9 + 1)
    00072 #define OFX_BRANCHID_LENGTH            (22 + 1)
    00073 #define OFX_ACCTID_LENGTH              (22 + 1)
    00074 #define OFX_ACCTKEY_LENGTH             (22 + 1)
    00075 #define OFX_BROKERID_LENGTH            (22 + 1)
    00076   /* Must be MAX of <BANKID>+<BRANCHID>+<ACCTID>, <ACCTID>+<ACCTKEY> and <ACCTID>+<BROKERID> */
    00077 #define OFX_ACCOUNT_ID_LENGTH (OFX_BANKID_LENGTH + OFX_BRANCHID_LENGTH + OFX_ACCTID_LENGTH + 1)
    00078 #define OFX_ACCOUNT_NAME_LENGTH        255
    00079 #define OFX_MARKETING_INFO_LENGTH      (360 + 1)
    00080 #define OFX_TRANSACTION_NAME_LENGTH    (32 + 1)
    00081 #define OFX_UNIQUE_ID_LENGTH           (32 + 1)
    00082 #define OFX_UNIQUE_ID_TYPE_LENGTH      (10 + 1)
    00083 #define OFX_SECNAME_LENGTH             (32 + 1)
    00084 #define OFX_TICKER_LENGTH              (32 + 1)
    00085 #define OFX_ORG_LENGTH                 (32 + 1)
    00086 #define OFX_FID_LENGTH                 (32 + 1)
    00087 #define OFX_USERID_LENGTH              (32 + 1)
    00088 #define OFX_USERPASS_LENGTH            (32 + 1)
    00089 #define OFX_URL_LENGTH                 (500 + 1)
    00090 #define OFX_APPID_LENGTH               (32)
    00091 #define OFX_APPVER_LENGTH              (32)
    00092 #define OFX_HEADERVERSION_LENGTH       (32)
    00093
    00094   /*
    00095   #define OFX_STATEMENT_CB               0;
    00096   #define OFX_ACCOUNT_CB                 1;
    00097   #define OFX_TRACSACTION_CB             2;
    00098   #define OFX_SECURITY_CB                3;
    00099   #define OFX_STATUS_CB                  4;
    00100   */
    00101
    00102   typedef void * LibofxContextPtr;
    00103
    00109   LibofxContextPtr libofx_get_new_context();
    00110
    00116   int libofx_free_context( LibofxContextPtr );
    00117
    00118   void libofx_set_dtd_dir(LibofxContextPtr libofx_context,
    00119                           const char *s);
    00120
    00122   enum LibofxFileFormat
    00123   {
    00124     AUTODETECT,
    00125     OFX,
    00126     OFC,
    00127     QIF,
    00128     UNKNOWN,
    00129     LAST
    00130   };
    00131
    00132   struct LibofxFileFormatInfo
    00133   {
    00134     enum LibofxFileFormat format;
    00135     const char * format_name;
    00136     const char * description;
    00137   };
    00138
    00139
    00140 #ifndef OFX_AQUAMANIAC_UGLY_HACK1
    00141
    00142   const struct LibofxFileFormatInfo LibofxImportFormatList[] =
    00143   {
    00144     {AUTODETECT, "AUTODETECT", "AUTODETECT (File format will be automatically detected later)"},
    00145     {OFX, "OFX", "OFX (Open Financial eXchange (OFX or QFX))"},
    00146     {OFC, "OFC", "OFC (Microsoft Open Financial Connectivity)"},
    00147     {QIF, "QIF", "QIF (Intuit Quicken Interchange Format) NOT IMPLEMENTED"},
    00148     {LAST, "LAST", "Not a file format, meant as a loop breaking condition"}
    00149   };
    00150
    00151   const struct LibofxFileFormatInfo LibofxExportFormatList[] =
    00152   {
    00153     {QIF, "QIF", "QIF (Intuit Quicken Interchange Format) NOT IMPLEMENTED"},
    00154     {LAST, "LAST", "Not a file format, meant as a loop breaking condition"}
    00155   };
    00156
    00168   enum LibofxFileFormat libofx_get_file_format_from_str(const struct LibofxFileFormatInfo format_list[], const char * file_type_string);
    00169
    00181   const char * libofx_get_file_format_description(const struct LibofxFileFormatInfo format_list[], enum LibofxFileFormat file_format);
    00182
    00183 #endif
    00184
    00191   int libofx_proc_file(LibofxContextPtr libofx_context,
    00192                        const char * p_filename,
    00193                        enum LibofxFileFormat ftype);
    00194
    00195
    00208   struct OfxStatusData
    00209   {
    00214     char ofx_element_name[OFX_ELEMENT_NAME_LENGTH];
    00216     int ofx_element_name_valid;
    00217
    00222     int code;
    00223     const char* name;
    00224     const char* description;
    00225     int code_valid;
    00228     enum Severity
    00229     {
    00230       INFO,
    00231       WARN,
    00232       ERROR
    00233     } severity;
    00234     int severity_valid;
    00235
    00241     char* server_message;
    00243     int server_message_valid;
    00245   };
    00246
    00247
    00257   typedef int (*LibofxProcStatusCallback)(const struct OfxStatusData data, void * status_data);
    00258
    00270   struct OfxAccountData
    00271   {
    00272
    00284     char account_id[OFX_ACCOUNT_ID_LENGTH];
    00285
    00291     char account_name[OFX_ACCOUNT_NAME_LENGTH];
    00292     int account_id_valid;/* Use for both account_id and account_name */
    00293
    00296     enum AccountType
    00297     {
    00298       OFX_CHECKING,
    00299       OFX_SAVINGS,
    00300       OFX_MONEYMRKT,
    00301       OFX_CREDITLINE,
    00302       OFX_CMA,
    00303       OFX_CREDITCARD,
    00304       OFX_INVESTMENT
    00305     } account_type;
    00306     int account_type_valid;
    00307
    00309     char currency[OFX_CURRENCY_LENGTH];
    00310     int currency_valid;
    00311
    00313     char account_number[OFX_ACCTID_LENGTH];
    00314     int account_number_valid;
    00315
    00317     char bank_id[OFX_BANKID_LENGTH];
    00318     int bank_id_valid;
    00319
    00320     char broker_id[OFX_BROKERID_LENGTH];
    00321     int broker_id_valid;
    00322
    00323     char branch_id[OFX_BRANCHID_LENGTH];
    00324     int branch_id_valid;
    00325
    00326   };
    00327
    00342   typedef int (*LibofxProcAccountCallback)(const struct OfxAccountData data, void * account_data);
    00343
    00351   struct OfxSecurityData
    00352   {
    00360     char unique_id[OFX_UNIQUE_ID_LENGTH];
    00361     int unique_id_valid;
    00362
    00363     char unique_id_type[OFX_UNIQUE_ID_TYPE_LENGTH];
    00365     int unique_id_type_valid;
    00366
    00367     char secname[OFX_SECNAME_LENGTH];
    00368     int secname_valid;
    00369
    00375     char ticker[OFX_TICKER_LENGTH];
    00376     int ticker_valid;
    00377
    00378     double unitprice;
    00380     int unitprice_valid;
    00381
    00382     time_t date_unitprice;
    00383     int date_unitprice_valid;
    00384
    00387     char currency[OFX_CURRENCY_LENGTH];
    00388     int currency_valid;
    00389
    00390     char memo[OFX_MEMO2_LENGTH];
    00391     int memo_valid;
    00392
    00395     char fiid[OFX_FIID_LENGTH];
    00396     int fiid_valid;
    00397
    00398   };/* end struct OfxSecurityData */
    00399
    00413   typedef int (*LibofxProcSecurityCallback)(const struct OfxSecurityData data, void * security_data);
    00414
    00415   typedef enum
    00416   {
    00417     OFX_CREDIT,
    00418     OFX_DEBIT,
    00419     OFX_INT,
    00420     OFX_DIV,
    00421     OFX_FEE,
    00422     OFX_SRVCHG,
    00423     OFX_DEP,
    00424     OFX_ATM,
    00425     OFX_POS,
    00426     OFX_XFER,
    00427     OFX_CHECK,
    00428     OFX_PAYMENT,
    00429     OFX_CASH,
    00430     OFX_DIRECTDEP,
    00431     OFX_DIRECTDEBIT,
    00432     OFX_REPEATPMT,
    00433     OFX_OTHER
    00434   } TransactionType;
    00435
    00436   typedef enum
    00437   {
    00438     OFX_BUYDEBT,
    00439     OFX_BUYMF,
    00440     OFX_BUYOPT,
    00441     OFX_BUYOTHER,
    00442     OFX_BUYSTOCK,
    00443     OFX_CLOSUREOPT,
    00444     OFX_INCOME,
    00445     OFX_INVEXPENSE,
    00446     OFX_JRNLFUND,
    00447     OFX_JRNLSEC,
    00448     OFX_MARGININTEREST,
    00449     OFX_REINVEST,
    00450     OFX_RETOFCAP,
    00451     OFX_SELLDEBT,
    00452     OFX_SELLMF,
    00453     OFX_SELLOPT,
    00454     OFX_SELLOTHER,
    00455     OFX_SELLSTOCK,
    00456     OFX_SPLIT,
    00457     OFX_TRANSFER
    00458   } InvTransactionType;
    00459
    00460   typedef enum
    00461   {
    00462     DELETE,
    00464     REPLACE
    00466   } FiIdCorrectionAction;
    00467
    00474   struct OfxTransactionData
    00475   {
    00476
    00482     char account_id[OFX_ACCOUNT_ID_LENGTH];
    00485     struct OfxAccountData * account_ptr;
    00487     int account_id_valid;
    00488
    00489     TransactionType transactiontype;
    00490     int transactiontype_valid;
    00491
    00495     InvTransactionType invtransactiontype;
    00496     int  invtransactiontype_valid;
    00497
    00505     double units;
    00506     int units_valid;
    00507
    00508     double unitprice;
    00510     int unitprice_valid;
    00511
    00512     double amount;
    00516     int amount_valid;
    00517
    00518     char fi_id[256];
    00521     int fi_id_valid;
    00522
    00530     char unique_id[OFX_UNIQUE_ID_LENGTH];
    00531     int unique_id_valid;
    00532     char unique_id_type[OFX_UNIQUE_ID_TYPE_LENGTH];
    00534     int unique_id_type_valid;
    00535
    00536     struct OfxSecurityData *security_data_ptr;
    00537     int security_data_valid;
    00538
    00539     time_t date_posted;
    00544     int date_posted_valid;
    00545
    00546     time_t date_initiated;
    00552     int date_initiated_valid;
    00553
    00554     time_t date_funds_available;
    00557     int date_funds_available_valid;
    00558
    00562     char fi_id_corrected[256];
    00563     int fi_id_corrected_valid;
    00564
    00567     FiIdCorrectionAction fi_id_correction_action;
    00568     int fi_id_correction_action_valid;
    00569
    00572     char server_transaction_id[OFX_SVRTID2_LENGTH];
    00573     int server_transaction_id_valid;
    00574
    00578     char check_number[OFX_CHECK_NUMBER_LENGTH];
    00579     int check_number_valid;
    00580
    00583     char reference_number[OFX_REFERENCE_NUMBER_LENGTH];
    00584     int reference_number_valid;
    00585
    00586     long int standard_industrial_code;
    00588     int standard_industrial_code_valid;
    00589
    00590     char payee_id[OFX_SVRTID2_LENGTH];
    00591     int payee_id_valid;
    00592
    00593     char name[OFX_TRANSACTION_NAME_LENGTH];
    00595     int name_valid;
    00596
    00597     char memo[OFX_MEMO2_LENGTH];
    00598     int memo_valid;
    00599
    00600     double commission;
    00601     int commission_valid;
    00602
    00603     double fees;
    00604     int fees_valid;
    00605
    00606     double oldunits;     /*number of units held before stock split */
    00607     int oldunits_valid;
    00608
    00609     double newunits;     /*number of units held after stock split */
    00610     int newunits_valid;
    00611
    00612
    00613     /*********** NOT YET COMPLETE!!! *********************/
    00614   };
    00615
    00625   typedef int (*LibofxProcTransactionCallback)(const struct OfxTransactionData data, void * transaction_data);
    00626
    00636   struct OfxStatementData
    00637   {
    00638
    00646     char currency[OFX_CURRENCY_LENGTH];
    00647     int currency_valid;
    00648
    00649     char account_id[OFX_ACCOUNT_ID_LENGTH];
    00651     struct OfxAccountData * account_ptr;
    00653     int account_id_valid;
    00654
    00657     double ledger_balance;
    00658     int ledger_balance_valid;
    00659
    00660     time_t ledger_balance_date;
    00661     int ledger_balance_date_valid;
    00662
    00668     double available_balance;
    00671     int available_balance_valid;
    00672
    00673     time_t available_balance_date;
    00674     int available_balance_date_valid;
    00675
    00680     time_t date_start;
    00681     int date_start_valid;
    00682
    00687     time_t date_end;
    00688     int date_end_valid;
    00689
    00692     char marketing_info[OFX_MARKETING_INFO_LENGTH];
    00693     int marketing_info_valid;
    00694   };
    00695
    00703   typedef int (*LibofxProcStatementCallback)(const struct OfxStatementData data, void * statement_data);
    00704
    00708   struct OfxCurrency
    00709   {
    00710     char currency[OFX_CURRENCY_LENGTH];
    00711     double exchange_rate;
    00712     int must_convert;
    00713   };
    00714
    00715
    00722   void ofx_set_status_cb(LibofxContextPtr ctx,
    00723                          LibofxProcStatusCallback cb,
    00724                          void *user_data);
    00725
    00732   void ofx_set_account_cb(LibofxContextPtr ctx,
    00733                           LibofxProcAccountCallback cb,
    00734                           void *user_data);
    00735
    00742   void ofx_set_security_cb(LibofxContextPtr ctx,
    00743                            LibofxProcSecurityCallback cb,
    00744                            void *user_data);
    00745
    00752   void ofx_set_transaction_cb(LibofxContextPtr ctx,
    00753                               LibofxProcTransactionCallback cb,
    00754                               void *user_data);
    00755
    00762   void ofx_set_statement_cb(LibofxContextPtr ctx,
    00763                             LibofxProcStatementCallback cb,
    00764                             void *user_data);
    00765
    00766
    00770   int libofx_proc_buffer(LibofxContextPtr ctx,
    00771                          const char *s, unsigned int size);
    00772
    00773
    00774   /* **************************************** */
    00775
    00781
    00785   struct OfxFiServiceInfo
    00786   {
    00787     char fid[OFX_FID_LENGTH];
    00788     char org[OFX_ORG_LENGTH];
    00789     char url[OFX_URL_LENGTH];
    00790     int accountlist;
    00791     int statements;
    00792     int billpay;
    00793     int investments;
    00794   };
    00795
    00805   struct OfxFiLogin
    00806   {
    00807     char fid[OFX_FID_LENGTH];
    00808     char org[OFX_ORG_LENGTH];
    00809     char userid[OFX_USERID_LENGTH];
    00810     char userpass[OFX_USERPASS_LENGTH];
    00811     char header_version[OFX_HEADERVERSION_LENGTH];
    00812     char appid[OFX_APPID_LENGTH];
    00813     char appver[OFX_APPVER_LENGTH];
    00814   };
    00815
    00816 #define OFX_AMOUNT_LENGTH (32 + 1)
    00817 #define OFX_PAYACCT_LENGTH (32 + 1)
    00818 #define OFX_STATE_LENGTH (5 + 1)
    00819 #define OFX_POSTALCODE_LENGTH (11 + 1)
    00820 #define OFX_NAME_LENGTH (32 + 1)
    00821
    00822   struct OfxPayment
    00823   {
    00824     char amount[OFX_AMOUNT_LENGTH];
    00825     char account[OFX_PAYACCT_LENGTH];
    00826     char datedue[9];
    00827     char memo[OFX_MEMO_LENGTH];
    00828   };
    00829
    00830   struct OfxPayee
    00831   {
    00832     char name[OFX_NAME_LENGTH];
    00833     char address1[OFX_NAME_LENGTH];
    00834     char city[OFX_NAME_LENGTH];
    00835     char state[OFX_STATE_LENGTH];
    00836     char postalcode[OFX_POSTALCODE_LENGTH];
    00837     char phone[OFX_NAME_LENGTH];
    00838   };
    00839
    00851   char* libofx_request_statement( const struct OfxFiLogin* fi, const struct OfxAccountData* account, time_t date_from );
    00852
    00863   char* libofx_request_accountinfo( const struct OfxFiLogin* login );
    00864
    00865   char* libofx_request_payment( const struct OfxFiLogin* login, const struct OfxAccountData* account, const struct OfxPayee* payee, const struct OfxPayment* payment );
    00866
    00867   char* libofx_request_payment_status( const struct OfxFiLogin* login, const char* transactionid );
    00868
    00870
    00871 extern int ofx_PARSER_msg;
    00872 extern int ofx_DEBUG_msg;
    00873 extern int ofx_DEBUG1_msg;
    00874 extern int ofx_DEBUG2_msg;
    00875 extern int ofx_DEBUG3_msg;
    00876 extern int ofx_DEBUG4_msg;
    00877 extern int ofx_DEBUG5_msg;
    00878 extern int ofx_STATUS_msg;
    00879 extern int ofx_INFO_msg;
    00880 extern int ofx_WARNING_msg;
    00881 extern int ofx_ERROR_msg;
    00882 extern int ofx_show_position;
    00884 #ifdef __cplusplus
    00885 } // end of extern "C"
    00886 #endif
    00887
    00888 #if defined(HAVE_GCC_VISIBILITY_EXTS) && defined(IN_LIBOFX)
    00889 #  pragma GCC visibility pop
    00890 #endif
    00891
    00892 #endif // end of LIBOFX_H