call: Add getCallDuration() method

If `duration_start_` is `time_point::min`, then when calculating the call's
duration, there's an signed integer overflow which result in an enormous time
duration.

Signed-off-by: Olivier Dion <olivier.dion@savoirfairelinux.com>
Change-Id: I3ad119ab0f79ef8e9c537d1879d628a29ceed4d7
This commit is contained in:
Olivier Dion
2021-05-11 08:41:22 -04:00
committed by Adrien Béraud
parent dc25cb3ea4
commit f5eb0b47df
3 changed files with 13 additions and 8 deletions

View File

@ -125,12 +125,7 @@ Call::Call(const std::shared_ptr<Account>& account,
duration_start_ = clock::now();
else if (cnx_state == ConnectionState::DISCONNECTED && call_state == CallState::OVER) {
if (auto jamiAccount = std::dynamic_pointer_cast<JamiAccount>(getAccount().lock())) {
auto duration = duration_start_ == time_point::min()
? 0
: std::chrono::duration_cast<std::chrono::milliseconds>(
clock::now() - duration_start_)
.count();
jamiAccount->addCallHistoryMessage(getPeerNumber(), duration);
jamiAccount->addCallHistoryMessage(getPeerNumber(), getCallDuration().count());
monitor();
}

View File

@ -301,6 +301,17 @@ public:
return parent_ != nullptr;
}
/**
* @return Call duration in milliseconds
*/
std::chrono::milliseconds getCallDuration() const
{
return duration_start_ == time_point::min()
? std::chrono::milliseconds::zero()
: std::chrono::duration_cast<std::chrono::milliseconds>(clock::now()
- duration_start_);
}
public: // media management
virtual bool toggleRecording();

View File

@ -2352,8 +2352,7 @@ SIPCall::monitor() const
return;
}
JAMI_DBG("- Call %s with %s:", getCallId().c_str(), getPeerNumber().c_str());
// TODO move in getCallDuration
JAMI_DBG("\t- Duration: %s", dht::print_duration(clock::now() - duration_start_).c_str());
JAMI_DBG("\t- Duration: %s", dht::print_duration(getCallDuration()).c_str());
for (auto& mediaAttr : getMediaAttributeList())
JAMI_DBG("\t- Media: %s", mediaAttr.toString(true).c_str());
#ifdef ENABLE_VIDEO