mumble-voip_mumble/src/mumble/DBus.cpp

142 lines
4.1 KiB
C++

// Copyright 2007-2023 The Mumble Developers. All rights reserved.
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file at the root of the
// Mumble source tree or at <https://www.mumble.info/LICENSE>.
#include "DBus.h"
#include "Channel.h"
#include "ClientUser.h"
#include "MainWindow.h"
#include "ServerHandler.h"
#include "Global.h"
#include <QtCore/QUrlQuery>
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusMessage>
MumbleDBus::MumbleDBus(QObject *mw) : QDBusAbstractAdaptor(mw) {
}
void MumbleDBus::openUrl(const QString &url, const QDBusMessage &msg) {
QUrl u = QUrl::fromEncoded(url.toLatin1());
bool valid = u.isValid();
valid = valid && (u.scheme() == QLatin1String("mumble"));
if (!valid) {
QDBusConnection::sessionBus().send(
msg.createErrorReply(QLatin1String("net.sourceforge.mumble.Error.url"), QLatin1String("Invalid URL")));
} else {
Global::get().mw->openUrl(u);
}
}
void MumbleDBus::getCurrentUrl(const QDBusMessage &msg) {
if (!Global::get().sh || !Global::get().sh->isRunning() || !Global::get().uiSession) {
QDBusConnection::sessionBus().send(msg.createErrorReply(
QLatin1String("net.sourceforge.mumble.Error.connection"), QLatin1String("Not connected")));
return;
}
QString host, user, pw;
unsigned short port;
QUrl u;
Global::get().sh->getConnectionInfo(host, port, user, pw);
u.setScheme(QLatin1String("mumble"));
u.setHost(host);
u.setPort(port);
u.setUserName(user);
QUrlQuery query;
query.addQueryItem(QLatin1String("version"), QLatin1String("1.2.0"));
u.setQuery(query);
QStringList path;
Channel *c = ClientUser::get(Global::get().uiSession)->cChannel;
while (c->cParent) {
path.prepend(c->qsName);
c = c->cParent;
}
QString fullpath = path.join(QLatin1String("/"));
// Make sure fullpath starts with a slash for non-empty paths. Setting
// a path without a leading slash clears the whole QUrl.
if (!fullpath.isEmpty()) {
fullpath.prepend(QLatin1String("/"));
}
u.setPath(fullpath);
QDBusConnection::sessionBus().send(msg.createReply(QString::fromLatin1(u.toEncoded())));
}
void MumbleDBus::getTalkingUsers(const QDBusMessage &msg) {
if (!Global::get().sh || !Global::get().sh->isRunning() || !Global::get().uiSession) {
QDBusConnection::sessionBus().send(msg.createErrorReply(
QLatin1String("net.sourceforge.mumble.Error.connection"), QLatin1String("Not connected")));
return;
}
QStringList names;
foreach (ClientUser *cu, ClientUser::getTalking()) { names.append(cu->qsName); }
QDBusConnection::sessionBus().send(msg.createReply(names));
}
void MumbleDBus::focus() {
Global::get().mw->show();
Global::get().mw->raise();
Global::get().mw->activateWindow();
}
void MumbleDBus::setTransmitMode(unsigned int mode, const QDBusMessage &msg) {
switch (mode) {
case 0:
Global::get().s.atTransmit = Settings::Continuous;
break;
case 1:
Global::get().s.atTransmit = Settings::VAD;
break;
case 2:
Global::get().s.atTransmit = Settings::PushToTalk;
break;
default:
QDBusConnection::sessionBus().send(msg.createErrorReply(
QLatin1String("net.sourceforge.mumble.Error.transmitMode"), QLatin1String("Invalid transmit mode")));
return;
}
QMetaObject::invokeMethod(Global::get().mw, "updateTransmitModeComboBox", Qt::QueuedConnection);
}
unsigned int MumbleDBus::getTransmitMode() {
return Global::get().s.atTransmit;
}
void MumbleDBus::toggleSelfMuted() {
Global::get().mw->qaAudioMute->trigger();
}
void MumbleDBus::toggleSelfDeaf() {
Global::get().mw->qaAudioDeaf->trigger();
}
void MumbleDBus::setSelfMuted(bool mute) {
Global::get().mw->qaAudioMute->setChecked(!mute);
Global::get().mw->qaAudioMute->trigger();
}
void MumbleDBus::setSelfDeaf(bool deafen) {
Global::get().mw->qaAudioDeaf->setChecked(!deafen);
Global::get().mw->qaAudioDeaf->trigger();
}
bool MumbleDBus::isSelfMuted() {
return Global::get().s.bMute;
}
bool MumbleDBus::isSelfDeaf() {
return Global::get().s.bDeaf;
}
void MumbleDBus::startTalking() {
Global::get().mw->on_PushToTalk_triggered(true, QVariant());
}
void MumbleDBus::stopTalking() {
Global::get().mw->on_PushToTalk_triggered(false, QVariant());
}