audiocallmanager.cpp 4,2 КБ
Newer Older
A. Roditelev's avatar
A. Roditelev включено в состав коммита
1
2
3
4
5
/**
 * SPDX-FileCopyrightText: 2024 Open Mobile Platform LLC <community@omp.ru>
 * SPDX-License-Identifier: BSD-3-Clause
 */

Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
6
7
8
9
10
#include <callfactoryinterface.h>

#include "audiocallmanager.h"
#include "audiocall.h"

Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
11
using ru::auroraos::call::AudioContext;
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using ru::auroraos::call::Call;
using ru::auroraos::call::CallManager;
using ru::auroraos::call::CallFactoryInterface;

static const auto SCHEME = QStringLiteral("ruauroraosaudiocallexample.://");

class AudioCallFactory : public CallFactoryInterface
{
    Call *newCall(CallManager *manager,
                 const QString &id,
                 const QVariantMap &parameters,
                 QObject *parent) override {
        return new AudioCall(manager, id, parameters, parent);
    }
};

Q_GLOBAL_STATIC(AudioCallFactory, audioCallFactory);

AudioCallManager::AudioCallManager(const QString &accountId, QObject *parent)
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
31
    : CallManager(accountId, parent)
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
32
    , m_audioContext(this)
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    , m_callId(1)
    , m_holdable(true)
    , m_redialable(true)
{
    setCallFactory(audioCallFactory);
}

Call *AudioCallManager::newCall(QVariantMap &properties)
{
    // Do not allow calls with empty remoteHandle (who do we call?).
    QString remoteHandle = properties[QStringLiteral("remoteHandle")].value<QString>();
    if (remoteHandle.isEmpty())
        return nullptr;

Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
47
48
49
50
    // Display remoteHandle if a human-readable remoteName is not provided.
    QString remoteName = properties[QStringLiteral("remoteName")].value<QString>();
    if (remoteName.isEmpty())
        properties[QStringLiteral("remoteName")] = remoteHandle;
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
51
52
53
54
55
56

    // Whether SetHold() calls are welcome.
    properties[QStringLiteral("holdable")] = m_holdable;

    // Fill local account name.
    properties[QStringLiteral("localHandle")] = QStringLiteral("CallExample");
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
57
    properties[QStringLiteral("localName")] = QStringLiteral("CallExample");
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
58
59
60
61
62
63

    if (m_redialable)
        properties[QStringLiteral("uri")] = SCHEME + remoteHandle;

    QString id = QString::number(m_callId++);

Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
64
65
66
67
    // Add audio control interface.
    auto call = CallManager::newCall(id, properties);
    call->addInterfaces({ audioManager() });
    return call;
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
}

Call *AudioCallManager::initiateCall(const QVariantMap &props)
{
    QVariantMap properties(props);
    properties[QStringLiteral("incoming")] = false;

    return newCall(properties);
}

Call *AudioCallManager::reportIncomingCall(const QVariantMap &props)
{
    QVariantMap properties(props);
    properties[QStringLiteral("incoming")] = true;

    return newCall(properties);
}

A. Roditelev's avatar
A. Roditelev включено в состав коммита
86
87
88
89
90
91
92
void AudioCallManager::disconnectAll()
{
    for (const auto &call : calls()) {
        removeCall(call);
    }
}

Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
void AudioCallManager::openUri(const QString &uri)
{
    qInfo() << uri;

    if (uri.startsWith(SCHEME)) {
        QString tmp(uri);
        const QString handle = tmp.replace(SCHEME, QStringLiteral(""));
        if (!handle.isEmpty()) {
            for (const auto &call : calls()) {
                if (uri == getCall(call)->uri()) {
                    // The call is already set up. Show the corresponding UI page.
                    qInfo() << "display the current call" << getCall(call)->callId();
                    return;
                }
            }

            QVariantMap properties;
            properties[QStringLiteral("incoming")] = false;
            properties[QStringLiteral("remoteHandle")] = handle;
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
112
113
            // FIXME: Parse remoteName from URI.
            properties[QStringLiteral("remoteName")] = QStringLiteral("Outgoing call ") + handle;
Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147

            newCall(properties);
            return;
        }
    }
    qWarning() << "Invalid URI" << uri;
}

bool AudioCallManager::holdable() const
{
    return m_holdable;
}

void AudioCallManager::setHoldable(bool on)
{
    if (on != m_holdable) {
        m_holdable = on;
        emit holdableChanged(on);
    }
}

bool AudioCallManager::redialable() const
{
    return m_redialable;
}

void AudioCallManager::setRedialable(bool on)
{
    if (m_redialable != on) {
        m_redialable = on;
        emit redialableChanged(on);
    }
}

A. Roditelev's avatar
A. Roditelev включено в состав коммита
148
149
150
151
152
QString AudioCallManager::audioGeneratorConfigPath() const
{
    return QString(AUDIO_GENERATOR_CONFIG_PATH);
}

Denis Grigorev's avatar
Denis Grigorev включено в состав коммита
153
154
155
156
AudioCall *AudioCallManager::getAudioCall(const QString &callId) const
{
    return qobject_cast<AudioCall*>(getCall(callId));
}