blob: c6b48fb93bd12f077618fe0cf75450eb23ec4872 [file] [log] [blame]
/*
* Copyright (C) 2004-2021 Savoir-faire Linux Inc.
*
* Author: Guillaume Roguez <guillaume.roguez@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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once
#include <map>
#include <memory>
#include <mutex>
#include <vector>
#include <string>
#include <utility>
#include "call.h"
#include "account.h"
namespace jami {
class SIPAccountBase;
class SIPCall;
class CallFactory
{
public:
CallFactory(std::mt19937_64& rand)
: rand_(rand)
{}
std::string getNewCallID() const;
/**
* Create a new call instance.
* @param account Account used to create this call
* @param type Set definitely this call as incoming/outgoing
* @param mediaList The list of media to include
* @return A shared pointer to the created call
*/
std::shared_ptr<SIPCall> newSipCall(const std::shared_ptr<SIPAccountBase>& account,
Call::CallType type,
const std::vector<DRing::MediaMap>& mediaList);
/**
* Forbid creation of new calls.
*/
void forbid();
/**
* Remove given call instance from call list.
*/
void removeCall(Call& call);
/**
* Accessor on removeCall with callID than instance.
*/
void removeCall(const std::string& id);
/**
* Return call pointer associated to given ID.Type can optionally be specified.
*/
std::shared_ptr<Call> getCall(const std::string& id) const;
std::shared_ptr<Call> getCall(const std::string& id, Call::LinkType link) const;
template<class C>
std::shared_ptr<C> getCall(const std::string& id)
{
return std::dynamic_pointer_cast<C>(getCall(id, C::LINK_TYPE));
}
/**
* Return if given call exists. Type can optionally be specified.
*/
bool hasCall(const std::string& id) const;
bool hasCall(const std::string& id, Call::LinkType link) const;
/**
* Return if calls exist. Type can optionally be specified.
*/
bool empty() const;
bool empty(Call::LinkType link) const;
/**
* Erase all calls.
*/
void clear();
/**
* Return all calls. Type can optionally be specified.
*/
std::vector<std::shared_ptr<Call>> getAllCalls() const;
std::vector<std::shared_ptr<Call>> getAllCalls(Call::LinkType link) const;
/**
* Return all call's IDs. Type can optionally be specified.
*/
std::vector<std::string> getCallIDs() const;
std::vector<std::string> getCallIDs(Call::LinkType link) const;
/**
* Return number of calls. Type can optionally be specified.
*/
std::size_t callCount() const;
std::size_t callCount(Call::LinkType link) const;
private:
/**
* @brief Get the calls map
* @param link The call type
* @return A pointer to the calls map instance
* @warning Concurrency protection must done by the caller.
*/
const CallMap* getMap_(Call::LinkType link) const
{
auto const& itermap = callMaps_.find(link);
if (itermap != callMaps_.cend())
return &itermap->second;
return nullptr;
}
std::mt19937_64& rand_;
mutable std::recursive_mutex callMapsMutex_ {};
std::atomic_bool allowNewCall_ {true};
std::map<Call::LinkType, CallMap> callMaps_ {};
};
} // namespace jami