Stefan Schuermans commited on 2019-08-13 18:30:31
Showing 1 changed files, with 59 additions and 18 deletions.
| ... | ... |
@@ -107,11 +107,13 @@ unsigned int glLogLineCnt; ///< number of lines already logged |
| 107 | 107 |
|
| 108 | 108 |
/** |
| 109 | 109 |
* @brief log information from linphone library |
| 110 |
+ * @param[in] domain log domain - ignored |
|
| 110 | 111 |
* @param[in] lev log level |
| 111 | 112 |
* @param[in] fmt format string |
| 112 | 113 |
* @param[in] args arguments to insert into format string |
| 113 | 114 |
*/ |
| 114 |
-void log_handler(OrtpLogLevel lev, const char *fmt, va_list args) |
|
| 115 |
+void log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, |
|
| 116 |
+ va_list args) |
|
| 115 | 117 |
{
|
| 116 | 118 |
// (re-)open logfile on first line |
| 117 | 119 |
if (glLogLineCnt == 0) {
|
| ... | ... |
@@ -139,6 +141,7 @@ void log_handler(OrtpLogLevel lev, const char *fmt, va_list args) |
| 139 | 141 |
// reset line count, so new file is opened on next line |
| 140 | 142 |
glLogLineCnt = 0; |
| 141 | 143 |
} |
| 144 |
+ (void)domain; |
|
| 142 | 145 |
} |
| 143 | 146 |
|
| 144 | 147 |
/// global init |
| ... | ... |
@@ -153,7 +156,7 @@ void init(std::string const &logFileName) |
| 153 | 156 |
struct Data {
|
| 154 | 157 |
SipPhone::ConfigData const *configData; ///< config data for worker thread |
| 155 | 158 |
SipPhone::SharedData *sharedData; ///< data shared with main Blinker thread |
| 156 |
- LinphoneCoreVTable callbacks; ///< callback table |
|
| 159 |
+ LinphoneCoreCbs *callbacks; ///< callbacks object, if active |
|
| 157 | 160 |
LinphoneCore *lc; ///< linphone core object, if active |
| 158 | 161 |
LinphoneCall *call; ///< current call, if available |
| 159 | 162 |
std::string playback; ///< name of playback file |
| ... | ... |
@@ -222,6 +225,9 @@ void global_state_changed(struct _LinphoneCore *lc, |
| 222 | 225 |
const char *message) |
| 223 | 226 |
{
|
| 224 | 227 |
Data *data = (Data*)linphone_core_get_user_data(lc); |
| 228 |
+ if (data == nullptr) {
|
|
| 229 |
+ return; // still initializing -> ignore |
|
| 230 |
+ } |
|
| 225 | 231 |
|
| 226 | 232 |
std::stringstream line; |
| 227 | 233 |
line << "global state changed to " << gstate2str(gstate) << ": " << message; |
| ... | ... |
@@ -241,6 +247,9 @@ void registration_state_changed(struct _LinphoneCore *lc, |
| 241 | 247 |
const char *message) |
| 242 | 248 |
{
|
| 243 | 249 |
Data *data = (Data*)linphone_core_get_user_data(lc); |
| 250 |
+ if (data == nullptr) {
|
|
| 251 |
+ return; // still initializing -> ignore |
|
| 252 |
+ } |
|
| 244 | 253 |
(void)cfg; |
| 245 | 254 |
|
| 246 | 255 |
std::stringstream line; |
| ... | ... |
@@ -260,6 +269,9 @@ void call_state_changed(struct _LinphoneCore *lc, LinphoneCall *call, |
| 260 | 269 |
LinphoneCallState cstate, const char *message) |
| 261 | 270 |
{
|
| 262 | 271 |
Data *data = (Data*)linphone_core_get_user_data(lc); |
| 272 |
+ if (data == nullptr) {
|
|
| 273 |
+ return; // still initializing -> ignore |
|
| 274 |
+ } |
|
| 263 | 275 |
|
| 264 | 276 |
std::stringstream line; |
| 265 | 277 |
line << "call state changed to " << cstate2str(cstate) << ": " |
| ... | ... |
@@ -291,7 +303,7 @@ void call_state_changed(struct _LinphoneCore *lc, LinphoneCall *call, |
| 291 | 303 |
switch (cstate) {
|
| 292 | 304 |
case LinphoneCallIncomingReceived: |
| 293 | 305 |
log(*data, "rejecting call (busy)"); |
| 294 |
- linphone_core_decline_call(lc, call, LinphoneReasonBusy); |
|
| 306 |
+ linphone_call_decline(call, LinphoneReasonBusy); |
|
| 295 | 307 |
break; |
| 296 | 308 |
default: |
| 297 | 309 |
break; |
| ... | ... |
@@ -308,7 +320,7 @@ void call_state_changed(struct _LinphoneCore *lc, LinphoneCall *call, |
| 308 | 320 |
} |
| 309 | 321 |
data->playback.clear(); |
| 310 | 322 |
log(*data, "accepting call"); |
| 311 |
- linphone_core_accept_call(lc, call); |
|
| 323 |
+ linphone_call_accept(call); |
|
| 312 | 324 |
break; |
| 313 | 325 |
default: |
| 314 | 326 |
break; |
| ... | ... |
@@ -325,6 +337,9 @@ void call_state_changed(struct _LinphoneCore *lc, LinphoneCall *call, |
| 325 | 337 |
void dtmf_received(struct _LinphoneCore* lc, LinphoneCall *call, int dtmf) |
| 326 | 338 |
{
|
| 327 | 339 |
Data *data = (Data*)linphone_core_get_user_data(lc); |
| 340 |
+ if (data == nullptr) {
|
|
| 341 |
+ return; // still initializing -> ignore |
|
| 342 |
+ } |
|
| 328 | 343 |
|
| 329 | 344 |
// check if current call |
| 330 | 345 |
bool current = data->call == call; |
| ... | ... |
@@ -375,23 +390,45 @@ void do_register(Data &data, std::string const &server, |
| 375 | 390 |
return; |
| 376 | 391 |
} |
| 377 | 392 |
|
| 393 |
+ LinphoneFactory *factory = linphone_factory_get(); |
|
| 394 |
+ |
|
| 395 |
+ // create linphone callback object |
|
| 396 |
+ data.callbacks = linphone_factory_create_core_cbs(factory); |
|
| 397 |
+ if (! data.callbacks) {
|
|
| 398 |
+ log(data, "failed to create linphone callback object"); |
|
| 399 |
+ return; |
|
| 400 |
+ } |
|
| 401 |
+ |
|
| 402 |
+ // set callbacks |
|
| 403 |
+ linphone_core_cbs_set_global_state_changed(data.callbacks, |
|
| 404 |
+ global_state_changed); |
|
| 405 |
+ linphone_core_cbs_set_registration_state_changed(data.callbacks, |
|
| 406 |
+ registration_state_changed); |
|
| 407 |
+ linphone_core_cbs_set_call_state_changed(data.callbacks, call_state_changed); |
|
| 408 |
+ linphone_core_cbs_set_dtmf_received(data.callbacks, dtmf_received); |
|
| 409 |
+ |
|
| 378 | 410 |
// create linphone core object |
| 379 |
- data.lc = linphone_core_new(&data.callbacks, NULL, NULL, &data); |
|
| 411 |
+ data.lc = linphone_factory_create_core(factory, data.callbacks, NULL, NULL); |
|
| 380 | 412 |
if (! data.lc) {
|
| 381 | 413 |
log(data, "failed to create linphone core"); |
| 414 |
+ linphone_core_cbs_unref(data.callbacks); |
|
| 415 |
+ data.callbacks = nullptr; |
|
| 382 | 416 |
return; |
| 383 | 417 |
} |
| 418 |
+ linphone_core_set_user_data(data.lc, &data); |
|
| 384 | 419 |
log(data, "linphone core created"); |
| 385 | 420 |
|
| 386 | 421 |
// set auth data |
| 387 | 422 |
if (! username.empty() && ! password.empty()) {
|
| 388 | 423 |
LinphoneAuthInfo *auth_info = |
| 389 | 424 |
linphone_auth_info_new(username.c_str(), username.c_str(), |
| 390 |
- password.c_str(), "", ""); |
|
| 425 |
+ password.c_str(), nullptr, "", ""); |
|
| 391 | 426 |
if (! auth_info) {
|
| 392 | 427 |
log(data, "failed to create auth info"); |
| 393 |
- linphone_core_destroy(data.lc); |
|
| 428 |
+ linphone_core_unref(data.lc); |
|
| 394 | 429 |
data.lc = nullptr; |
| 430 |
+ linphone_core_cbs_unref(data.callbacks); |
|
| 431 |
+ data.callbacks = nullptr; |
|
| 395 | 432 |
return; |
| 396 | 433 |
} |
| 397 | 434 |
linphone_core_add_auth_info(data.lc, auth_info); |
| ... | ... |
@@ -406,12 +443,18 @@ void do_register(Data &data, std::string const &server, |
| 406 | 443 |
LinphoneProxyConfig *proxy = linphone_core_create_proxy_config(data.lc); |
| 407 | 444 |
if (! proxy) {
|
| 408 | 445 |
log(data, "failed to create proxy config"); |
| 409 |
- linphone_core_destroy(data.lc); |
|
| 446 |
+ linphone_core_unref(data.lc); |
|
| 410 | 447 |
data.lc = nullptr; |
| 448 |
+ linphone_core_cbs_unref(data.callbacks); |
|
| 449 |
+ data.callbacks = nullptr; |
|
| 411 | 450 |
return; |
| 412 | 451 |
} |
| 413 | 452 |
linphone_proxy_config_set_server_addr(proxy, sipserver.c_str()); |
| 414 |
- linphone_proxy_config_set_identity(proxy, identity.c_str()); |
|
| 453 |
+ LinphoneAddress *addr = |
|
| 454 |
+ linphone_proxy_config_normalize_sip_uri(proxy, identity.c_str()); |
|
| 455 |
+ if (addr != NULL) {
|
|
| 456 |
+ linphone_proxy_config_set_identity_address(proxy, addr); |
|
| 457 |
+ } |
|
| 415 | 458 |
linphone_proxy_config_enable_register(proxy, TRUE); |
| 416 | 459 |
linphone_core_add_proxy_config(data.lc, proxy); |
| 417 | 460 |
log(data, "proxy config set"); |
| ... | ... |
@@ -432,11 +475,13 @@ void do_deregister(Data &data) |
| 432 | 475 |
return; |
| 433 | 476 |
} |
| 434 | 477 |
|
| 435 |
- log(data, "destroying..."); |
|
| 436 |
- linphone_core_destroy(data.lc); |
|
| 478 |
+ log(data, "unreferencing..."); |
|
| 479 |
+ linphone_core_unref(data.lc); |
|
| 437 | 480 |
data.lc = nullptr; |
| 481 |
+ linphone_core_cbs_unref(data.callbacks); |
|
| 482 |
+ data.callbacks = nullptr; |
|
| 438 | 483 |
data.call = nullptr; |
| 439 |
- log(data, "destroyed"); |
|
| 484 |
+ log(data, "unreferenced"); |
|
| 440 | 485 |
} |
| 441 | 486 |
|
| 442 | 487 |
/** |
| ... | ... |
@@ -474,7 +519,7 @@ void do_hangup(Data &data) |
| 474 | 519 |
} |
| 475 | 520 |
|
| 476 | 521 |
log(data, "terminating call..."); |
| 477 |
- linphone_core_terminate_call(data.lc, data.call); |
|
| 522 |
+ linphone_call_terminate(data.call); |
|
| 478 | 523 |
data.call = nullptr; |
| 479 | 524 |
log(data, "call terminated"); |
| 480 | 525 |
} |
| ... | ... |
@@ -491,11 +536,7 @@ void worker(SipPhone::ConfigData const &configData, |
| 491 | 536 |
Data data; |
| 492 | 537 |
data.configData = &configData; |
| 493 | 538 |
data.sharedData = &sharedData; |
| 494 |
- memset(&data.callbacks, 0, sizeof(data.callbacks)); |
|
| 495 |
- data.callbacks.global_state_changed = global_state_changed; |
|
| 496 |
- data.callbacks.registration_state_changed = registration_state_changed; |
|
| 497 |
- data.callbacks.call_state_changed = call_state_changed; |
|
| 498 |
- data.callbacks.dtmf_received = dtmf_received; |
|
| 539 |
+ data.callbacks = nullptr; |
|
| 499 | 540 |
data.lc = nullptr; |
| 500 | 541 |
data.call = nullptr; |
| 501 | 542 |
data.logLineCnt = 0; |
| 502 | 543 |