29 #include "ParserEventGeneratorKit.h"    39 extern SGMLApplication::OpenEntityPtr 
entity_ptr;
    40 extern SGMLApplication::Position 
position;
    59     curr_container_element = NULL;
    60     is_data_element = 
false;
    61     libofx_context = p_libofx_context;
    76     message_out(
PARSER, 
"startElement event received from OpenSP for element " + identifier);
    80     switch (event.contentType)
    82     case StartElementEvent::empty:
    85     case StartElementEvent::cdata:
    88     case StartElementEvent::rcdata:
    91     case StartElementEvent::mixed:
    93       is_data_element = 
true;
    95     case StartElementEvent::element:
    97       is_data_element = 
false;
   100       message_out(
ERROR, 
"Unknown SGML content type?!?!?!? OpenSP interface changed?");
   103     if (is_data_element == 
false)
   107       if (identifier == 
"OFX")
   110         MainContainer = 
new OfxMainContainer (libofx_context, curr_container_element, identifier);
   111         curr_container_element = MainContainer;
   113       else if (identifier == 
"STATUS")
   116         curr_container_element = 
new OfxStatusContainer (libofx_context, curr_container_element, identifier);
   118       else if (identifier == 
"STMTRS" ||
   119                identifier == 
"CCSTMTRS" ||
   120                identifier == 
"INVSTMTRS")
   123         curr_container_element = 
new OfxStatementContainer (libofx_context, curr_container_element, identifier);
   125       else if (identifier == 
"BANKTRANLIST")
   129         if (curr_container_element && curr_container_element->
type != 
"STATEMENT")
   131           message_out(
ERROR, 
"Element " + identifier + 
" found while not inside a STATEMENT container");
   135           curr_container_element = 
new OfxPushUpContainer (libofx_context, curr_container_element, identifier);
   138       else if (identifier == 
"STMTTRN")
   143       else if (identifier == 
"BUYDEBT" ||
   144                identifier == 
"BUYMF" ||
   145                identifier == 
"BUYOPT" ||
   146                identifier == 
"BUYOTHER" ||
   147                identifier == 
"BUYSTOCK" ||
   148                identifier == 
"CLOSUREOPT" ||
   149                identifier == 
"INCOME" ||
   150                identifier == 
"INVEXPENSE" ||
   151                identifier == 
"JRNLFUND" ||
   152                identifier == 
"JRNLSEC" ||
   153                identifier == 
"MARGININTEREST" ||
   154                identifier == 
"REINVEST" ||
   155                identifier == 
"RETOFCAP" ||
   156                identifier == 
"SELLDEBT" ||
   157                identifier == 
"SELLMF" ||
   158                identifier == 
"SELLOPT" ||
   159                identifier == 
"SELLOTHER" ||
   160                identifier == 
"SELLSTOCK" ||
   161                identifier == 
"SPLIT" ||
   162                identifier == 
"TRANSFER" )
   168       else if (identifier == 
"INVBUY" ||
   169                identifier == 
"INVSELL" ||
   170                identifier == 
"INVTRAN" ||
   171                identifier == 
"SECID")
   174         curr_container_element = 
new OfxPushUpContainer (libofx_context, curr_container_element, identifier);
   178       else if (identifier == 
"BANKACCTFROM" || identifier == 
"CCACCTFROM" || identifier == 
"INVACCTFROM")
   181         curr_container_element = 
new OfxAccountContainer (libofx_context, curr_container_element, identifier);
   183       else if (identifier == 
"SECINFO")
   186         curr_container_element = 
new OfxSecurityContainer (libofx_context, curr_container_element, identifier);
   189       else if (identifier == 
"LEDGERBAL" || identifier == 
"AVAILBAL")
   192         curr_container_element = 
new OfxBalanceContainer (libofx_context, curr_container_element, identifier);
   197         curr_container_element = 
new OfxDummyContainer(libofx_context, curr_container_element, identifier);
   205       if (incoming_data != 
"")
   207         message_out (
ERROR, 
"startElement: incoming_data should be empty! You are probably using OpenSP <= 1.3.4.  The following data was lost: " + incoming_data );
   208         incoming_data.assign (
"");
   220     bool end_element_for_data_element;
   223     end_element_for_data_element = is_data_element;
   224     message_out(
PARSER, 
"endElement event received from OpenSP for element " + identifier);
   227     if (curr_container_element == NULL)
   229       message_out (
ERROR, 
"Tried to close a " + identifier + 
" without a open element (NULL pointer)");
   230       incoming_data.assign (
"");
   234       if (end_element_for_data_element == 
true)
   238         curr_container_element->
add_attribute (identifier, incoming_data);
   239         message_out (
PARSER, 
"endElement: Added data '" + incoming_data + 
"' from " + identifier + 
" to " + curr_container_element->
type + 
" container_element");
   240         incoming_data.assign (
"");
   241         is_data_element = 
false;
   247           if (incoming_data != 
"")
   249             message_out(
ERROR, 
"End tag for non data element " + identifier + 
", incoming data should be empty but contains: " + incoming_data + 
" DATA HAS BEEN LOST SOMEWHERE!");
   252           if (identifier == 
"OFX")
   255             tmp_container_element = curr_container_element;
   256             curr_container_element = curr_container_element->
getparent ();
   257             if (curr_container_element == NULL)
   260               curr_container_element = tmp_container_element;
   262             if (MainContainer != NULL)
   265               delete MainContainer;
   266               MainContainer = NULL;
   267               curr_container_element = NULL;
   268               message_out (
DEBUG, 
"Element " + identifier + 
" closed, MainContainer destroyed");
   272               message_out (
DEBUG, 
"Element " + identifier + 
" closed, but there was no MainContainer to destroy (probably a malformed file)!");
   277             tmp_container_element = curr_container_element;
   278             curr_container_element = curr_container_element->
getparent ();
   279             if (MainContainer != NULL)
   282               message_out (
PARSER, 
"Element " + identifier + 
" closed, object added to MainContainer");
   286               message_out (
ERROR, 
"MainContainer is NULL trying to add element " + identifier);
   292           message_out (
ERROR, 
"Tried to close a " + identifier + 
" but a " + curr_container_element->
type + 
" is currently open.");
   302   void data (
const DataEvent & event)
   307     message_out(
PARSER, 
"data event received from OpenSP, incoming_data is now: " + incoming_data);
   314   void error (
const ErrorEvent & event)
   321     message = message + 
"OpenSP parser: ";
   324     case SGMLApplication::ErrorEvent::quantity:
   325       message = message + 
"quantity (Exceeding a quantity limit):";
   328     case SGMLApplication::ErrorEvent::idref:
   329       message = message + 
"idref (An IDREF to a non-existent ID):";
   332     case SGMLApplication::ErrorEvent::capacity:
   333       message = message + 
"capacity (Exceeding a capacity limit):";
   336     case SGMLApplication::ErrorEvent::otherError:
   337       message = message + 
"otherError (misc parse error):";
   340     case SGMLApplication::ErrorEvent::warning:
   341       message = message + 
"warning (Not actually an error.):";
   344     case SGMLApplication::ErrorEvent::info:
   345       message =  message + 
"info (An informationnal message.  Not actually an error):";
   349       message = message + 
"OpenSP sent an unknown error to LibOFX (You probably have a newer version of OpenSP):";
   380   ParserEventGeneratorKit parserKit;
   381   parserKit.setOption (ParserEventGeneratorKit::showOpenEntities);
   382   EventGenerator *egp = parserKit.makeEventGenerator (argc, argv);
   383   egp->inhibitMessages (
true);  
   385   unsigned nErrors = egp->run (*app); 
 Represents a security, such as a stock or bond. 
OfxGenericContainer * getparent()
Returns the parent container object (the one representing the containing OFX SGML element) ...
A generic container for an OFX SGML element. Every container inherits from OfxGenericContainer. 
void openEntityChange(const OpenEntityPtr ¶_entity_ptr)
Callback: Receive internal OpenSP state. 
SGMLApplication::Position position
virtual void add_attribute(const string identifier, const string value)
Add data to a container object. 
string AppendCharStringtostring(const SGMLApplication::CharString source, string &dest)
Append an OpenSP CharString to an existing C++ STL string. 
void error(const ErrorEvent &event)
Callback: SGML parse error. 
void data(const DataEvent &event)
Callback: Data from an OFX element. 
int message_out(OfxMsgType error_type, const string message)
Message output function. 
OFX/SGML parsing functionnality. 
string CharStringtostring(const SGMLApplication::CharString source, string &dest)
Convert OpenSP CharString to a C++ STL string. 
Various simple functions for type conversion & al. 
int ofx_proc_sgml(LibofxContext *libofx_context, int argc, char *const *argv)
Parses a DTD and OFX file(s) 
Represents a statement for either a bank account or a credit card account. 
virtual int add_to_main_tree()
Add this container to the main tree. 
Represents a bank or credid card transaction. 
A container to hold a OFX SGML element for which you want the parent to process it's data elements...
void startElement(const StartElementEvent &event)
Callback: Start of an OFX element. 
SGMLApplication::OpenEntityPtr entity_ptr
string strip_whitespace(const string para_string)
Sanitize a string coming from OpenSP. 
LibOFX internal object code. 
Message IO functionality. 
Represents a bank or credid card transaction. 
Represents a bank account or a credit card account. 
The root container. Created by the <OFX> OFX element or by the export functions. 
int gen_event()
Generate libofx.h events. 
This object is driven by OpenSP as it parses the SGML from the ofx file(s) 
void endElement(const EndElementEvent &event)
Callback: End of an OFX element. 
A container to holds OFX SGML elements that LibOFX knows nothing about. 
Represents the <BALANCE> OFX SGML entity. 
Represents the <STATUS> OFX SGML entity.