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);