Select Git revision
message_engine.cpp
-
This patches avoid swarm members to connect to all devices of the conversation by using a better routing mechanism. The idea is to add a component called "DRT" that will store, like a DHT, a routing table containing the known devices of the conversation. The DRT is bootstraped with the list of the devices that already wrote a message in the conversation, else with some other members that have devices present (because lot of devices may never have written any message). Moreover, because a user can import an old backup without the conversation and without other devices present, we also try to connect to 2 other random members because they may never connect if they are on an old back-up. Once bootstraped, the DRT is used to decide to who a user should be connected. And it will use approximately log(N) connections (instead of N like before). So, when sending a message, a user will send to connected peers (and some mobiles). Then, some peers in the conversation will get the message, pull it, then announce to their nearest peers (and some mobiles) until all peers got the new message. To avoid infinite loop, we check if we already got the commit and if we have something to announce. Finally, if somebody disconnect, this will cause the DRT to try to re-fill its bucket and try to connect to a new device. GitLab: #297 Change-Id: I137788c77219fe74287585882260547cc5628784
This patches avoid swarm members to connect to all devices of the conversation by using a better routing mechanism. The idea is to add a component called "DRT" that will store, like a DHT, a routing table containing the known devices of the conversation. The DRT is bootstraped with the list of the devices that already wrote a message in the conversation, else with some other members that have devices present (because lot of devices may never have written any message). Moreover, because a user can import an old backup without the conversation and without other devices present, we also try to connect to 2 other random members because they may never connect if they are on an old back-up. Once bootstraped, the DRT is used to decide to who a user should be connected. And it will use approximately log(N) connections (instead of N like before). So, when sending a message, a user will send to connected peers (and some mobiles). Then, some peers in the conversation will get the message, pull it, then announce to their nearest peers (and some mobiles) until all peers got the new message. To avoid infinite loop, we check if we already got the commit and if we have something to announce. Finally, if somebody disconnect, this will cause the DRT to try to re-fill its bucket and try to connect to a new device. GitLab: #297 Change-Id: I137788c77219fe74287585882260547cc5628784
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
managerimpl.cpp 94.44 KiB
/*
* Copyright (C) 2004-2007 Savoir-Faire Linux inc.
* Author: Alexandre Bourget <alexandre.bourget@savoirfairelinux.com>
* Author: Yan Morin <yan.morin@savoirfairelinux.com>
* Author: Laurielle Lea <laurielle.lea@savoirfairelinux.com>
* Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
* Author: Guillaume Carmel-Archambault <guillaume.carmel-archambault@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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <errno.h>
#include <time.h>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <sys/types.h> // mkdir(2)
#include <sys/stat.h> // mkdir(2)
#include <cc++/socket.h> // why do I need this here?
#include <ccrtp/channel.h> // why do I need this here?
#include <ccrtp/rtp.h> // why do I need this here?
#include <cc++/file.h>
#include "conference.h"
#include "manager.h"
#include "account.h"
#include "sipaccount.h"
#include "audio/audiolayer.h"
#include "audio/alsalayer.h"
#include "audio/pulselayer.h"
#include "audio/tonelist.h"
#include "accountcreator.h" // create new account
#include "sipvoiplink.h"
#include "user_cfg.h"
#define fill_config_str(name, value) \
(_config.addConfigTreeItem(section, Conf::ConfigTreeItem(std::string(name), std::string(value), type_str)))
#define fill_config_int(name, value) \
(_config.addConfigTreeItem(section, Conf::ConfigTreeItem(std::string(name), std::string(value), type_int)))
ManagerImpl::ManagerImpl (void)
: _hasTriedToRegister (false)
, _config()
, _currentCallId2()
, _currentCallMutex()
, _codecBuilder (NULL)
, _audiodriver (NULL)
, _dtmfKey (NULL)
, _codecDescriptorMap()
, _toneMutex()
, _telephoneTone (NULL)
, _audiofile()
, _spkr_volume (0)