mirror of
https://git.jami.net/savoirfairelinux/jami-client-qt.git
synced 2025-04-23 14:42:02 +02:00
367 lines
9.8 KiB
C++
367 lines
9.8 KiB
C++
/*!
|
|
* Copyright (C) 2015-2020 by Savoir-faire Linux
|
|
* Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>
|
|
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
|
|
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com>
|
|
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
|
|
* Author: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "utilsadapter.h"
|
|
|
|
#include "lrcinstance.h"
|
|
#include "systemtray.h"
|
|
#include "utils.h"
|
|
#include "version.h"
|
|
|
|
#include "api/pluginmodel.h"
|
|
|
|
#include <QApplication>
|
|
#include <QClipboard>
|
|
#include <QFileInfo>
|
|
|
|
UtilsAdapter::UtilsAdapter(SystemTray* systemTray, LRCInstance* instance, QObject* parent)
|
|
: QmlAdapterBase(instance, parent)
|
|
, clipboard_(QApplication::clipboard())
|
|
, systemTray_(systemTray)
|
|
{}
|
|
|
|
const QString
|
|
UtilsAdapter::getProjectCredits()
|
|
{
|
|
return Utils::getProjectCredits();
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getVersionStr()
|
|
{
|
|
return QString(VERSION_STRING);
|
|
}
|
|
|
|
void
|
|
UtilsAdapter::setClipboardText(QString text)
|
|
{
|
|
clipboard_->setText(text, QClipboard::Clipboard);
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::qStringFromFile(const QString& filename)
|
|
{
|
|
return Utils::QByteArrayFromFile(filename);
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getStyleSheet(const QString& name, const QString& source)
|
|
{
|
|
auto simplifiedCSS = source.simplified().replace("'", "\"");
|
|
QString s = QString::fromLatin1("(function() {"
|
|
" var node = document.createElement('style');"
|
|
" node.id = '%1';"
|
|
" node.innerHTML = '%2';"
|
|
" document.head.appendChild(node);"
|
|
"})()")
|
|
.arg(name)
|
|
.arg(simplifiedCSS);
|
|
return s;
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getCachePath()
|
|
{
|
|
QDir dataDir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));
|
|
dataDir.cdUp();
|
|
return dataDir.absolutePath() + "/jami";
|
|
}
|
|
bool
|
|
UtilsAdapter::createStartupLink()
|
|
{
|
|
return Utils::CreateStartupLink(L"Jami");
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::GetRingtonePath()
|
|
{
|
|
return Utils::GetRingtonePath();
|
|
}
|
|
|
|
bool
|
|
UtilsAdapter::checkStartupLink()
|
|
{
|
|
return Utils::CheckStartupLink(L"Jami");
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getBestName(const QString& accountId, const QString& uid)
|
|
{
|
|
const auto& conv = lrcInstance_->getConversationFromConvUid(uid);
|
|
if (!conv.participants.isEmpty())
|
|
return lrcInstance_->getAccountInfo(accountId).contactModel->bestNameForContact(
|
|
conv.participants[0]);
|
|
return QString();
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getPeerUri(const QString& accountId, const QString& uid)
|
|
{
|
|
try {
|
|
auto* convModel = lrcInstance_->getAccountInfo(accountId).conversationModel.get();
|
|
const auto& convInfo = convModel->getConversationForUid(uid).value();
|
|
return convInfo.get().participants.front();
|
|
} catch (const std::out_of_range& e) {
|
|
qDebug() << e.what();
|
|
return "";
|
|
}
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::getBestId(const QString& accountId)
|
|
{
|
|
if (accountId.isEmpty())
|
|
return {};
|
|
return lrcInstance_->accountModel().bestIdForAccount(accountId);
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getBestId(const QString& accountId, const QString& uid)
|
|
{
|
|
const auto& conv = lrcInstance_->getConversationFromConvUid(uid);
|
|
if (!conv.participants.isEmpty())
|
|
return lrcInstance_->getAccountInfo(accountId).contactModel->bestIdForContact(
|
|
conv.participants[0]);
|
|
return QString();
|
|
}
|
|
|
|
int
|
|
UtilsAdapter::getTotalUnreadMessages()
|
|
{
|
|
int totalUnreadMessages {0};
|
|
if (lrcInstance_->getCurrentAccountInfo().profileInfo.type != lrc::api::profile::Type::SIP) {
|
|
auto* convModel = lrcInstance_->getCurrentConversationModel();
|
|
auto ringConversations = convModel->getFilteredConversations(lrc::api::profile::Type::RING,
|
|
false);
|
|
ringConversations.for_each(
|
|
[&totalUnreadMessages](const lrc::api::conversation::Info& conversation) {
|
|
totalUnreadMessages += conversation.unreadMessages;
|
|
});
|
|
}
|
|
return totalUnreadMessages;
|
|
}
|
|
|
|
int
|
|
UtilsAdapter::getTotalPendingRequest()
|
|
{
|
|
auto& accountInfo = lrcInstance_->getCurrentAccountInfo();
|
|
return accountInfo.contactModel->pendingRequestCount();
|
|
}
|
|
|
|
void
|
|
UtilsAdapter::setConversationFilter(const QString& filter)
|
|
{
|
|
lrcInstance_->getCurrentConversationModel()->setFilter(filter);
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getCurrConvId()
|
|
{
|
|
return lrcInstance_->get_selectedConvUid();
|
|
}
|
|
|
|
void
|
|
UtilsAdapter::makePermanentCurrentConv()
|
|
{
|
|
lrcInstance_->getCurrentConversationModel()->makePermanent(lrcInstance_->get_selectedConvUid());
|
|
}
|
|
|
|
const QStringList
|
|
UtilsAdapter::getCurrAccList()
|
|
{
|
|
return lrcInstance_->accountModel().getAccountList();
|
|
}
|
|
|
|
int
|
|
UtilsAdapter::getAccountListSize()
|
|
{
|
|
return getCurrAccList().size();
|
|
}
|
|
|
|
bool
|
|
UtilsAdapter::hasCall(const QString& accountId)
|
|
{
|
|
auto activeCalls = lrcInstance_->getActiveCalls();
|
|
for (const auto& callId : activeCalls) {
|
|
auto& accountInfo = lrcInstance_->accountModel().getAccountInfo(accountId);
|
|
if (accountInfo.callModel->hasCall(callId)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getCallConvForAccount(const QString& accountId)
|
|
{
|
|
// TODO: Currently returning first call, establish priority according to state?
|
|
for (const auto& callId : lrcInstance_->getActiveCalls()) {
|
|
auto& accountInfo = lrcInstance_->accountModel().getAccountInfo(accountId);
|
|
if (accountInfo.callModel->hasCall(callId)) {
|
|
return lrcInstance_->getConversationFromCallId(callId, accountId).uid;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getCallId(const QString& accountId, const QString& convUid)
|
|
{
|
|
auto const& convInfo = lrcInstance_->getConversationFromConvUid(convUid, accountId);
|
|
if (convInfo.uid.isEmpty()) {
|
|
return {};
|
|
}
|
|
|
|
if (auto* call = lrcInstance_->getCallInfoForConversation(convInfo, false)) {
|
|
return call->id;
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
int
|
|
UtilsAdapter::getCallStatus(const QString& callId)
|
|
{
|
|
const auto callStatus = lrcInstance_->getCallInfo(callId, lrcInstance_->getCurrAccId());
|
|
return static_cast<int>(callStatus->status);
|
|
}
|
|
|
|
const QString
|
|
UtilsAdapter::getCallStatusStr(int statusInt)
|
|
{
|
|
const auto status = static_cast<lrc::api::call::Status>(statusInt);
|
|
return lrc::api::call::to_string(status);
|
|
}
|
|
|
|
// returns true if name is valid registered name
|
|
bool
|
|
UtilsAdapter::validateRegNameForm(const QString& regName)
|
|
{
|
|
QRegularExpression regExp(" ");
|
|
|
|
if (regName.size() > 2 && !regName.contains(regExp)) {
|
|
return true;
|
|
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::getStringUTF8(QString string)
|
|
{
|
|
return string.toUtf8();
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::getRecordQualityString(int value)
|
|
{
|
|
return value ? QString::number(static_cast<float>(value) / 100, 'f', 1) + " Mbps" : "Default";
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::getCurrentPath()
|
|
{
|
|
return QDir::currentPath();
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::stringSimplifier(QString input)
|
|
{
|
|
return input.simplified();
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::toNativeSeparators(QString inputDir)
|
|
{
|
|
return QDir::toNativeSeparators(inputDir);
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::toFileInfoName(QString inputFileName)
|
|
{
|
|
QFileInfo fi(inputFileName);
|
|
return fi.fileName();
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::toFileAbsolutepath(QString inputFileName)
|
|
{
|
|
QFileInfo fi(inputFileName);
|
|
return fi.absolutePath();
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::getAbsPath(QString path)
|
|
{
|
|
// Note: this function is used on urls returned from qml-FileDialogs which
|
|
// contain 'file:///' for reasons we don't understand.
|
|
// TODO: this logic can be refactored into the JamiFileDialog component.
|
|
#ifdef Q_OS_WIN
|
|
return path.replace(QRegExp("^file:\\/{2,3}"), "").replace("\n", "").replace("\r", "");
|
|
#else
|
|
return path.replace(QRegExp("^file:\\/{2,3}"), "/").replace("\n", "").replace("\r", "");
|
|
#endif
|
|
}
|
|
|
|
bool
|
|
UtilsAdapter::checkShowPluginsButton(bool isCall)
|
|
{
|
|
if (isCall)
|
|
return lrcInstance_->pluginModel().getPluginsEnabled()
|
|
&& (lrcInstance_->pluginModel().getCallMediaHandlers().size() > 0);
|
|
else
|
|
return lrcInstance_->pluginModel().getPluginsEnabled()
|
|
&& (lrcInstance_->pluginModel().getChatHandlers().size() > 0);
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::fileName(const QString& path)
|
|
{
|
|
QFileInfo fi(path);
|
|
return fi.fileName();
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::getExt(const QString& path)
|
|
{
|
|
QFileInfo fi(path);
|
|
return fi.completeSuffix();
|
|
}
|
|
|
|
bool
|
|
UtilsAdapter::isImage(const QString& fileExt)
|
|
{
|
|
return Utils::isImage(fileExt);
|
|
}
|
|
|
|
QString
|
|
UtilsAdapter::humanFileSize(qint64 fileSize)
|
|
{
|
|
return Utils::humanFileSize(fileSize);
|
|
}
|
|
|
|
void
|
|
UtilsAdapter::setSystemTrayIconVisible(bool visible)
|
|
{
|
|
systemTray_->setVisible(visible);
|
|
}
|