00001
00002
00003
00004
00005
00006
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 #include <config.h>
00024 #endif
00025
00026 #include <iostream>
00027 #include <stdlib.h>
00028 #include <string>
00029 #include "messages.hh"
00030 #include "libofx.h"
00031 #include "ofx_error_msg.hh"
00032 #include "ofx_utilities.hh"
00033 #include "ofx_containers.hh"
00034
00035 extern OfxMainContainer * MainContainer;
00036
00037
00038
00039
00040
00041 OfxDummyContainer::OfxDummyContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00042 OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00043 {
00044 type="DUMMY";
00045 message_out(INFO, "Created OfxDummyContainer to hold unsupported aggregate "+para_tag_identifier);
00046 }
00047 void OfxDummyContainer::add_attribute(const string identifier, const string value)
00048 {
00049 message_out(DEBUG, "OfxDummyContainer for "+tag_identifier+" ignored a "+identifier+" ("+value+")");
00050 }
00051
00052
00053
00054
00055
00056 OfxPushUpContainer::OfxPushUpContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00057 OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00058 {
00059 type="PUSHUP";
00060 message_out(DEBUG, "Created OfxPushUpContainer to hold aggregate "+tag_identifier);
00061 }
00062 void OfxPushUpContainer::add_attribute(const string identifier, const string value)
00063 {
00064
00065 parentcontainer->add_attribute(identifier, value);
00066 }
00067
00068
00069
00070
00071
00072 OfxStatusContainer::OfxStatusContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00073 OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00074 {
00075 memset(&data,0,sizeof(data));
00076 type="STATUS";
00077 if (parentcontainer!=NULL){
00078 strncpy(data.ofx_element_name, parentcontainer->tag_identifier.c_str(), OFX_ELEMENT_NAME_LENGTH);
00079 data.ofx_element_name_valid=true;
00080 }
00081
00082 }
00083 OfxStatusContainer::~OfxStatusContainer()
00084 {
00085 message_out(DEBUG,"Entering the status's container's destructor");
00086
00087 libofx_context->statusCallback(data);
00088
00089 if ( data.server_message_valid )
00090 delete [] data.server_message;
00091 }
00092
00093 void OfxStatusContainer::add_attribute(const string identifier, const string value)
00094 {
00095 ErrorMsg error_msg;
00096
00097 if( identifier=="CODE"){
00098 data.code=atoi(value.c_str());
00099 error_msg = find_error_msg(data.code);
00100 data.name = error_msg.name;
00101 data.description = error_msg.description;
00102 data.code_valid = true;
00103 }
00104 else if(identifier=="SEVERITY"){
00105 data.severity_valid = true;
00106 if(value=="INFO") {
00107 data.severity=OfxStatusData::INFO;
00108 }
00109 else if(value=="WARN") {
00110 data.severity=OfxStatusData::WARN;
00111 }
00112 else if(value=="ERROR") {
00113 data.severity=OfxStatusData::ERROR;
00114 }
00115 else{
00116 message_out(ERROR, "WRITEME: Unknown severity "+value+" inside a "+type+" container");
00117 data.severity_valid = false;
00118 }
00119 }
00120 else if((identifier=="MESSAGE")||(identifier=="MESSAGE2")){
00121 data.server_message=new char[value.length()+1];
00122 strcpy(data.server_message,value.c_str());
00123 data.server_message_valid=true;
00124 }
00125 else{
00126
00127 OfxGenericContainer::add_attribute(identifier, value);
00128 }
00129 }
00130
00131
00132
00133
00134
00135
00136
00137 OfxBalanceContainer::OfxBalanceContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00138 OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00139 {
00140 amount_valid=false;
00141 date_valid=false;
00142 type="BALANCE";
00143 }
00144
00145 OfxBalanceContainer::~OfxBalanceContainer()
00146 {
00147 if (parentcontainer->type == "STATEMENT")
00148 {
00149 ((OfxStatementContainer*)parentcontainer)->add_balance(this);
00150 }
00151 else
00152 {
00153 message_out (ERROR,"I completed a " + type + " element, but I havent found a suitable parent to save it");
00154 }
00155 }
00156 void OfxBalanceContainer::add_attribute(const string identifier, const string value)
00157 {
00158 if(identifier=="BALAMT"){
00159 amount=ofxamount_to_double(value);
00160 amount_valid=true;
00161 }
00162 else if(identifier=="DTASOF"){
00163 date = ofxdate_to_time_t(value);
00164 date_valid = true;
00165 }
00166 else{
00167
00168 OfxGenericContainer::add_attribute(identifier, value);
00169 }
00170 }