From 0f5248018defbded87f3ce570e5467f72985190c Mon Sep 17 00:00:00 2001 From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> Date: Thu, 7 Dec 2017 22:35:45 -0500 Subject: [PATCH] PJSIP support to std::error_code and std::system_error Some practical C++ additions: * class PjsipErrorCategory as error category for std::error_code. * class PjsipFailure inheriting from std::system_error exception. Change-Id: I957cd36d06cf49ae98cb6634f5e4d5dcac666be8 --- src/sip/sip_utils.cpp | 9 +++++++++ src/sip/sip_utils.h | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/sip/sip_utils.cpp b/src/sip/sip_utils.cpp index 3558eebbbc..52aba60662 100644 --- a/src/sip/sip_utils.cpp +++ b/src/sip/sip_utils.cpp @@ -44,6 +44,15 @@ namespace ring { namespace sip_utils { +std::string +PjsipErrorCategory::message( int condition ) const +{ + std::string err_msg; + err_msg.reserve(PJ_ERR_MSG_SIZE); + err_msg.resize(pj_strerror(condition, &err_msg[0], err_msg.size()).slen); + return err_msg; +} + std::string fetchHeaderValue(pjsip_msg *msg, const std::string &field) { diff --git a/src/sip/sip_utils.h b/src/sip/sip_utils.h index 74ee3221ca..353b9d3713 100644 --- a/src/sip/sip_utils.h +++ b/src/sip/sip_utils.h @@ -47,6 +47,29 @@ static constexpr int DEFAULT_SIP_TLS_PORT {5061}; enum class KeyExchangeProtocol { NONE, SDES }; +/// PjsipErrorCategory - a PJSIP error category for std::error_code +class PjsipErrorCategory final : public std::error_category +{ +public: + const char* name() const noexcept override { return "pjsip"; } + std::string message( int condition ) const override; +}; + +/// PJSIP related exception +/// Based on std::system_error with code() returning std::error_code with PjsipErrorCategory category +class PjsipFailure : public std::system_error +{ +private: + static constexpr const char* what_ = "PJSIP call failed"; + +public: + PjsipFailure() + : std::system_error(std::error_code(PJ_EUNKNOWN, PjsipErrorCategory()), what_) {} + + explicit PjsipFailure(pj_status_t status) + : std::system_error(std::error_code(status, PjsipErrorCategory()), what_) {} +}; + static constexpr const char* getKeyExchangeName(KeyExchangeProtocol kx) { return kx == KeyExchangeProtocol::SDES ? "sdes" : ""; } -- GitLab