Commit afc102cc authored by Alexandre Savard's avatar Alexandre Savard
Browse files

Merge branch 'optionalfeature'

parents 68f5391b 320e5ae2
...@@ -163,23 +163,41 @@ PKG_CHECK_MODULES([CCRTP], [libccrtp] >= ${LIBCCRTP_MIN_VERSION},, [ ...@@ -163,23 +163,41 @@ PKG_CHECK_MODULES([CCRTP], [libccrtp] >= ${LIBCCRTP_MIN_VERSION},, [
############################################################################################################################### # TLS
# TLS # # required dependency(ies): libssl
# required dependency(ies): libssl #
###############################################################################################################################
dnl Check for OpenSSL to link against pjsip and provide SIPS TLS support dnl Check for OpenSSL to link against pjsip and provide SIPS TLS support
PKG_CHECK_MODULES([libssl], libssl,, AC_MSG_ERROR([Missing ssl development package: libssl-dev])) AC_ARG_WITH([tls],
[ AS_HELP_STRING([--without-tls], [disable tls support]) ],
[],
[with_tls=yes])
AS_IF([test "xwith_tls" = "xyes"], [
PKG_CHECK_MODULES([libssl], libssl,, AC_MSG_ERROR([Missing ssl development package: libssl-dev]))
]);
AC_DEFINE_UNQUOTED([HAVE_TLS], `if test "x$with_tls" = "xyes"; then echo 1; else echo 0; fi`, [Define if you have tls support])
AM_CONDITIONAL(BUILD_TLS, test "x$with_tls" = "xyes" )
############################################################################################################################### # ZRTP
# ZRTP # # required dependency(ies): libzrtp
# required dependency(ies): libzrtp #
###############################################################################################################################
dnl Check for libzrtpcpp, a ccRTP extension providing zrtp key exchange dnl Check for libzrtpcpp, a ccRTP extension providing zrtp key exchange
LIBZRTPCPP_MIN_VERSION=1.3.0 LIBZRTPCPP_MIN_VERSION=1.3.0
PKG_CHECK_MODULES(ZRTPCPP, libzrtpcpp >= ${LIBZRTPCPP_MIN_VERSION},, AC_MSG_ERROR([Missing zrtp development package: libzrtpcpp-dev])) AC_ARG_WITH([zrtp],
[ AS_HELP_STRING([--without-zrtp], [disable zrtp support]) ],
[],
[with_zrtp=yes])
AS_IF([test "xwith_zrtp" = "xyes"], [
PKG_CHECK_MODULES(ZRTPCPP, libzrtpcpp >= ${LIBZRTPCPP_MIN_VERSION},, AC_MSG_ERROR([Missing zrtp development package: libzrtpcpp-dev]))
]);
AC_DEFINE_UNQUOTED([HAVE_ZRTP], `if test "x$with_zrtp" = "xyes"; then echo 1; else echo 0; fi`, [Define if you have zrtp support])
AM_CONDITIONAL(BUILD_ZRTP, test "x$with_zrtp" = "xyes" )
# DBUS
# required dependency(ies): libdbus-c++
dnl DBus-C++ detection dnl DBus-C++ detection
dnl pkg-config doesn't like 0.6.0-pre1 version number, it assumes that it is dnl pkg-config doesn't like 0.6.0-pre1 version number, it assumes that it is
dnl more recent than (unreleased) 0.6.0 dnl more recent than (unreleased) 0.6.0
...@@ -189,10 +207,8 @@ AC_MSG_ERROR([You need the DBus-c++ libraries (version $DBUS_CPP_REQUIRED_VERSIO ...@@ -189,10 +207,8 @@ AC_MSG_ERROR([You need the DBus-c++ libraries (version $DBUS_CPP_REQUIRED_VERSIO
############################################################################################################################### # Instant Messaging
# Instant Messaging # # required dependency(ies): libxpat
# required dependency(ies): libxpat #
###############################################################################################################################
AC_ARG_WITH([instant_messaging], AC_ARG_WITH([instant_messaging],
[ AS_HELP_STRING([--without-instant_messaging], [disable support for instant-messaging]) ], [ AS_HELP_STRING([--without-instant_messaging], [disable support for instant-messaging]) ],
[], [],
...@@ -206,14 +222,16 @@ AS_IF([test "x$with_instant_messaging" = "xyes"], [ ...@@ -206,14 +222,16 @@ AS_IF([test "x$with_instant_messaging" = "xyes"], [
AC_DEFINE_UNQUOTED([HAVE_INSTANT_MESSAGING], `if test "x$with_instant_messaging" = "xyes"; then echo 1; else echo 0; fi`, [Define if you have instant messaging support]) AC_DEFINE_UNQUOTED([HAVE_INSTANT_MESSAGING], `if test "x$with_instant_messaging" = "xyes"; then echo 1; else echo 0; fi`, [Define if you have instant messaging support])
AM_CONDITIONAL(BUILD_INSTANT_MESSAGING, test "x$with_instant_messaging" = "xyes" ) AM_CONDITIONAL(BUILD_INSTANT_MESSAGING, test "x$with_instant_messaging" = "xyes" )
# PTHREAD
# required dependency(ies): libxpat
AX_PTHREAD AX_PTHREAD
############################################################################################################################### # SDES Key Exchange
# SDES Key Exchange # # required dependency(ies): libpcre
# required dependency(ies): libpcre #
###############################################################################################################################
AC_ARG_WITH([sdes], AC_ARG_WITH([sdes],
[ AS_HELP_STRING([--without-sdes], [disable support for sdes key exchange]) ], [ AS_HELP_STRING([--without-sdes], [disable support for sdes key exchange]) ],
[], [],
...@@ -232,10 +250,8 @@ PKG_CHECK_MODULES(CPPUNIT, cppunit >= ${CPPUNIT_MIN_VERSION}, AM_CONDITIONAL(BUI ...@@ -232,10 +250,8 @@ PKG_CHECK_MODULES(CPPUNIT, cppunit >= ${CPPUNIT_MIN_VERSION}, AM_CONDITIONAL(BUI
############################################################################################################################### # GSM CODEC
# GSM CODEC # # required dependency(ies): libgsm
# required dependency(ies): libgsm #
###############################################################################################################################
dnl check for libgsm1 (doesn't use pkg-config) dnl check for libgsm1 (doesn't use pkg-config)
dnl Check for libgsm dnl Check for libgsm
AC_ARG_WITH([gsm], [AS_HELP_STRING([--without-gsm], AC_ARG_WITH([gsm], [AS_HELP_STRING([--without-gsm],
...@@ -254,10 +270,8 @@ AM_CONDITIONAL(BUILD_GSM, test "x$with_gsm" = "xyes" ) ...@@ -254,10 +270,8 @@ AM_CONDITIONAL(BUILD_GSM, test "x$with_gsm" = "xyes" )
############################################################################################################################### # SPEEX CODEC
# SPEEX CODEC # # required dependency(ies): libspeex
# required dependency(ies): libspeex #
###############################################################################################################################
dnl Check for libspeex dnl Check for libspeex
AC_ARG_WITH([speex], AC_ARG_WITH([speex],
[AS_HELP_STRING([--without-speex], [AS_HELP_STRING([--without-speex],
...@@ -277,10 +291,8 @@ AM_CONDITIONAL(BUILD_SPEEX, test "x$with_speex" = "xyes" ) ...@@ -277,10 +291,8 @@ AM_CONDITIONAL(BUILD_SPEEX, test "x$with_speex" = "xyes" )
############################################################################################################################### # SPEEX DSP
# SPEEX DSP # # required dependency(ies): libspeexdsp
# required dependency(ies): libspeexdsp #
###############################################################################################################################
dnl check in case the libspeexdsp is not installed dnl check in case the libspeexdsp is not installed
AC_ARG_WITH([speexdsp], AC_ARG_WITH([speexdsp],
[AS_HELP_STRING([--without-speexdsp], [AS_HELP_STRING([--without-speexdsp],
...@@ -300,10 +312,8 @@ AM_CONDITIONAL(BUILD_SPEEXDSP, test "x$with_speexdsp" = "xyes" ) ...@@ -300,10 +312,8 @@ AM_CONDITIONAL(BUILD_SPEEXDSP, test "x$with_speexdsp" = "xyes" )
############################################################################################################################### # IAX
# IAX # # required dependency(ies): libiax2 (static)
# required dependency(ies): libiax2 (static) #
###############################################################################################################################
dnl Check for IAX dnl Check for IAX
AC_ARG_WITH([iax2], [AS_HELP_STRING([--without-iax2], AC_ARG_WITH([iax2], [AS_HELP_STRING([--without-iax2],
[disable support for the iax2 protocol])], [], [with_iax2=yes]) [disable support for the iax2 protocol])], [], [with_iax2=yes])
...@@ -313,6 +323,8 @@ AM_CONDITIONAL(USE_IAX, test "x$with_iax2" = "xyes" ) ...@@ -313,6 +323,8 @@ AM_CONDITIONAL(USE_IAX, test "x$with_iax2" = "xyes" )
# NETWORK MANAGER
# required dependency(ies): libiax2 (static)
dnl Check for network-manager dnl Check for network-manager
AC_ARG_WITH([networkmanager], [AS_HELP_STRING([--without-networkmanager], AC_ARG_WITH([networkmanager], [AS_HELP_STRING([--without-networkmanager],
[disable support for network-manager events])], [], [disable support for network-manager events])], [],
...@@ -322,10 +334,8 @@ AM_CONDITIONAL(USE_NETWORKMANAGER, test "x$with_networkmanager" = "xyes" ) ...@@ -322,10 +334,8 @@ AM_CONDITIONAL(USE_NETWORKMANAGER, test "x$with_networkmanager" = "xyes" )
############################################################################################################################### # DOXYGEN
# DOXYGEN # # required dependency(ies): doxygen
# required dependency(ies): doxygen #
###############################################################################################################################
# check for doxygen, mostly stolen from http://log4cpp.sourceforge.net/ # check for doxygen, mostly stolen from http://log4cpp.sourceforge.net/
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
AC_DEFUN([BB_ENABLE_DOXYGEN], AC_DEFUN([BB_ENABLE_DOXYGEN],
......
if USE_IAX
SUBDIRS = iax2 SUBDIRS = iax2
endif
EXTRA_DIST=pjproject EXTRA_DIST=pjproject
...@@ -5,31 +5,29 @@ libexec_PROGRAMS = sflphoned ...@@ -5,31 +5,29 @@ libexec_PROGRAMS = sflphoned
if SFL_VIDEO if SFL_VIDEO
SFL_VIDEO_SUBDIR = video SFL_VIDEO_SUBDIR = video
SFL_VIDEO_LIB=./video/libvideo.la
endif endif
if BUILD_INSTANT_MESSAGING if BUILD_INSTANT_MESSAGING
INSTANT_MESSAGING_SUBDIR = im INSTANT_MESSAGING_SUBDIR = im
IM_LIB=./im/libim.la
endif endif
SUBDIRS = dbus audio config hooks history sip iax $(INSTANT_MESSAGING_SUBDIR) $(SFL_VIDEO_SUBDIR)
sflphoned_SOURCES = main.cpp
# Redefine the USE_IAX variable here, so that it could be used in managerimpl # Redefine the USE_IAX variable here, so that it could be used in managerimpl
if USE_IAX if USE_IAX
IAX_SUBDIR=iax
IAX_CXXFLAG=-DUSE_IAX IAX_CXXFLAG=-DUSE_IAX
IAX_LIB=./iax/libiaxlink.la IAX_LIB=./iax/libiaxlink.la $(top_builddir)/libs/iax2/libiax2.la
else
IAX_CXXFLAG=
IAX_LIB=
endif endif
if USE_NETWORKMANAGER if USE_NETWORKMANAGER
NETWORKMANAGER=-DUSE_NETWORKMANAGER NETWORKMANAGER=-DUSE_NETWORKMANAGER
else
NETWORKMANAGER=
endif endif
SUBDIRS = dbus audio config hooks history sip $(IAX_SUBDIR) $(INSTANT_MESSAGING_SUBDIR) $(SFL_VIDEO_SUBDIR)
sflphoned_SOURCES = main.cpp
sflphoned_CXXFLAGS = \ sflphoned_CXXFLAGS = \
-DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" $(IAX_CXXFLAG) $(NETWORKMANAGER) \ -DPREFIX=\"$(prefix)\" -DPROGSHAREDIR=\"${datadir}/sflphone\" $(IAX_CXXFLAG) $(NETWORKMANAGER) \
-DVERSION=\"$(VERSION)\" -DVERSION=\"$(VERSION)\"
...@@ -62,16 +60,7 @@ noinst_HEADERS = \ ...@@ -62,16 +60,7 @@ noinst_HEADERS = \
account_schema.h \ account_schema.h \
registration_states.h registration_states.h
if SFL_VIDEO
SFL_VIDEO_LIB=./video/libvideo.la
endif
if BUILD_INSTANT_MESSAGING
IM_LIB=./im/libim.la
endif
libsflphone_la_LIBADD = \ libsflphone_la_LIBADD = \
$(top_builddir)/libs/iax2/libiax2.la \
$(IAX_LIB) \ $(IAX_LIB) \
./sip/libsiplink.la \ ./sip/libsiplink.la \
./audio/libaudio.la \ ./audio/libaudio.la \
......
...@@ -2,19 +2,19 @@ include $(top_srcdir)/globals.mak ...@@ -2,19 +2,19 @@ include $(top_srcdir)/globals.mak
noinst_LTLIBRARIES = libaudiortp.la noinst_LTLIBRARIES = libaudiortp.la
if BUILD_ZRTP
SFL_ZRTP_SRC=audio_zrtp_session.h audio_zrtp_session.cpp zrtp_session_callback.cpp zrtp_session_callback.h
endif
libaudiortp_la_SOURCES = \ libaudiortp_la_SOURCES = \
$(SFL_ZRTP_SRC) \
audio_rtp_session.cpp \ audio_rtp_session.cpp \
audio_symmetric_rtp_session.cpp \ audio_symmetric_rtp_session.cpp \
audio_rtp_record_handler.cpp \ audio_rtp_record_handler.cpp \
audio_rtp_factory.cpp \ audio_rtp_factory.cpp \
audio_zrtp_session.cpp \
zrtp_session_callback.cpp \
audio_srtp_session.cpp \ audio_srtp_session.cpp \
audio_rtp_session.h \ audio_rtp_session.h \
audio_rtp_record_handler.h \ audio_rtp_record_handler.h \
audio_rtp_factory.h \ audio_rtp_factory.h \
audio_symmetric_rtp_session.h \ audio_symmetric_rtp_session.h \
audio_zrtp_session.h \
zrtp_session_callback.h \
audio_srtp_session.h audio_srtp_session.h
...@@ -29,7 +29,9 @@ ...@@ -29,7 +29,9 @@
*/ */
#include "audio_rtp_factory.h" #include "audio_rtp_factory.h"
#if HAVE_ZRTP
#include "audio_zrtp_session.h" #include "audio_zrtp_session.h"
#endif
#include "audio_symmetric_rtp_session.h" #include "audio_symmetric_rtp_session.h"
#include "manager.h" #include "manager.h"
#include "sip/sdp.h" #include "sip/sdp.h"
...@@ -37,6 +39,7 @@ ...@@ -37,6 +39,7 @@
#include "sip/sipaccount.h" #include "sip/sipaccount.h"
#include "sip/sdes_negotiator.h" #include "sip/sdes_negotiator.h"
#include "logger.h" #include "logger.h"
#include "config.h"
namespace sfl { namespace sfl {
...@@ -69,10 +72,14 @@ void AudioRtpFactory::initConfig() ...@@ -69,10 +72,14 @@ void AudioRtpFactory::initConfig()
srtpEnabled_ = account->getSrtpEnabled(); srtpEnabled_ = account->getSrtpEnabled();
std::string key(account->getSrtpKeyExchange()); std::string key(account->getSrtpKeyExchange());
if (srtpEnabled_) { if (srtpEnabled_) {
#if HAVE_ZRTP
if (key == "sdes") if (key == "sdes")
keyExchangeProtocol_ = SDES; keyExchangeProtocol_ = SDES;
else if (key == "zrtp") else if (key == "zrtp")
keyExchangeProtocol_ = ZRTP; keyExchangeProtocol_ = ZRTP;
#else
keyExchangeProtocol_ = SDES;
#endif
} else { } else {
keyExchangeProtocol_ = NONE; keyExchangeProtocol_ = NONE;
} }
...@@ -93,7 +100,7 @@ void AudioRtpFactory::initSession() ...@@ -93,7 +100,7 @@ void AudioRtpFactory::initSession()
const std::string zidFilename(Manager::instance().voipPreferences.getZidFile()); const std::string zidFilename(Manager::instance().voipPreferences.getZidFile());
switch (keyExchangeProtocol_) { switch (keyExchangeProtocol_) {
#if HAVE_ZRTP
case ZRTP: case ZRTP:
rtpSession_ = new AudioZrtpSession(*ca_, zidFilename); rtpSession_ = new AudioZrtpSession(*ca_, zidFilename);
// TODO: be careful with that. The hello hash is computed asynchronously. Maybe it's // TODO: be careful with that. The hello hash is computed asynchronously. Maybe it's
...@@ -101,7 +108,7 @@ void AudioRtpFactory::initSession() ...@@ -101,7 +108,7 @@ void AudioRtpFactory::initSession()
if (helloHashEnabled_) if (helloHashEnabled_)
ca_->getLocalSDP()->setZrtpHash(static_cast<AudioZrtpSession *>(rtpSession_)->getHelloHash()); ca_->getLocalSDP()->setZrtpHash(static_cast<AudioZrtpSession *>(rtpSession_)->getHelloHash());
break; break;
#endif
case SDES: case SDES:
rtpSession_ = new AudioSrtpSession(*ca_); rtpSession_ = new AudioSrtpSession(*ca_);
break; break;
...@@ -152,6 +159,7 @@ void AudioRtpFactory::updateDestinationIpAddress() ...@@ -152,6 +159,7 @@ void AudioRtpFactory::updateDestinationIpAddress()
rtpSession_->updateDestinationIpAddress(); rtpSession_->updateDestinationIpAddress();
} }
#if HAVE_ZRTP
sfl::AudioZrtpSession * AudioRtpFactory::getAudioZrtpSession() sfl::AudioZrtpSession * AudioRtpFactory::getAudioZrtpSession()
{ {
if (keyExchangeProtocol_ == ZRTP) if (keyExchangeProtocol_ == ZRTP)
...@@ -159,6 +167,7 @@ sfl::AudioZrtpSession * AudioRtpFactory::getAudioZrtpSession() ...@@ -159,6 +167,7 @@ sfl::AudioZrtpSession * AudioRtpFactory::getAudioZrtpSession()
else else
throw AudioRtpFactoryException("rtpSession_ is NULL in getAudioZrtpSession"); throw AudioRtpFactoryException("rtpSession_ is NULL in getAudioZrtpSession");
} }
#endif
void sfl::AudioRtpFactory::initLocalCryptoInfo() void sfl::AudioRtpFactory::initLocalCryptoInfo()
{ {
......
...@@ -46,7 +46,9 @@ class SIPCall; ...@@ -46,7 +46,9 @@ class SIPCall;
namespace sfl { namespace sfl {
#if HAVE_ZRTP
class AudioZrtpSession; class AudioZrtpSession;
#endif
class AudioCodec; class AudioCodec;
class UnsupportedRtpSessionType : public std::logic_error { class UnsupportedRtpSessionType : public std::logic_error {
...@@ -115,12 +117,14 @@ class AudioRtpFactory { ...@@ -115,12 +117,14 @@ class AudioRtpFactory {
srtpEnabled_ = enable; srtpEnabled_ = enable;
} }
#if HAVE_ZRTP
/** /**
* Get the current AudioZrtpSession. Throws an AudioRtpFactoryException * Get the current AudioZrtpSession. Throws an AudioRtpFactoryException
* if the current rtp thread is null, or if it's not of the correct type. * if the current rtp thread is null, or if it's not of the correct type.
* @return The current AudioZrtpSession thread. * @return The current AudioZrtpSession thread.
*/ */
sfl::AudioZrtpSession * getAudioZrtpSession(); sfl::AudioZrtpSession* getAudioZrtpSession();
#endif
void initLocalCryptoInfo(); void initLocalCryptoInfo();
void initLocalCryptoInfoOnOffHold(); void initLocalCryptoInfoOnOffHold();
......
...@@ -37,7 +37,9 @@ ...@@ -37,7 +37,9 @@
#include "sip/sipvoiplink.h" #include "sip/sipvoiplink.h"
#include "audio/audiolayer.h" #include "audio/audiolayer.h"
#include "audio/audiortp/audio_rtp_factory.h" #include "audio/audiortp/audio_rtp_factory.h"
#if HAVE_ZRTP
#include "audio/audiortp/audio_zrtp_session.h" #include "audio/audiortp/audio_zrtp_session.h"
#endif
#include "logger.h" #include "logger.h"
#include "manager.h" #include "manager.h"
...@@ -307,6 +309,7 @@ CallManager::startTone(const int32_t& start , const int32_t& type) ...@@ -307,6 +309,7 @@ CallManager::startTone(const int32_t& start , const int32_t& type)
// for conferencing in order to get // for conferencing in order to get
// the right pointer for the given // the right pointer for the given
// callID. // callID.
#if HAVE_ZRTP
sfl::AudioZrtpSession * sfl::AudioZrtpSession *
CallManager::getAudioZrtpSession(const std::string& callID) CallManager::getAudioZrtpSession(const std::string& callID)
{ {
...@@ -330,60 +333,81 @@ CallManager::getAudioZrtpSession(const std::string& callID) ...@@ -330,60 +333,81 @@ CallManager::getAudioZrtpSession(const std::string& callID)
return zSession; return zSession;
} }
#endif
void void
CallManager::setSASVerified(const std::string& callID) CallManager::setSASVerified(const std::string& callID)
{ {
#if HAVE_ZRTP
try { try {
sfl::AudioZrtpSession * zSession; sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID); zSession = getAudioZrtpSession(callID);
zSession->SASVerified(); zSession->SASVerified();
} catch (...) { } catch (...) {
} }
#else
ERROR("No zrtp support for %s, please recompile SFLphone with zrtp", callID.c_str());
#endif
} }
void void
CallManager::resetSASVerified(const std::string& callID) CallManager::resetSASVerified(const std::string& callID)
{ {
#if HAVE_ZRTP
try { try {
sfl::AudioZrtpSession * zSession; sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID); zSession = getAudioZrtpSession(callID);
zSession->resetSASVerified(); zSession->resetSASVerified();
} catch (...) { } catch (...) {
} }
#else
ERROR("No zrtp support for %s, please recompile SFLphone with zrtp", callID.c_str());
#endif
} }
void void
CallManager::setConfirmGoClear(const std::string& callID) CallManager::setConfirmGoClear(const std::string& callID)
{ {
#if HAVE_ZRTP
try { try {
sfl::AudioZrtpSession * zSession; sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID); zSession = getAudioZrtpSession(callID);
zSession->goClearOk(); zSession->goClearOk();
} catch (...) { } catch (...) {
} }
#else
ERROR("No zrtp support for %s, please recompile SFLphone with zrtp", callID.c_str());
#endif
} }
void void
CallManager::requestGoClear(const std::string& callID) CallManager::requestGoClear(const std::string& callID)
{ {
#if HAVE_ZRTP
try { try {
sfl::AudioZrtpSession * zSession; sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID); zSession = getAudioZrtpSession(callID);
zSession->requestGoClear(); zSession->requestGoClear();
} catch (...) { } catch (...) {
} }
#else
ERROR("No zrtp support for %s, please recompile SFLphone with zrtp", callID.c_str());
#endif
} }
void void
CallManager::acceptEnrollment(const std::string& callID, const bool& accepted) CallManager::acceptEnrollment(const std::string& callID, const bool& accepted)
{ {
#if HAVE_ZRTP
try { try {
sfl::AudioZrtpSession * zSession; sfl::AudioZrtpSession * zSession;
zSession = getAudioZrtpSession(callID); zSession = getAudioZrtpSession(callID);
zSession->acceptEnrollment(accepted); zSession->acceptEnrollment(accepted);
} catch (...) { } catch (...) {
} }
#else
ERROR("No zrtp support for %s, please recompile SFLphone with zrtp", callID.c_str());
#endif
} }
void void
......
...@@ -127,7 +127,9 @@ class CallManager ...@@ -127,7 +127,9 @@ class CallManager
private: private: