Line data Source code
1 : /* 2 : * Copyright (C) 2004-2026 Savoir-faire Linux Inc. 3 : * 4 : * This program is free software: you can redistribute it and/or modify 5 : * it under the terms of the GNU General Public License as published by 6 : * the Free Software Foundation, either version 3 of the License, or 7 : * (at your option) any later version. 8 : * 9 : * This program is distributed in the hope that it will be useful, 10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 : * GNU General Public License for more details. 13 : * 14 : * You should have received a copy of the GNU General Public License 15 : * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 : */ 17 : #pragma once 18 : #include "config/serializable.h" 19 : #include "string_utils.h" 20 : 21 : #include <string> 22 : #include <utility> 23 : #include <map> 24 : #include <filesystem> 25 : 26 : using namespace std::literals; 27 : 28 : namespace jami { 29 : constexpr const char* const DEFAULT_RINGTONE_PATH = "default.opus"; 30 : 31 : struct AccountConfig : public Serializable 32 : { 33 1196 : AccountConfig(const std::string& type_, const std::string& id_, const std::filesystem::path& path_ = {}) 34 2392 : : type(type_) 35 1196 : , id(id_) 36 2392 : , path(path_) 37 1196 : {} 38 : 39 : void serializeDiff(YAML::Emitter& out, const AccountConfig& def) const; 40 : 41 : virtual void serialize(YAML::Emitter& out) const = 0; 42 : virtual void unserialize(const YAML::Node& node); 43 : 44 : virtual std::map<std::string, std::string> toMap() const; 45 : virtual void fromMap(const std::map<std::string, std::string>&); 46 : 47 : /** Account type */ 48 : const std::string type; 49 : 50 : /** Account id */ 51 : const std::string id; 52 : 53 : /** Path where the configuration file is stored. 54 : * Part of the context but not stored in the configuration 55 : * Used to compute relative paths for configuraton fields */ 56 : const std::filesystem::path path; 57 : 58 : /** A user-defined name for this account */ 59 : std::string alias {}; 60 : 61 : std::string username {}; 62 : 63 : /** SIP hostname (SIP account) or DHT bootstrap nodes (Jami account) */ 64 : std::string hostname {}; 65 : 66 : /** True if the account is enabled. */ 67 : bool enabled {true}; 68 : 69 : /** If true, automatically answer calls to this account */ 70 : bool autoAnswerEnabled {false}; 71 : 72 : /** If true, automatically deny new calls when already in one call to this account */ 73 : bool denySecondCallEnabled {false}; 74 : 75 : /** If true, send displayed status (and emit to the client) */ 76 : bool sendReadReceipt {true}; 77 : 78 : /** If true, send composing status (and emit to the client) */ 79 : bool sendComposing {true}; 80 : 81 : /** If true mix calls into a conference */ 82 : bool isRendezVous {false}; 83 : 84 : /** 85 : * The number of concurrent calls for the account 86 : * -1: Unlimited 87 : * 0: Do not disturb 88 : * 1: Single call 89 : * +: Multi line 90 : */ 91 : int activeCallLimit {-1}; 92 : 93 : std::vector<unsigned> activeCodecs {}; 94 : 95 : /** 96 : * Play ringtone when receiving a call 97 : */ 98 : bool ringtoneEnabled {true}; 99 : 100 : /** 101 : * Ringtone file used for this account 102 : */ 103 : std::string ringtonePath {DEFAULT_RINGTONE_PATH}; 104 : 105 : /** 106 : * Allows user to temporarily disable video calling 107 : */ 108 : bool videoEnabled {true}; 109 : 110 : /** 111 : * Display name when calling 112 : */ 113 : std::string displayName {}; 114 : 115 : /** 116 : * User-agent used for registration 117 : */ 118 : std::string customUserAgent {}; 119 : 120 : /** 121 : * Account mail box 122 : */ 123 : std::string mailbox {}; 124 : 125 : /** 126 : * UPnP IGD controller and the mutex to access it 127 : */ 128 : bool upnpEnabled {true}; 129 : 130 : std::set<std::string> defaultModerators {}; 131 : bool localModeratorsEnabled {true}; 132 : bool allModeratorsEnabled {true}; 133 : 134 : /** 135 : * Device push notification token. 136 : */ 137 : std::string deviceKey {}; 138 : /** 139 : * Device push notification platform. 140 : */ 141 : std::string platform {}; 142 : 143 : /** 144 : * Push notification topic. 145 : */ 146 : std::string notificationTopic {}; 147 : 148 : /** 149 : * information about the customization of ui 150 : */ 151 : std::string uiCustomization {}; 152 : }; 153 : 154 : inline void 155 49202 : parseString(const std::map<std::string, std::string>& details, const char* key, std::string& s) 156 : { 157 49202 : auto it = details.find(key); 158 49203 : if (it != details.end()) 159 20808 : s = it->second; 160 49203 : } 161 : 162 : inline void 163 38086 : parseBool(const std::map<std::string, std::string>& details, const char* key, bool& s) 164 : { 165 38086 : auto it = details.find(key); 166 38087 : if (it != details.end()) 167 20081 : s = it->second == TRUE_STR; 168 38087 : } 169 : 170 : template<class T> 171 : inline void 172 11188 : parseInt(const std::map<std::string, std::string>& details, const char* key, T& s) 173 : { 174 11188 : auto it = details.find(key); 175 11188 : if (it != details.end()) 176 5920 : s = to_int<T>(it->second); 177 11188 : } 178 : 179 : void parsePath(const std::map<std::string, std::string>& details, 180 : const char* key, 181 : std::string& s, 182 : const std::filesystem::path& base); 183 : 184 : } // namespace jami