43 #include <curl/curl.h> 54 bool post(
const char* request,
const char* url,
const char* filename)
56 CURL *curl = curl_easy_init();
61 FILE* file = fopen(filename,
"wb");
64 curl_easy_cleanup(curl);
68 curl_easy_setopt(curl, CURLOPT_URL, url);
69 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
71 struct curl_slist *headerlist = NULL;
72 headerlist = curl_slist_append(headerlist,
"Content-type: application/x-ofx");
73 headerlist = curl_slist_append(headerlist,
"Accept: */*, application/x-ofx");
75 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
76 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
77 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (
void *)file);
79 CURLcode res = curl_easy_perform(curl);
81 curl_easy_cleanup(curl);
82 curl_slist_free_all (headerlist);
89 bool post(
const char*,
const char*,
const char*)
91 cerr <<
"ERROR: libox must be configured with libcurl to post this request directly" << endl;
96 ostream& operator<<(ostream& os, const vector<string>& strvect)
98 for ( vector<string>::const_iterator it = strvect.begin(); it != strvect.end(); ++it)
105 int main (
int argc,
char *argv[])
109 if (cmdline_parser (argc, argv, &args_info) != 0)
114 cmdline_parser_print_help();
122 cout <<
"file " << args_info.
inputs[0] << endl;
126 cerr <<
"ERROR: You must specify an output file" << endl;
134 cout <<
"bank " << args_info.
inputs[0] << endl;
138 cerr <<
"ERROR: You must specify an bank" << endl;
155 cerr <<
"fipid " << args_info.
fipid_arg << endl;
156 cerr <<
"contacting partner server..." << endl;
158 cout <<
"fid " << svcinfo.fid << endl;
159 strncpy(fi.fid, svcinfo.fid, OFX_FID_LENGTH - 1);
160 cout <<
"org " << svcinfo.org << endl;
161 strncpy(fi.org, svcinfo.org, OFX_ORG_LENGTH - 1);
162 cout <<
"url " << svcinfo.url << endl;
167 cerr <<
"fid " << args_info.
fid_arg << endl;
168 strncpy(fi.fid, args_info.
fid_arg, OFX_FID_LENGTH - 1);
172 cerr <<
"ERROR: --fid is required" << endl;
178 cerr <<
"org " << args_info.
org_arg << endl;
179 strncpy(fi.org, args_info.
org_arg, OFX_ORG_LENGTH - 1);
183 cerr <<
"ERROR: --org is required" << endl;
189 cerr <<
"user " << args_info.
user_arg << endl;
190 strncpy(fi.userid, args_info.
user_arg, OFX_USERID_LENGTH - 1);
194 cerr <<
"ERROR: --user is required" << endl;
200 cerr <<
"pass " << args_info.
pass_arg << endl;
201 strncpy(fi.userpass, args_info.
pass_arg, OFX_USERPASS_LENGTH - 1);
205 cerr <<
"ERROR: --pass is required" << endl;
215 cerr <<
"Statement request" << endl;
222 cerr <<
"bank " << args_info.
bank_arg << endl;
229 cerr <<
"ERROR: --bank is required for a bank request" << endl;
236 cerr <<
"broker " << args_info.
broker_arg << endl;
237 strncpy(account.broker_id, args_info.
broker_arg, OFX_BROKERID_LENGTH - 1);
243 cerr <<
"ERROR: --broker is required for an investment statement request" << endl;
250 cerr <<
"acct " << args_info.
acct_arg << endl;
255 cerr <<
"ERROR: --acct is required for a statement request" << endl;
261 cerr <<
"type " << args_info.
type_arg << endl;
274 cerr <<
"ERROR: --type is not valid. Must be between 1 and 3" << endl;
280 cerr <<
"ERROR: --type is required for a statement request" << endl;
286 cerr <<
"past " << args_info.
past_arg << endl;
290 cerr <<
"ERROR: --past is required for a statement request" << endl;
298 if ( url.length() && args_info.
inputs_num > 0 )
299 post(request, url.c_str(), args_info.
inputs[0]);
310 memset(tridstr, 0, 33);
316 cerr <<
"trid " << args_info.
trid_arg << endl;
317 snprintf(tridstr, 32,
"%i", args_info.
trid_arg);
321 cerr <<
"ERROR: --trid is required for a payment inquiry request" << endl;
327 char* request = libofx_request_payment_status( &fi, tridstr );
330 fb.open (
"query", ios::out);
335 if ( url.length() && args_info.
inputs_num > 0 )
336 post(request, url.c_str(), args_info.
inputs[0]);
349 memset(&payee, 0,
sizeof(
OfxPayee));
353 strcpy(payee.name,
"MARTIN PREUSS");
354 strcpy(payee.address1,
"1 LAUREL ST");
355 strcpy(payee.city,
"SAN CARLOS");
356 strcpy(payee.state,
"CA");
357 strcpy(payee.postalcode,
"94070");
358 strcpy(payee.phone,
"866-555-1212");
360 strcpy(payment.amount,
"200.00");
361 strcpy(payment.account,
"1234");
362 strcpy(payment.datedue,
"20060301");
363 strcpy(payment.memo,
"This is a test");
369 cerr <<
"bank " << args_info.
bank_arg << endl;
376 cerr <<
"ERROR: --bank is required for a bank request" << endl;
383 cerr <<
"broker " << args_info.
broker_arg << endl;
384 strncpy(account.broker_id, args_info.
broker_arg, OFX_BROKERID_LENGTH - 1);
390 cerr <<
"ERROR: --broker is required for an investment statement request" << endl;
397 cerr <<
"acct " << args_info.
acct_arg << endl;
402 cerr <<
"ERROR: --acct is required for a statement request" << endl;
408 cerr <<
"type " << args_info.
type_arg << endl;
421 cerr <<
"ERROR: --type is not valid. Must be between 1 and 3" << endl;
427 cerr <<
"ERROR: --type is required for a statement request" << endl;
433 char* request = libofx_request_payment( &fi, &account, &payee, &payment );
436 fb.open (
"query", ios::out);
441 if ( url.length() && args_info.
inputs_num > 0 )
442 post(request, url.c_str(), args_info.
inputs[0]);
457 if ( url.length() && args_info.
inputs_num > 0 )
458 post(request, url.c_str(), args_info.
inputs[0]);
468 cout << OfxPartner::BankNames();
473 cout << OfxPartner::FipidForBank(args_info.
inputs[0]);
479 cout <<
"Account List? " << (svcinfo.
accountlist ?
"Yes" :
"No") << endl;
480 cout <<
"Statements? " << (svcinfo.
statements ?
"Yes" :
"No") << endl;
481 cout <<
"Billpay? " << (svcinfo.
billpay ?
"Yes" :
"No") << endl;
482 cout <<
"Investments? " << (svcinfo.
investments ?
"Yes" :
"No") << endl;
487 vector<string> banks = OfxPartner::BankNames();
488 vector<string>::const_iterator it_bank = banks.begin();
489 while ( it_bank != banks.end() )
491 vector<string> fipids = OfxPartner::FipidForBank(*it_bank);
492 vector<string>::const_iterator it_fipid = fipids.begin();
493 while ( it_fipid != fipids.end() )
495 if ( OfxPartner::ServiceInfo(*it_fipid).accountlist )
496 cout << *it_bank << endl;
unsigned int allsupport_given
Whether allsupport was given.
unsigned int org_given
Whether org was given.
An abstraction of an account.
long past_arg
How far back to look from today (in days).
unsigned int payment_req_given
Whether payment-req was given.
unsigned int fid_given
Whether fid was given.
Where the command line options are stored.
char * libofx_request_statement(const struct OfxFiLogin *fi, const struct OfxAccountData *account, time_t date_from)
Creates an OFX statement request in string form.
unsigned int type_given
Whether type was given.
char * fid_arg
FI identifier.
unsigned int bank_given
Whether bank was given.
unsigned int bank_fipid_given
Whether bank-fipid was given.
Methods for connecting to the OFX partner server to retrieve OFX server information.
char * libofx_request_accountinfo(const struct OfxFiLogin *login)
Creates an OFX account info (list) request in string form.
char * url_arg
Url to POST the data to (otherwise goes to stdout).
unsigned int bank_services_given
Whether bank-services was given.
char * fipid_arg
FI partner identifier (looks up fid, org & url from partner server).
unsigned int url_given
Whether url was given.
char bank_id[OFX_BANKID_LENGTH]
unsigned int fipid_given
Whether fipid was given.
char * acct_arg
Account ID.
char * user_arg
User name.
unsigned int bank_list_given
Whether bank-list was given.
unsigned int pass_given
Whether pass was given.
unsigned inputs_num
unamed options number
int trid_arg
Transaction id.
unsigned int statement_req_given
Whether statement-req was given.
Information returned by the OFX Partner Server about a financial institution.
unsigned int trid_given
Whether trid was given.
unsigned int past_given
Whether past was given.
unsigned int acct_given
Whether acct was given.
int main(int argc, char *argv[])
char ** inputs
unamed options (options without names)
char account_number[OFX_ACCTID_LENGTH]
Declaration of nodeparser object, which facilitiates searching for nodes in an XML file using a notat...
unsigned int user_given
Whether user was given.
unsigned int paymentinquiry_req_given
Whether paymentinquiry-req was given.
unsigned int accountinfo_req_given
Whether accountinfo-req was given.
char * bank_arg
IBAN bank identifier.
unsigned int broker_given
Whether broker was given.
char * org_arg
FI org tag.
char * broker_arg
Broker identifier.
int type_arg
Account Type 1=checking 2=invest 3=ccard.
Information sufficient to log into an financial institution.