Skip to content

Commit

Permalink
Merge branch 'jb34320' into 'master'
Browse files Browse the repository at this point in the history
Get report flags from the correct place in dconf

IMSI wasn't set for the MMS event, flags were always zero, no reports
requested from the operator. Also, replaced MMS_PROPERTY_IMSI with
MMS_PROPERTY_UNREAD which better reflects its purpose. IMSI is provided
by EVENT_PROPERTY_SUBSCRIBER_ID property which isn't MMS specific.

Eventually, IMSI of the SIM card to use for sending the message should
be provided by the UI. Added a variant of sendMessage D-Bus call
which takes IMSI as a parameter.

Requires mer-core/libcommhistory!12

See merge request !12
  • Loading branch information
Slava Monich committed Feb 24, 2016
2 parents 2d0c9a7 + ab05bfe commit b0ecf1e
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 74 deletions.
118 changes: 51 additions & 67 deletions src/mmshandler.cpp
Expand Up @@ -2,7 +2,7 @@
**
** This file is part of commhistory-daemon.
**
** Copyright (C) 2014-2015 Jolla Ltd.
** Copyright (C) 2014-2016 Jolla Ltd.
** Contact: Slava Monich <slava.monich@jolla.com>
**
** This library is free software; you can redistribute it and/or modify it
Expand Down Expand Up @@ -37,11 +37,9 @@
#include <QDBusPendingCall>
#include <QDBusPendingCallWatcher>
#include <mdconfgroup.h>
#include <qofonomanager.h>
#include <qofonosimmanager.h>
#include <qofononetworkregistration.h>
#include <qofonoconnectionmanager.h>
#include <qofonoextmodemmanager.h>
#include <unistd.h>

using namespace RTComLogger;
Expand Down Expand Up @@ -82,24 +80,22 @@ class MmsHandlerModem

MmsHandler::MmsHandler(QObject* parent)
: MessageHandlerBase(parent, MMS_HANDLER_PATH, MMS_HANDLER_SERVICE)
, m_ofonoManager(new QOfonoManager(this))
, m_ofonoExtModemManager(new QOfonoExtModemManager(this))
, m_ofonoManager(QOfonoManager::instance())
, m_ofonoExtModemManager(QOfonoExtModemManager::instance())
, m_imsiSettings(new MDConfGroup(QStringLiteral("/imsi"), this))
{
qDBusRegisterMetaType<MmsPart>();
qDBusRegisterMetaType<MmsPartList>();
qDBusRegisterMetaType<QList<CommHistory::Event> >();

connect(m_ofonoExtModemManager, SIGNAL(defaultVoiceModemChanged(QString)),
SLOT(onDefaultVoiceModemChanged(QString)));

connect(m_ofonoManager, SIGNAL(modemAdded(QString)), SLOT(onModemAdded(QString)));
connect(m_ofonoManager, SIGNAL(modemRemoved(QString)), SLOT(onModemRemoved(QString)));
QOfonoManager* ofonoManager = m_ofonoManager.data();
connect(ofonoManager, SIGNAL(modemAdded(QString)), SLOT(onModemAdded(QString)));
connect(ofonoManager, SIGNAL(modemRemoved(QString)), SLOT(onModemRemoved(QString)));

if (m_ofonoManager->available())
addAllModems();

connect(m_ofonoManager, SIGNAL(availableChanged(bool)), SLOT(onOfonoAvailableChanged(bool)));
connect(ofonoManager, SIGNAL(availableChanged(bool)), SLOT(onOfonoAvailableChanged(bool)));


QDBusConnection dbus(QDBusConnection::sessionBus());
Expand Down Expand Up @@ -178,6 +174,11 @@ void MmsHandler::addModem(const QString &path)
SLOT(onRoamingAllowedChanged(bool)));
}

QString MmsHandler::getModemPath(const CommHistory::Event &event) const
{
return getModemPath(event.subscriberIdentity());
}

QString MmsHandler::getModemPath(const QString &imsi) const
{
QString path;
Expand Down Expand Up @@ -212,7 +213,7 @@ QString MmsHandler::messageNotification(const QString &imsi, const QString &from
event.setRecipients(Recipient(ringAccountPath, from));
event.setSubject(subject);
event.setSubscriberIdentity(imsi);
event.setExtraProperty(MMS_PROPERTY_IMSI, imsi);
event.setExtraProperty(MMS_PROPERTY_UNREAD, true);
event.setExtraProperty(MMS_PROPERTY_EXPIRY, expiry);
event.setExtraProperty(MMS_PROPERTY_PUSH_DATA, data.toBase64());

Expand Down Expand Up @@ -263,8 +264,7 @@ void MmsHandler::messageReceiveStateChanged(const QString &recId, int state)

if (!event.isValid()) {
qWarning() << "Ignoring MMS message receive state for unknown event" << recId;
const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
m_activeEvents.remove(getModemPath(imsi), recId.toInt());
m_activeEvents.remove(getModemPath(event), recId.toInt());
return;
}

Expand Down Expand Up @@ -295,8 +295,7 @@ void MmsHandler::messageReceiveStateChanged(const QString &recId, int state)
qWarning() << "Failed updating MMS event status for" << recId;

if (newStatus != Event::WaitingStatus && newStatus != Event::DownloadingStatus) {
const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
m_activeEvents.remove(getModemPath(imsi), event.id());
m_activeEvents.remove(getModemPath(event), event.id());
NotificationManager::instance()->showNotification(event, event.recipients().value(0).remoteUid(), Group::ChatTypeP2P);
}
}
Expand All @@ -311,13 +310,12 @@ void MmsHandler::messageReceived(const QString &recId, const QString &mmsId, con
if (model.getEventById(recId.toInt()))
event = model.event();

const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
m_activeEvents.remove(getModemPath(imsi), recId.toInt());
m_activeEvents.remove(getModemPath(event), recId.toInt());

if (!event.isValid()) {
qWarning() << "Received messageReceived with unknown recId. Setting localUid to currently active account path.";
// Create new event
QString ringAccountPath = accountPath(m_defaultVoiceModem);
QString ringAccountPath = accountPath(m_ofonoExtModemManager->defaultVoiceModem());
event.setType(Event::MMSEvent);
event.setEndTime(QDateTime::currentDateTime());
event.setDirection(Event::Inbound);
Expand All @@ -341,10 +339,10 @@ void MmsHandler::messageReceived(const QString &recId, const QString &mmsId, con
Q_UNUSED(cls);

// We no longer need expiry and push data properties but we need
// to keep IMSI property until the message is read
event.setExtraProperty(MMS_PROPERTY_EXPIRY, QVariant());
event.setExtraProperty(MMS_PROPERTY_PUSH_DATA, QVariant());
if (!readReport) event.setExtraProperty(MMS_PROPERTY_IMSI, QVariant());
// the "unread" property until the message is read
event.removeExtraProperty(MMS_PROPERTY_EXPIRY);
event.removeExtraProperty(MMS_PROPERTY_PUSH_DATA);
if (!readReport) event.removeExtraProperty(MMS_PROPERTY_UNREAD);

// Change UID/group if necessary
if (event.recipients().value(0).remoteUid() != from) {
Expand Down Expand Up @@ -473,8 +471,7 @@ void MmsHandler::messageSendStateChanged(const QString &recId, int state, const

if (!event.isValid()) {
qWarning() << "Ignoring MMS message send state for unknown event" << recId;
const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
m_activeEvents.remove(getModemPath(imsi), recId.toInt());
m_activeEvents.remove(getModemPath(event), recId.toInt());
return;
}

Expand All @@ -501,8 +498,7 @@ void MmsHandler::messageSendStateChanged(const QString &recId, int state, const
qWarning() << "Failed updating MMS event status for" << recId;

if (newStatus != Event::SendingStatus) {
const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
m_activeEvents.remove(getModemPath(imsi), event.id());
m_activeEvents.remove(getModemPath(event), event.id());
NotificationManager::instance()->showNotification(event, event.recipients().value(0).remoteUid(), Group::ChatTypeP2P, details);
}
}
Expand All @@ -515,8 +511,7 @@ void MmsHandler::messageSent(const QString &recId, const QString &mmsId)
if (model.getEventById(recId.toInt()))
event = model.event();

const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
m_activeEvents.remove(getModemPath(imsi), recId.toInt());
m_activeEvents.remove(getModemPath(event), recId.toInt());

if (!event.isValid()) {
qWarning() << "Ignoring MMS message sent state for unknown event" << recId;
Expand Down Expand Up @@ -613,7 +608,7 @@ void MmsHandler::readReportSendStatus(const QString &recId, int status)
SingleEventModel model;
if (model.getEventById(recId.toInt())) {
Event event(model.event());
event.setExtraProperty(MMS_PROPERTY_IMSI, QVariant());
event.removeExtraProperty(MMS_PROPERTY_UNREAD);
if (!model.modifyEvent(event)) {
qWarning() << "Failed to update MMS event" << event.id();
}
Expand All @@ -634,9 +629,15 @@ static QStringList normalizeNumberList(const QStringList &in)

int MmsHandler::sendMessage(const QStringList &to, const QStringList &cc, const QStringList &bcc,
const QString &subject, MmsPartList parts)
{
return sendMessage(m_ofonoExtModemManager->defaultVoiceSim(), to, cc, bcc, subject, parts);
}

int MmsHandler::sendMessage(const QString &imsi, const QStringList &to, const QStringList &cc, const QStringList &bcc,
const QString &subject, MmsPartList parts)
{
Event event;
QString ringAccountPath = accountPath(m_defaultVoiceModem);
QString ringAccountPath = accountPath(m_ofonoExtModemManager->defaultVoiceModem());
event.setType(Event::MMSEvent);
event.setStartTime(QDateTime::currentDateTime());
event.setEndTime(event.startTime());
Expand All @@ -650,6 +651,7 @@ int MmsHandler::sendMessage(const QStringList &to, const QStringList &cc, const
event.setToList(normalizeNumberList(to));
event.setCcList(normalizeNumberList(cc));
event.setBccList(normalizeNumberList(bcc));
event.setSubscriberIdentity(imsi);

// XXX Group conversations not yet supported
if (to.size() + cc.size() + bcc.size() > 1) {
Expand Down Expand Up @@ -695,7 +697,7 @@ int MmsHandler::sendMessage(const QStringList &to, const QStringList &cc, const
model.modifyEvent(event);
}
}
} else if (isDataProhibited(m_defaultVoiceModem)) {
} else if (isDataProhibited(m_ofonoExtModemManager->defaultVoiceModem())) {
qWarning() << "Refusing to send MMS message due to data roaming restrictions";
event.setStatus(Event::TemporarilyFailedStatus);
model.modifyEvent(event);
Expand Down Expand Up @@ -746,10 +748,9 @@ void MmsHandler::sendMessageFromEvent(Event &event)
parts.append(p);
}

const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();

const QString imsi = event.subscriberIdentity();
unsigned int flags = m_imsiSettings->value(imsi + QStringLiteral("/mms/send-flags"), 0).toInt();
DEBUG_("send flag are" << flags);
DEBUG_("send flags are" << flags);

QVariantList args;
args << event.id() << imsi << event.toList() << event.ccList() << event.bccList()
Expand All @@ -764,27 +765,20 @@ void MmsHandler::sendMessageFromEvent(Event &event)

void MmsHandler::onSendMessageFinished(QDBusPendingCallWatcher *call)
{
bool ok = false;
int eventId = call->property("mms-event-id").toInt(&ok);

Event event;
SingleEventModel model;
if (ok && model.getEventById(eventId))
event = model.event();

QDBusPendingReply<QString> reply = *call;
if (reply.isError()) {
qCritical() << "Call to MmsEngine sendMessage failed:" << reply.error();
event.setStatus(Event::TemporarilyFailedStatus);
NotificationManager::instance()->showNotification(event, event.recipients().value(0).remoteUid(), Group::ChatTypeP2P);
} else {
event.setSubscriberIdentity(reply.value());
event.setExtraProperty(MMS_PROPERTY_IMSI, reply.value());
}

if (!model.modifyEvent(event))
qCritical() << "Updating outgoing MMS event after sendMessage call failed:" << event.toString();
qWarning() << "Call to MmsEngine sendMessage failed:" << reply.error();
bool ok = false;
int eventId = call->property("mms-event-id").toInt(&ok);

SingleEventModel model;
if (ok && model.getEventById(eventId)) {
Event event = model.event();
event.setStatus(Event::TemporarilyFailedStatus);
model.modifyEvent(event);
NotificationManager::instance()->showNotification(event, event.recipients().value(0).remoteUid(), Group::ChatTypeP2P);
}
}
call->deleteLater();
}

Expand Down Expand Up @@ -851,17 +845,9 @@ void MmsHandler::onRoamingAllowedChanged(bool roaming)
dataProhibitedChanged(m->path);
}


void MmsHandler::onDefaultVoiceModemChanged(QString modem)
{
DEBUG_("onDefaultVoiceModemChanged" << modem);

m_defaultVoiceModem = modem;
}

void MmsHandler::eventMarkedAsRead(CommHistory::Event &event)
{
const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
const QString imsi = event.subscriberIdentity();

// Caller already checked canSendReadReports() so mobile data is allowed
const bool sendReadReports = m_imsiSettings->value(
Expand All @@ -874,7 +860,7 @@ void MmsHandler::eventMarkedAsRead(CommHistory::Event &event)
callEngine("sendReadReport", args);
} else {
DEBUG_("not allowed to send read report for" << event.id());
event.setExtraProperty(MMS_PROPERTY_IMSI, QVariant());
event.removeExtraProperty(MMS_PROPERTY_UNREAD);
SingleEventModel model;
if (!model.modifyEvent(event)) {
qWarning() << "Failed to update MMS event" << event.id();
Expand All @@ -889,9 +875,8 @@ void MmsHandler::onEventsUpdated(const QList<CommHistory::Event> &events)

for (int i=0; i<count; i++) {
Event event(events.at(i));
const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
DEBUG_(i << ":" << event.toString());
if (canSendReadReports(getModemPath(imsi))) {
if (canSendReadReports(getModemPath(event))) {
if (MmsReadReportModel::acceptsEvent(event)) {
eventMarkedAsRead(event);
}
Expand All @@ -913,8 +898,7 @@ void MmsHandler::onGroupsUpdatedFull(const QList<CommHistory::Group> &groups)
DEBUG_(count << "MMS event(s) found in group" << gid);
for (int j=0; j<count; j++) {
Event event(model.event(j));
const QString imsi = event.extraProperty(MMS_PROPERTY_IMSI).toString();
if (canSendReadReports(getModemPath(imsi))) {
if (canSendReadReports(getModemPath(event))) {
eventMarkedAsRead(event);
} else {
DEBUG_("can't send read report at the moment for" << event.id());
Expand Down
15 changes: 8 additions & 7 deletions src/mmshandler.h
Expand Up @@ -2,7 +2,7 @@
**
** This file is part of commhistory-daemon.
**
** Copyright (C) 2014-2015 Jolla Ltd.
** Copyright (C) 2014-2016 Jolla Ltd.
** Contact: Slava Monich <slava.monich@jolla.com>
**
** This library is free software; you can redistribute it and/or modify it
Expand All @@ -25,6 +25,8 @@

#include <QHash>
#include <QMultiMap>
#include <qofonomanager.h>
#include <qofonoextmodemmanager.h>
#include "messagehandlerbase.h"
#include "mmspart.h"

Expand All @@ -35,8 +37,6 @@ namespace CommHistory {
}

class QDBusPendingCallWatcher;
class QOfonoManager;
class QOfonoExtModemManager;
class MDConfGroup;
class MmsHandlerModem;

Expand All @@ -61,6 +61,8 @@ public Q_SLOTS:
void readReport(const QString &imsi, const QString &mmsId, const QString &recipient, int status);
void readReportSendStatus(const QString &recId, int status);

int sendMessage(const QString &imsi, const QStringList &to, const QStringList &cc, const QStringList &bcc,
const QString &subject, MmsPartList parts);
int sendMessage(const QStringList &to, const QStringList &cc, const QStringList &bcc,
const QString &subject, MmsPartList parts);
void sendMessageFromEvent(int eventId);
Expand All @@ -74,11 +76,11 @@ private Q_SLOTS:
void onGroupsUpdatedFull(const QList<CommHistory::Group> &groups);
void onStatusChanged(const QString &status);
void onRoamingAllowedChanged(bool roaming);
void onDefaultVoiceModemChanged(QString modem);

private:
void addAllModems();
void addModem(const QString &path);
QString getModemPath(const CommHistory::Event &event) const;
QString getModemPath(const QString &imsi) const;
void dataProhibitedChanged(const QString &path);
static QDBusPendingCall callEngine(const QString &method, const QVariantList &args);
Expand All @@ -94,12 +96,11 @@ private Q_SLOTS:
QString accountPath(const QString &modemPath);

private:
QOfonoManager *m_ofonoManager;
QOfonoExtModemManager *m_ofonoExtModemManager;
QSharedPointer<QOfonoManager> m_ofonoManager;
QSharedPointer<QOfonoExtModemManager> m_ofonoExtModemManager;
QHash<QString, MmsHandlerModem*> m_modems;
MDConfGroup *m_imsiSettings;
QMultiMap<QString, int> m_activeEvents;
QString m_defaultVoiceModem;
};

#endif // MMSHANDLER_H
21 changes: 21 additions & 0 deletions src/org.nemomobile.MmsHandler.xml
Expand Up @@ -225,6 +225,27 @@
<arg direction="out" type="i" name="eventId"/>
</method>

<method name="sendMessage">
<!-- IMSI -->
<arg direction="in" type="s" name="imsi"/>
<!-- To: list -->
<arg direction="in" type="as" name="to"/>
<!-- Cc: list -->
<arg direction="in" type="as" name="cc"/>
<!-- Bcc: list -->
<arg direction="in" type="as" name="bcc"/>
<!-- Subject -->
<arg direction="in" type="s" name="subject"/>
<!--
List of message parts in the usual format.
All files will be copied before this method returns.
-->
<arg direction="in" type="a(sss)" name="parts"/>
<annotation name="org.qtproject.QtDBus.QtTypeName.In5" value="MmsPartList"/>
<!-- Event ID if successful, otherwise -1 -->
<arg direction="out" type="i" name="eventId"/>
</method>

<!--
===============================================================
Expand Down

0 comments on commit b0ecf1e

Please sign in to comment.