Main Page | Class Hierarchy | Data Structures | File List | Data Fields | Globals

ofx_container_main.cpp

Go to the documentation of this file.
00001 /*************************************************************************** 00002 ofx_container_main.cpp 00003 ------------------- 00004 copyright : (C) 2002 by Benoit Grégoire 00005 email : bock@step.polymtl.ca 00006 ***************************************************************************/ 00010 /*************************************************************************** 00011 * * 00012 * This program is free software; you can redistribute it and/or modify * 00013 * it under the terms of the GNU General Public License as published by * 00014 * the Free Software Foundation; either version 2 of the License, or * 00015 * (at your option) any later version. * 00016 * * 00017 ***************************************************************************/ 00018 00019 #ifdef HAVE_CONFIG_H 00020 #include <config.h> 00021 #endif 00022 00023 #include <string> 00024 #include <iostream> 00025 #include "ParserEventGeneratorKit.h" 00026 #include "messages.hh" 00027 #include "libofx.h" 00028 #include "ofx_containers.hh" 00029 00030 OfxMainContainer::OfxMainContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier): 00031 OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier) 00032 { 00033 00034 //statement_tree_top=statement_tree.insert(statement_tree_top, NULL); 00035 //security_tree_top=security_tree.insert(security_tree_top, NULL); 00036 00037 } 00038 OfxMainContainer::~OfxMainContainer() 00039 { 00040 message_out(DEBUG,"Entering the main container's destructor"); 00041 tree<OfxGenericContainer *>::iterator tmp = security_tree.begin(); 00042 00043 while(tmp!=security_tree.end()) 00044 { 00045 message_out(DEBUG,"Deleting "+(*tmp)->type); 00046 delete (*tmp); 00047 ++tmp; 00048 } 00049 tmp = account_tree.begin(); 00050 while(tmp!=account_tree.end()) 00051 { 00052 message_out(DEBUG,"Deleting "+(*tmp)->type); 00053 delete (*tmp); 00054 ++tmp; 00055 } 00056 } 00057 int OfxMainContainer::add_container(OfxGenericContainer * container) 00058 { 00059 message_out(DEBUG,"OfxMainContainer::add_container for element " + container->tag_identifier + "; destroying the generic container"); 00060 /* Call gen_event anyway, it could be a status container or similar */ 00061 container->gen_event(); 00062 delete container; 00063 return 0; 00064 } 00065 00066 int OfxMainContainer::add_container(OfxSecurityContainer * container) 00067 { 00068 message_out(DEBUG,"OfxMainContainer::add_container, adding a security"); 00069 security_tree.insert(security_tree.begin(), container); 00070 return true; 00071 00072 00073 } 00074 00075 int OfxMainContainer::add_container(OfxAccountContainer * container) 00076 { 00077 message_out(DEBUG,"OfxMainContainer::add_container, adding an account"); 00078 if( account_tree.size()==0) 00079 { 00080 message_out(DEBUG,"OfxMainContainer::add_container, account is the first account"); 00081 account_tree.insert(account_tree.begin(), container); 00082 } 00083 else 00084 { 00085 message_out(DEBUG,"OfxMainContainer::add_container, account is not the first account"); 00086 tree<OfxGenericContainer *>::sibling_iterator tmp = account_tree.begin(); 00087 tmp += (account_tree.number_of_siblings(tmp))-2; //Find last account 00088 account_tree.insert_after(tmp, container); 00089 } 00090 return true; 00091 } 00092 00093 int OfxMainContainer::add_container(OfxStatementContainer * container) 00094 { 00095 message_out(DEBUG,"OfxMainContainer::add_container, adding a statement"); 00096 tree<OfxGenericContainer *>::sibling_iterator tmp = account_tree.begin(); 00097 //cerr<< "size="<<account_tree.size()<<"; num_sibblings="<<account_tree.number_of_siblings(tmp)<<endl; 00098 tmp += (account_tree.number_of_siblings(tmp))-2; //Find last account 00099 00100 if(account_tree.is_valid(tmp)) 00101 { 00102 message_out(DEBUG,"1: tmp is valid, Accounts are present"); 00103 tree<OfxGenericContainer *>::iterator child = account_tree.begin(tmp); 00104 if(account_tree.number_of_children(tmp)!=0) 00105 { 00106 message_out(DEBUG,"There are already children for this account"); 00107 account_tree.insert(tmp.begin(), container); 00108 00109 } 00110 else 00111 { 00112 message_out(DEBUG,"There are no children for this account"); 00113 account_tree.append_child(tmp,container); 00114 } 00115 container->add_account(&( ((OfxAccountContainer *)(*tmp))->data)); 00116 return true; 00117 } 00118 else 00119 { 00120 message_out(ERROR,"OfxMainContainer::add_container, no accounts are present (tmp is invalid)"); 00121 return false; 00122 } 00123 } 00124 00125 int OfxMainContainer::add_container(OfxTransactionContainer * container) 00126 { 00127 message_out(DEBUG,"OfxMainContainer::add_container, adding a transaction"); 00128 00129 if( account_tree.size()!=0) 00130 { 00131 tree<OfxGenericContainer *>::sibling_iterator tmp = account_tree.begin(); 00132 //cerr<< "size="<<account_tree.size()<<"; num_sibblings="<<account_tree.number_of_siblings(tmp)<<endl; 00133 tmp += (account_tree.number_of_siblings(tmp))-2; //Find last account 00134 if(account_tree.is_valid(tmp)) 00135 { 00136 message_out(DEBUG,"OfxMainContainer::add_container: tmp is valid, Accounts are present"); 00137 account_tree.append_child(tmp,container); 00138 container->add_account(&(((OfxAccountContainer *)(*tmp))->data)); 00139 return true; 00140 } 00141 else 00142 { 00143 message_out(ERROR,"OfxMainContainer::add_container: tmp is invalid!"); 00144 return false; 00145 } 00146 } 00147 else 00148 { 00149 message_out(ERROR,"OfxMainContainer::add_container: the tree is empty!"); 00150 return false; 00151 } 00152 } 00153 00154 int OfxMainContainer::gen_event() 00155 { 00156 message_out(DEBUG,"Begin walking the trees of the main container to generate events"); 00157 tree<OfxGenericContainer *>::iterator tmp = security_tree.begin(); 00158 //cerr<<"security_tree.size(): "<<security_tree.size()<<endl; 00159 int i = 0; 00160 while(tmp!=security_tree.end()) 00161 { 00162 message_out(DEBUG,"Looping..."); 00163 //cerr <<i<<endl; 00164 i++; 00165 (*tmp)->gen_event(); 00166 ++tmp; 00167 } 00168 tmp = account_tree.begin(); 00169 //cerr<<account_tree.size()<<endl; 00170 i = 0; 00171 while(tmp!=account_tree.end()) 00172 { 00173 //cerr<< "i="<<i<<"; depth="<<account_tree.depth(tmp)<<endl; 00174 i++; 00175 (*tmp)->gen_event(); 00176 ++tmp; 00177 } 00178 return true; 00179 } 00180 00181 OfxSecurityData * OfxMainContainer::find_security(string unique_id) 00182 { 00183 message_out(DEBUG,"OfxMainContainer::find_security() Begin."); 00184 00185 tree<OfxGenericContainer *>::sibling_iterator tmp = security_tree.begin(); 00186 OfxSecurityData * retval = NULL; 00187 while(tmp!=security_tree.end()&&retval==NULL) 00188 { 00189 if(((OfxSecurityContainer*)(*tmp))->data.unique_id==unique_id) 00190 { message_out(DEBUG,(string)"Security "+((OfxSecurityContainer*)(*tmp))->data.unique_id+" found."); 00191 retval=&((OfxSecurityContainer*)(*tmp))->data; 00192 } 00193 ++tmp; 00194 } 00195 return retval; 00196 }

Generated on Fri Oct 8 20:34:47 2004 for LibOFX by doxygen 1.3.7