void SingleEventModelTest::contactMatching() { QFETCH(QString, localId); QFETCH(QString, remoteId); QFETCH(int, eventType); SingleEventModel model; Event::PropertySet p; p.insert(Event::ContactId); p.insert(Event::ContactName); model.setPropertyMask(p); watcher.setModel(&model); int eventId = addTestEvent(model, (Event::EventType)eventType, Event::Inbound, localId, group1.id(), "text", false, false, QDateTime::currentDateTime(), remoteId); watcher.waitForSignals(); QVERIFY(eventId != -1); QVERIFY(model.getEventByUri(Event::idToUrl(eventId))); QVERIFY(watcher.waitForModelReady()); Event event = model.event(model.index(0, 0)); QCOMPARE(event.id(), eventId); QCOMPARE(event.contactId(), 0); QString noMatch = remoteId; noMatch += remoteId[1]; int contactId1 = addTestContact("Really1Bad", noMatch, localId); QVERIFY(model.getEventByUri(Event::idToUrl(eventId))); QVERIFY(watcher.waitForModelReady()); event = model.event(model.index(0, 0)); QCOMPARE(event.id(), eventId); QCOMPARE(event.contactId(), 0); int contactId = addTestContact("Really Bad", remoteId, localId); QVERIFY(model.getEventByUri(Event::idToUrl(eventId))); QVERIFY(watcher.waitForModelReady()); event = model.event(model.index(0, 0)); QCOMPARE(event.id(), eventId); QCOMPARE(event.contactId(), contactId); QCOMPARE(event.contactName(), QString("Really Bad")); deleteTestContact(contactId1); deleteTestContact(contactId); }
bool DeclarativeGroupManager::setEventStatus(int eventId, int status) { SingleEventModel model; if (!model.getEventById(eventId)) { qWarning() << Q_FUNC_INFO << "No event with id" << eventId; return false; } Event ev = model.event(model.index(0, 0)); if (ev.status() == status) return true; ev.setStatus(static_cast<Event::EventStatus>(status)); return model.modifyEvent(ev); }
void MmsHandler::messageReceiveStateChanged(const QString &recId, int state) { Event event; SingleEventModel model; if (model.getEventById(recId.toInt())) event = model.event(model.index(0, 0)); if (!event.isValid()) { qWarning() << "Ignoring MMS message receive state for unknown event" << recId; m_activeEvents.removeOne(recId.toInt()); return; } Event::EventStatus newStatus = event.status(); switch (state) { case Deferred: newStatus = Event::WaitingStatus; break; case Receiving: case Decoding: newStatus = Event::DownloadingStatus; break; case NoSpace: case RecvError: // Avoid overwriting the status for cancelled receive calls if (event.status() == Event::ManualNotificationStatus) return; newStatus = Event::TemporarilyFailedStatus; break; case Garbage: newStatus = Event::PermanentlyFailedStatus; break; } if (newStatus != event.status()) { event.setStatus(newStatus); if (!model.modifyEvent(event)) qWarning() << "Failed updating MMS event status for" << recId; if (newStatus != Event::WaitingStatus && newStatus != Event::DownloadingStatus) { m_activeEvents.removeOne(event.id()); NotificationManager::instance()->showNotification(event, event.remoteUid(), Group::ChatTypeP2P); } } }
void SingleEventModelTest::getEventByUri() { SingleEventModel model; watcher.setModel(&model); Event event; event.setType(Event::SMSEvent); event.setDirection(Event::Outbound); event.setLocalUid("/org/freedesktop/Telepathy/Account/gabble/jabber/dut_40localhost0"); event.setGroupId(group1.id()); event.setFreeText("freeText"); event.setStartTime(QDateTime::currentDateTime()); event.setEndTime(QDateTime::currentDateTime()); event.setRemoteUid("123456"); event.setMessageToken("messageTokenA1"); // ignore call properties Event::PropertySet p = Event::allProperties(); p.remove(Event::IsEmergencyCall); p.remove(Event::IsMissedCall); model.setPropertyMask(p); //TODO: add reading invalid id QVERIFY(model.addEvent(event)); watcher.waitForSignals(); QVERIFY(event.id() != -1); QVERIFY(model.getEventByUri(event.url())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); Event modelEvent = model.event(model.index(0, 0)); QVERIFY(compareEvents(event, modelEvent)); }
void SingleEventModelTest::getEventByTokens() { SingleEventModel model; // ignore call properties Event::PropertySet p = Event::allProperties(); p.remove(Event::IsEmergencyCall); p.remove(Event::IsMissedCall); model.setPropertyMask(p); watcher.setModel(&model); Event event; event.setType(Event::SMSEvent); event.setDirection(Event::Outbound); event.setLocalUid("/org/freedesktop/Telepathy/Account/gabble/jabber/dut_40localhost0"); event.setGroupId(group1.id()); event.setFreeText("freeText"); event.setStartTime(QDateTime::currentDateTime()); event.setEndTime(QDateTime::currentDateTime()); event.setRemoteUid("123456"); event.setMessageToken("messageTokenB1"); QVERIFY(model.addEvent(event)); watcher.waitForSignals(); QVERIFY(event.id() != -1); Event mms(event); mms.setMessageToken("mmsMessageToken"); mms.setMmsId("mmsId"); QVERIFY(model.addEvent(mms)); watcher.waitForSignals(); QVERIFY(mms.id() != -1); Event mms2(event); mms2.setMessageToken("mmsMessageToken"); mms2.setMmsId("mmsId"); mms2.setGroupId(group2.id()); QVERIFY(model.addEvent(mms2)); watcher.waitForSignals(); QVERIFY(mms2.id() != -1); QVERIFY(model.getEventByTokens("messageTokenB1", "", -1)); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); Event modelEvent = model.event(model.index(0, 0)); QVERIFY(compareEvents(event, modelEvent)); QVERIFY(model.getEventByTokens("messageTokenB1", "", group1.id())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); modelEvent = model.event(model.index(0, 0)); QVERIFY(compareEvents(event, modelEvent)); QVERIFY(model.getEventByTokens("messageTokenB1", "", group1.id() + 1)); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 0); // Can match either to token or mms id: QVERIFY(model.getEventByTokens("messageTokenB1", "nonExistingMmsId", group1.id())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); modelEvent = model.event(model.index(0, 0)); QVERIFY(compareEvents(event, modelEvent)); QVERIFY(model.getEventByTokens("", "nonExistingMmsId", group1.id())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 0); QVERIFY(model.getEventByTokens("", "mmsId", group1.id())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); modelEvent = model.event(model.index(0, 0)); QVERIFY(compareEvents(mms, modelEvent)); QVERIFY(model.getEventByTokens("", "mmsId", group2.id())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); modelEvent = model.event(model.index(0, 0)); QVERIFY(compareEvents(mms2, modelEvent)); QVERIFY(model.getEventByTokens("mmsMessageToken", "mmsId", group1.id())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); modelEvent = model.event(model.index(0, 0)); QVERIFY(compareEvents(mms, modelEvent)); }
void SingleEventModelTest::updateStatus() { SingleEventModel model; watcher.setModel(&model); SingleEventModel observer; ModelWatcher watcherObserver; watcherObserver.setModel(&observer); Event event; event.setType(Event::SMSEvent); event.setDirection(Event::Outbound); event.setLocalUid("/org/freedesktop/Telepathy/Account/gabble/jabber/dut_40localhost0"); event.setGroupId(group1.id()); event.setFreeText("freeText"); event.setStartTime(QDateTime::currentDateTime()); event.setEndTime(QDateTime::currentDateTime()); event.setRemoteUid("123456"); event.setMessageToken("messageTokenB"); QVERIFY(model.addEvent(event)); watcher.waitForSignals(); QVERIFY(event.id() != -1); CommHistory::Event::PropertySet props = CommHistory::Event::PropertySet() << CommHistory::Event::Id << CommHistory::Event::Direction << CommHistory::Event::Status << CommHistory::Event::GroupId << CommHistory::Event::MessageToken << CommHistory::Event::ReportDelivery << CommHistory::Event::MmsId; model.setPropertyMask(props); QVERIFY(model.getEventByUri(event.url())); QVERIFY(watcher.waitForModelReady()); QCOMPARE(model.rowCount(), 1); Event modelEvent = model.event(model.index(0, 0)); QVERIFY(modelEvent.validProperties().contains(CommHistory::Event::Status)); QVERIFY(modelEvent.validProperties().contains(CommHistory::Event::MessageToken)); QVERIFY(!modelEvent.validProperties().contains(CommHistory::Event::FreeText)); QVERIFY(!modelEvent.validProperties().contains(CommHistory::Event::ContactId)); QCOMPARE(event.status(), modelEvent.status()); QCOMPARE(event.messageToken(), modelEvent.messageToken()); // init observer model with the same event and all properties QVERIFY(observer.getEventByUri(event.url())); QVERIFY(watcherObserver.waitForModelReady()); QCOMPARE(observer.rowCount(), 1); Event observedEvent = observer.event(observer.index(0, 0)); QVERIFY(compareEvents(event, observedEvent)); // modify event with new status only modelEvent.setStatus(Event::SentStatus); QVERIFY(model.modifyEvent(modelEvent)); watcher.waitForSignals(); QCOMPARE(watcher.updatedCount(), 1); QCOMPARE(watcher.committedCount(), 1); //check observer model QTest::qWait(100); observedEvent = observer.event(observer.index(0, 0)); QCOMPARE(observedEvent.freeText(), event.freeText()); QCOMPARE(observedEvent.status(), Event::SentStatus); }
void MmsHandler::messageReceived(const QString &recId, const QString &mmsId, const QString &from, const QStringList &to, const QStringList &cc, const QString &subj, uint date, int priority, const QString &cls, bool readReport, MmsPartList parts) { Event event; SingleEventModel model; if (model.getEventById(recId.toInt())) event = model.event(model.index(0, 0)); m_activeEvents.removeOne(recId.toInt()); if (!event.isValid()) { // Create new event event.setType(Event::MMSEvent); event.setEndTime(QDateTime::currentDateTime()); event.setDirection(Event::Inbound); event.setLocalUid(RING_ACCOUNT_PATH); event.setRemoteUid(from); if (!setGroupForEvent(event)) { qCritical() << "Failed to handle group for MMS received event; message dropped:" << event.toString(); return; } } // Update event properties event.setSubject(subj); event.setStartTime(QDateTime::fromTime_t(date)); event.setMmsId(mmsId); event.setToList(to); event.setCcList(cc); event.setReportRead(readReport); event.setStatus(Event::ReceivedStatus); Q_UNUSED(priority); Q_UNUSED(cls); // Remove MMS notification properties event.setExtraProperty("mms-notification-imsi", QVariant()); event.setExtraProperty("mms-expiry", QVariant()); event.setExtraProperty("mms-push-data", QVariant()); // Change UID/group if necessary if (event.remoteUid() != from) { int oldGroup = event.groupId(); event.setRemoteUid(from); if (!setGroupForEvent(event)) qCritical() << "Failed handling group for MMS received event"; if (oldGroup != event.groupId()) { int newGroup = event.groupId(); event.setGroupId(oldGroup); if (!model.moveEvent(event, newGroup)) qCritical() << "Failed moving MMS received event from group" << oldGroup << "to" << newGroup << event.toString(); event.setGroupId(newGroup); } } // If there wasn't a matching notification, save first to get the event ID before message parts if (event.id() < 0 && !model.addEvent(event)) { qCritical() << "Failed adding MMS received event; message dropped: " << event.toString(); return; } QList<MessagePart> eventParts; QString freeText; bool ok = copyMmsPartFiles(parts, event.id(), eventParts, freeText); if (ok) { event.setMessageParts(eventParts); event.setFreeText(freeText); if (!model.modifyEvent(event)) { qCritical() << "Failed updating MMS received event:" << event.toString(); ok = false; } } if (!ok) { // Clean up copied MMS parts, and try to set TemporarilyFailed on the event foreach (const MessagePart &part, eventParts) QFile::remove(part.path()); // Re-query event to avoid wiping out notification data if (model.getEventById(event.id())) { event = model.event(model.index(0, 0)); if (event.isValid()) { event.setStatus(Event::TemporarilyFailedStatus); model.modifyEvent(event); NotificationManager::instance()->showNotification(event, from, Group::ChatTypeP2P); } } return; }