LCOV - code coverage report
Current view: top level - src - account_factory.cpp (source / functions) Hit Total Coverage
Test: jami-coverage-filtered.info Lines: 75 86 87.2 %
Date: 2024-11-15 09:04:49 Functions: 15 21 71.4 %

          Line data    Source code
       1             : /*
       2             :  *  Copyright (C) 2004-2024 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             : 
      18             : #ifdef HAVE_CONFIG_H
      19             : #include "config.h"
      20             : #endif
      21             : 
      22             : #include "account_factory.h"
      23             : 
      24             : #include "sip/sipaccount.h"
      25             : #include "jamidht/jamiaccount.h"
      26             : 
      27             : #include <stdexcept>
      28             : 
      29             : namespace jami {
      30             : 
      31             : const std::string_view AccountFactory::DEFAULT_ACCOUNT_TYPE = SIPAccount::ACCOUNT_TYPE;
      32             : 
      33          39 : AccountFactory::AccountFactory()
      34             : {
      35          39 :     generators_.emplace(SIPAccount::ACCOUNT_TYPE, [](const std::string& id) {
      36          48 :         return std::make_shared<SIPAccount>(id, true);
      37             :     });
      38          39 :     generators_.emplace(JamiAccount::ACCOUNT_TYPE, [](const std::string& id) {
      39         784 :         return std::make_shared<JamiAccount>(id);
      40             :     });
      41          39 : }
      42             : 
      43             : std::shared_ptr<Account>
      44         808 : AccountFactory::createAccount(std::string_view accountType, const std::string& id)
      45             : {
      46         808 :     if (hasAccount(id)) {
      47           0 :         JAMI_ERROR("Existing account {}", id);
      48           0 :         return nullptr;
      49             :     }
      50             : 
      51         808 :     const auto& it = generators_.find(accountType);
      52         808 :     if (it == generators_.cend())
      53           0 :         return {};
      54             : 
      55         808 :     std::shared_ptr<Account> account = it->second(id);
      56             :     {
      57         808 :         std::lock_guard lock(mutex_);
      58         808 :         auto m = accountMaps_.find(accountType);
      59         808 :         if (m == accountMaps_.end())
      60          30 :             m = accountMaps_.emplace(std::string(accountType), AccountMap<Account>{}).first;
      61         808 :         m->second.emplace(id, account);
      62         808 :     }
      63         808 :     return account;
      64         808 : }
      65             : 
      66             : bool
      67           0 : AccountFactory::isSupportedType(std::string_view name) const
      68             : {
      69           0 :     return generators_.find(name) != generators_.cend();
      70             : }
      71             : 
      72             : void
      73         803 : AccountFactory::removeAccount(Account& account)
      74             : {
      75         803 :     std::string_view account_type = account.getAccountType();
      76         803 :     std::lock_guard lock(mutex_);
      77         803 :     const auto& id = account.getAccountID();
      78        2409 :     JAMI_DEBUG("Removing account {:s}", id);
      79         803 :     auto m = accountMaps_.find(account_type);
      80         803 :     if (m != accountMaps_.end()) {
      81         803 :         m->second.erase(id);
      82        2409 :         JAMI_DEBUG("Remaining {:d} {:s} account(s)", m->second.size(), account_type);
      83             :     }
      84         803 : }
      85             : 
      86             : void
      87           0 : AccountFactory::removeAccount(std::string_view id)
      88             : {
      89           0 :     std::lock_guard lock(mutex_);
      90             : 
      91           0 :     if (auto account = getAccount(id)) {
      92           0 :         removeAccount(*account);
      93             :     } else
      94           0 :         JAMI_ERROR("No account with ID {:s}", id);
      95           0 : }
      96             : 
      97             : template<>
      98             : bool
      99         812 : AccountFactory::hasAccount(std::string_view id) const
     100             : {
     101         812 :     std::lock_guard lk(mutex_);
     102             : 
     103        1594 :     for (const auto& item : accountMaps_) {
     104         784 :         const auto& map = item.second;
     105         784 :         if (map.find(id) != map.cend())
     106           2 :             return true;
     107             :     }
     108             : 
     109         810 :     return false;
     110         812 : }
     111             : 
     112             : template<>
     113             : void
     114          39 : AccountFactory::clear()
     115             : {
     116          39 :     std::lock_guard lk(mutex_);
     117          39 :     accountMaps_.clear();
     118          39 : }
     119             : 
     120             : template<>
     121             : std::vector<std::shared_ptr<Account>>
     122        4634 : AccountFactory::getAllAccounts() const
     123             : {
     124        4634 :     std::lock_guard lock(mutex_);
     125        4634 :     std::vector<std::shared_ptr<Account>> v;
     126             : 
     127        9211 :     for (const auto& itemmap : accountMaps_) {
     128        4577 :         const auto& map = itemmap.second;
     129        4577 :         v.reserve(v.size() + map.size());
     130       13054 :         for (const auto& item : map)
     131        8477 :             v.push_back(item.second);
     132             :     }
     133             : 
     134        9268 :     return v;
     135        4634 : }
     136             : 
     137             : template<>
     138             : std::shared_ptr<Account>
     139       10489 : AccountFactory::getAccount(std::string_view id) const
     140             : {
     141       10489 :     std::lock_guard lock(mutex_);
     142             : 
     143       11263 :     for (const auto& item : accountMaps_) {
     144       10461 :         const auto& map = item.second;
     145       10461 :         const auto& iter = map.find(id);
     146       10461 :         if (iter != map.cend())
     147        9687 :             return iter->second;
     148             :     }
     149             : 
     150         802 :     return nullptr;
     151       10489 : }
     152             : 
     153             : template<>
     154             : bool
     155           5 : AccountFactory::empty() const
     156             : {
     157           5 :     std::lock_guard lock(mutex_);
     158             : 
     159           5 :     for (const auto& item : accountMaps_) {
     160           3 :         const auto& map = item.second;
     161           3 :         if (!map.empty())
     162           3 :             return false;
     163             :     }
     164             : 
     165           2 :     return true;
     166           5 : }
     167             : 
     168             : template<>
     169             : std::size_t
     170        2866 : AccountFactory::accountCount() const
     171             : {
     172        2866 :     std::lock_guard lock(mutex_);
     173        2866 :     std::size_t count = 0;
     174             : 
     175        5690 :     for (const auto& it : accountMaps_)
     176        2824 :         count += it.second.size();
     177             : 
     178        2866 :     return count;
     179        2866 : }
     180             : 
     181             : } // namespace jami

Generated by: LCOV version 1.14