00001
00002
00003
00004
00005
00006
00026
00027
00028
00029
00030
00031
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 1
00042 #define LIBOFX_BUILD_VERSION 0
00043 #define LIBOFX_VERSION_RELEASE_STRING "0.9.1"
00044
00045
00046 #ifdef __cplusplus
00047 #define CFCT extern "C"
00048 #else
00049 #define CFCT
00050 #define true 1
00051 #define false 0
00052 #endif
00053
00054 #define OFX_ELEMENT_NAME_LENGTH 100
00055 #define OFX_SVRTID2_LENGTH (36 + 1)
00056 #define OFX_CHECK_NUMBER_LENGTH (12 + 1)
00057 #define OFX_REFERENCE_NUMBER_LENGTH (32 + 1)
00058 #define OFX_FITID_LENGTH (255 + 1)
00059 #define OFX_TOKEN2_LENGTH (36 + 1)
00060 #define OFX_MEMO_LENGTH (255 + 1)
00061 #define OFX_MEMO2_LENGTH (390 + 1)
00062 #define OFX_BALANCE_NAME_LENGTH (32 + 1)
00063 #define OFX_BALANCE_DESCRIPTION_LENGTH (80 + 1)
00064 #define OFX_CURRENCY_LENGTH (3 + 1)
00065 #define OFX_BANKID_LENGTH (9 + 1)
00066 #define OFX_BRANCHID_LENGTH (22 + 1)
00067 #define OFX_ACCTID_LENGTH (22 + 1)
00068 #define OFX_ACCTKEY_LENGTH (22 + 1)
00069 #define OFX_BROKERID_LENGTH (22 + 1)
00070
00071 #define OFX_ACCOUNT_ID_LENGTH (OFX_BANKID_LENGTH + OFX_BRANCHID_LENGTH + OFX_ACCTID_LENGTH + 1)
00072 #define OFX_ACCOUNT_NAME_LENGTH 255
00073 #define OFX_MARKETING_INFO_LENGTH (360 + 1)
00074 #define OFX_TRANSACTION_NAME_LENGTH (32 + 1)
00075 #define OFX_UNIQUE_ID_LENGTH (32 + 1)
00076 #define OFX_UNIQUE_ID_TYPE_LENGTH (10 + 1)
00077 #define OFX_SECNAME_LENGTH (32 + 1)
00078 #define OFX_TICKER_LENGTH (32 + 1)
00079 #define OFX_ORG_LENGTH (32 + 1)
00080 #define OFX_FID_LENGTH (32 + 1)
00081 #define OFX_USERID_LENGTH (32 + 1)
00082 #define OFX_USERPASS_LENGTH (32 + 1)
00083 #define OFX_URL_LENGTH (500 + 1)
00084 #define OFX_APPID_LENGTH (32)
00085 #define OFX_APPVER_LENGTH (32)
00086 #define OFX_HEADERVERSION_LENGTH (32)
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 typedef void * LibofxContextPtr;
00102 CFCT LibofxContextPtr libofx_get_new_context();
00108 CFCT int libofx_free_context( LibofxContextPtr );
00109
00110 CFCT void libofx_set_dtd_dir(LibofxContextPtr libofx_context,
00111 const char *s);
00112
00114 enum LibofxFileFormat{ AUTODETECT,
00115 OFX,
00116 OFC,
00117 QIF,
00118 UNKNOWN,
00119 LAST
00120 };
00121
00122 struct LibofxFileFormatInfo{
00123 enum LibofxFileFormat format;
00124 const char * format_name;
00125 const char * description;
00126 };
00127
00128
00129 #ifndef OFX_AQUAMANIAC_UGLY_HACK1
00130
00131 const struct LibofxFileFormatInfo LibofxImportFormatList[] =
00132 {
00133 {AUTODETECT, "AUTODETECT", "AUTODETECT (File format will be automatically detected later)"},
00134 {OFX, "OFX", "OFX (Open Financial eXchange (OFX or QFX))"},
00135 {OFC, "OFC", "OFC (Microsoft Open Financial Connectivity)"},
00136 {QIF, "QIF", "QIF (Intuit Quicken Interchange Format) NOT IMPLEMENTED"},
00137 {LAST, "LAST", "Not a file format, meant as a loop breaking condition"}
00138 };
00139
00140 const struct LibofxFileFormatInfo LibofxExportFormatList[] =
00141 {
00142 {QIF, "QIF", "QIF (Intuit Quicken Interchange Format) NOT IMPLEMENTED"},
00143 {LAST, "LAST", "Not a file format, meant as a loop breaking condition"}
00144 };
00145
00153 CFCT enum LibofxFileFormat libofx_get_file_format_from_str(const struct LibofxFileFormatInfo format_list[], const char * file_type_string);
00154
00162 CFCT const char * libofx_get_file_format_description(const struct LibofxFileFormatInfo format_list[], enum LibofxFileFormat file_format);
00163
00164 #endif
00165
00172 CFCT int libofx_proc_file(LibofxContextPtr libofx_context,
00173 const char * p_filename,
00174 enum LibofxFileFormat ftype);
00175
00176
00189 struct OfxStatusData{
00194 char ofx_element_name[OFX_ELEMENT_NAME_LENGTH];
00196 int ofx_element_name_valid;
00197
00202 int code;
00203 const char* name;
00204 const char* description;
00205 int code_valid;
00208 enum Severity{INFO,
00209 WARN,
00210 ERROR
00211 } severity;
00212 int severity_valid;
00213
00219 char* server_message;
00221 int server_message_valid;
00223 };
00224
00225
00234 CFCT typedef int (*LibofxProcStatusCallback)(const struct OfxStatusData data, void * status_data);
00235
00247 struct OfxAccountData{
00248
00259 char account_id[OFX_ACCOUNT_ID_LENGTH];
00265 char account_name[OFX_ACCOUNT_NAME_LENGTH];
00266 int account_id_valid;
00267
00269 enum AccountType{
00270 OFX_CHECKING,
00271 OFX_SAVINGS,
00272 OFX_MONEYMRKT,
00273 OFX_CREDITLINE,
00274 OFX_CMA,
00275 OFX_CREDITCARD,
00276 OFX_INVESTMENT
00277 } account_type;
00278 int account_type_valid;
00279 char currency[OFX_CURRENCY_LENGTH];
00280 int currency_valid;
00281
00283 char account_number[OFX_ACCTID_LENGTH];
00284 int account_number_valid;
00285
00287 char bank_id[OFX_BANKID_LENGTH];
00288 int bank_id_valid;
00289
00290 char broker_id[OFX_BROKERID_LENGTH];
00291 int broker_id_valid;
00292
00293 char branch_id[OFX_BRANCHID_LENGTH];
00294 int branch_id_valid;
00295
00296 };
00297
00310 CFCT typedef int (*LibofxProcAccountCallback)(const struct OfxAccountData data, void * account_data);
00311
00318 struct OfxSecurityData{
00324 char unique_id[OFX_UNIQUE_ID_LENGTH];
00325 int unique_id_valid;
00326 char unique_id_type[OFX_UNIQUE_ID_TYPE_LENGTH];
00328 int unique_id_type_valid;
00329 char secname[OFX_SECNAME_LENGTH];
00330 int secname_valid;
00331
00337 char ticker[OFX_TICKER_LENGTH];
00338 int ticker_valid;
00339
00340 double unitprice;
00342 int unitprice_valid;
00343
00344 time_t date_unitprice;
00345 int date_unitprice_valid;
00346
00347 char currency[OFX_CURRENCY_LENGTH];
00350 int currency_valid;
00351 char memo[OFX_MEMO2_LENGTH];
00352 int memo_valid;
00353 };
00354
00366 CFCT typedef int (*LibofxProcSecurityCallback)(const struct OfxSecurityData data, void * security_data);
00367
00368 typedef enum {
00369 OFX_CREDIT,
00370 OFX_DEBIT,
00371 OFX_INT,
00372 OFX_DIV,
00373 OFX_FEE,
00374 OFX_SRVCHG,
00375 OFX_DEP,
00376 OFX_ATM,
00377 OFX_POS,
00378 OFX_XFER,
00379 OFX_CHECK,
00380 OFX_PAYMENT,
00381 OFX_CASH,
00382 OFX_DIRECTDEP,
00383 OFX_DIRECTDEBIT,
00384 OFX_REPEATPMT,
00385 OFX_OTHER
00386 } TransactionType;
00387
00388 typedef enum{
00389 OFX_BUYDEBT,
00390 OFX_BUYMF,
00391 OFX_BUYOPT,
00392 OFX_BUYOTHER,
00393 OFX_BUYSTOCK,
00394 OFX_CLOSUREOPT,
00395 OFX_INCOME,
00396 OFX_INVEXPENSE,
00397 OFX_JRNLFUND,
00398 OFX_JRNLSEC,
00399 OFX_MARGININTEREST,
00400 OFX_REINVEST,
00401 OFX_RETOFCAP,
00402 OFX_SELLDEBT,
00403 OFX_SELLMF,
00404 OFX_SELLOPT,
00405 OFX_SELLOTHER,
00406 OFX_SELLSTOCK,
00407 OFX_SPLIT,
00408 OFX_TRANSFER
00409 } InvTransactionType;
00410 typedef enum {
00411 DELETE,
00413 REPLACE
00415 } FiIdCorrectionAction;
00416
00423 struct OfxTransactionData{
00424
00430 char account_id[OFX_ACCOUNT_ID_LENGTH];
00433 struct OfxAccountData * account_ptr;
00435 int account_id_valid;
00436
00437 TransactionType transactiontype;
00438 int transactiontype_valid;
00439
00443 InvTransactionType invtransactiontype;
00444 int invtransactiontype_valid;
00445
00446 double units;
00452 int units_valid;
00453 double unitprice;
00455 int unitprice_valid;
00456 double amount;
00460 int amount_valid;
00461 char fi_id[256];
00464 int fi_id_valid;
00465
00473 char unique_id[OFX_UNIQUE_ID_LENGTH];
00474 int unique_id_valid;
00475 char unique_id_type[OFX_UNIQUE_ID_TYPE_LENGTH];
00477 int unique_id_type_valid;
00478 struct OfxSecurityData *security_data_ptr;
00479 int security_data_valid;
00480
00481 time_t date_posted;
00486 int date_posted_valid;
00487
00488 time_t date_initiated;
00494 int date_initiated_valid;
00495 time_t date_funds_available;
00498 int date_funds_available_valid;
00502 char fi_id_corrected[256];
00503 int fi_id_corrected_valid;
00506 FiIdCorrectionAction fi_id_correction_action;
00507 int fi_id_correction_action_valid;
00508
00511 char server_transaction_id[OFX_SVRTID2_LENGTH];
00512 int server_transaction_id_valid;
00516 char check_number[OFX_CHECK_NUMBER_LENGTH];
00517 int check_number_valid;
00520 char reference_number[OFX_REFERENCE_NUMBER_LENGTH];
00521 int reference_number_valid;
00522 long int standard_industrial_code;
00524 int standard_industrial_code_valid;
00525 char payee_id[OFX_SVRTID2_LENGTH];
00526 int payee_id_valid;
00527 char name[OFX_TRANSACTION_NAME_LENGTH];
00529 int name_valid;
00530 char memo[OFX_MEMO2_LENGTH];
00531 int memo_valid;
00532 double commission;
00533 int commission_valid;
00534 double fees;
00535 int fees_valid;
00536 double oldunits;
00537 int oldunits_valid;
00538 double newunits;
00539 int newunits_valid;
00540
00541
00542
00543 };
00544
00553 CFCT typedef int (*LibofxProcTransactionCallback)(const struct OfxTransactionData data, void * transaction_data);
00554
00563 struct OfxStatementData{
00564
00572 char currency[OFX_CURRENCY_LENGTH];
00573 int currency_valid;
00574 char account_id[OFX_ACCOUNT_ID_LENGTH];
00576 struct OfxAccountData * account_ptr;
00578 int account_id_valid;
00581 double ledger_balance;
00582 int ledger_balance_valid;
00583 time_t ledger_balance_date;
00584 int ledger_balance_date_valid;
00585
00591 double available_balance;
00594 int available_balance_valid;
00595 time_t available_balance_date;
00596 int available_balance_date_valid;
00601 time_t date_start;
00602 int date_start_valid;
00607 time_t date_end;
00608 int date_end_valid;
00611 char marketing_info[OFX_MARKETING_INFO_LENGTH];
00612 int marketing_info_valid;
00613 };
00614
00622 CFCT typedef int (*LibofxProcStatementCallback)(const struct OfxStatementData data, void * statement_data);
00623
00627 struct OfxCurrency{
00628 char currency[OFX_CURRENCY_LENGTH];
00629 double exchange_rate;
00630 int must_convert;
00631 };
00632
00633
00640 CFCT void ofx_set_status_cb(LibofxContextPtr ctx,
00641 LibofxProcStatusCallback cb,
00642 void *user_data);
00649 CFCT void ofx_set_account_cb(LibofxContextPtr ctx,
00650 LibofxProcAccountCallback cb,
00651 void *user_data);
00658 CFCT void ofx_set_security_cb(LibofxContextPtr ctx,
00659 LibofxProcSecurityCallback cb,
00660 void *user_data);
00667 CFCT void ofx_set_transaction_cb(LibofxContextPtr ctx,
00668 LibofxProcTransactionCallback cb,
00669 void *user_data);
00670
00677 CFCT void ofx_set_statement_cb(LibofxContextPtr ctx,
00678 LibofxProcStatementCallback cb,
00679 void *user_data);
00680
00681
00685 CFCT int libofx_proc_buffer(LibofxContextPtr ctx,
00686 const char *s, unsigned int size);
00687
00693
00698 struct OfxFiServiceInfo{
00699 char fid[OFX_FID_LENGTH];
00700 char org[OFX_ORG_LENGTH];
00701 char url[OFX_URL_LENGTH];
00702 int accountlist;
00703 int statements;
00704 int billpay;
00705 int investments;
00706 };
00707
00717 struct OfxFiLogin{
00718 char fid[OFX_FID_LENGTH];
00719 char org[OFX_ORG_LENGTH];
00720 char userid[OFX_USERID_LENGTH];
00721 char userpass[OFX_USERPASS_LENGTH];
00722 char header_version[OFX_HEADERVERSION_LENGTH];
00723 char appid[OFX_APPID_LENGTH];
00724 char appver[OFX_APPVER_LENGTH];
00725 };
00726
00727 #define OFX_AMOUNT_LENGTH (32 + 1)
00728 #define OFX_PAYACCT_LENGTH (32 + 1)
00729 #define OFX_STATE_LENGTH (5 + 1)
00730 #define OFX_POSTALCODE_LENGTH (11 + 1)
00731 #define OFX_NAME_LENGTH (32 + 1)
00732
00733 struct OfxPayment{
00734 char amount[OFX_AMOUNT_LENGTH];
00735 char account[OFX_PAYACCT_LENGTH];
00736 char datedue[9];
00737 char memo[OFX_MEMO_LENGTH];
00738 };
00739
00740 struct OfxPayee{
00741 char name[OFX_NAME_LENGTH];
00742 char address1[OFX_NAME_LENGTH];
00743 char city[OFX_NAME_LENGTH];
00744 char state[OFX_STATE_LENGTH];
00745 char postalcode[OFX_POSTALCODE_LENGTH];
00746 char phone[OFX_NAME_LENGTH];
00747 };
00748
00761 CFCT char* libofx_request_statement( const struct OfxFiLogin* fi, const struct OfxAccountData* account, time_t date_from );
00762
00774 CFCT char* libofx_request_accountinfo( const struct OfxFiLogin* login );
00775
00776 CFCT char* libofx_request_payment( const struct OfxFiLogin* login, const struct OfxAccountData* account, const struct OfxPayee* payee, const struct OfxPayment* payment );
00777
00778 CFCT char* libofx_request_payment_status( const struct OfxFiLogin* login, const char* transactionid );
00779
00781
00782 #endif
00783