1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>LibOFX: ofx_utilities.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.3 -->
<div class="tabs">
<ul>
<li><a href="main.html"><span>Main Page</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<h1>ofx_utilities.cpp</h1><a href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment"> ofx_util.cpp</span>
<a name="l00003"></a>00003 <span class="comment"> -------------------</span>
<a name="l00004"></a>00004 <span class="comment"> copyright : (C) 2002 by Benoit Grgoire</span>
<a name="l00005"></a>00005 <span class="comment"> email : bock@step.polymtl.ca</span>
<a name="l00006"></a>00006 <span class="comment"> ***************************************************************************/</span>
<a name="l00010"></a>00010 <span class="comment">/***************************************************************************</span>
<a name="l00011"></a>00011 <span class="comment"> * *</span>
<a name="l00012"></a>00012 <span class="comment"> * This program is free software; you can redistribute it and/or modify *</span>
<a name="l00013"></a>00013 <span class="comment"> * it under the terms of the GNU General Public License as published by *</span>
<a name="l00014"></a>00014 <span class="comment"> * the Free Software Foundation; either version 2 of the License, or *</span>
<a name="l00015"></a>00015 <span class="comment"> * (at your option) any later version. *</span>
<a name="l00016"></a>00016 <span class="comment"> * *</span>
<a name="l00017"></a>00017 <span class="comment"> ***************************************************************************/</span>
<a name="l00018"></a>00018 <span class="preprocessor">#include <config.h></span>
<a name="l00019"></a>00019 <span class="preprocessor">#include <iostream></span>
<a name="l00020"></a>00020 <span class="preprocessor">#include <assert.h></span>
<a name="l00021"></a>00021
<a name="l00022"></a>00022 <span class="preprocessor">#include "ParserEventGeneratorKit.h"</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include "SGMLApplication.h"</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include <time.h></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include <string></span>
<a name="l00026"></a>00026 <span class="preprocessor">#include <locale.h></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "<a class="code" href="fx-0_89_80_2lib_2messages_8hh.html" title="Message IO functionality.">messages.hh</a>"</span>
<a name="l00028"></a>00028 <span class="preprocessor">#include "<a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8hh.html" title="Various simple functions for type conversion &amp; al.">ofx_utilities.hh</a>"</span>
<a name="l00029"></a>00029
<a name="l00030"></a>00030 <span class="preprocessor">#ifdef OS_WIN32</span>
<a name="l00031"></a>00031 <span class="preprocessor"></span><span class="preprocessor"># define DIRSEP "\\"</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#else</span>
<a name="l00033"></a><a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html#2c89f3449c0cc91f289ecbef54188d8d">00033</a> <span class="preprocessor"></span><span class="preprocessor"># define DIRSEP "/"</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00035"></a>00035 <span class="preprocessor"></span>
<a name="l00036"></a>00036
<a name="l00037"></a>00037 <span class="keyword">using namespace </span>std;
<a name="l00041"></a>00041 <span class="comment">/*ostream &operator<<(ostream &os, SGMLApplication::CharString s)</span>
<a name="l00042"></a>00042 <span class="comment"> {</span>
<a name="l00043"></a>00043 <span class="comment"> for (size_t i = 0; i < s.len; i++)</span>
<a name="l00044"></a>00044 <span class="comment"> {</span>
<a name="l00045"></a>00045 <span class="comment"> os << ((char *)(s.ptr))[i*sizeof(SGMLApplication::Char)];</span>
<a name="l00046"></a>00046 <span class="comment"> }</span>
<a name="l00047"></a>00047 <span class="comment"> return os;</span>
<a name="l00048"></a>00048 <span class="comment"> }*/</span>
<a name="l00049"></a>00049
<a name="l00050"></a>00050 <span class="comment">/*wostream &operator<<(wostream &os, SGMLApplication::CharString s)</span>
<a name="l00051"></a>00051 <span class="comment"> {</span>
<a name="l00052"></a>00052 <span class="comment"> for (size_t i = 0; i < s.len; i++)</span>
<a name="l00053"></a>00053 <span class="comment"> {//cout<<i;</span>
<a name="l00054"></a>00054 <span class="comment"> os << wchar_t(s.ptr[i*MULTIPLY4]); </span>
<a name="l00055"></a>00055 <span class="comment"> }</span>
<a name="l00056"></a>00056 <span class="comment"> return os;</span>
<a name="l00057"></a>00057 <span class="comment"> } */</span>
<a name="l00058"></a>00058
<a name="l00059"></a>00059 <span class="comment">/*wchar_t* CharStringtowchar_t(SGMLApplication::CharString source, wchar_t *dest)</span>
<a name="l00060"></a>00060 <span class="comment"> {</span>
<a name="l00061"></a>00061 <span class="comment"> size_t i;</span>
<a name="l00062"></a>00062 <span class="comment"> for (i = 0; i < source.len; i++)</span>
<a name="l00063"></a>00063 <span class="comment"> {</span>
<a name="l00064"></a>00064 <span class="comment"> dest[i]+=wchar_t(source.ptr[i*sizeof(SGMLApplication::Char)*(sizeof(char)/sizeof(wchar_t))]);</span>
<a name="l00065"></a>00065 <span class="comment"> }</span>
<a name="l00066"></a>00066 <span class="comment"> return dest;</span>
<a name="l00067"></a>00067 <span class="comment"> }*/</span>
<a name="l00068"></a>00068
<a name="l00069"></a><a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html#e7575392f9f9c464ede10057dec0e8e4">00069</a> <span class="keywordtype">string</span> <a class="code" href="ofx__utilities_8cpp.html#e7575392f9f9c464ede10057dec0e8e4" title="Convert OpenSP CharString to a C++ STL string.">CharStringtostring</a>(<span class="keyword">const</span> SGMLApplication::CharString source, <span class="keywordtype">string</span> &dest)
<a name="l00070"></a>00070 {
<a name="l00071"></a>00071 <span class="keywordtype">size_t</span> i;
<a name="l00072"></a>00072 dest.assign(<span class="stringliteral">""</span>);<span class="comment">//Empty the provided string</span>
<a name="l00073"></a>00073 <span class="comment">// cout<<"Length: "<<source.len<<"sizeof(Char)"<<sizeof(SGMLApplication::Char)<<endl;</span>
<a name="l00074"></a>00074 <span class="keywordflow">for</span> (i = 0; i < source.len; i++){
<a name="l00075"></a>00075 dest+=(char)(((source.ptr)[i]));
<a name="l00076"></a>00076 <span class="comment">// cout<<i<<" "<<(char)(((source.ptr)[i]))<<endl; </span>
<a name="l00077"></a>00077 }
<a name="l00078"></a>00078 <span class="keywordflow">return</span> dest;
<a name="l00079"></a>00079 }
<a name="l00080"></a>00080
<a name="l00081"></a><a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html#50b88c84b759d3058397336e7ea42c32">00081</a> <span class="keywordtype">string</span> <a class="code" href="ofx__utilities_8cpp.html#50b88c84b759d3058397336e7ea42c32" title="Append an OpenSP CharString to an existing C++ STL string.">AppendCharStringtostring</a>(<span class="keyword">const</span> SGMLApplication::CharString source, <span class="keywordtype">string</span> &dest)
<a name="l00082"></a>00082 {
<a name="l00083"></a>00083 <span class="keywordtype">size_t</span> i;
<a name="l00084"></a>00084 <span class="keywordflow">for</span> (i = 0; i < source.len; i++)
<a name="l00085"></a>00085 {
<a name="l00086"></a>00086 dest+=(char)(((source.ptr)[i]));
<a name="l00087"></a>00087 }
<a name="l00088"></a>00088 <span class="keywordflow">return</span> dest;
<a name="l00089"></a>00089 }
<a name="l00090"></a>00090
<a name="l00106"></a><a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html#5fdbbc08f8d80a534f8db03d25316d7a">00106</a> time_t <a class="code" href="ofx__utilities_8cpp.html#5fdbbc08f8d80a534f8db03d25316d7a" title="Convert a C++ string containing a time in OFX format to a C time_t.">ofxdate_to_time_t</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> ofxdate)
<a name="l00107"></a>00107 {
<a name="l00108"></a>00108 <span class="keyword">struct </span>tm time;
<a name="l00109"></a>00109 <span class="keywordtype">double</span> local_offset; <span class="comment">/* in seconds */</span>
<a name="l00110"></a>00110 <span class="keywordtype">float</span> ofx_gmt_offset; <span class="comment">/* in fractionnal hours */</span>
<a name="l00111"></a>00111 <span class="keywordtype">char</span> timezone[4]; <span class="comment">/* Original timezone: the library does not expose this value*/</span>
<a name="l00112"></a>00112 <span class="keywordtype">char</span> exact_time_specified = <span class="keyword">false</span>;
<a name="l00113"></a>00113 <span class="keywordtype">char</span> time_zone_specified = <span class="keyword">false</span>;
<a name="l00114"></a>00114
<a name="l00115"></a>00115 time_t temptime;
<a name="l00116"></a>00116 std::time(&temptime);
<a name="l00117"></a>00117 local_offset = difftime(mktime(localtime(&temptime)), mktime(gmtime(&temptime)));
<a name="l00118"></a>00118
<a name="l00119"></a>00119 <span class="keywordflow">if</span>(ofxdate.size()!=0){
<a name="l00120"></a>00120 time.tm_year=atoi(ofxdate.substr(0,4).c_str())-1900;
<a name="l00121"></a>00121 time.tm_mon=atoi(ofxdate.substr(4,2).c_str())-1;
<a name="l00122"></a>00122 time.tm_mday=atoi(ofxdate.substr(6,2).c_str());
<a name="l00123"></a>00123 <span class="keywordflow">if</span>(ofxdate.size()>8) {
<a name="l00124"></a>00124 <span class="comment">/* if exact time is specified */</span>
<a name="l00125"></a>00125 exact_time_specified = <span class="keyword">true</span>;
<a name="l00126"></a>00126 time.tm_hour=atoi(ofxdate.substr(8,2).c_str());
<a name="l00127"></a>00127 time.tm_min=atoi(ofxdate.substr(10,2).c_str());
<a name="l00128"></a>00128 time.tm_sec=atoi(ofxdate.substr(12,2).c_str());
<a name="l00129"></a>00129 }
<a name="l00130"></a>00130
<a name="l00131"></a>00131 <span class="comment">/* Check if the timezone has been specified */</span>
<a name="l00132"></a>00132 string::size_type startidx = ofxdate.find(<span class="stringliteral">"["</span>);
<a name="l00133"></a>00133 string::size_type endidx;
<a name="l00134"></a>00134 <span class="keywordflow">if</span>(startidx!=string::npos){
<a name="l00135"></a>00135 <span class="comment">/* Time zone was specified */</span>
<a name="l00136"></a>00136 time_zone_specified = <span class="keyword">true</span>;
<a name="l00137"></a>00137 startidx++;
<a name="l00138"></a>00138 endidx = ofxdate.find(<span class="stringliteral">":"</span>, startidx)-1;
<a name="l00139"></a>00139 ofx_gmt_offset=atof(ofxdate.substr(startidx,(endidx-startidx)+1).c_str());
<a name="l00140"></a>00140 startidx = endidx+2;
<a name="l00141"></a>00141 strncpy(timezone,ofxdate.substr(startidx,3).c_str(),4);
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143 <span class="keywordflow">else</span>{
<a name="l00144"></a>00144 <span class="comment">/* Time zone was not specified, assume GMT (provisionnaly) in case exact time is specified */</span>
<a name="l00145"></a>00145 ofx_gmt_offset=0;
<a name="l00146"></a>00146 strcpy(timezone, <span class="stringliteral">"GMT"</span>);
<a name="l00147"></a>00147 }
<a name="l00148"></a>00148
<a name="l00149"></a>00149 <span class="keywordflow">if</span>(time_zone_specified == <span class="keyword">true</span>)
<a name="l00150"></a>00150 {
<a name="l00151"></a>00151 <span class="comment">/* If the timezone is specified always correct the timezone */</span>
<a name="l00152"></a>00152 <span class="comment">/* If the timezone is not specified, but the exact time is, correct the timezone, assuming GMT following the spec */</span>
<a name="l00153"></a>00153 <span class="comment">/* Correct the time for the timezone */</span>
<a name="l00154"></a>00154 time.tm_sec = time.tm_sec + (int)(local_offset - (ofx_gmt_offset*60*60));<span class="comment">//Convert from fractionnal hours to seconds</span>
<a name="l00155"></a>00155 }
<a name="l00156"></a>00156 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (exact_time_specified == <span class="keyword">false</span>)
<a name="l00157"></a>00157 {
<a name="l00158"></a>00158 <span class="comment">/*Time zone data missing and exact time not specified, diverge from the OFX spec ans assume 11h59 local time */</span>
<a name="l00159"></a>00159 time.tm_hour=11;
<a name="l00160"></a>00160 time.tm_min=59;
<a name="l00161"></a>00161 time.tm_sec=0;
<a name="l00162"></a>00162 }
<a name="l00163"></a>00163 }
<a name="l00164"></a>00164 <span class="keywordflow">else</span>{
<a name="l00165"></a>00165 <a class="code" href="messages_8cpp.html#6af6947c1ec6fcbefd793f80c26d90fa" title="Message output function.">message_out</a>(<a class="code" href="messages_8hh.html#7cd03dafa59895bc306bf220b7b85f692fd6f336d08340583bd620a7f5694c90">ERROR</a>, <span class="stringliteral">"ofxdate_to_time_t(): Unable to convert time, string is 0 length!"</span>);
<a name="l00166"></a>00166 }
<a name="l00167"></a>00167 <span class="keywordflow">return</span> mktime(&time);
<a name="l00168"></a>00168 }
<a name="l00169"></a>00169
<a name="l00174"></a><a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html#bfca5b423e5d7b194eb53c53f706f6ba">00174</a> <span class="keywordtype">double</span> <a class="code" href="ofx__utilities_8cpp.html#bfca5b423e5d7b194eb53c53f706f6ba" title="Convert OFX amount of money to double float.">ofxamount_to_double</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> ofxamount)
<a name="l00175"></a>00175 {
<a name="l00176"></a>00176 <span class="comment">//Replace commas and decimal points for atof()</span>
<a name="l00177"></a>00177 string::size_type idx;
<a name="l00178"></a>00178 <span class="keywordtype">string</span> tmp = ofxamount;
<a name="l00179"></a>00179
<a name="l00180"></a>00180 idx = tmp.find(<span class="charliteral">','</span>);
<a name="l00181"></a>00181 <span class="keywordflow">if</span>(idx==string::npos){
<a name="l00182"></a>00182 idx = tmp.find(<span class="charliteral">'.'</span>);
<a name="l00183"></a>00183 }
<a name="l00184"></a>00184
<a name="l00185"></a>00185 <span class="keywordflow">if</span>(idx!=string::npos){
<a name="l00186"></a>00186 tmp.replace(idx,1,1,((localeconv())->decimal_point)[0]);
<a name="l00187"></a>00187 }
<a name="l00188"></a>00188
<a name="l00189"></a>00189 <span class="keywordflow">return</span> atof(tmp.c_str());
<a name="l00190"></a>00190 }
<a name="l00191"></a>00191
<a name="l00195"></a><a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html#34933785dd934134973847e58a700733">00195</a> <span class="keywordtype">string</span> <a class="code" href="ofx__utilities_8cpp.html#34933785dd934134973847e58a700733" title="Sanitize a string coming from OpenSP.">strip_whitespace</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> para_string)
<a name="l00196"></a>00196 {
<a name="l00197"></a>00197 <span class="keywordtype">size_t</span> index;
<a name="l00198"></a>00198 <span class="keywordtype">size_t</span> i;
<a name="l00199"></a>00199 <span class="keywordtype">string</span> temp_string = para_string;
<a name="l00200"></a>00200 <span class="keyword">const</span> <span class="keywordtype">char</span> *whitespace = <span class="stringliteral">" \b\f\n\r\t\v"</span>;
<a name="l00201"></a>00201 <span class="keyword">const</span> <span class="keywordtype">char</span> *abnormal_whitespace = <span class="stringliteral">"\b\f\n\r\t\v"</span>;<span class="comment">//backspace,formfeed,newline,cariage return, horizontal and vertical tabs</span>
<a name="l00202"></a>00202 <a class="code" href="messages_8cpp.html#6af6947c1ec6fcbefd793f80c26d90fa" title="Message output function.">message_out</a>(<a class="code" href="messages_8hh.html#7cd03dafa59895bc306bf220b7b85f69b03d2afd0c05cf9e3b1a3f60c2545b67">DEBUG4</a>,<span class="stringliteral">"strip_whitespace() Before: |"</span>+temp_string+<span class="stringliteral">"|"</span>);
<a name="l00203"></a>00203 <span class="keywordflow">for</span>(i=0;i<=temp_string.size()&&temp_string.find_first_of(whitespace, i)==i&&temp_string.find_first_of(whitespace, i)!=string::npos;i++);
<a name="l00204"></a>00204 temp_string.erase(0,i);<span class="comment">//Strip leading whitespace</span>
<a name="l00205"></a>00205 <span class="keywordflow">for</span>(i=temp_string.size()-1;(i>=0)&&(temp_string.find_last_of(whitespace, i)==i)&&(temp_string.find_last_of(whitespace, i)!=string::npos);i--);
<a name="l00206"></a>00206 temp_string.erase(i+1,temp_string.size()-(i+1));<span class="comment">//Strip trailing whitespace</span>
<a name="l00207"></a>00207
<a name="l00208"></a>00208 <span class="keywordflow">while</span> ((index = temp_string.find_first_of(abnormal_whitespace))!=string::npos)
<a name="l00209"></a>00209 {
<a name="l00210"></a>00210 temp_string.erase(index,1);<span class="comment">//Strip leading whitespace</span>
<a name="l00211"></a>00211 };
<a name="l00212"></a>00212
<a name="l00213"></a>00213 <a class="code" href="messages_8cpp.html#6af6947c1ec6fcbefd793f80c26d90fa" title="Message output function.">message_out</a>(<a class="code" href="messages_8hh.html#7cd03dafa59895bc306bf220b7b85f69b03d2afd0c05cf9e3b1a3f60c2545b67">DEBUG4</a>,<span class="stringliteral">"strip_whitespace() After: |"</span>+temp_string+<span class="stringliteral">"|"</span>);
<a name="l00214"></a>00214
<a name="l00215"></a>00215 <span class="keywordflow">return</span> temp_string;
<a name="l00216"></a>00216 }
<a name="l00217"></a>00217
<a name="l00218"></a>00218
<a name="l00219"></a><a class="code" href="fx-0_89_80_2lib_2ofx__utilities_8cpp.html#a0e945c824a3012017b4babd721d9f38">00219</a> <span class="keywordtype">int</span> <a class="code" href="ofx__utilities_8cpp.html#a0e945c824a3012017b4babd721d9f38">mkTempFileName</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *tmpl, <span class="keywordtype">char</span> *buffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) {
<a name="l00220"></a>00220 <span class="keyword">const</span> <span class="keywordtype">char</span> *tmp_dir;
<a name="l00221"></a>00221
<a name="l00222"></a>00222 tmp_dir = getenv (<span class="stringliteral">"TMPDIR"</span>);
<a name="l00223"></a>00223 <span class="keywordflow">if</span> (!tmp_dir)
<a name="l00224"></a>00224 tmp_dir = getenv (<span class="stringliteral">"TMP"</span>);
<a name="l00225"></a>00225 <span class="keywordflow">if</span> (!tmp_dir)
<a name="l00226"></a>00226 tmp_dir = getenv (<span class="stringliteral">"TEMP"</span>);
<a name="l00227"></a>00227
<a name="l00228"></a>00228 <span class="keywordflow">if</span> (!tmp_dir)
<a name="l00229"></a>00229 {
<a name="l00230"></a>00230 <span class="preprocessor">#ifdef OS_WIN32</span>
<a name="l00231"></a>00231 <span class="preprocessor"></span> tmp_dir = <span class="stringliteral">"C:\\"</span>;
<a name="l00232"></a>00232 <span class="preprocessor">#else </span>
<a name="l00233"></a>00233 <span class="preprocessor"></span> tmp_dir = <span class="stringliteral">"/tmp"</span>;
<a name="l00234"></a>00234 <span class="preprocessor">#endif </span><span class="comment">/* !OS_WIN32 */</span>
<a name="l00235"></a>00235 }
<a name="l00236"></a>00236
<a name="l00237"></a>00237 strncpy(buffer, tmp_dir, size);
<a name="l00238"></a>00238 assert((strlen(buffer)+strlen(tmpl)+2)<size);
<a name="l00239"></a>00239 strcat(buffer, <a class="code" href="ofx__utilities_8cpp.html#2c89f3449c0cc91f289ecbef54188d8d">DIRSEP</a>);
<a name="l00240"></a>00240 strcat(buffer, tmpl);
<a name="l00241"></a>00241 <span class="keywordflow">return</span> 0;
<a name="l00242"></a>00242 }
<a name="l00243"></a>00243
<a name="l00244"></a>00244
<a name="l00245"></a>00245
</pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Mon Nov 19 20:27:59 2007 for LibOFX by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.3 </small></address>
</body>
</html>
|