#include "TrainInfo.h" //#include "string_nocase.h" //#include "Util.h" //#include "Exceptions.h" #include "Logger.h" #include "HttpClient.h" #include #include #include #include using namespace std; vector traininfoList; TrainInfo tmpTrainInfo; ostringstream buffer; string ConvertUpdateInfo(char ch) { string result; switch ( ch) { case '1': result = "< 3 min"; break; case '2': result = "3 - 10 min"; break; case '3': result = "> 10 min"; break; case '4': result = "No info"; break; default: result = "Unknown"; } return result; } void startElement(void *userData, const char *el, const char **attr) { buffer.str(""); //clear buffer } void endElement(void *userData, const char *el) { string name(el); if (name == "time") { tmpTrainInfo.time = buffer.str(); } else if (name == "updated") { tmpTrainInfo.update = ConvertUpdateInfo( buffer.str().at(0) ); } else if (name == "trainnumber") { tmpTrainInfo.type = buffer.str(); } else if (name == "destination") { tmpTrainInfo.destination = buffer.str(); } else if (name == "origin") { tmpTrainInfo.origin = buffer.str(); } else if (name == "location") { tmpTrainInfo.current = buffer.str(); } else if (name == "status") { tmpTrainInfo.status = buffer.str(); } else if (name == "note") { tmpTrainInfo.note = buffer.str(); } else if (name == "train") { traininfoList.push_back(tmpTrainInfo); } } void charData(void *userData, const XML_Char *s,int len) { for (int i=0; i GetTrainInfo(int stationID) { traininfoList.clear(); ostringstream url; url << "http://app.t-hoerup.dk/TrainInfoService/DepartureServlet?format=xml&station=" << stationID; XML_Parser parser = NULL; try { string trainXml = HttpClient::GetString( url.str() ); parser = XML_ParserCreate( NULL ); XML_SetElementHandler(parser, startElement, endElement); XML_SetCharacterDataHandler(parser, charData); int isFinal = 1; //this XML_Parse(parser, trainXml.c_str(), trainXml.size(), isFinal); } catch (exception &e) { Logger::logMessage( e.what() ); } catch (... ) { Logger::logMessage( "unknown error in GetTrainInfo(int stationID)" ); } if (parser != NULL) XML_ParserFree(parser); return traininfoList; } /* //old html screen scaper bit vector GetTrainInfo(string stationcode, string stationname) { vector result; string url = string("http://www.bane.dk/visStation.asp?W=FJRN&S=") + stationcode + "&artikelId=4275&statnavn=" + stationname; //string raw_doc = Util::readUrl(url, "/tmp/sms_tog.tmp" ); string raw_doc; try { raw_doc = HttpClient::GetString(url); } catch (httpexception& e) { Logger::logMessage(e.what()); } if (raw_doc == "") { throw std::runtime_error("Connection timeout"); } raw_doc = Util::str_replace(raw_doc, "\"", "'"); string_nocase html = raw_doc.c_str(); unsigned int pos =0; unsigned int ankomstpos = html.find("id='ankomsttabel'"); while (1) { //start with time pos = html.find("", pos); if (pos == string::npos) break; if (pos > ankomstpos) break; TrainInfo info; pos = html.find("", pos); info.time = html.substr(start, stop-start).c_str(); //update info pos = html.find("", pos); pos += 54; char update = html.at(pos); info.update = ConvertUpdateInfo(update); //type pos = html.find( "", pos); start = pos + 20; stop = html.find("", pos); info.type = html.substr(start, stop-start).c_str(); //destination pos = html.find( "", pos); start = pos + 16; stop = html.find( "", pos); info.destination = html.substr(start, stop-start).c_str(); //origin pos = html.find( "", pos); start = pos + 20; stop = html.find( "", pos); info.origin = html.substr(start, stop-start).c_str(); //Current location pos++; //since origin and current use the same search pattern, we must increase the position //so we don't get origin twice. pos = html.find( "", pos); start = pos + 20; stop = html.find( "", pos); info.current = html.substr(start, stop-start).c_str(); //status pos = html.find( "", pos); start = pos + 19; stop = html.find( "", pos); info.status = html.substr(start, stop-start).c_str(); //note pos = html.find( "", pos); start = pos + 16; stop = html.find( "", pos); info.note = html.substr(start, stop-start).c_str(); CleanTrainInfo(info); result.push_back(info); } return result; } */