Skip to content

Commit

Permalink
Merge branch 'mer-1608' into 'master'
Browse files Browse the repository at this point in the history
[voicecall] Export voicecallrecord availability. Contributes to MER#1608



See merge request !11
  • Loading branch information
matthewvogt committed Jun 30, 2016
2 parents 518ad02 + f983741 commit bbc4f76
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 7 deletions.
90 changes: 83 additions & 7 deletions plugins/declarative/src/voicecallaudiorecorder.cpp
Expand Up @@ -4,6 +4,8 @@
#include <QDateTime>
#include <QDBusConnection>
#include <QDBusMessage>
#include <QDBusMetaType>
#include <QDBusPendingReply>
#include <QDir>
#include <QLocale>
#include <QDataStream>
Expand All @@ -19,6 +21,10 @@ const quint16 SampleBits = 16;
const quint32 WaveHeaderLength = 44;
const quint16 WavePCMFormat = 1;

const QString RouteManagerService("org.nemomobile.Route.Manager");
const QString RouteManagerPath("/org/nemomobile/Route/Manager");
const QString RouteManagerInterface("org.nemomobile.Route.Manager");

QAudioFormat getRecordingFormat()
{
QAudioFormat format;
Expand All @@ -42,31 +48,82 @@ const QAudioFormat recordingFormat(getRecordingFormat());

QDBusMessage createEnableVoicecallRecordingMessage(bool enable)
{
const QString routeManagerService("org.nemomobile.Route.Manager");
const QString routeManagerPath("/org/nemomobile/Route/Manager");
const QString routeManagerInterface("org.nemomobile.Route.Manager");

QDBusMessage msg = QDBusMessage::createMethodCall(routeManagerService,
routeManagerPath,
routeManagerInterface,
QDBusMessage msg = QDBusMessage::createMethodCall(RouteManagerService,
RouteManagerPath,
RouteManagerInterface,
enable ? QString("Enable") : QString("Disable"));
msg.setArguments(QVariantList() << QVariant(QString("voicecallrecord")));
return msg;
}

QDBusMessage createVoicecallFeaturesMessage(void)
{
QDBusMessage msg = QDBusMessage::createMethodCall(RouteManagerService,
RouteManagerPath,
RouteManagerInterface,
QString("GetAll"));
return msg;
}

}


struct ManagerFeature
{
QString name;
unsigned unused1;
unsigned unused2;
};
typedef QList<ManagerFeature> ManagerFeatureList;

Q_DECLARE_METATYPE(ManagerFeature)
Q_DECLARE_METATYPE(ManagerFeatureList)

QDBusArgument &operator<<(QDBusArgument &arg, const ManagerFeature &feature)
{
arg.beginStructure();
arg << feature.name;
arg << feature.unused1;
arg << feature.unused2;
arg.endStructure();
return arg;
}

const QDBusArgument &operator>>(const QDBusArgument &arg, ManagerFeature &feature)
{
arg.beginStructure();
arg >> feature.name;
arg >> feature.unused1;
arg >> feature.unused2;
arg.endStructure();
return arg;
}


VoiceCallAudioRecorder::VoiceCallAudioRecorder(QObject *parent)
: QObject(parent)
, featureAvailable(false)
, active(false)
{
qDBusRegisterMetaType<ManagerFeature>();
qDBusRegisterMetaType<ManagerFeatureList>();

QDBusMessage featuresMsg = createVoicecallFeaturesMessage();
QDBusPendingCall featuresCall = QDBusConnection::systemBus().asyncCall(featuresMsg);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(featuresCall, this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, &VoiceCallAudioRecorder::featuresCallFinished);
}

VoiceCallAudioRecorder::~VoiceCallAudioRecorder()
{
terminateRecording();
}

bool VoiceCallAudioRecorder::available() const
{
return featureAvailable;
}

void VoiceCallAudioRecorder::startRecording(const QString &name, const QString &uid, bool incoming)
{
if (name.isEmpty() || uid.isEmpty()) {
Expand Down Expand Up @@ -123,6 +180,25 @@ bool VoiceCallAudioRecorder::deleteRecording(const QString &fileName)
return false;
}

void VoiceCallAudioRecorder::featuresCallFinished(QDBusPendingCallWatcher *watcher)
{
QDBusPendingReply<QString, unsigned, QString, unsigned, ManagerFeatureList> reply = *watcher;
if (reply.isError()) {
qWarning() << "Unable to query voice call recording feature.";
} else {
const ManagerFeatureList features = reply.argumentAt<4>();
foreach (const ManagerFeature &feature, features) {
if (feature.name == QStringLiteral("voicecallrecord")) {
featureAvailable = true;
emit availableChanged();
break;
}
}
}

watcher->deleteLater();
}

void VoiceCallAudioRecorder::inputStateChanged(QAudio::State state)
{
if (state == QAudio::StoppedState) {
Expand Down
7 changes: 7 additions & 0 deletions plugins/declarative/src/voicecallaudiorecorder.h
Expand Up @@ -4,6 +4,7 @@
#include <QAudioInput>
#include <QFile>
#include <QScopedPointer>
#include <QDBusPendingCallWatcher>

class VoiceCallAudioRecorder : public QObject
{
Expand All @@ -12,6 +13,7 @@ class VoiceCallAudioRecorder : public QObject

Q_ENUMS(ErrorCondition)

Q_PROPERTY(bool available READ available NOTIFY availableChanged)
Q_PROPERTY(bool recording READ recording NOTIFY recordingChanged)

public:
Expand All @@ -24,6 +26,8 @@ class VoiceCallAudioRecorder : public QObject
explicit VoiceCallAudioRecorder(QObject *parent);
~VoiceCallAudioRecorder();

bool available() const;

Q_INVOKABLE void startRecording(const QString &name, const QString &uid, bool incoming);
Q_INVOKABLE void stopRecording();

Expand All @@ -33,11 +37,13 @@ class VoiceCallAudioRecorder : public QObject
Q_INVOKABLE bool deleteRecording(const QString &fileName);

signals:
void availableChanged();
void recordingChanged();
void recordingError(ErrorCondition error);
void callRecorded(const QString &fileName, const QString &label);

private slots:
void featuresCallFinished(QDBusPendingCallWatcher *watcher);
void inputStateChanged(QAudio::State state);

private:
Expand All @@ -47,6 +53,7 @@ private slots:
QScopedPointer<QAudioInput> input;
QScopedPointer<QFile> output;
QString label;
bool featureAvailable;
bool active;
};

Expand Down

0 comments on commit bbc4f76

Please sign in to comment.