29 #include "ParserEventGeneratorKit.h" 
   37 extern SGMLApplication::OpenEntityPtr 
entity_ptr;
 
   38 extern SGMLApplication::Position 
position;
 
   49   std::string incoming_data; 
 
   55     curr_container_element = NULL;
 
   56     is_data_element = 
false;
 
   57     libofx_context = p_libofx_context;
 
   67     message_out(
PARSER, 
"startElement event received from OpenSP for element " + identifier);
 
   71     switch (event.contentType)
 
   73     case StartElementEvent::empty:
 
   76     case StartElementEvent::cdata:
 
   79     case StartElementEvent::rcdata:
 
   82     case StartElementEvent::mixed:
 
   84       is_data_element = 
true;
 
   86     case StartElementEvent::element:
 
   88       is_data_element = 
false;
 
   91       message_out(
ERROR, 
"Unknown SGML content type?!?!?!? OpenSP interface changed?");
 
   94     if (is_data_element == 
false)
 
   98       if (identifier == 
"OFC")
 
  101         MainContainer = 
new OfxMainContainer (libofx_context, curr_container_element, identifier);
 
  102         curr_container_element = MainContainer;
 
  104       else if (identifier == 
"STATUS")
 
  107         curr_container_element = 
new OfxStatusContainer (libofx_context, curr_container_element, identifier);
 
  109       else if (identifier == 
"ACCTSTMT")
 
  112         curr_container_element = 
new OfxStatementContainer (libofx_context, curr_container_element, identifier);
 
  114       else if (identifier == 
"STMTRS")
 
  118         if (curr_container_element == NULL || curr_container_element->
type != 
"STATEMENT")
 
  120           message_out(
ERROR, 
"Element " + identifier + 
" found while not inside a STATEMENT container");
 
  124           curr_container_element = 
new OfxPushUpContainer (libofx_context, curr_container_element, identifier);
 
  127       else if (identifier == 
"GENTRN" ||
 
  128                identifier == 
"STMTTRN")
 
  133       else if (identifier == 
"BUYDEBT" ||
 
  134                identifier == 
"BUYMF" ||
 
  135                identifier == 
"BUYOPT" ||
 
  136                identifier == 
"BUYOTHER" ||
 
  137                identifier == 
"BUYSTOCK" ||
 
  138                identifier == 
"CLOSUREOPT" ||
 
  139                identifier == 
"INCOME" ||
 
  140                identifier == 
"INVEXPENSE" ||
 
  141                identifier == 
"JRNLFUND" ||
 
  142                identifier == 
"JRNLSEC" ||
 
  143                identifier == 
"MARGININTEREST" ||
 
  144                identifier == 
"REINVEST" ||
 
  145                identifier == 
"RETOFCAP" ||
 
  146                identifier == 
"SELLDEBT" ||
 
  147                identifier == 
"SELLMF" ||
 
  148                identifier == 
"SELLOPT" ||
 
  149                identifier == 
"SELLOTHER" ||
 
  150                identifier == 
"SELLSTOCK" ||
 
  151                identifier == 
"SPLIT" ||
 
  152                identifier == 
"TRANSFER" )
 
  158       else if (identifier == 
"INVBUY" ||
 
  159                identifier == 
"INVSELL" ||
 
  160                identifier == 
"INVTRAN" ||
 
  161                identifier == 
"SECID")
 
  164         curr_container_element = 
new OfxPushUpContainer (libofx_context, curr_container_element, identifier);
 
  168       else if (identifier == 
"ACCOUNT" ||
 
  169                identifier == 
"ACCTFROM" )
 
  172         curr_container_element = 
new OfxAccountContainer (libofx_context, curr_container_element, identifier);
 
  174       else if (identifier == 
"SECINFO")
 
  177         curr_container_element = 
new OfxSecurityContainer (libofx_context, curr_container_element, identifier);
 
  180       else if (identifier == 
"LEDGERBAL" || identifier == 
"AVAILBAL")
 
  183         curr_container_element = 
new OfxBalanceContainer (libofx_context, curr_container_element, identifier);
 
  188         curr_container_element = 
new OfxDummyContainer(libofx_context, curr_container_element, identifier);
 
  196       if (incoming_data != 
"")
 
  198         message_out (
ERROR, 
"startElement: incoming_data should be empty! You are probably using OpenSP <= 1.3.4.  The following data was lost: " + incoming_data );
 
  199         incoming_data.assign (
"");
 
  211     bool end_element_for_data_element = is_data_element;
 
  212     message_out(
PARSER, 
"endElement event received from OpenSP for element " + identifier);
 
  215     if (curr_container_element == NULL)
 
  217       message_out (
ERROR, 
"Tried to close a " + identifier + 
" without a open element (NULL pointer)");
 
  218       incoming_data.assign (
"");
 
  222       if (end_element_for_data_element == 
true)
 
  226         curr_container_element->
add_attribute (identifier, incoming_data);
 
  227         message_out (
PARSER, 
"endElement: Added data '" + incoming_data + 
"' from " + identifier + 
" to " + curr_container_element->
type + 
" container_element");
 
  228         incoming_data.assign (
"");
 
  229         is_data_element = 
false;
 
  235           if (incoming_data != 
"")
 
  237             message_out(
ERROR, 
"End tag for non data element " + identifier + 
", incoming data should be empty but contains: " + incoming_data + 
" DATA HAS BEEN LOST SOMEWHERE!");
 
  240           if (identifier == 
"OFX")
 
  243             tmp_container_element = curr_container_element;
 
  244             curr_container_element = curr_container_element->
getparent ();
 
  246             delete MainContainer;
 
  247             MainContainer = NULL;
 
  248             message_out (
DEBUG, 
"Element " + identifier + 
" closed, MainContainer destroyed");
 
  252             tmp_container_element = curr_container_element;
 
  253             curr_container_element = curr_container_element->
getparent ();
 
  254             if (MainContainer != NULL)
 
  257               message_out (
PARSER, 
"Element " + identifier + 
" closed, object added to MainContainer");
 
  261               message_out (
ERROR, 
"MainContainer is NULL trying to add element " + identifier);
 
  267           message_out (
ERROR, 
"Tried to close a " + identifier + 
" but a " + curr_container_element->
type + 
" is currently open.");
 
  277   void data (
const DataEvent & event)
 
  282     message_out(
PARSER, 
"data event received from OpenSP, incoming_data is now: " + incoming_data);
 
  289   void error (
const ErrorEvent & event)
 
  295     message = message + 
"OpenSP parser: ";
 
  298     case SGMLApplication::ErrorEvent::quantity:
 
  299       message = message + 
"quantity (Exceeding a quantity limit):";
 
  302     case SGMLApplication::ErrorEvent::idref:
 
  303       message = message + 
"idref (An IDREF to a non-existent ID):";
 
  306     case SGMLApplication::ErrorEvent::capacity:
 
  307       message = message + 
"capacity (Exceeding a capacity limit):";
 
  310     case SGMLApplication::ErrorEvent::otherError:
 
  311       message = message + 
"otherError (misc parse error):";
 
  314     case SGMLApplication::ErrorEvent::warning:
 
  315       message = message + 
"warning (Not actually an error.):";
 
  318     case SGMLApplication::ErrorEvent::info:
 
  319       message =  message + 
"info (An informationnal message.  Not actually an error):";
 
  323       message = message + 
"OpenSP sent an unknown error to LibOFX (You probably have a newer version of OpenSP):";
 
  354   ParserEventGeneratorKit parserKit;
 
  355   parserKit.setOption (ParserEventGeneratorKit::showOpenEntities);
 
  356   EventGenerator *egp = parserKit.makeEventGenerator (argc, argv);
 
  357   egp->inhibitMessages (
true);  
 
  359   unsigned nErrors = egp->run (*app);