blob: 31ca4f96a09f0e712955879ac06c2cbfa8ba1c3e [file] [log] [blame]
/*
* Copyright (C) 2004-2021 Savoir-faire Linux Inc.
*
* Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
* Author: Philippe Gorley <philippe.gorley@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 ful,
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef __PREFERENCE_H__
#define __PREFERENCE_H__
#include "config/serializable.h"
#include "client/ring_signal.h"
#include <string>
#include <map>
#include <set>
#include <vector>
namespace YAML {
class Emitter;
class Node;
} // namespace YAML
extern "C" {
struct pjsip_msg;
}
namespace jami {
class AudioLayer;
class Preferences : public Serializable
{
public:
static const char* const DFT_ZONE;
static const char* const REGISTRATION_EXPIRE_KEY;
Preferences();
void serialize(YAML::Emitter& out) const override;
void unserialize(const YAML::Node& in) override;
const std::string& getAccountOrder() const { return accountOrder_; }
// flush invalid accountIDs from account order
void verifyAccountOrder(const std::vector<std::string>& accounts);
void addAccount(const std::string& acc);
void removeAccount(const std::string& acc);
void setAccountOrder(const std::string& ord) { accountOrder_ = ord; }
int getHistoryLimit() const { return historyLimit_; }
void setHistoryLimit(int lim) { historyLimit_ = lim; }
int getRingingTimeout() const { return ringingTimeout_; }
void setRingingTimeout(int timeout) { ringingTimeout_ = timeout; }
int getHistoryMaxCalls() const { return historyMaxCalls_; }
void setHistoryMaxCalls(int max) { historyMaxCalls_ = max; }
std::string getZoneToneChoice() const { return zoneToneChoice_; }
void setZoneToneChoice(const std::string& str) { zoneToneChoice_ = str; }
int getPortNum() const { return portNum_; }
void setPortNum(int port) { portNum_ = port; }
bool getSearchBarDisplay() const { return searchBarDisplay_; }
void setSearchBarDisplay(bool search) { searchBarDisplay_ = search; }
bool getMd5Hash() const { return md5Hash_; }
void setMd5Hash(bool md5) { md5Hash_ = md5; }
private:
std::string accountOrder_;
int historyLimit_;
int historyMaxCalls_;
int ringingTimeout_;
std::string zoneToneChoice_;
int portNum_;
bool searchBarDisplay_;
bool md5Hash_;
constexpr static const char* const CONFIG_LABEL = "preferences";
};
class VoipPreference : public Serializable
{
public:
VoipPreference();
void serialize(YAML::Emitter& out) const override;
void unserialize(const YAML::Node& in) override;
bool getDisableSecureDlgCheck() const { return disableSecureDlgCheck_; }
void setDisableSecureDlgCheck(bool disable) { disableSecureDlgCheck_ = disable; }
bool getPlayDtmf() const { return playDtmf_; }
void setPlayDtmf(bool dtmf) { playDtmf_ = dtmf; }
bool getPlayTones() const { return playTones_; }
void setPlayTones(bool tone) { playTones_ = tone; }
int getPulseLength() const { return pulseLength_; }
void setPulseLength(int length) { pulseLength_ = length; }
bool getSymmetricRtp() const { return symmetricRtp_; }
void setSymmetricRtp(bool sym) { symmetricRtp_ = sym; }
std::string getZidFile() const { return zidFile_; }
void setZidFile(const std::string& file) { zidFile_ = file; }
private:
bool disableSecureDlgCheck_;
bool playDtmf_;
bool playTones_;
int pulseLength_;
bool symmetricRtp_;
std::string zidFile_;
constexpr static const char* const CONFIG_LABEL = "voipPreferences";
};
class AudioPreference : public Serializable
{
public:
AudioPreference();
AudioLayer* createAudioLayer();
static std::vector<std::string> getSupportedAudioManagers();
const std::string& getAudioApi() const { return audioApi_; }
void setAudioApi(const std::string& api) { audioApi_ = api; }
void serialize(YAML::Emitter& out) const override;
void unserialize(const YAML::Node& in) override;
// alsa preference
int getAlsaCardin() const { return alsaCardin_; }
void setAlsaCardin(int c) { alsaCardin_ = c; }
int getAlsaCardout() const { return alsaCardout_; }
void setAlsaCardout(int c) { alsaCardout_ = c; }
int getAlsaCardRingtone() const { return alsaCardRingtone_; }
void setAlsaCardRingtone(int c) { alsaCardRingtone_ = c; }
const std::string& getAlsaPlugin() const { return alsaPlugin_; }
void setAlsaPlugin(const std::string& p) { alsaPlugin_ = p; }
int getAlsaSmplrate() const { return alsaSmplrate_; }
void setAlsaSmplrate(int r) { alsaSmplrate_ = r; }
// pulseaudio preference
const std::string& getPulseDevicePlayback() const { return pulseDevicePlayback_; }
void setPulseDevicePlayback(const std::string& p) { pulseDevicePlayback_ = p; }
const std::string& getPulseDeviceRecord() const { return pulseDeviceRecord_; }
void setPulseDeviceRecord(const std::string& r) { pulseDeviceRecord_ = r; }
const std::string& getPulseDeviceRingtone() const { return pulseDeviceRingtone_; }
void setPulseDeviceRingtone(const std::string& r) { pulseDeviceRingtone_ = r; }
// portaudio preference
const std::string& getPortAudioDevicePlayback() const { return portaudioDevicePlayback_; }
void setPortAudioDevicePlayback(const std::string& p) { portaudioDevicePlayback_ = p; }
const std::string& getPortAudioDeviceRecord() const { return portaudioDeviceRecord_; }
void setPortAudioDeviceRecord(const std::string& r) { portaudioDeviceRecord_ = r; }
const std::string& getPortAudioDeviceRingtone() const { return portaudioDeviceRingtone_; }
void setPortAudioDeviceRingtone(const std::string& r) { portaudioDeviceRingtone_ = r; }
// general preference
const std::string& getRecordPath() const { return recordpath_; }
// Returns true if directory is writeable
bool setRecordPath(const std::string& r);
bool getIsAlwaysRecording() const { return alwaysRecording_; }
void setIsAlwaysRecording(bool rec) { alwaysRecording_ = rec; }
double getVolumemic() const { return volumemic_; }
void setVolumemic(double m) { volumemic_ = m; }
double getVolumespkr() const { return volumespkr_; }
void setVolumespkr(double s) { volumespkr_ = s; }
bool isAGCEnabled() const { return agcEnabled_; }
void setAGCState(bool enabled) { agcEnabled_ = enabled; }
bool getNoiseReduce() const { return denoise_; }
void setNoiseReduce(bool enabled) { denoise_ = enabled; }
bool getCaptureMuted() const { return captureMuted_; }
void setCaptureMuted(bool muted) { captureMuted_ = muted; }
bool getPlaybackMuted() const { return playbackMuted_; }
void setPlaybackMuted(bool muted) { playbackMuted_ = muted; }
const std::string& getEchoCanceller() const { return echoCanceller_; }
void setEchoCanceller(const std::string& ec) { echoCanceller_ = ec; }
private:
std::string audioApi_;
// alsa preference
int alsaCardin_;
int alsaCardout_;
int alsaCardRingtone_;
std::string alsaPlugin_;
int alsaSmplrate_;
// pulseaudio preference
std::string pulseDevicePlayback_;
std::string pulseDeviceRecord_;
std::string pulseDeviceRingtone_;
// portaudio preference
std::string portaudioDevicePlayback_;
std::string portaudioDeviceRecord_;
std::string portaudioDeviceRingtone_;
// general preference
std::string recordpath_; //: /home/msavard/Bureau
bool alwaysRecording_;
double volumemic_;
double volumespkr_;
std::string echoCanceller_;
bool denoise_;
bool agcEnabled_;
bool captureMuted_;
bool playbackMuted_;
constexpr static const char* const CONFIG_LABEL = "audio";
};
class ShortcutPreferences : public Serializable
{
public:
ShortcutPreferences();
void serialize(YAML::Emitter& out) const override;
void unserialize(const YAML::Node& in) override;
void setShortcuts(std::map<std::string, std::string> shortcuts);
std::map<std::string, std::string> getShortcuts() const;
std::string getHangup() const { return hangup_; }
void setHangup(const std::string& hangup) { hangup_ = hangup; }
std::string getPickup() const { return pickup_; }
void setPickup(const std::string& pickup) { pickup_ = pickup; }
std::string getPopup() const { return popup_; }
void setPopup(const std::string& popup) { popup_ = popup; }
std::string getToggleHold() const { return toggleHold_; }
void setToggleHold(const std::string& hold) { toggleHold_ = hold; }
std::string getTogglePickupHangup() const { return togglePickupHangup_; }
void setTogglePickupHangup(const std::string& toggle) { togglePickupHangup_ = toggle; }
private:
std::string hangup_;
std::string pickup_;
std::string popup_;
std::string toggleHold_;
std::string togglePickupHangup_;
constexpr static const char* const CONFIG_LABEL = "shortcuts";
};
#ifdef ENABLE_VIDEO
class VideoPreferences : public Serializable
{
public:
VideoPreferences();
void serialize(YAML::Emitter& out) const override;
void unserialize(const YAML::Node& in) override;
bool getDecodingAccelerated() const { return decodingAccelerated_; }
bool setDecodingAccelerated(bool decodingAccelerated)
{
if (decodingAccelerated_ != decodingAccelerated) {
decodingAccelerated_ = decodingAccelerated;
emitSignal<DRing::ConfigurationSignal::HardwareDecodingChanged>(decodingAccelerated_);
return true;
}
return false;
}
bool getEncodingAccelerated() const { return encodingAccelerated_; }
bool setEncodingAccelerated(bool encodingAccelerated)
{
if (encodingAccelerated_ != encodingAccelerated) {
encodingAccelerated_ = encodingAccelerated;
emitSignal<DRing::ConfigurationSignal::HardwareEncodingChanged>(encodingAccelerated_);
return true;
}
return false;
}
bool getRecordPreview() const { return recordPreview_; }
void setRecordPreview(bool rec) { recordPreview_ = rec; }
int getRecordQuality() const { return recordQuality_; }
void setRecordQuality(int rec) { recordQuality_ = rec; }
const std::string& getConferenceResolution() const { return conferenceResolution_; }
void setConferenceResolution(const std::string& res) { conferenceResolution_ = res; }
private:
bool decodingAccelerated_;
bool encodingAccelerated_;
bool recordPreview_;
int recordQuality_;
std::string conferenceResolution_;
constexpr static const char* const CONFIG_LABEL = "video";
};
#endif // ENABLE_VIDEO
#ifdef ENABLE_PLUGIN
class PluginPreferences : public Serializable
{
public:
PluginPreferences();
void serialize(YAML::Emitter& out) const override;
void unserialize(const YAML::Node& in) override;
bool getPluginsEnabled() const { return pluginsEnabled_; }
void setPluginsEnabled(bool pluginsEnabled) { pluginsEnabled_ = pluginsEnabled; }
std::vector<std::string> getLoadedPlugins() const
{
std::vector<std::string> v(loadedPlugins_.begin(), loadedPlugins_.end());
return v;
}
std::vector<std::string> getInstalledPlugins() const
{
return std::vector<std::string>(installedPlugins_.begin(), installedPlugins_.end());
}
void saveStateLoadedPlugins(std::string plugin, bool loaded)
{
if (loaded) {
if (loadedPlugins_.find(plugin) != loadedPlugins_.end())
return;
loadedPlugins_.emplace(plugin);
} else {
auto it = loadedPlugins_.find(plugin);
if (it != loadedPlugins_.end())
loadedPlugins_.erase(it);
}
}
private:
bool pluginsEnabled_;
std::set<std::string> installedPlugins_;
std::set<std::string> loadedPlugins_;
constexpr static const char* const CONFIG_LABEL = "plugins";
};
#endif // ENABLE_PLUGIN
} // namespace jami
#endif