ofx_containers_misc.cpp
Go to the documentation of this file.

    00001 /***************************************************************************
    00002          ofx_proc_rs.cpp
    00003                              -------------------
    00004     copyright            : (C) 2002 by Benoit Grégoire
    00005     email                : benoitg@coeus.ca
    00006 ***************************************************************************/
    00013 /***************************************************************************
    00014  *                                                                         *
    00015  *   This program is free software; you can redistribute it and/or modify  *
    00016  *   it under the terms of the GNU General Public License as published by  *
    00017  *   the Free Software Foundation; either version 2 of the License, or     *
    00018  *   (at your option) any later version.                                   *
    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  *                         OfxDummyContainer                               *
    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  *                         OfxPushUpContainer                              *
    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   //message_out(DEBUG, "OfxPushUpContainer for "+tag_identifier+" will push up a "+identifier+" ("+value+") to a "+ parentcontainer->type + " container");
    00065   parentcontainer->add_attribute(identifier, value);
    00066 }
    00067
    00068 /***************************************************************************
    00069  *                         OfxStatusContainer                              *
    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   {
    00079     strncpy(data.ofx_element_name, parentcontainer->tag_identifier.c_str(), OFX_ELEMENT_NAME_LENGTH);
    00080     data.ofx_element_name_valid = true;
    00081   }
    00082
    00083 }
    00084 OfxStatusContainer::~OfxStatusContainer()
    00085 {
    00086   message_out(DEBUG, "Entering the status's container's destructor");
    00087
    00088   libofx_context->statusCallback(data);
    00089
    00090   if ( data.server_message_valid )
    00091     delete [] data.server_message;
    00092 }
    00093
    00094 void OfxStatusContainer::add_attribute(const string identifier, const string value)
    00095 {
    00096   ErrorMsg error_msg;
    00097
    00098   if ( identifier == "CODE")
    00099   {
    00100     data.code = atoi(value.c_str());
    00101     error_msg = find_error_msg(data.code);
    00102     data.name = error_msg.name;//memory is already allocated
    00103     data.description = error_msg.description;//memory is already allocated
    00104     data.code_valid = true;
    00105   }
    00106   else if (identifier == "SEVERITY")
    00107   {
    00108     data.severity_valid = true;
    00109     if (value == "INFO")
    00110     {
    00111       data.severity = OfxStatusData::INFO;
    00112     }
    00113     else if (value == "WARN")
    00114     {
    00115       data.severity = OfxStatusData::WARN;
    00116     }
    00117     else if (value == "ERROR")
    00118     {
    00119       data.severity = OfxStatusData::ERROR;
    00120     }
    00121     else
    00122     {
    00123       message_out(ERROR, "WRITEME: Unknown severity " + value + " inside a " + type + " container");
    00124       data.severity_valid = false;
    00125     }
    00126   }
    00127   else if ((identifier == "MESSAGE") || (identifier == "MESSAGE2"))
    00128   {
    00129     data.server_message = new char[value.length()+1];
    00130     strcpy(data.server_message, value.c_str());
    00131     data.server_message_valid = true;
    00132   }
    00133   else
    00134   {
    00135     /* Redirect unknown identifiers to the base class */
    00136     OfxGenericContainer::add_attribute(identifier, value);
    00137   }
    00138 }
    00139
    00140
    00141
    00142 /***************************************************************************
    00143  * OfxBalanceContainer  (does not directly abstract a object in libofx.h)  *
    00144  ***************************************************************************/
    00145
    00146 OfxBalanceContainer::OfxBalanceContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
    00147   OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
    00148 {
    00149   amount_valid = false;
    00150   date_valid = false;
    00151   type = "BALANCE";
    00152 }
    00153
    00154 OfxBalanceContainer::~OfxBalanceContainer()
    00155 {
    00156   if (parentcontainer->type == "STATEMENT")
    00157   {
    00158     ((OfxStatementContainer*)parentcontainer)->add_balance(this);
    00159   }
    00160   else
    00161   {
    00162     message_out (ERROR, "I completed a " + type + " element, but I havent found a suitable parent to save it");
    00163   }
    00164 }
    00165 void OfxBalanceContainer::add_attribute(const string identifier, const string value)
    00166 {
    00167   if (identifier == "BALAMT")
    00168   {
    00169     amount = ofxamount_to_double(value);
    00170     amount_valid = true;
    00171   }
    00172   else if (identifier == "DTASOF")
    00173   {
    00174     date = ofxdate_to_time_t(value);
    00175     date_valid = true;
    00176   }
    00177   else
    00178   {
    00179     /* Redirect unknown identifiers to the base class */
    00180     OfxGenericContainer::add_attribute(identifier, value);
    00181   }
    00182 }