00001
00002
00003
00004
00005
00006
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <iostream>
00032 #include <string>
00033 #include "libofx.h"
00034 #include <config.h>
00035 #include <curl/curl.h>
00036 #include <stdio.h>
00037 #include <stdlib.h>
00038 #include <unistd.h>
00039
00040 #include "cmdline.h"
00041
00042 using namespace std;
00043
00044 bool post(const char* request, const char* url, const char* filename)
00045 {
00046 CURL *curl = curl_easy_init();
00047 if(! curl)
00048 return false;
00049
00050 unlink("tmpout");
00051 FILE* file = fopen(filename,"wb");
00052 if (! file )
00053 {
00054 curl_easy_cleanup(curl);
00055 return false;
00056 }
00057
00058 curl_easy_setopt(curl, CURLOPT_URL, url);
00059 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
00060
00061 struct curl_slist *headerlist=NULL;
00062 headerlist=curl_slist_append(headerlist, "Content-type: application/x-ofx");
00063 headerlist=curl_slist_append(headerlist, "Accept: */*, application/x-ofx");
00064
00065 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
00066 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite);
00067 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)file);
00068
00069 CURLcode res = curl_easy_perform(curl);
00070
00071 curl_easy_cleanup(curl);
00072 curl_slist_free_all (headerlist);
00073
00074 fclose(file);
00075
00076 return true;
00077 }
00078
00079 int main (int argc, char *argv[])
00080 {
00081 gengetopt_args_info args_info;
00082
00083 if (cmdline_parser (argc, argv, &args_info) != 0)
00084 exit(1) ;
00085
00086 if ( argc == 1 )
00087 {
00088 cmdline_parser_print_help();
00089 exit(1);
00090 }
00091
00092 if ( args_info.inputs_num > 0 )
00093 {
00094 cout << "file " << args_info.inputs[0] << endl;
00095 }
00096 else
00097 {
00098 cerr << "ERROR: You must specify an output file" << endl;
00099 }
00100
00101
00102
00103 OfxFiLogin fi;
00104 memset(&fi,0,sizeof(OfxFiLogin));
00105 bool ok = true;
00106 if ( args_info.fid_given )
00107 {
00108 cerr << "fid " << args_info.fid_arg << endl;
00109 strncpy(fi.fid,args_info.fid_arg,OFX_FID_LENGTH-1);
00110 }
00111 else
00112 {
00113 cerr << "ERROR: --fid is required" << endl;
00114 ok = false;
00115 }
00116
00117 if ( args_info.org_given )
00118 {
00119 cerr << "org " << args_info.org_arg << endl;
00120 strncpy(fi.org,args_info.org_arg,OFX_ORG_LENGTH-1);
00121 }
00122 else
00123 {
00124 cerr << "ERROR: --org is required" << endl;
00125 ok = false;
00126 }
00127
00128 if ( args_info.user_given )
00129 {
00130 cerr << "user " << args_info.user_arg << endl;
00131 strncpy(fi.userid,args_info.user_arg,OFX_USERID_LENGTH-1);
00132 }
00133 else
00134 {
00135 cerr << "ERROR: --user is required" << endl;
00136 ok = false;
00137 }
00138
00139 if ( args_info.pass_given )
00140 {
00141 cerr << "pass " << args_info.pass_arg << endl;
00142 strncpy(fi.userpass,args_info.pass_arg,OFX_USERPASS_LENGTH-1);
00143 }
00144 else
00145 {
00146 cerr << "ERROR: --pass is required" << endl;
00147 ok = false;
00148 }
00149
00150 if ( args_info.statement_req_flag )
00151 {
00152 cerr << "Statement request" << endl;
00153
00154 OfxAccountInfo account;
00155 memset(&account,0,sizeof(OfxAccountInfo));
00156
00157 if ( args_info.bank_given )
00158 {
00159 cerr << "bank " << args_info.bank_arg << endl;
00160 strncpy(account.bankid,args_info.bank_arg,OFX_BANKID_LENGTH-1);
00161 }
00162 else
00163 {
00164 if ( args_info.type_given && args_info.type_arg == 1 )
00165 {
00166 cerr << "ERROR: --bank is required for a bank request" << endl;
00167 ok = false;
00168 }
00169 }
00170
00171 if ( args_info.broker_given )
00172 {
00173 cerr << "broker " << args_info.broker_arg << endl;
00174 strncpy(account.brokerid,args_info.broker_arg,OFX_BROKERID_LENGTH-1);
00175 }
00176 else
00177 {
00178 if ( args_info.type_given && args_info.type_arg == 2 )
00179 {
00180 cerr << "ERROR: --broker is required for an investment statement request" << endl;
00181 ok = false;
00182 }
00183 }
00184
00185 if ( args_info.acct_given )
00186 {
00187 cerr << "acct " << args_info.acct_arg << endl;
00188 strncpy(account.accountid,args_info.acct_arg,OFX_ACCOUNT_ID_LENGTH-1);
00189 }
00190 else
00191 {
00192 cerr << "ERROR: --acct is required for a statement request" << endl;
00193 ok = false;
00194 }
00195
00196 if ( args_info.type_given )
00197 {
00198 cerr << "type " << args_info.type_arg << endl;
00199 account.type = static_cast<AccountType>(args_info.type_arg);
00200 }
00201 else
00202 {
00203 cerr << "ERROR: --type is required for a statement request" << endl;
00204 ok = false;
00205 }
00206
00207 if ( args_info.past_given )
00208 {
00209 cerr << "past " << args_info.past_arg << endl;
00210 }
00211 else
00212 {
00213 cerr << "ERROR: --past is required for a statement request" << endl;
00214 ok = false;
00215 }
00216
00217 if ( ok )
00218 {
00219 char* request = libofx_request_statement( &fi, &account, time(NULL) - args_info.past_arg * 86400L );
00220
00221 if ( args_info.url_given )
00222 post(request,args_info.url_arg,args_info.inputs[0]);
00223 else
00224 cout << request;
00225
00226 free(request);
00227 }
00228 }
00229
00230 if ( args_info.accountinfo_req_flag )
00231 {
00232 if ( ok )
00233 {
00234 char* request = libofx_request_accountinfo( &fi );
00235
00236 if ( args_info.url_given )
00237 post(request,args_info.url_arg,args_info.inputs[0]);
00238 else
00239 cout << request;
00240
00241 free(request);
00242 }
00243 }
00244
00245 return 0;
00246 }
00247
00248
00249
00250