JourneyDetailResultList * Parser131500ComAu::parseDetails(JourneyResultItem *journeyitem)
{
    QString element = journeyitem->internalData1();
    element.replace("am+", "am");
    element.replace("pm+", "pm");

    QStringList detailResults = element.split("<linesep>");
    JourneyDetailResultList *results = new JourneyDetailResultList();

    QDate journeydate = journeyitem->date();

    for (int i = 0; i < detailResults.count(); i++) {
        JourneyDetailResultItem *item = new JourneyDetailResultItem();

        QRegExp regexp = QRegExp("(Take the |Walk to )(.*)$");
        regexp.setMinimal(true);
        regexp.indexIn(detailResults[i].trimmed());

        if (regexp.cap(1) == "Take the ") {
            //qDebug()<<"Regular: "<<regexp.cap(2).trimmed();
            QRegExp regexp2 = QRegExp("(.*)Dep: (\\d:\\d\\d|\\d\\d:\\d\\d)(am|pm)(.*)Arr: (\\d:\\d\\d|\\d\\d:\\d\\d)(am|pm)(.*)(\\t+.*)$");
            regexp2.setMinimal(true);
            regexp2.indexIn(regexp.cap(2).trimmed());
            //qDebug()<<"***";
            if (regexp2.matchedLength() == -1) {
                regexp2 = QRegExp("(.*)Dep: (\\d:\\d\\d|\\d\\d:\\d\\d)(am|pm)(.*)Arr: (\\d:\\d\\d|\\d\\d:\\d\\d)(am|pm)(.*)$");
                regexp2.setMinimal(true);
                regexp2.indexIn(regexp.cap(2).trimmed());
            }

            /*
            qDebug()<<"Train:"<<regexp2.cap(1).trimmed();
            qDebug()<<"Time1:"<<regexp2.cap(2).trimmed();
            qDebug()<<"Time1b:"<<regexp2.cap(3).trimmed();
            qDebug()<<"Station1:"<<regexp2.cap(4).trimmed();
            qDebug()<<"Time2:"<<regexp2.cap(5).trimmed();
            qDebug()<<"Time2b:"<<regexp2.cap(6).trimmed();
            qDebug()<<"Station2:"<<regexp2.cap(7).trimmed();
            qDebug()<<"Alt:"<<regexp2.cap(8).trimmed();
            */

            QDateTime fromDateTime;
            QDateTime toDateTime;
            QTime fromTime   = QTime::fromString(regexp2.cap(2).trimmed() + regexp2.cap(3).trimmed(), "h:map");
            QTime toTime     = QTime::fromString(regexp2.cap(5).trimmed() + regexp2.cap(6).trimmed(), "h:map");
            fromDateTime.setDate(journeydate);
            fromDateTime.setTime(fromTime);
            toDateTime.setDate(journeydate);
            toDateTime.setTime(toTime);

            if (toDateTime.toTime_t() < fromDateTime.toTime_t()) {
                toDateTime.addDays(1);
                journeydate.addDays(1);
            }

            item->setDepartureStation(regexp2.cap(4).trimmed());
            item->setArrivalStation(regexp2.cap(7).trimmed());
            item->setTrain(regexp2.cap(1).trimmed());
            item->setInfo(regexp2.cap(8).trimmed());
            item->setDepartureDateTime(fromDateTime);
            item->setArrivalDateTime(toDateTime);
            results->appendItem(item);
        }
        if (regexp.cap(1) == "Walk to ") {
            //qDebug()<<"Walking: "<<regexp.cap(2).trimmed();
            QRegExp regexp2 = QRegExp("(.*) - (.+) (.*)$");
            regexp2.setMinimal(true);
            regexp2.indexIn(regexp.cap(2).trimmed());

            /*
            qDebug()<<"***";
            qDebug()<<"Station1:"<<regexp2.cap(1).trimmed();
            qDebug()<<"WalkDist1:"<<regexp2.cap(2).trimmed();
            qDebug()<<"WalkDist2:"<<regexp2.cap(3).trimmed();
            */

            item->setDepartureStation("");
            if (results->itemcount() > 0) {
                JourneyDetailResultItem *lastitem = results->getItem(results->itemcount() - 1);
                item->setDepartureStation(lastitem->arrivalStation());
                item->setDepartureDateTime(lastitem->arrivalDateTime());
                item->setArrivalDateTime(lastitem->arrivalDateTime());
            }
            item->setArrivalStation(regexp2.cap(1).trimmed());
            // TODO: Might need translation
            item->setInfo("Walking " + regexp2.cap(2).trimmed() + " " + regexp2.cap(3).trimmed());
            //Don't add WalkTo infos as first item
            if (results->itemcount() > 0) {
                results->appendItem(item);
            }

        }
    }

    results->setDuration(journeyitem->duration());
    if (results->itemcount() > 0) {
        JourneyDetailResultItem *lastitem = results->getItem(results->itemcount() - 1);
        JourneyDetailResultItem *firstitem = results->getItem(0);
        results->setDepartureStation(firstitem->departureStation());
        results->setArrivalStation(lastitem->arrivalStation());

        for (int i=0; i < results->itemcount(); i++) {
            if (!results->getItem(i)->departureDateTime().isNull()) {
                results->setDepartureDateTime(results->getItem(i)->departureDateTime());
                break;
            }
        }

        for (int i=results->itemcount() -1; i >= 0; i--) {
            if (!results->getItem(i)->arrivalDateTime().isNull()) {
                results->setArrivalDateTime(results->getItem(i)->arrivalDateTime());
                break;
            }
        }
    }

    return results;
}
Beispiel #2
0
JourneyDetailResultList* ParserHafasXml::internalParseJourneyDetails(QByteArray data)
{
    qDebug() << ";;;;;;;;;;;;;;;" << data;
    JourneyDetailResultList *results = new JourneyDetailResultList();

    QBuffer readBuffer;
    readBuffer.setData(data);
    readBuffer.open(QIODevice::ReadOnly);

    QXmlQuery query;
    query.bindVariable("path", &readBuffer);
    query.setQuery("doc($path)/ResC/Err//@text/string()");

    QStringList errorResult;
    if (!query.evaluateTo(&errorResult))
    {
        qDebug() << "parserHafasXml::ErrorTest - Query Failed";
        return results;
    }

    if (errorResult.count() > 0 ) {
        emit errorOccured(errorResult.join("").trimmed());
        qWarning()<<"ParserHafasXml::internalParseJourneyDetails:"<<errorResult.join("");
        return results;
    }

    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Departure/BasicStop/Station/@name/string()");
    QStringList departureResults;
    if (!query.evaluateTo(&departureResults))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 1 Failed";
    }
    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Arrival/BasicStop/Station/@name/string()");
    QStringList arrivalResults;
    if (!query.evaluateTo(&arrivalResults))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 2 Failed";
    }

    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Departure/BasicStop/Location/Station/HafasName/Text/string()");
    QStringList departure2Results;
    if (!query.evaluateTo(&departure2Results))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 1b Failed";
    }
    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Arrival/BasicStop/Location/Station/HafasName/Text/string()");
    QStringList arrival2Results;
    if (!query.evaluateTo(&arrival2Results))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 2b Failed";
    }

    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Departure/BasicStop/Dep/Time/string()");
    QStringList depTimeResult;
    if (!query.evaluateTo(&depTimeResult))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 3 Failed";
    }

    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Departure/BasicStop/Dep/Platform/Text/string()");
    QStringList depPlatResult;
    if (!query.evaluateTo(&depPlatResult))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 4 Failed";
    }

    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Arrival/BasicStop/Arr/Time/string()");
    QStringList arrTimeResult;
    if (!query.evaluateTo(&arrTimeResult))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 5 Failed";
    }

    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection/Arrival/BasicStop/Arr/Platform/Text/string()");
    QStringList arrPlatResult;
    if (!query.evaluateTo(&arrPlatResult))
    {
        qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 6 Failed";
    }

    //It is possible, that the stationname is in two seperate fields
    if (departureResults.count() == 0 && departure2Results.count() > 0)
    {
        departureResults = departure2Results;
        arrivalResults = arrival2Results;
    }

    if (departureResults.count() == arrivalResults.count())
    {
        for(int i = 0; i < departureResults.count(); i++)
        {
            JourneyDetailResultItem *item = new JourneyDetailResultItem();

            /*
            qDebug()<<"   "<<"Journey "<<i;
            qDebug()<<"     DepartureSt:"<<departureResults[i].trimmed();
            qDebug()<<"     DepartureTime:"<<depTimeResult[i].trimmed();
            qDebug()<<"     DeparturePlatform:"<<depPlatResult[i].trimmed();
            qDebug()<<"     ArrivalSt:"<<arrivalResults[i].trimmed();
            qDebug()<<"     ArrivalTime:"<<arrTimeResult[i].trimmed();
            qDebug()<<"     ArrivalPlatform:"<<arrPlatResult[i].trimmed();
            */

            item->setDepartureDateTime(cleanHafasDateTime(depTimeResult[i].trimmed(), journeyDetailRequestData.date));
            item->setArrivalDateTime(cleanHafasDateTime(arrTimeResult[i].trimmed(), journeyDetailRequestData.date));
            item->setDepartureStation(departureResults[i].trimmed());
            item->setArrivalStation(arrivalResults[i].trimmed());
            if (depPlatResult[i].trimmed() != "")
            {
                item->setDepartureInfo(tr("Pl.") + " " + depPlatResult[i].trimmed());
            }
            if (arrPlatResult[i].trimmed() != "")
            {
                item->setArrivalInfo(tr("Pl.") + " " + arrPlatResult[i].trimmed());
            }

            //Check for train or if walking
            query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection[" + QString::number(i + 1) + "]/Journey/JourneyAttributeList/JourneyAttribute/Attribute[@type='NAME']/AttributeVariant/Text/string()");
            QStringList trainResult;
            if (!query.evaluateTo(&trainResult))
            {
                qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 7 Failed";
            }

            if (trainResult.count() > 0)
            {
                //qDebug()<<"     Train:"<<trainResult.join("").trimmed();
                item->setTrain(trainResult.join("").trimmed());
            } else
            {
                query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection[" + QString::number(i + 1) + "]/Walk/Duration/Time/string()");
                QStringList walkResult;
                if (!query.evaluateTo(&walkResult))
                {
                   qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 8 Failed";
                }

                //Maybe its a transfer?
                QStringList transferResult;
                if (walkResult.count() == 0) {
                    query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection[" + QString::number(i + 1) + "]/Transfer/Duration/Time/string()");

                    if (!query.evaluateTo(&transferResult))
                    {
                       qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 8b Failed";
                    }
                }

                //Maybe its gisroute?
                if (walkResult.count() == 0 && transferResult.count() == 0)
                {
                   query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection[" + QString::number(i + 1) + "]/GisRoute/Duration/Time/string()");
                   QStringList gisrouteResult;
                   if (!query.evaluateTo(&gisrouteResult))
                   {
                       qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 9 Failed";
                   }

                   //Ok its a gisroute
                   if (gisrouteResult.count() > 0)
                   {
                       query.setQuery("doc($path)/ResC/ConRes//Connection[@id='" + journeyDetailRequestData.id + "']/ConSectionList/ConSection[" + QString::number(i + 1) + "]/GisRoute/@type/string()");
                       QStringList gisroutetypeResult;
                       if (!query.evaluateTo(&gisroutetypeResult))
                       {
                           qDebug() << "parserHafasXml::parseJourneyDataDetails - Query 10 Failed";
                       }

                       QString gisrouteType = gisroutetypeResult.join("").trimmed();
                       int minutes = cleanHafasDate(gisrouteResult.join("").trimmed()).toInt();
                       if (gisrouteType == "FOOT")
                       {
                           item->setInfo(tr("Walk for %n min", "", minutes));
                       } else if (gisrouteType == "BIKE")
                       {
                           item->setInfo(tr("Use a Bike for %n min", "", minutes));
                       } else if (gisrouteType == "CAR")
                       {
                           item->setInfo(tr("Use a car for %n min", "", minutes));
                       } else if (gisrouteType == "TAXI")
                       {
                           item->setInfo(tr("Take a taxi for %n min", "", minutes));
                       }
                   }
                } else {

                    if (transferResult.count() > 0) {
                        item->setInfo(tr("Transfer for %n min", "", cleanHafasDate(transferResult.join("").trimmed()).toInt()));
                    }

                    if (walkResult.count() > 0) {
                        item->setInfo(tr("Walk for %n min", "", cleanHafasDate(walkResult.join("").trimmed()).toInt()));
                    }
                }
            }

            results->appendItem(item);
        }

        if (results->itemcount() > 0) {
            results->setDepartureStation(results->getItem(0)->departureStation());
            results->setArrivalStation(results->getItem(results->itemcount() - 1)->arrivalStation());

            for (int i=0; i < results->itemcount(); i++) {
                if (!results->getItem(i)->departureDateTime().isNull()) {
                    results->setDepartureDateTime(results->getItem(i)->departureDateTime());
                    break;
                }
            }

            for (int i=results->itemcount() -1; i >= 0; i--) {
                if (!results->getItem(i)->arrivalDateTime().isNull()) {
                    results->setArrivalDateTime(results->getItem(i)->arrivalDateTime());
                    break;
                }
            }

            results->setDuration(journeyDetailRequestData.duration);
            results->setId(journeyDetailRequestData.id);
        }

       return results;
    }

    emit errorOccured(tr("Internal error occured, Error parsing details data"));
    return results;
}