void ParserXmlVasttrafikSe::parseSearchJourney(QNetworkReply *networkReply) { qDebug() << "ParserXmlVasttrafikSe::parseSearchJourney(networkReply.url()=" << networkReply->url().toString() << ")"; JourneyResultList *journeyResultList = new JourneyResultList(); for (QHash<QString, JourneyDetailResultList *>::Iterator it = cachedJourneyDetails.begin(); it != cachedJourneyDetails.end();) { JourneyDetailResultList *jdrl = it.value(); it = cachedJourneyDetails.erase(it); delete jdrl; } /// Use fallback values for empty results (i.e. no connections found) journeyResultList->setDepartureStation(m_searchJourneyParameters.departureStation.name); journeyResultList->setViaStation(m_searchJourneyParameters.viaStation.name); journeyResultList->setArrivalStation(m_searchJourneyParameters.arrivalStation.name); journeyResultList->setTimeInfo(tr("%1, %2", "DATE, TIME").arg(m_searchJourneyParameters.dateTime.date().toString(Qt::DefaultLocaleShortDate)).arg(m_searchJourneyParameters.dateTime.time().toString(Qt::DefaultLocaleShortDate))); m_earliestArrival = m_latestResultDeparture = QDateTime(); QTextStream ts(networkReply->readAll()); ts.setCodec("UTF-8"); const QString xmlRawtext = ts.readAll(); QDomDocument doc("result"); if (doc.setContent(xmlRawtext, false)) { QDomNodeList tripNodeList = doc.elementsByTagName("Trip"); for (unsigned int i = 0; i < tripNodeList.length(); ++i) { JourneyResultItem *jritem = new JourneyResultItem(); JourneyDetailResultList *detailsList = new JourneyDetailResultList(); /// Set default values for journey's start and end time QDateTime journeyStart = QDateTime::currentDateTime(); QDateTime journeyEnd = QDateTime::currentDateTime(); QDomNodeList legNodeList = tripNodeList.item(i).childNodes(); int numStops = 0; QStringList trainTypes; int tripRtStatus = TRIP_RTDATA_NONE; for (unsigned int j = 0; j < legNodeList.length(); ++j) { QDomNode legNode = legNodeList.item(j); QDomNode originNode = legNode.namedItem("Origin"); QDomNode destinationNode = legNode.namedItem("Destination"); if (j == 0) { journeyStart.setDate(QDate::fromString(getAttribute(originNode, "date"), QLatin1String("yyyy-MM-dd"))); journeyEnd.setDate(journeyStart.date()); const QTime time = QTime::fromString(getAttribute(originNode, "time"), "hh:mm"); journeyStart.setTime(time); if (i == 0) { const QDate date = QDate::fromString(getAttribute(originNode, "date"), QLatin1String("yyyy-MM-dd")); journeyResultList->setDepartureStation(getAttribute(originNode, "name")); journeyResultList->setTimeInfo(tr("%1, %2", "DATE, TIME").arg(date.toString(Qt::DefaultLocaleShortDate)).arg(time.toString(Qt::DefaultLocaleShortDate))); } } if (j == legNodeList.length() - 1) { journeyEnd.setTime(QTime::fromString(getAttribute(destinationNode, "time"), "hh:mm")); if (i == 0) journeyResultList->setArrivalStation(getAttribute(destinationNode, "name")); } if (getAttribute(legNode, "type") != QLatin1String("WALK") || getAttribute(originNode, "name") != getAttribute(destinationNode, "name")) { ++numStops; trainTypes.append(i18nConnectionType(getAttribute(legNode, "name"))); } JourneyDetailResultItem *jdrItem = new JourneyDetailResultItem(); jdrItem->setDepartureStation(getAttribute(originNode, "name")); const QString depTrack = getAttribute(originNode, "track"); jdrItem->setDepartureInfo(depTrack.isEmpty() ? QChar(0x2014) : tr("Track %1").arg(depTrack)); const QDateTime scheduledDepartureTime = QDateTime::fromString(getAttribute(originNode, "date") + getAttribute(originNode, "time"), "yyyy-MM-ddhh:mm"); jdrItem->setDepartureDateTime(scheduledDepartureTime); jdrItem->setArrivalStation(getAttribute(destinationNode, "name")); const QString arrTrack = getAttribute(destinationNode, "track"); jdrItem->setArrivalInfo(arrTrack.isEmpty() ? QChar(0x2014) : tr("Track %1").arg(arrTrack)); const QDateTime scheduledArrivalTime = QDateTime::fromString(getAttribute(destinationNode, "date") + getAttribute(destinationNode, "time"), "yyyy-MM-ddhh:mm"); jdrItem->setArrivalDateTime(scheduledArrivalTime); const QString direction = getAttribute(legNode, "direction"); if (!direction.isEmpty()) jdrItem->setInfo(tr("to %1").arg(direction)); if (getAttribute(legNode, "type") == QLatin1String("WALK")) jdrItem->setTrain(tr("Walk")); else { const QString connectionName = i18nConnectionType(getAttribute(legNode, "name")); const QString fgColor = getAttribute(legNode, "fgColor"); const QString bgColor = getAttribute(legNode, "bgColor"); if (!fgColor.isEmpty() && !bgColor.isEmpty()) jdrItem->setTrain(QString(QLatin1String("<span style=\"color:%2; background-color: %3;\">%1</span>")).arg(connectionName).arg(fgColor).arg(bgColor)); else jdrItem->setTrain(connectionName); } jdrItem->setInternalData1("NO setInternalData1"); jdrItem->setInternalData2("NO setInternalData2"); const QString realTimeDeparture = getAttribute(originNode, "rtTime"); if (!realTimeDeparture.isEmpty()) { const QTime realTimeTime = QTime::fromString(realTimeDeparture, QLatin1String("hh:mm")); const int minutesTo = scheduledDepartureTime.time().msecsTo(realTimeTime) / 60000; if (minutesTo > 3) { jdrItem->setDepartureInfo(jdrItem->departureInfo() + tr("<br/><span style=\"color:#b30;\">%1 min late</span>").arg(minutesTo)); tripRtStatus = TRIP_RTDATA_WARNING; } else { if (tripRtStatus == TRIP_RTDATA_NONE) { tripRtStatus = TRIP_RTDATA_ONTIME; } jdrItem->setDepartureInfo(jdrItem->departureInfo() + tr("<br/><span style=\"color:#093; font-weight: normal;\">on time</span>")); } } const QString realTimeArrival = getAttribute(destinationNode, "rtTime"); if (!realTimeArrival.isEmpty()) { const QTime realTimeTime = QTime::fromString(realTimeArrival, QLatin1String("hh:mm")); const int minutesTo = scheduledArrivalTime.time().msecsTo(realTimeTime) / 60000; if (minutesTo > 3) jdrItem->setArrivalInfo(jdrItem->arrivalInfo() + tr("<br/><span style=\"color:#b30;\">%1 min late</span>").arg(minutesTo)); else jdrItem->setArrivalInfo(jdrItem->arrivalInfo() + tr("<br/><span style=\"color:#093; font-weight: normal;\">on time</span>")); } detailsList->appendItem(jdrItem); } if (journeyStart.time() > journeyEnd.time()) journeyEnd = journeyEnd.addDays(1); jritem->setDate(journeyStart.date()); jritem->setDepartureTime(journeyStart.time().toString(tr("hh:mm"))); jritem->setArrivalTime(journeyEnd.time().toString(tr("hh:mm"))); int diffTime = journeyStart.secsTo(journeyEnd); if (diffTime < 0) diffTime += 86400; jritem->setDuration(tr("%1:%2").arg(diffTime / 3600).arg(QString::number(diffTime / 60 % 60), 2, '0')); jritem->setTransfers(QString::number(legNodeList.length() - 1)); trainTypes.removeDuplicates(); jritem->setTrainType(trainTypes.join(", ")); if (tripRtStatus == TRIP_RTDATA_WARNING) jritem->setMiscInfo(tr("<span style=\"color:#b30;\">traffic warning</span>")); else if (tripRtStatus == TRIP_RTDATA_ONTIME) jritem->setMiscInfo(tr("<span style=\"color:#093; font-weight: normal;\">on time</span>")); journeyResultList->appendItem(jritem); const QString id = QString::number(i); jritem->setId(id); detailsList->setId(id); detailsList->setDepartureStation(journeyResultList->departureStation()); detailsList->setViaStation(journeyResultList->viaStation()); detailsList->setArrivalStation(journeyResultList->arrivalStation()); detailsList->setDuration(jritem->duration()); detailsList->setArrivalDateTime(journeyEnd); detailsList->setDepartureDateTime(journeyStart); cachedJourneyDetails[id] = detailsList; if (!m_earliestArrival.isValid() || journeyEnd < m_earliestArrival) m_earliestArrival = journeyEnd.addSecs(-60); if (!m_latestResultDeparture.isValid() || journeyStart > m_latestResultDeparture) m_latestResultDeparture = journeyStart.addSecs(60); } } emit journeyResult(journeyResultList); }
void CalendarThreadWrapper::addToCalendar() { const QString viaStation = m_result->viaStation(); QSettings settings(FAHRPLAN_SETTINGS_NAMESPACE, "fahrplan2"); QString calendarEntryTitle; QString calendarEntryDesc; if (viaStation.isEmpty()) calendarEntryTitle = tr("%1 to %2").arg(m_result->departureStation(), m_result->arrivalStation()); else calendarEntryTitle = tr("%1 via %3 to %2").arg(m_result->departureStation(), m_result->arrivalStation(), viaStation); if (!m_result->info().isEmpty()) calendarEntryDesc.append(m_result->info()).append("\n"); const bool compactFormat = settings.value("compactCalendarEntries", false).toBool(); for (int i=0; i < m_result->itemcount(); i++) { JourneyDetailResultItem *item = m_result->getItem(i); if (!compactFormat && !item->train().isEmpty()) calendarEntryDesc.append("--- ").append(item->train()).append(" ---\n"); calendarEntryDesc.append(formatStation(item->departureDateTime(), item->departureStation(), item->departureInfo())); calendarEntryDesc.append("\n"); if (compactFormat && !item->train().isEmpty()) calendarEntryDesc.append("--- ").append(item->train()).append(" ---\n"); calendarEntryDesc.append(formatStation(item->arrivalDateTime(), item->arrivalStation(), item->arrivalInfo())); calendarEntryDesc.append("\n"); if (!item->info().isEmpty()) { calendarEntryDesc.append(item->info()).append("\n"); } if (!compactFormat) calendarEntryDesc.append("\n"); } if (!compactFormat) calendarEntryDesc.append( tr("-- \nAdded by Fahrplan. Please, re-check the information before your journey.")); #ifdef BUILD_FOR_BLACKBERRY CalendarService service; QPair<AccountId, FolderId> folder; settings.beginGroup("Calendar"); folder.first = settings.value("AccountId", -1).toInt(); if (folder.first >= 0) folder.second = settings.value("FolderId", -1).toInt(); if ((folder.first < 0) || (folder.second < 0)) folder = service.defaultCalendarFolder(); CalendarEvent event; event.setAccountId(folder.first); event.setFolderId(folder.second); event.setSubject(calendarEntryTitle); event.setStartTime(m_result->departureDateTime()); event.setEndTime(m_result->arrivalDateTime()); event.setBody(calendarEntryDesc); event.setReminder(-1); emit addCalendarEntryComplete(service.createEvent(event) == Result::Success); #elif defined(BUILD_FOR_HARMATTAN) || defined(BUILD_FOR_MAEMO_5) || defined(BUILD_FOR_SYMBIAN) QOrganizerManager defaultManager; QOrganizerEvent event; event.setDisplayLabel(calendarEntryTitle); event.setStartDateTime(m_result->departureDateTime()); event.setEndDateTime(m_result->arrivalDateTime()); event.setDescription(calendarEntryDesc); QString id = settings.value("Calendar/CollectionId").toString(); if (!id.isEmpty()) { QOrganizerCollectionId collectionId = QOrganizerCollectionId::fromString(id); if (!collectionId.isNull()) event.setCollectionId(collectionId); } emit addCalendarEntryComplete(defaultManager.saveItem(&event)); #else emit addCalendarEntryComplete(false); #endif QThread::currentThread()->exit(0); // Move back to GUI thread so the deleteLater() callback works (it requires // an event loop which is still alive) moveToThread(QCoreApplication::instance()->thread()); }
void CalendarThreadWrapper::addToCalendar() { #if defined(MEEGO_EDITION_HARMATTAN) || defined(Q_WS_MAEMO_5) || defined(Q_OS_SYMBIAN) QString desc; const QString viaStation = m_result->viaStation(); if (viaStation.isEmpty()) desc.append(tr("%1 to %2").arg(m_result->departureStation()).arg(m_result->arrivalStation()) + "\n"); else desc.append(tr("%1 via %3 to %2").arg(m_result->departureStation()).arg(m_result->arrivalStation()).arg(viaStation) + "\n"); if (!m_result->info().isEmpty()) { desc.append(m_result->info() + "\n"); } for (int i=0; i < m_result->itemcount(); i++) { JourneyDetailResultItem *item = m_result->getItem(i); if (!item->train().isEmpty()) { desc.append(item->train() + "\n"); } desc.append(item->departureDateTime().date().toString() + " " + item->departureDateTime().time().toString("HH:mm") + " " + item->departureStation()); if (!item->departureInfo().isEmpty()) { desc.append(" - " + item->departureInfo()); } desc.append("\n"); desc.append(item->arrivalDateTime().date().toString() + " " + item->arrivalDateTime().time().toString("HH:mm") + " " + item->arrivalStation()); if (!item->arrivalInfo().isEmpty()) { desc.append(" - " + item->arrivalInfo()); } desc.append("\n"); if (!item->info().isEmpty()) { desc.append(item->info() + "\n"); } desc.append("--\n"); } desc.append(tr("\n(added by fahrplan app, please recheck informations before travel.)")); QOrganizerManager defaultManager; QOrganizerEvent event; if (viaStation.isEmpty()) event.setDisplayLabel(tr("Journey: %1 to %2").arg(m_result->departureStation()).arg(m_result->arrivalStation())); else event.setDisplayLabel(tr("Journey: %1 via %3 to %2").arg(m_result->departureStation()).arg(m_result->arrivalStation()).arg(viaStation)); event.setDescription(desc); event.setStartDateTime(m_result->departureDateTime()); event.setEndDateTime(m_result->arrivalDateTime()); emit addCalendarEntryComplete(defaultManager.saveItem(&event)); #else emit addCalendarEntryComplete(false); #endif QThread::currentThread()->exit(0); // Move back to GUI thread so the deleteLater() callback works (it requires // an event loop which is still alive) moveToThread(QCoreApplication::instance()->thread()); }