Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
savoirfairelinux
jami-libclient
Commits
dd5856e9
Commit
dd5856e9
authored
Nov 19, 2019
by
Sébastien Blin
Browse files
callmodel: expose setCurrentCall
Change-Id: I1177d216bed15091642dec84bdef623b55e4d44b
parent
639a38d3
Changes
4
Show whitespace changes
Inline
Side-by-side
src/api/lrc.h
View file @
dd5856e9
...
...
@@ -22,6 +22,7 @@
#include
<memory>
#include
<vector>
#include
<string>
#include
<atomic>
// Lrc
#include
"typedefs.h"
...
...
@@ -110,6 +111,11 @@ public:
*/
static
std
::
vector
<
std
::
string
>
getConferenceSubcalls
(
const
std
::
string
&
id
);
/**
* Preference
*/
static
std
::
atomic_bool
holdConferences
;
private:
std
::
unique_ptr
<
LrcPimpl
>
lrcPimpl_
;
};
...
...
src/api/newcallmodel.h
View file @
dd5856e9
...
...
@@ -148,7 +148,8 @@ public:
void
playDTMF
(
const
std
::
string
&
callId
,
const
std
::
string
&
value
)
const
;
/**
* Toggle pause on a call
* Toggle pause on a call.
* @warn only use this function for SIP calls
* @param callId
*/
void
togglePause
(
const
std
::
string
&
callId
)
const
;
...
...
@@ -225,6 +226,11 @@ public:
*/
static
std
::
string
getSIPCallStatusString
(
const
short
&
statusCode
);
/**
* Set a call as the current call (hold other calls)
*/
void
setCurrentCall
(
const
std
::
string
&
callId
)
const
;
Q_SIGNALS:
/**
* Emitted when a call state changes
...
...
src/lrc.cpp
View file @
dd5856e9
...
...
@@ -45,6 +45,8 @@ namespace lrc
using
namespace
api
;
std
::
atomic_bool
lrc
::
api
::
Lrc
::
holdConferences
;
// To judge whether the call is finished or not depending on callState
bool
isFinished
(
const
QString
&
callState
);
...
...
@@ -65,6 +67,7 @@ public:
Lrc
::
Lrc
(
MigrationCb
willDoMigrationCb
,
MigrationCb
didDoMigrationCb
)
{
lrc
::
api
::
Lrc
::
holdConferences
.
store
(
true
);
#ifndef ENABLE_LIBWRAP
// Replace locale for timestamps
std
::
locale
::
global
(
std
::
locale
(
""
));
...
...
src/newcallmodel.cpp
View file @
dd5856e9
...
...
@@ -139,12 +139,8 @@ public:
* Retrieve active conferences from the daemon and init the model
*/
void
initConferencesFromDaemon
();
/**
* Set a call as the current call (hold other calls)
*/
void
setCurrentCall
(
const
std
::
string
&
callId
);
bool
manageCurrentCall_
{
true
};
bool
dontHoldConferences_
{
false
};
std
::
string
currentCall_
{
};
std
::
map
<
std
::
string
,
std
::
string
>
pendingConferences_
;
public
Q_SLOTS
:
...
...
@@ -323,7 +319,7 @@ NewCallModel::togglePause(const std::string& callId) const
if
(
call
->
status
==
call
::
Status
::
PAUSED
)
{
if
(
call
->
type
==
call
::
Type
::
DIALOG
)
{
CallManager
::
instance
().
unhold
(
callId
.
c_str
());
pimpl_
->
setCurrentCall
(
callId
);
setCurrentCall
(
callId
);
}
else
{
CallManager
::
instance
().
unholdConference
(
callId
.
c_str
());
}
...
...
@@ -582,19 +578,37 @@ NewCallModelPimpl::initConferencesFromDaemon()
}
void
NewCallModel
Pimpl
::
setCurrentCall
(
const
std
::
string
&
callId
)
NewCallModel
::
setCurrentCall
(
const
std
::
string
&
callId
)
const
{
if
(
!
manageCurrentCall_
)
return
;
auto
it
=
pendingConferences_
.
find
(
callId
);
if
(
!
pimpl_
->
manageCurrentCall_
)
return
;
auto
it
=
pimpl_
->
pendingConferences_
.
find
(
callId
);
// Set current call only if not adding this call
// to a current conference
if
(
it
!=
pendingConferences_
.
end
())
return
;
if
(
it
!=
pimpl_
->
pendingConferences_
.
end
())
return
;
if
(
!
hasCall
(
callId
))
return
;
// The client should be able to set the current call multiple times
if
(
pimpl_
->
currentCall_
==
callId
)
return
;
pimpl_
->
currentCall_
=
callId
;
// Unhold call
auto
&
call
=
pimpl_
->
calls
[
callId
];
if
(
call
->
status
==
call
::
Status
::
PAUSED
)
{
auto
&
call
=
pimpl_
->
calls
[
callId
];
if
(
call
->
type
==
call
::
Type
::
DIALOG
)
{
CallManager
::
instance
().
unhold
(
callId
.
c_str
());
}
else
{
CallManager
::
instance
().
unholdConference
(
callId
.
c_str
());
}
}
std
::
vector
<
std
::
string
>
filterCalls
;
QStringList
conferences
=
CallManager
::
instance
().
getConferenceList
();
for
(
const
auto
&
confId
:
conferences
)
{
QStringList
callList
=
CallManager
::
instance
().
getParticipantList
(
confId
);
foreach
(
const
auto
&
c
allI
d
,
callList
)
{
filterCalls
.
emplace_back
(
c
allI
d
.
toStdString
());
foreach
(
const
auto
&
c
i
d
,
callList
)
{
filterCalls
.
emplace_back
(
c
i
d
.
toStdString
());
}
}
for
(
const
auto
&
cid
:
Lrc
::
activeCalls
())
{
...
...
@@ -603,10 +617,11 @@ NewCallModelPimpl::setCurrentCall(const std::string& callId)
CallManager
::
instance
().
hold
(
cid
.
c_str
());
}
}
if
(
dontH
oldConferences
_
)
{
if
(
!
lrc
::
api
::
Lrc
::
h
oldConferences
)
{
return
;
}
for
(
const
auto
&
confId
:
conferences
)
{
if
(
callId
!=
confId
.
toStdString
())
CallManager
::
instance
().
holdConference
(
confId
);
}
}
...
...
@@ -695,17 +710,18 @@ NewCallModelPimpl::slotCallStateChanged(const std::string& callId, const std::st
// NOTE: signal emission order matters, always emit CallStatusChanged before CallEnded
emit
linked
.
callStatusChanged
(
callId
,
code
);
if
(
call
->
status
==
call
::
Status
::
OUTGOING_RINGING
)
{
setCurrentCall
(
callId
);
if
(
call
->
status
==
call
::
Status
::
OUTGOING_RINGING
&&
linked
.
owner
.
profileInfo
.
type
!=
profile
::
Type
::
SIP
)
{
linked
.
setCurrentCall
(
callId
);
}
else
if
(
call
->
status
==
call
::
Status
::
ENDED
)
{
emit
linked
.
callEnded
(
callId
);
}
else
if
(
call
->
status
==
call
::
Status
::
IN_PROGRESS
)
{
if
(
previousStatus
==
call
::
Status
::
INCOMING_RINGING
||
previousStatus
==
call
::
Status
::
OUTGOING_RINGING
)
{
if
(
previousStatus
==
call
::
Status
::
INCOMING_RINGING
)
setCurrentCall
(
callId
);
if
(
previousStatus
==
call
::
Status
::
INCOMING_RINGING
&&
linked
.
owner
.
profileInfo
.
type
!=
profile
::
Type
::
SIP
)
linked
.
setCurrentCall
(
callId
);
call
->
startTime
=
std
::
chrono
::
steady_clock
::
now
();
emit
linked
.
callStarted
(
callId
);
sendProfile
(
callId
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment