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 by Benoit Grégoire
    00005     email                : bock@step.polymtl.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 SNAPSHOT
    00043 #define LIBOFX_VERSION_RELEASE_STRING "0.9.5~SNAPSHOT"
    00044
    00045
    00046 #ifdef __cplusplus
    00047 extern "C" {
    00048 #else
    00049 #define true 1
    00050 #define false 0
    00051 #endif
    00052
    00053 #define OFX_ELEMENT_NAME_LENGTH         100
    00054 #define OFX_SVRTID2_LENGTH             (36 + 1)
    00055 #define OFX_CHECK_NUMBER_LENGTH        (12 + 1)
    00056 #define OFX_REFERENCE_NUMBER_LENGTH    (32 + 1)
    00057 #define OFX_FITID_LENGTH               (255 + 1)
    00058 #define OFX_TOKEN2_LENGTH              (36 + 1)
    00059 #define OFX_MEMO_LENGTH                (255 + 1)
    00060 #define OFX_MEMO2_LENGTH               (390 + 1)
    00061 #define OFX_BALANCE_NAME_LENGTH        (32 + 1)
    00062 #define OFX_BALANCE_DESCRIPTION_LENGTH (80 + 1)
    00063 #define OFX_CURRENCY_LENGTH            (3 + 1) /* In ISO-4217 format */
    00064 #define OFX_BANKID_LENGTH              (9 + 1)
    00065 #define OFX_BRANCHID_LENGTH            (22 + 1)
    00066 #define OFX_ACCTID_LENGTH              (22 + 1)
    00067 #define OFX_ACCTKEY_LENGTH             (22 + 1)
    00068 #define OFX_BROKERID_LENGTH            (22 + 1)
    00069   /* Must be MAX of <BANKID>+<BRANCHID>+<ACCTID>, <ACCTID>+<ACCTKEY> and <ACCTID>+<BROKERID> */
    00070 #define OFX_ACCOUNT_ID_LENGTH (OFX_BANKID_LENGTH + OFX_BRANCHID_LENGTH + OFX_ACCTID_LENGTH + 1)
    00071 #define OFX_ACCOUNT_NAME_LENGTH        255
    00072 #define OFX_MARKETING_INFO_LENGTH      (360 + 1)
    00073 #define OFX_TRANSACTION_NAME_LENGTH    (32 + 1)
    00074 #define OFX_UNIQUE_ID_LENGTH           (32 + 1)
    00075 #define OFX_UNIQUE_ID_TYPE_LENGTH      (10 + 1)
    00076 #define OFX_SECNAME_LENGTH             (32 + 1)
    00077 #define OFX_TICKER_LENGTH              (32 + 1)
    00078 #define OFX_ORG_LENGTH                 (32 + 1)
    00079 #define OFX_FID_LENGTH                 (32 + 1)
    00080 #define OFX_USERID_LENGTH              (32 + 1)
    00081 #define OFX_USERPASS_LENGTH            (32 + 1)
    00082 #define OFX_URL_LENGTH                 (500 + 1)
    00083 #define OFX_APPID_LENGTH               (32)
    00084 #define OFX_APPVER_LENGTH              (32)
    00085 #define OFX_HEADERVERSION_LENGTH       (32)
    00086
    00087   /*
    00088   #define OFX_STATEMENT_CB               0;
    00089   #define OFX_ACCOUNT_CB                 1;
    00090   #define OFX_TRACSACTION_CB             2;
    00091   #define OFX_SECURITY_CB                3;
    00092   #define OFX_STATUS_CB                  4;
    00093   */
    00094
    00095   typedef void * LibofxContextPtr;
    00096
    00102   LibofxContextPtr libofx_get_new_context();
    00103
    00109   int libofx_free_context( LibofxContextPtr );
    00110
    00111   void libofx_set_dtd_dir(LibofxContextPtr libofx_context,
    00112                           const char *s);
    00113
    00115   enum LibofxFileFormat
    00116   {
    00117     AUTODETECT,
    00118     OFX,
    00119     OFC,
    00120     QIF,
    00121     UNKNOWN,
    00122     LAST
    00123   };
    00124
    00125   struct LibofxFileFormatInfo
    00126   {
    00127     enum LibofxFileFormat format;
    00128     const char * format_name;
    00129     const char * description;
    00130   };
    00131
    00132
    00133 #ifndef OFX_AQUAMANIAC_UGLY_HACK1
    00134
    00135   const struct LibofxFileFormatInfo LibofxImportFormatList[] =
    00136   {
    00137     {AUTODETECT, "AUTODETECT", "AUTODETECT (File format will be automatically detected later)"},
    00138     {OFX, "OFX", "OFX (Open Financial eXchange (OFX or QFX))"},
    00139     {OFC, "OFC", "OFC (Microsoft Open Financial Connectivity)"},
    00140     {QIF, "QIF", "QIF (Intuit Quicken Interchange Format) NOT IMPLEMENTED"},
    00141     {LAST, "LAST", "Not a file format, meant as a loop breaking condition"}
    00142   };
    00143
    00144   const struct LibofxFileFormatInfo LibofxExportFormatList[] =
    00145   {
    00146     {QIF, "QIF", "QIF (Intuit Quicken Interchange Format) NOT IMPLEMENTED"},
    00147     {LAST, "LAST", "Not a file format, meant as a loop breaking condition"}
    00148   };
    00149
    00161   enum LibofxFileFormat libofx_get_file_format_from_str(const struct LibofxFileFormatInfo format_list[], const char * file_type_string);
    00162
    00174   const char * libofx_get_file_format_description(const struct LibofxFileFormatInfo format_list[], enum LibofxFileFormat file_format);
    00175
    00176 #endif
    00177
    00184   int libofx_proc_file(LibofxContextPtr libofx_context,
    00185                        const char * p_filename,
    00186                        enum LibofxFileFormat ftype);
    00187
    00188
    00201   struct OfxStatusData
    00202   {
    00207     char ofx_element_name[OFX_ELEMENT_NAME_LENGTH];
    00209     int ofx_element_name_valid;
    00210
    00215     int code;
    00216     const char* name;
    00217     const char* description;
    00218     int code_valid;
    00221     enum Severity
    00222     {
    00223       INFO,
    00224       WARN,
    00225       ERROR
    00226     } severity;
    00227     int severity_valid;
    00228
    00234     char* server_message;
    00236     int server_message_valid;
    00238   };
    00239
    00240
    00250   typedef int (*LibofxProcStatusCallback)(const struct OfxStatusData data, void * status_data);
    00251
    00263   struct OfxAccountData
    00264   {
    00265
    00277     char account_id[OFX_ACCOUNT_ID_LENGTH];
    00278
    00284     char account_name[OFX_ACCOUNT_NAME_LENGTH];
    00285     int account_id_valid;/* Use for both account_id and account_name */
    00286
    00289     enum AccountType
    00290     {
    00291       OFX_CHECKING,
    00292       OFX_SAVINGS,
    00293       OFX_MONEYMRKT,
    00294       OFX_CREDITLINE,
    00295       OFX_CMA,
    00296       OFX_CREDITCARD,
    00297       OFX_INVESTMENT
    00298     } account_type;
    00299     int account_type_valid;
    00300
    00302     char currency[OFX_CURRENCY_LENGTH];
    00303     int currency_valid;
    00304
    00306     char account_number[OFX_ACCTID_LENGTH];
    00307     int account_number_valid;
    00308
    00310     char bank_id[OFX_BANKID_LENGTH];
    00311     int bank_id_valid;
    00312
    00313     char broker_id[OFX_BROKERID_LENGTH];
    00314     int broker_id_valid;
    00315
    00316     char branch_id[OFX_BRANCHID_LENGTH];
    00317     int branch_id_valid;
    00318
    00319   };
    00320
    00335   typedef int (*LibofxProcAccountCallback)(const struct OfxAccountData data, void * account_data);
    00336
    00344   struct OfxSecurityData
    00345   {
    00353     char unique_id[OFX_UNIQUE_ID_LENGTH];
    00354     int unique_id_valid;
    00355
    00356     char unique_id_type[OFX_UNIQUE_ID_TYPE_LENGTH];
    00358     int unique_id_type_valid;
    00359
    00360     char secname[OFX_SECNAME_LENGTH];
    00361     int secname_valid;
    00362
    00368     char ticker[OFX_TICKER_LENGTH];
    00369     int ticker_valid;
    00370
    00371     double unitprice;
    00373     int unitprice_valid;
    00374
    00375     time_t date_unitprice;
    00376     int date_unitprice_valid;
    00377
    00380     char currency[OFX_CURRENCY_LENGTH];
    00381     int currency_valid;
    00382
    00383     char memo[OFX_MEMO2_LENGTH];
    00384     int memo_valid;
    00385   };/* end struct OfxSecurityData */
    00386
    00400   typedef int (*LibofxProcSecurityCallback)(const struct OfxSecurityData data, void * security_data);
    00401
    00402   typedef enum
    00403   {
    00404     OFX_CREDIT,
    00405     OFX_DEBIT,
    00406     OFX_INT,
    00407     OFX_DIV,
    00408     OFX_FEE,
    00409     OFX_SRVCHG,
    00410     OFX_DEP,
    00411     OFX_ATM,
    00412     OFX_POS,
    00413     OFX_XFER,
    00414     OFX_CHECK,
    00415     OFX_PAYMENT,
    00416     OFX_CASH,
    00417     OFX_DIRECTDEP,
    00418     OFX_DIRECTDEBIT,
    00419     OFX_REPEATPMT,
    00420     OFX_OTHER
    00421   } TransactionType;
    00422
    00423   typedef enum
    00424   {
    00425     OFX_BUYDEBT,
    00426     OFX_BUYMF,
    00427     OFX_BUYOPT,
    00428     OFX_BUYOTHER,
    00429     OFX_BUYSTOCK,
    00430     OFX_CLOSUREOPT,
    00431     OFX_INCOME,
    00432     OFX_INVEXPENSE,
    00433     OFX_JRNLFUND,
    00434     OFX_JRNLSEC,
    00435     OFX_MARGININTEREST,
    00436     OFX_REINVEST,
    00437     OFX_RETOFCAP,
    00438     OFX_SELLDEBT,
    00439     OFX_SELLMF,
    00440     OFX_SELLOPT,
    00441     OFX_SELLOTHER,
    00442     OFX_SELLSTOCK,
    00443     OFX_SPLIT,
    00444     OFX_TRANSFER
    00445   } InvTransactionType;
    00446
    00447   typedef enum
    00448   {
    00449     DELETE,
    00451     REPLACE
    00453   } FiIdCorrectionAction;
    00454
    00461   struct OfxTransactionData
    00462   {
    00463
    00469     char account_id[OFX_ACCOUNT_ID_LENGTH];
    00472     struct OfxAccountData * account_ptr;
    00474     int account_id_valid;
    00475
    00476     TransactionType transactiontype;
    00477     int transactiontype_valid;
    00478
    00482     InvTransactionType invtransactiontype;
    00483     int  invtransactiontype_valid;
    00484
    00492     double units;
    00493     int units_valid;
    00494
    00495     double unitprice;
    00497     int unitprice_valid;
    00498
    00499     double amount;
    00503     int amount_valid;
    00504
    00505     char fi_id[256];
    00508     int fi_id_valid;
    00509
    00517     char unique_id[OFX_UNIQUE_ID_LENGTH];
    00518     int unique_id_valid;
    00519     char unique_id_type[OFX_UNIQUE_ID_TYPE_LENGTH];
    00521     int unique_id_type_valid;
    00522
    00523     struct OfxSecurityData *security_data_ptr;
    00524     int security_data_valid;
    00525
    00526     time_t date_posted;
    00531     int date_posted_valid;
    00532
    00533     time_t date_initiated;
    00539     int date_initiated_valid;
    00540
    00541     time_t date_funds_available;
    00544     int date_funds_available_valid;
    00545
    00549     char fi_id_corrected[256];
    00550     int fi_id_corrected_valid;
    00551
    00554     FiIdCorrectionAction fi_id_correction_action;
    00555     int fi_id_correction_action_valid;
    00556
    00559     char server_transaction_id[OFX_SVRTID2_LENGTH];
    00560     int server_transaction_id_valid;
    00561
    00565     char check_number[OFX_CHECK_NUMBER_LENGTH];
    00566     int check_number_valid;
    00567
    00570     char reference_number[OFX_REFERENCE_NUMBER_LENGTH];
    00571     int reference_number_valid;
    00572
    00573     long int standard_industrial_code;
    00575     int standard_industrial_code_valid;
    00576
    00577     char payee_id[OFX_SVRTID2_LENGTH];
    00578     int payee_id_valid;
    00579
    00580     char name[OFX_TRANSACTION_NAME_LENGTH];
    00582     int name_valid;
    00583
    00584     char memo[OFX_MEMO2_LENGTH];
    00585     int memo_valid;
    00586
    00587     double commission;
    00588     int commission_valid;
    00589
    00590     double fees;
    00591     int fees_valid;
    00592
    00593     double oldunits;     /*number of units held before stock split */
    00594     int oldunits_valid;
    00595
    00596     double newunits;     /*number of units held after stock split */
    00597     int newunits_valid;
    00598
    00599
    00600     /*********** NOT YET COMPLETE!!! *********************/
    00601   };
    00602
    00612   typedef int (*LibofxProcTransactionCallback)(const struct OfxTransactionData data, void * transaction_data);
    00613
    00623   struct OfxStatementData
    00624   {
    00625
    00633     char currency[OFX_CURRENCY_LENGTH];
    00634     int currency_valid;
    00635
    00636     char account_id[OFX_ACCOUNT_ID_LENGTH];
    00638     struct OfxAccountData * account_ptr;
    00640     int account_id_valid;
    00641
    00644     double ledger_balance;
    00645     int ledger_balance_valid;
    00646
    00647     time_t ledger_balance_date;
    00648     int ledger_balance_date_valid;
    00649
    00655     double available_balance;
    00658     int available_balance_valid;
    00659
    00660     time_t available_balance_date;
    00661     int available_balance_date_valid;
    00662
    00667     time_t date_start;
    00668     int date_start_valid;
    00669
    00674     time_t date_end;
    00675     int date_end_valid;
    00676
    00679     char marketing_info[OFX_MARKETING_INFO_LENGTH];
    00680     int marketing_info_valid;
    00681   };
    00682
    00690   typedef int (*LibofxProcStatementCallback)(const struct OfxStatementData data, void * statement_data);
    00691
    00695   struct OfxCurrency
    00696   {
    00697     char currency[OFX_CURRENCY_LENGTH];
    00698     double exchange_rate;
    00699     int must_convert;
    00700   };
    00701
    00702
    00709   void ofx_set_status_cb(LibofxContextPtr ctx,
    00710                          LibofxProcStatusCallback cb,
    00711                          void *user_data);
    00712
    00719   void ofx_set_account_cb(LibofxContextPtr ctx,
    00720                           LibofxProcAccountCallback cb,
    00721                           void *user_data);
    00722
    00729   void ofx_set_security_cb(LibofxContextPtr ctx,
    00730                            LibofxProcSecurityCallback cb,
    00731                            void *user_data);
    00732
    00739   void ofx_set_transaction_cb(LibofxContextPtr ctx,
    00740                               LibofxProcTransactionCallback cb,
    00741                               void *user_data);
    00742
    00749   void ofx_set_statement_cb(LibofxContextPtr ctx,
    00750                             LibofxProcStatementCallback cb,
    00751                             void *user_data);
    00752
    00753
    00757   int libofx_proc_buffer(LibofxContextPtr ctx,
    00758                          const char *s, unsigned int size);
    00759
    00760
    00761   /* **************************************** */
    00762
    00768
    00772   struct OfxFiServiceInfo
    00773   {
    00774     char fid[OFX_FID_LENGTH];
    00775     char org[OFX_ORG_LENGTH];
    00776     char url[OFX_URL_LENGTH];
    00777     int accountlist;
    00778     int statements;
    00779     int billpay;
    00780     int investments;
    00781   };
    00782
    00792   struct OfxFiLogin
    00793   {
    00794     char fid[OFX_FID_LENGTH];
    00795     char org[OFX_ORG_LENGTH];
    00796     char userid[OFX_USERID_LENGTH];
    00797     char userpass[OFX_USERPASS_LENGTH];
    00798     char header_version[OFX_HEADERVERSION_LENGTH];
    00799     char appid[OFX_APPID_LENGTH];
    00800     char appver[OFX_APPVER_LENGTH];
    00801   };
    00802
    00803 #define OFX_AMOUNT_LENGTH (32 + 1)
    00804 #define OFX_PAYACCT_LENGTH (32 + 1)
    00805 #define OFX_STATE_LENGTH (5 + 1)
    00806 #define OFX_POSTALCODE_LENGTH (11 + 1)
    00807 #define OFX_NAME_LENGTH (32 + 1)
    00808
    00809   struct OfxPayment
    00810   {
    00811     char amount[OFX_AMOUNT_LENGTH];
    00812     char account[OFX_PAYACCT_LENGTH];
    00813     char datedue[9];
    00814     char memo[OFX_MEMO_LENGTH];
    00815   };
    00816
    00817   struct OfxPayee
    00818   {
    00819     char name[OFX_NAME_LENGTH];
    00820     char address1[OFX_NAME_LENGTH];
    00821     char city[OFX_NAME_LENGTH];
    00822     char state[OFX_STATE_LENGTH];
    00823     char postalcode[OFX_POSTALCODE_LENGTH];
    00824     char phone[OFX_NAME_LENGTH];
    00825   };
    00826
    00838   char* libofx_request_statement( const struct OfxFiLogin* fi, const struct OfxAccountData* account, time_t date_from );
    00839
    00850   char* libofx_request_accountinfo( const struct OfxFiLogin* login );
    00851
    00852   char* libofx_request_payment( const struct OfxFiLogin* login, const struct OfxAccountData* account, const struct OfxPayee* payee, const struct OfxPayment* payment );
    00853
    00854   char* libofx_request_payment_status( const struct OfxFiLogin* login, const char* transactionid );
    00855
    00857
    00858 #ifdef __cplusplus
    00859 } // end of extern "C"
    00860 #endif
    00861 #endif // end of LIBOFX_H