diff --git a/CMakeLists.txt b/CMakeLists.txt index ee02b53b1..be0eb299f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,7 +247,7 @@ if(MSVC) endif() else() list(APPEND STRICT_OPTIONS_CPP "-Wall" "-Wuninitialized" "-Wno-error=deprecated-declarations") - list(APPEND STRICT_OPTIONS_C "-Wdeclaration-after-statement" "-Wstrict-prototypes" "-Werror=strict-prototypes") + list(APPEND STRICT_OPTIONS_C "-Wstrict-prototypes" "-Werror=strict-prototypes") if(CMAKE_C_COMPILER_ID STREQUAL "GNU") list(APPEND STRICT_OPTIONS_C "-fno-inline-small-functions") endif() diff --git a/configure.ac b/configure.ac index 80c7c7b4d..474d52799 100644 --- a/configure.ac +++ b/configure.ac @@ -776,7 +776,7 @@ AC_ARG_ENABLE(strict, ) STRICT_OPTIONS="-Wall -Wuninitialized" -STRICT_OPTIONS_CC="-Wdeclaration-after-statement -Wstrict-prototypes" +STRICT_OPTIONS_CC="-Wstrict-prototypes" STRICT_OPTIONS_CXX="" #for clang diff --git a/console/commands.c b/console/commands.c index 72510bd65..449af0695 100644 --- a/console/commands.c +++ b/console/commands.c @@ -2070,7 +2070,7 @@ static int lpc_cmd_status(LinphoneCore *lc, char *args) linphonec_out("hook=paused sip:%s\n",linphonec_get_callee()); break; case LinphoneCallIdle: - linphonec_out("hook=offhook\n"); + linphonec_out("hook=on-hook\n"); break; case LinphoneCallStreamsRunning: case LinphoneCallConnected: diff --git a/coreapi/account_creator.c b/coreapi/account_creator.c index e26f6157c..9b47f4206 100644 --- a/coreapi/account_creator.c +++ b/coreapi/account_creator.c @@ -61,6 +61,14 @@ void linphone_account_creator_cbs_set_user_data(LinphoneAccountCreatorCbs *cbs, cbs->user_data = ud; } +LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_update_hash(const LinphoneAccountCreatorCbs *cbs) { + return cbs->update_hash; +} + +void linphone_account_creator_cbs_set_update_hash(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb) { + cbs->update_hash = cb; +} + LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_account_used(const LinphoneAccountCreatorCbs *cbs) { return cbs->is_account_used; } @@ -367,6 +375,54 @@ const char * linphone_account_creator_get_password(const LinphoneAccountCreator return creator->password; } +static void _password_updated_cb(LinphoneXmlRpcRequest *request) { + LinphoneAccountCreator *creator = (LinphoneAccountCreator *)linphone_xml_rpc_request_get_user_data(request); + if (creator->callbacks->update_hash != NULL) { + LinphoneAccountCreatorStatus status = LinphoneAccountCreatorReqFailed; + const char* resp = linphone_xml_rpc_request_get_string_response(request); + if (linphone_xml_rpc_request_get_status(request) == LinphoneXmlRpcStatusOk) { + if (strcmp(resp, "OK") == 0) { + status = LinphoneAccountCreatorOK; + } else if (strcmp(resp, "ERROR_PASSWORD_DOESNT_MATCH") == 0) { + status = LinphoneAccountCreatorAccountNotExist; + } else { + status = LinphoneAccountCreatorErrorServer; + } + } + creator->callbacks->update_hash(creator, status, resp); + } +} + +LinphoneAccountCreatorStatus linphone_account_creator_update_password(LinphoneAccountCreator *creator, const char *new_pwd){ + LinphoneXmlRpcRequest *request; + char *identity = _get_identity(creator); + if (!identity || (!creator->username && !creator->phone_number + && !creator->domain && (!creator->password || !creator->ha1))) { + if (creator->callbacks->update_hash != NULL) { + creator->callbacks->update_hash(creator, LinphoneAccountCreatorReqFailed, "Missing required parameters"); + } + return LinphoneAccountCreatorReqFailed; + } + + const char * username = creator->username ? creator->username : creator->phone_number; + const char * ha1 = ms_strdup(creator->ha1 ? creator->ha1 : ha1_for_passwd(username, creator->domain, creator->password) ); + const char * new_ha1 = ms_strdup(ha1_for_passwd(username, creator->domain, new_pwd)); + + request = linphone_xml_rpc_request_new_with_args("update_hash", LinphoneXmlRpcArgString, + LinphoneXmlRpcArgString, username, + LinphoneXmlRpcArgString, ha1, + LinphoneXmlRpcArgString, new_ha1, + LinphoneXmlRpcArgString, creator->domain, + LinphoneXmlRpcArgNone); + + linphone_xml_rpc_request_set_user_data(request, creator); + linphone_xml_rpc_request_cbs_set_response(linphone_xml_rpc_request_get_callbacks(request), _password_updated_cb); + linphone_xml_rpc_session_send_request(creator->xmlrpc_session, request); + linphone_xml_rpc_request_unref(request); + + return LinphoneAccountCreatorOK; +} + LinphoneAccountCreatorStatus linphone_account_creator_set_ha1(LinphoneAccountCreator *creator, const char *ha1){ set_string(&creator->ha1, ha1, FALSE); return LinphoneAccountCreatorOK; diff --git a/coreapi/account_creator.h b/coreapi/account_creator.h index c308ba3df..1b678f765 100644 --- a/coreapi/account_creator.h +++ b/coreapi/account_creator.h @@ -145,6 +145,14 @@ LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_set_userna **/ LINPHONE_PUBLIC const char * linphone_account_creator_get_username(const LinphoneAccountCreator *creator); +/** + * Update the password. + * @param[in] creator LinphoneAccountCreator object + * @param[in] new_pwd const char * : new password for the account creator + * @return LinphoneAccountCreatorOk if everything is OK, or a specific error otherwise. +**/ +LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_update_password(LinphoneAccountCreator *creator, const char *new_pwd); + /** * Set the phone number normalized. * @param[in] creator LinphoneAccountCreator object @@ -379,6 +387,20 @@ LINPHONE_PUBLIC void *linphone_account_creator_cbs_get_user_data(const LinphoneA **/ LINPHONE_PUBLIC void linphone_account_creator_cbs_set_user_data(LinphoneAccountCreatorCbs *cbs, void *ud); +/** + * Retrieve the user pointer associated with a LinphoneAccountCreatorCbs object. + * @param[in] cbs LinphoneAccountCreatorCbs object. + * @return The user pointer associated with the LinphoneAccountCreatorCbs object. +**/ +LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_update_hash(const LinphoneAccountCreatorCbs *cbs); + +/** + * Assign a user pointer to a LinphoneAccountCreatorCbs object. + * @param[in] cbs LinphoneAccountCreatorCbs object. + * @param[in] ud The user pointer to associate with the LinphoneAccountCreatorCbs object. +**/ +LINPHONE_PUBLIC void linphone_account_creator_cbs_set_update_hash(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb); + /** * Get the current linked tested callback. * @param[in] cbs LinphoneAccountCreatorCbs object. diff --git a/coreapi/authentication.c b/coreapi/authentication.c index ec956f5f1..773e31fc0 100644 --- a/coreapi/authentication.c +++ b/coreapi/authentication.c @@ -484,7 +484,7 @@ void linphone_core_remove_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *in /** * Returns an unmodifiable list of currently entered LinphoneAuthInfo. * @param[in] lc The LinphoneCore object - * @return \mslist{LinphoneAuthInfo} + * @return \bctbx_list{LinphoneAuthInfo} **/ const bctbx_list_t *linphone_core_get_auth_info_list(const LinphoneCore *lc){ return lc->auth_info; diff --git a/coreapi/conference.h b/coreapi/conference.h index 269e442f1..1359327cc 100644 --- a/coreapi/conference.h +++ b/coreapi/conference.h @@ -103,7 +103,7 @@ LINPHONE_PUBLIC int linphone_conference_remove_participant(LinphoneConference *o * The returned bctbx_list_t contains URIs of all participant. That list must be * freed after use and each URI must be unref with linphone_address_unref() * @param obj A #LinphoneConference - * @return \mslist{LinphoneAddress} + * @return \bctbx_list{LinphoneAddress} */ LINPHONE_PUBLIC bctbx_list_t *linphone_conference_get_participants(const LinphoneConference *obj); diff --git a/coreapi/dial_plan.c b/coreapi/dial_plan.c index 6441cb2f3..2c36723d7 100644 --- a/coreapi/dial_plan.c +++ b/coreapi/dial_plan.c @@ -261,6 +261,10 @@ int linphone_dial_plan_lookup_ccc_from_e164(const char* e164) { LinphoneDialPlan* elected_dial_plan=NULL; unsigned int found; unsigned int i=0; + + if (e164[0]!='+') { + return -1;/*not an e164 number*/ + } if (e164[1]=='1') { /*USA case*/ return 1; @@ -292,14 +296,13 @@ int linphone_dial_plan_lookup_ccc_from_iso(const char* iso) { return -1; } -const LinphoneDialPlan* linphone_dial_plan_by_ccc(const char *ccc) { +const LinphoneDialPlan* linphone_dial_plan_by_ccc_as_int(int ccc) { int i; - if (!ccc) { - return &most_common_dialplan; - } - + char ccc_as_char[16] = {0}; + snprintf(ccc_as_char,sizeof(ccc_as_char)-1,"%i",ccc); + for(i=0;dial_plans[i].country!=NULL;++i){ - if (strcmp(ccc,dial_plans[i].ccc)==0){ + if (strcmp(ccc_as_char,dial_plans[i].ccc)==0){ return &dial_plans[i]; } } @@ -307,6 +310,15 @@ const LinphoneDialPlan* linphone_dial_plan_by_ccc(const char *ccc) { return &most_common_dialplan; } + +const LinphoneDialPlan* linphone_dial_plan_by_ccc(const char *ccc) { + if (!ccc) { + return &most_common_dialplan; + } + + return linphone_dial_plan_by_ccc_as_int((int)strtol(ccc,NULL,10)); +} + const LinphoneDialPlan* linphone_dial_plan_get_all() { return dial_plans; } diff --git a/coreapi/friend.c b/coreapi/friend.c index 16bf62912..0cecfb3a0 100644 --- a/coreapi/friend.c +++ b/coreapi/friend.c @@ -744,8 +744,6 @@ void linphone_friend_edit(LinphoneFriend *fr) { void linphone_friend_done(LinphoneFriend *fr) { ms_return_if_fail(fr); if (!fr->lc) return; - linphone_friend_apply(fr, fr->lc); - linphone_friend_save(fr, fr->lc); if (fr && linphone_core_vcard_supported() && fr->vcard) { if (linphone_vcard_compare_md5_hash(fr->vcard) != 0) { @@ -756,6 +754,8 @@ void linphone_friend_done(LinphoneFriend *fr) { } } } + linphone_friend_apply(fr, fr->lc); + linphone_friend_save(fr, fr->lc); } #if __clang__ || ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || __GNUC__ > 4) @@ -1221,7 +1221,7 @@ void linphone_core_friends_storage_init(LinphoneCore *lc) { linphone_create_table(db); if (linphone_update_table(db)) { // After updating schema, database need to be closed/reopenned - sqlite3_close(lc->friends_db); + sqlite3_close(db); _linphone_sqlite3_open(lc->friends_db_file, &db); } diff --git a/coreapi/friendlist.h b/coreapi/friendlist.h index 78ff3ca2f..c4c3b78cb 100644 --- a/coreapi/friendlist.h +++ b/coreapi/friendlist.h @@ -87,7 +87,7 @@ LINPHONE_PUBLIC void linphone_core_remove_friend_list(LinphoneCore *lc, Linphone /** * Retrieves the list of LinphoneFriendList from the core. * @param[in] lc LinphoneCore object - * @return \mslist{LinphoneFriendList} a list of LinphoneFriendList + * @return \bctbx_list{LinphoneFriendList} a list of LinphoneFriendList */ LINPHONE_PUBLIC const bctbx_list_t * linphone_core_get_friends_lists(const LinphoneCore *lc); @@ -196,7 +196,7 @@ LINPHONE_PUBLIC LinphoneFriendListStatus linphone_friend_list_remove_friend(Linp /** * Retrieves the list of LinphoneFriend from this LinphoneFriendList. * @param[in] list LinphoneFriendList object - * @return \mslist{LinphoneFriend} a list of LinphoneFriend + * @return \bctbx_list{LinphoneFriend} a list of LinphoneFriend */ LINPHONE_PUBLIC const bctbx_list_t * linphone_friend_list_get_friends(const LinphoneFriendList *list); diff --git a/coreapi/help/Doxyfile.in b/coreapi/help/Doxyfile.in index b0230913f..f3b62161a 100644 --- a/coreapi/help/Doxyfile.in +++ b/coreapi/help/Doxyfile.in @@ -228,7 +228,7 @@ TAB_SIZE = 8 # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. -ALIASES = "mslist{1}=A list of \ref \1 objects. \xmlonly \1 \endxmlonly" +ALIASES = "bctbx_list{1}=A list of \ref \1 objects. \xmlonly \1 \endxmlonly" # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" diff --git a/coreapi/help/realtimetext_sender.c b/coreapi/help/realtimetext_sender.c index 5e4bfdf84..64493008d 100644 --- a/coreapi/help/realtimetext_sender.c +++ b/coreapi/help/realtimetext_sender.c @@ -111,7 +111,7 @@ int main(int argc, char *argv[]){ /* main loop for sending message and doing background linphonecore work: */ while(running){ - char character; + int character; /*to disable terminal buffering*/ if (system ("/bin/stty raw") == -1){ ms_error("/bin/stty error"); diff --git a/coreapi/linphone_tunnel.h b/coreapi/linphone_tunnel.h index 399875f46..5716b4fc3 100644 --- a/coreapi/linphone_tunnel.h +++ b/coreapi/linphone_tunnel.h @@ -227,7 +227,7 @@ LINPHONE_PUBLIC void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, Linph /** * Get added servers * @param tunnel LinphoneTunnel object - * @return \mslist{LinphoneTunnelConfig} + * @return \bctbx_list{LinphoneTunnelConfig} */ LINPHONE_PUBLIC const bctbx_list_t *linphone_tunnel_get_servers(const LinphoneTunnel *tunnel); diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 4838e89e6..bbf1b27ff 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -668,13 +668,16 @@ static const char *linphone_call_get_bind_ip_for_stream(LinphoneCall *call, int const char *bind_ip = lp_config_get_string(call->core->config,"rtp","bind_address", call->af == AF_INET6 ? "::0" : "0.0.0.0"); PortConfig *pc = &call->media_ports[stream_index]; - if (stream_index<2 && pc->multicast_ip[0]!='\0'){ + if (pc->multicast_ip[0]!='\0'){ if (call->dir==LinphoneCallOutgoing){ /*as multicast sender, we must decide a local interface to use to send multicast, and bind to it*/ linphone_core_get_local_ip_for(strchr(pc->multicast_ip,':') ? AF_INET6 : AF_INET, NULL, pc->multicast_bind_ip); bind_ip = pc->multicast_bind_ip; - + }else{ + /*otherwise we shall use an address family of the same family of the multicast address, because + * dual stack socket and multicast don't work well on Mac OS (linux is OK, as usual).*/ + bind_ip = strchr(pc->multicast_ip,':') ? "::0" : "0.0.0.0"; } } return bind_ip; @@ -683,7 +686,7 @@ static const char *linphone_call_get_bind_ip_for_stream(LinphoneCall *call, int static const char *linphone_call_get_public_ip_for_stream(LinphoneCall *call, int stream_index){ const char *public_ip=call->media_localip; - if (stream_index<2 && call->media_ports[stream_index].multicast_ip[0]!='\0') + if (call->media_ports[stream_index].multicast_ip[0]!='\0') public_ip=call->media_ports[stream_index].multicast_ip; return public_ip; } @@ -5160,6 +5163,10 @@ void linphone_call_repair_if_broken(LinphoneCall *call){ case LinphoneCallOutgoingRinging: linphone_call_repair_by_invite_with_replaces(call); break; + case LinphoneCallIncomingEarlyMedia: + case LinphoneCallIncomingReceived: + /* Keep the call broken until a forked INVITE is received from the server. */ + break; default: ms_warning("linphone_call_repair_if_broken(): don't know what to do in state [%s]", linphone_call_state_to_string(call->state)); call->broken = FALSE; @@ -5178,16 +5185,8 @@ void linphone_call_refresh_sockets(LinphoneCall *call){ } void linphone_call_replace_op(LinphoneCall *call, SalOp *op) { - switch (linphone_call_get_state(call)) { - case LinphoneCallConnected: - case LinphoneCallStreamsRunning: - sal_call_terminate(call->op); - break; - default: - break; - } - sal_op_kill_dialog(call->op); - sal_op_release(call->op); + SalOp *oldop = call->op; + LinphoneCallState oldstate = linphone_call_get_state(call); call->op = op; sal_op_set_user_pointer(call->op, call); sal_call_set_local_media_description(call->op, call->localdesc); @@ -5204,4 +5203,24 @@ void linphone_call_replace_op(LinphoneCall *call, SalOp *op) { ms_warning("linphone_call_replace_op(): don't know what to do in state [%s]", linphone_call_state_to_string(call->state)); break; } + switch (oldstate) { + case LinphoneCallIncomingEarlyMedia: + case LinphoneCallIncomingReceived: + sal_op_set_user_pointer(oldop, NULL); /* To make the call does not get terminated by terminating this op. */ + /* Do not terminate a forked INVITE */ + if (sal_call_get_replaces(op)) { + sal_call_terminate(oldop); + } else { + sal_op_kill_dialog(oldop); + } + break; + case LinphoneCallConnected: + case LinphoneCallStreamsRunning: + sal_call_terminate(oldop); + sal_op_kill_dialog(oldop); + break; + default: + break; + } + sal_op_release(oldop); } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 882ac4045..c03dde5b4 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1989,7 +1989,7 @@ LinphoneAddress *linphone_core_get_primary_contact_parsed(LinphoneCore *lc){ /** * Sets the list of audio codecs. * @param[in] lc The LinphoneCore object - * @param[in] codecs \mslist{PayloadType} + * @param[in] codecs \bctbx_list{PayloadType} * @return 0 * * @ingroup media_parameters @@ -2007,7 +2007,7 @@ int linphone_core_set_audio_codecs(LinphoneCore *lc, bctbx_list_t *codecs){ /** * Sets the list of video codecs. * @param[in] lc The LinphoneCore object - * @param[in] codecs \mslist{PayloadType} + * @param[in] codecs \bctbx_list{PayloadType} * @return 0 * * @ingroup media_parameters @@ -3582,7 +3582,7 @@ int linphone_core_start_update_call(LinphoneCore *lc, LinphoneCall *call){ subject="Conference"; }else if (call->params->internal_call_update){ subject="ICE processing concluded"; - }else if (!no_user_consent){ + }else if (no_user_consent){ subject="Refreshing"; }else{ subject="Media change"; @@ -4144,7 +4144,7 @@ int linphone_core_terminate_all_calls(LinphoneCore *lc){ /** * Returns the current list of calls. * @param[in] lc The LinphoneCore object - * @return \mslist{LinphoneCall} + * @return \bctbx_list{LinphoneCall} * * Note that this list is read-only and might be changed by the core after a function call to linphone_core_iterate(). * Similarly the LinphoneCall objects inside it might be destroyed without prior notice. diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 64f2ada6f..598209da5 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1584,7 +1584,7 @@ LINPHONE_PUBLIC int linphone_chat_room_get_history_size(LinphoneChatRoom *cr); * Gets nb_message most recent messages from cr chat room, sorted from oldest to most recent. * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which messages should be retrieved * @param[in] nb_message Number of message to retrieve. 0 means everything. - * @return \mslist{LinphoneChatMessage} + * @return \bctbx_list{LinphoneChatMessage} */ LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history(LinphoneChatRoom *cr,int nb_message); @@ -1593,7 +1593,7 @@ LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history(LinphoneChatRoom *c * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which messages should be retrieved * @param[in] begin The first message of the range to be retrieved. History most recent message has index 0. * @param[in] end The last message of the range to be retrieved. History oldest message has index of history size - 1 (use #linphone_chat_room_get_history_size to retrieve history size) - * @return \mslist{LinphoneChatMessage} + * @return \bctbx_list{LinphoneChatMessage} */ LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_range(LinphoneChatRoom *cr, int begin, int end); @@ -1644,7 +1644,7 @@ LINPHONE_PUBLIC uint32_t linphone_chat_room_get_char(const LinphoneChatRoom *cr) /** * Returns an list of chat rooms * @param[in] lc #LinphoneCore object - * @return \mslist{LinphoneChatRoom} + * @return \bctbx_list{LinphoneChatRoom} **/ LINPHONE_PUBLIC const bctbx_list_t* linphone_core_get_chat_rooms(LinphoneCore *lc); LINPHONE_PUBLIC unsigned int linphone_chat_message_store(LinphoneChatMessage *msg); @@ -2913,7 +2913,7 @@ LINPHONE_PUBLIC void linphone_core_set_dns_servers(LinphoneCore *lc, const bctbx /** * Returns the list of available audio codecs. * @param[in] lc The LinphoneCore object - * @return \mslist{PayloadType} + * @return \bctbx_list{PayloadType} * * This list is unmodifiable. The ->data field of the bctbx_list_t points a PayloadType * structure holding the codec information. @@ -2928,7 +2928,7 @@ LINPHONE_PUBLIC int linphone_core_set_audio_codecs(LinphoneCore *lc, bctbx_list_ /** * Returns the list of available video codecs. * @param[in] lc The LinphoneCore object - * @return \mslist{PayloadType} + * @return \bctbx_list{PayloadType} * * This list is unmodifiable. The ->data field of the bctbx_list_t points a PayloadType * structure holding the codec information. @@ -2943,7 +2943,7 @@ LINPHONE_PUBLIC int linphone_core_set_video_codecs(LinphoneCore *lc, bctbx_list_ /** * Returns the list of available text codecs. * @param[in] lc The LinphoneCore object - * @return \mslist{PayloadType} + * @return \bctbx_list{PayloadType} * * This list is unmodifiable. The ->data field of the bctbx_list_t points a PayloadType * structure holding the codec information. @@ -3079,7 +3079,7 @@ LINPHONE_PUBLIC void linphone_core_remove_proxy_config(LinphoneCore *lc, Linphon /** * Returns an unmodifiable list of entered proxy configurations. * @param[in] lc The LinphoneCore object - * @return \mslist{LinphoneProxyConfig} + * @return \bctbx_list{LinphoneProxyConfig} **/ LINPHONE_PUBLIC const bctbx_list_t *linphone_core_get_proxy_config_list(const LinphoneCore *lc); @@ -3540,7 +3540,7 @@ LINPHONE_PUBLIC void linphone_core_set_rtp_no_xmit_on_audio_mute(LinphoneCore *l /** * Get the list of call logs (past calls). * @param[in] lc LinphoneCore object - * @return \mslist{LinphoneCallLog} + * @return \bctbx_list{LinphoneCallLog} **/ LINPHONE_PUBLIC const bctbx_list_t * linphone_core_get_call_logs(LinphoneCore *lc); @@ -3549,7 +3549,7 @@ LINPHONE_PUBLIC const bctbx_list_t * linphone_core_get_call_logs(LinphoneCore *l * At the contrary of linphone_core_get_call_logs, it is your responsability to unref the logs and free this list once you are done using it. * @param[in] lc LinphoneCore object * @param[in] addr LinphoneAddress object - * @return \mslist{LinphoneCallLog} + * @return \bctbx_list{LinphoneCallLog} **/ LINPHONE_PUBLIC bctbx_list_t * linphone_core_get_call_history_for_address(LinphoneCore *lc, const LinphoneAddress *addr); diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index a42b688c6..c4301e9ff 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -8224,6 +8224,34 @@ static void account_creator_phone_account_recovered(LinphoneAccountCreator *crea env->CallVoidMethod(listener, method, getAccountCreator(env, creator), statusObject); } +static void account_creator_password_updated(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, const char *resp) { + JNIEnv *env = 0; + jint result = jvm->AttachCurrentThread(&env,NULL); + if (result != 0) { + ms_error("cannot attach VM\n"); + return; + } + + ms_warning("test callback password updated"); + + LinphoneAccountCreatorCbs *cbs = linphone_account_creator_get_callbacks(creator); + jobject listener = (jobject) linphone_account_creator_cbs_get_user_data(cbs); + if (listener == NULL) { + ms_error("account_creator_response() notification without listener"); + return ; + } + + LinphoneCore *lc = (LinphoneCore *)creator->core; + LinphoneJavaBindings *ljb = (LinphoneJavaBindings *)linphone_core_get_user_data(lc); + + jclass clazz = (jclass) env->GetObjectClass(listener); + jmethodID method = env->GetMethodID(clazz, "onAccountCreatorPasswordUpdated","(Lorg/linphone/core/LinphoneAccountCreator;Lorg/linphone/core/LinphoneAccountCreator$Status;)V"); + env->DeleteLocalRef(clazz); + + jobject statusObject = env->CallStaticObjectMethod(ljb->accountCreatorStatusClass, ljb->accountCreatorStatusFromIntId, (jint)status); + env->CallVoidMethod(listener, method, getAccountCreator(env, creator), statusObject); +} + extern "C" jlong Java_org_linphone_core_LinphoneAccountCreatorImpl_newLinphoneAccountCreator(JNIEnv *env, jobject thiz, jlong core, jstring jurl) { const char *url = GetStringUTFChars(env, jurl); LinphoneAccountCreator *account_creator = linphone_account_creator_new((LinphoneCore *)core, url); @@ -8252,6 +8280,8 @@ extern "C" void Java_org_linphone_core_LinphoneAccountCreatorImpl_setListener(JN linphone_account_creator_cbs_set_is_account_activated(cbs, account_creator_is_account_activated); linphone_account_creator_cbs_set_recover_phone_account(cbs, account_creator_phone_account_recovered); linphone_account_creator_cbs_set_is_phone_number_used(cbs, account_creator_is_phone_number_used); + linphone_account_creator_cbs_set_is_account_linked(cbs, account_creator_is_account_linked); + linphone_account_creator_cbs_set_update_hash(cbs, account_creator_password_updated); } extern "C" jint Java_org_linphone_core_LinphoneAccountCreatorImpl_setUsername(JNIEnv *env, jobject thiz, jlong ptr, jstring jusername) { @@ -8450,6 +8480,15 @@ extern "C" jint Java_org_linphone_core_LinphoneAccountCreatorImpl_recoverPhoneAc return (jint) linphone_account_creator_recover_phone_account(account_creator); } +extern "C" jint Java_org_linphone_core_LinphoneAccountCreatorImpl_updatePassword(JNIEnv *env, jobject thiz, jlong ptr, jstring jpasswd) { + jint status; + LinphoneAccountCreator *account_creator = (LinphoneAccountCreator *)ptr; + const char* passwd = GetStringUTFChars(env, jpasswd); + status = (jint) linphone_account_creator_update_password(account_creator, passwd); + ReleaseStringUTFChars(env, jpasswd, passwd); + return status; +} + extern "C" jobject Java_org_linphone_core_LinphoneAccountCreatorImpl_configure(JNIEnv *env, jobject thiz, jlong ptr) { LinphoneAccountCreator *account_creator = (LinphoneAccountCreator *)ptr; LinphoneProxyConfig *lpc = linphone_account_creator_configure(account_creator); diff --git a/coreapi/linphonecore_utils.h b/coreapi/linphonecore_utils.h index 83c46054c..d7da908ac 100644 --- a/coreapi/linphonecore_utils.h +++ b/coreapi/linphonecore_utils.h @@ -133,7 +133,13 @@ LINPHONE_PUBLIC const LinphoneDialPlan* linphone_dial_plan_get_all(void); * @return Return matching dial plan, or a generic one if none found **/ LINPHONE_PUBLIC const LinphoneDialPlan* linphone_dial_plan_by_ccc(const char *ccc); - +/** + * Find best match for given CCC + * @return Return matching dial plan, or a generic one if none found + **/ +LINPHONE_PUBLIC const LinphoneDialPlan* linphone_dial_plan_by_ccc_as_int(int ccc); + + /** * Return if given plan is generic **/ diff --git a/coreapi/linphonefriend.h b/coreapi/linphonefriend.h index af6f995d8..2e48ca96e 100644 --- a/coreapi/linphonefriend.h +++ b/coreapi/linphonefriend.h @@ -175,7 +175,7 @@ LINPHONE_PUBLIC void linphone_friend_add_address(LinphoneFriend *lf, const Linph /** * Returns a list of #LinphoneAddress for this friend * @param lf #LinphoneFriend object - * @return \mslist{LinphoneAddress} + * @return \bctbx_list{LinphoneAddress} */ LINPHONE_PUBLIC const bctbx_list_t* linphone_friend_get_addresses(const LinphoneFriend *lf); @@ -196,7 +196,7 @@ LINPHONE_PUBLIC void linphone_friend_add_phone_number(LinphoneFriend *lf, const /** * Returns a list of phone numbers for this friend * @param lf #LinphoneFriend object - * @return \mslist{const char *} + * @return \bctbx_list{const char *} */ LINPHONE_PUBLIC bctbx_list_t* linphone_friend_get_phone_numbers(LinphoneFriend *lf); @@ -444,7 +444,7 @@ LINPHONE_PUBLIC void linphone_core_reject_subscriber(LinphoneCore *lc, LinphoneF /** * Get Buddy list of LinphoneFriend * @param[in] lc #LinphoneCore object - * @return \mslist{LinphoneFriend} + * @return \bctbx_list{LinphoneFriend} * @deprecated use linphone_core_get_friends_lists() or linphone_friend_list_get_friends() instead. */ LINPHONE_PUBLIC const bctbx_list_t * linphone_core_get_friend_list(const LinphoneCore *lc); diff --git a/coreapi/lpconfig.h b/coreapi/lpconfig.h index 59269098e..09a1f8d97 100644 --- a/coreapi/lpconfig.h +++ b/coreapi/lpconfig.h @@ -111,8 +111,8 @@ LINPHONE_PUBLIC const char *lp_config_get_string(const LpConfig *lpconfig, const * @param[in] lpconfig A LpConfig object * @param[in] section The section from which to retrieve a configuration item * @param[in] key The name of the configuration item to retrieve - * @param[in] default_list \mslist{const char *} - * @return \mslist{const char *} + * @param[in] default_list \bctbx_list{const char *} + * @return \bctbx_list{const char *} */ LINPHONE_PUBLIC bctbx_list_t * lp_config_get_string_list(const LpConfig *lpconfig, const char *section, const char *key, bctbx_list_t *default_list); @@ -162,7 +162,7 @@ LINPHONE_PUBLIC void lp_config_set_string(LpConfig *lpconfig,const char *section * @param[in] lpconfig A LpConfig object * @param[in] section The name of the section to put the configuration item into * @param[in] key The name of the configuration item to set - * @param[in] value \mslist{const char *} The value to set + * @param[in] value \bctbx_list{const char *} The value to set */ LINPHONE_PUBLIC void lp_config_set_string_list(LpConfig *lpconfig, const char *section, const char *key, const bctbx_list_t *value); diff --git a/coreapi/nat_policy.c b/coreapi/nat_policy.c index 2d0826ef9..d7f176beb 100644 --- a/coreapi/nat_policy.c +++ b/coreapi/nat_policy.c @@ -41,6 +41,7 @@ static void linphone_nat_policy_destroy(LinphoneNatPolicy *policy) { if (policy->stun_addrinfo) bctbx_freeaddrinfo(policy->stun_addrinfo); if (policy->stun_resolver_context) { sal_resolve_cancel(policy->stun_resolver_context); + sal_resolver_context_unref(policy->stun_resolver_context); } } @@ -185,7 +186,6 @@ void linphone_nat_policy_set_stun_server(LinphoneNatPolicy *policy, const char * } if (new_stun_server != NULL) { policy->stun_server = new_stun_server; - linphone_nat_policy_resolve_stun_server(policy); } } @@ -250,7 +250,7 @@ const struct addrinfo * linphone_nat_policy_get_stun_server_addrinfo(LinphoneNat * - if no cached value exists, block for a short time; this case must be unprobable because the resolution will be asked each * time the stun server value is changed. */ - if (linphone_nat_policy_stun_server_activated(policy)) { + if (linphone_nat_policy_stun_server_activated(policy) && (policy->stun_addrinfo == NULL)) { int wait_ms = 0; int wait_limit = 1000; linphone_nat_policy_resolve_stun_server(policy); diff --git a/coreapi/private.h b/coreapi/private.h index c1339826c..e72a5618f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -1344,6 +1344,7 @@ struct _LinphoneAccountCreatorCbs { LinphoneAccountCreatorCbsStatusCb activate_phone_number_link; LinphoneAccountCreatorCbsStatusCb recover_phone_account; LinphoneAccountCreatorCbsStatusCb is_account_linked; + LinphoneAccountCreatorCbsStatusCb update_hash; }; BELLE_SIP_DECLARE_VPTR(LinphoneAccountCreatorCbs); diff --git a/coreapi/proxy.c b/coreapi/proxy.c index f344f6307..6203f1f19 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -594,19 +594,8 @@ static char *flatten_number(const char *number){ char *result=ms_malloc0(strlen(number)+1); char *w=result; const char *r; - bool_t removing_trunk_prefix = FALSE; for(r=number;*r!='\0';++r){ - if (result[0] == '+') { - /*e164 case*/ - if (*r=='(') { - /*start removing trunk prefix as we are in form +33 (0) 6 222222*/ - removing_trunk_prefix=TRUE; - } else if (*r==')') { - /*stop removing trunk prefix*/ - removing_trunk_prefix=FALSE; - } - } - if (removing_trunk_prefix == FALSE && (*r=='+' || isdigit(*r))){ + if (*r=='+' || isdigit(*r)){ *w++=*r; } } @@ -614,9 +603,9 @@ static char *flatten_number(const char *number){ return result; } -static char* replace_plus_with_icp(char *phone, const char* icp){ +/*static char* replace_plus_with_icp(char *phone, const char* icp){ return (icp && phone[0]=='+') ? ms_strdup_printf("%s%s", icp, phone+1) : ms_strdup(phone); -} +}*/ static char* replace_icp_with_plus(char *phone, const char *icp){ return (strstr(phone, icp) == phone) ? ms_strdup_printf("+%s", phone+strlen(icp)) : ms_strdup(phone); @@ -634,46 +623,62 @@ bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const char* linphone_proxy_config_normalize_phone_number(LinphoneProxyConfig *proxy, const char *username) { LinphoneProxyConfig *tmpproxy = proxy ? proxy : linphone_proxy_config_new(); char* result = NULL; + LinphoneDialPlan dialplan = {0}; + char * nationnal_significant_number = NULL; + int ccc = -1; + if (linphone_proxy_config_is_phone_number(tmpproxy, username)){ - LinphoneDialPlan dialplan = *linphone_dial_plan_by_ccc(tmpproxy->dial_prefix); //copy dial plan; char * flatten=flatten_number(username); ms_debug("Flattened number is '%s' for '%s'",flatten, username); - if (tmpproxy->dial_prefix){ - if (strcmp(tmpproxy->dial_prefix,dialplan.ccc) != 0){ - //probably generic dialplan, preserving proxy dial prefix - strncpy(dialplan.ccc,tmpproxy->dial_prefix,sizeof(dialplan.ccc)); + ccc = linphone_dial_plan_lookup_ccc_from_e164(flatten); + if (ccc>-1) { /*e164 like phone number*/ + dialplan = *linphone_dial_plan_by_ccc_as_int(ccc); + nationnal_significant_number = strstr(flatten, dialplan.ccc); + if (nationnal_significant_number) { + nationnal_significant_number +=strlen(dialplan.ccc); } - } - /*if proxy has a dial prefix, modify phonenumber accordingly*/ - if (tmpproxy->dial_prefix!=NULL && tmpproxy->dial_prefix[0]!='\0'){ - ms_debug("Using dial plan '%s'",dialplan.country); - /* the number already starts with + or international prefix*/ - if (flatten[0]=='+'||strstr(flatten,dialplan.icp)==flatten){ - ms_debug("Prefix already present."); - if (tmpproxy->dial_escape_plus) { - result = replace_plus_with_icp(flatten,dialplan.icp); - } else { - result = replace_icp_with_plus(flatten,dialplan.icp); + } else if (flatten[0] =='+') { + ms_message ("Unknown ccc for e164 like number [%s]", flatten); + goto end; + } else { + dialplan = *linphone_dial_plan_by_ccc(tmpproxy->dial_prefix); //copy dial plan; + if (tmpproxy->dial_prefix){ + if (strcmp(tmpproxy->dial_prefix,dialplan.ccc) != 0){ + //probably generic dialplan, preserving proxy dial prefix + strncpy(dialplan.ccc,tmpproxy->dial_prefix,sizeof(dialplan.ccc)); } - }else{ - /*0. keep at most national number significant digits */ - char* flatten_start = flatten + MAX(0, (int)strlen(flatten) - (int)dialplan.nnl); - ms_debug("Prefix not present. Keeping at most %d digits: %s", dialplan.nnl, flatten_start); - - /*1. First prepend international calling prefix or +*/ - /*2. Second add prefix*/ - /*3. Finally add user digits */ - result = ms_strdup_printf("%s%s%s" - , tmpproxy->dial_escape_plus ? dialplan.icp : "+" - , dialplan.ccc - , flatten_start); - ms_debug("Prepended prefix resulted in %s", result); } - }else if (tmpproxy->dial_escape_plus){ - /* user did not provide dial prefix, so we'll take the most generic one */ - result = replace_plus_with_icp(flatten,dialplan.icp); + if (strstr(flatten,dialplan.icp)==flatten) { + char *e164 = replace_icp_with_plus(flatten,dialplan.icp); + result = linphone_proxy_config_normalize_phone_number(tmpproxy,e164); + ms_free(e164); + goto end; + } + nationnal_significant_number=flatten; } + ms_debug("Using dial plan '%s'",dialplan.country); + + /*if proxy has a dial prefix, modify phonenumber accordingly*/ + if (dialplan.ccc[0]!='\0') { + /* the number already starts with + or international prefix*/ + /*0. keep at most national number significant digits */ + char* nationnal_significant_number_start = nationnal_significant_number + + MAX(0, (int)strlen(nationnal_significant_number) + - (int)dialplan.nnl); + ms_debug("Prefix not present. Keeping at most %d digits: %s", dialplan.nnl, nationnal_significant_number_start); + + /*1. First prepend international calling prefix or +*/ + /*2. Second add prefix*/ + /*3. Finally add user digits */ + result = ms_strdup_printf("%s%s%s" + , tmpproxy->dial_escape_plus ? dialplan.icp : "+" + , dialplan.ccc + , nationnal_significant_number_start); + ms_debug("Prepended prefix resulted in %s", result); + } + + end: if (result==NULL) { result = flatten; } else { diff --git a/coreapi/vcard.h b/coreapi/vcard.h index 7e72b5347..709aff046 100644 --- a/coreapi/vcard.h +++ b/coreapi/vcard.h @@ -88,7 +88,7 @@ LINPHONE_PUBLIC void linphone_vcard_free(LinphoneVcard *vCard); * Uses belcard to parse the content of a file and returns all the vcards it contains as LinphoneVcards, or NULL if it contains none. * @param[in] context the vCard context to use (speed up the process by not creating a Belcard parser each time) * @param[in] file the path to the file to parse - * @return \mslist{LinphoneVcard} + * @return \bctbx_list{LinphoneVcard} */ LINPHONE_PUBLIC bctbx_list_t* linphone_vcard_context_get_vcard_list_from_file(LinphoneVcardContext *context, const char *file); @@ -96,7 +96,7 @@ LINPHONE_PUBLIC bctbx_list_t* linphone_vcard_context_get_vcard_list_from_file(Li * Uses belcard to parse the content of a buffer and returns all the vcards it contains as LinphoneVcards, or NULL if it contains none. * @param[in] context the vCard context to use (speed up the process by not creating a Belcard parser each time) * @param[in] buffer the buffer to parse - * @return \mslist{LinphoneVcard} + * @return \bctbx_list{LinphoneVcard} */ LINPHONE_PUBLIC bctbx_list_t* linphone_vcard_context_get_vcard_list_from_buffer(LinphoneVcardContext *context, const char *buffer); @@ -181,7 +181,7 @@ void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_ /** * Returns the list of SIP addresses (as LinphoneAddress) in the vCard (all the IMPP attributes that has an URI value starting by "sip:") or NULL * @param[in] vCard the LinphoneVcard - * @return const \mslist{LinphoneAddress *} + * @return \bctbx_list{LinphoneAddress} */ LINPHONE_PUBLIC const bctbx_list_t* linphone_vcard_get_sip_addresses(LinphoneVcard *vCard); @@ -202,7 +202,7 @@ void linphone_vcard_remove_phone_number(LinphoneVcard *vCard, const char *phone) /** * Returns the list of phone numbers (as string) in the vCard (all the TEL attributes) or NULL * @param[in] vCard the LinphoneVcard - * @return \mslist{const char *} + * @return \bctbx_list{const char *} */ LINPHONE_PUBLIC bctbx_list_t* linphone_vcard_get_phone_numbers(const LinphoneVcard *vCard); @@ -293,4 +293,4 @@ void linphone_vcard_clean_cache(LinphoneVcard *vCard); } #endif -#endif \ No newline at end of file +#endif diff --git a/coreapi/vtables.c b/coreapi/vtables.c index 12ca9fc30..e106fef01 100644 --- a/coreapi/vtables.c +++ b/coreapi/vtables.c @@ -43,7 +43,7 @@ LinphoneCoreVTable *linphone_core_get_current_vtable(LinphoneCore *lc) { static void cleanup_dead_vtable_refs(LinphoneCore *lc){ bctbx_list_t *it,*next_it; - + if (lc->vtable_notify_recursion > 0) return; /*don't cleanup vtable if we are iterating through a listener list.*/ for(it=lc->vtable_refs; it!=NULL; ){ VTableReference *ref=(VTableReference*)it->data; @@ -327,7 +327,7 @@ void linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable){ void linphone_core_remove_listener(LinphoneCore *lc, const LinphoneCoreVTable *vtable) { bctbx_list_t *it; - ms_message("Vtable [%p] unregistered on core [%p]",lc,vtable); + ms_message("Vtable [%p] unregistered on core [%p]",vtable,lc); for(it=lc->vtable_refs; it!=NULL; it=it->next){ VTableReference *ref=(VTableReference*)it->data; if (ref->vtable==vtable) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 98daa9f12..5f5384d45 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -314,7 +314,7 @@ void linphone_gtk_call_log_update(GtkWidget *w){ start_date[strlen(start_date) - 1] = '\0'; } #endif - lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),addr); + lf=linphone_core_find_friend(linphone_gtk_get_core(),la); if(lf != NULL){ /*update display name from friend*/ display = linphone_friend_get_name(lf); diff --git a/gtk/propertybox.c b/gtk/propertybox.c index a356f09c6..470196d0f 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -1297,7 +1297,7 @@ static void linphone_gtk_media_encryption_changed(GtkWidget *combo){ gtk_widget_set_sensitive(mandatory_box,TRUE); }else if (strcasecmp(selected,"ZRTP")==0){ linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionZRTP); - gtk_widget_set_sensitive(mandatory_box,FALSE); + gtk_widget_set_sensitive(mandatory_box,TRUE); } else { linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionNone); gtk_widget_set_sensitive(mandatory_box,FALSE); @@ -1389,7 +1389,7 @@ static void linphone_gtk_show_media_encryption(GtkWidget *pb){ case LinphoneMediaEncryptionZRTP: if (zrtp_id!=-1) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo),zrtp_id); - linphone_gtk_set_media_encryption_mandatory_sensitive(pb,FALSE); + linphone_gtk_set_media_encryption_mandatory_sensitive(pb,TRUE); } break; } diff --git a/java/common/org/linphone/core/LinphoneAccountCreator.java b/java/common/org/linphone/core/LinphoneAccountCreator.java index 78297b15d..72cdebbab 100644 --- a/java/common/org/linphone/core/LinphoneAccountCreator.java +++ b/java/common/org/linphone/core/LinphoneAccountCreator.java @@ -32,6 +32,7 @@ public interface LinphoneAccountCreator { void onAccountCreatorPhoneAccountRecovered(LinphoneAccountCreator accountCreator, Status status); void onAccountCreatorIsAccountLinked(LinphoneAccountCreator accountCreator, Status status); void onAccountCreatorIsPhoneNumberUsed(LinphoneAccountCreator accountCreator, Status status); + void onAccountCreatorPasswordUpdated(LinphoneAccountCreator accountCreator, Status status); } public static class Status { @@ -157,5 +158,7 @@ public interface LinphoneAccountCreator { Status recoverPhoneAccount(); + Status updatePassword(String newPassword); + LinphoneProxyConfig configure(); } diff --git a/java/impl/org/linphone/core/LinphoneAccountCreatorImpl.java b/java/impl/org/linphone/core/LinphoneAccountCreatorImpl.java index a43b9d33b..66333eec8 100644 --- a/java/impl/org/linphone/core/LinphoneAccountCreatorImpl.java +++ b/java/impl/org/linphone/core/LinphoneAccountCreatorImpl.java @@ -226,6 +226,12 @@ public class LinphoneAccountCreatorImpl implements LinphoneAccountCreator { return Status.fromInt(recoverPhoneAccount(nativePtr)); } + private native int updatePassword(long ptr, String newPassword); + @Override + public Status updatePassword(String newPassword) { + return Status.fromInt(updatePassword(nativePtr, newPassword)); + } + private native LinphoneProxyConfig configure(long ptr); @Override public LinphoneProxyConfig configure() { diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 4fbb4de04..46597507d 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -130,7 +130,6 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { File factory = factoryConfig == null ? null : new File(factoryConfig); LinphoneCore lc = new LinphoneCoreImpl(listener, user, factory, userdata); lc.enableOpenH264(openh264Enabled); - if(context!=null) lc.setContext(context); return lc; } catch (IOException e) { throw new LinphoneCoreException("Cannot create LinphoneCore",e); @@ -145,7 +144,6 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { MediastreamerAndroidContext.setContext(context); LinphoneCore lc = new LinphoneCoreImpl(listener); lc.enableOpenH264(openh264Enabled); - if(context!=null) lc.setContext(context); return lc; } catch (IOException e) { throw new LinphoneCoreException("Cannot create LinphoneCore",e); diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index 40cbf5416..61a44582e 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -222,13 +222,13 @@ class LinphoneCoreImpl implements LinphoneCore { mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); setAndroidPowerManager(mContext.getSystemService(Context.POWER_SERVICE)); if (Version.sdkAboveOrEqual(Version.API12_HONEYCOMB_MR1_31X)) { - WifiManager wifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); + WifiManager wifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); WifiLock lock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "linphonecore ["+ nativePtr+"] wifi-lock"); lock.setReferenceCounted(true); setAndroidWifiLock(nativePtr,lock); } if (Version.sdkAboveOrEqual(Version.API14_ICE_CREAM_SANDWICH_40)) { - WifiManager wifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); + WifiManager wifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); MulticastLock lock = wifiManager.createMulticastLock("linphonecore ["+ nativePtr+"] multicast-lock"); lock.setReferenceCounted(true); setAndroidMulticastLock(nativePtr, lock); @@ -476,17 +476,17 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized void addFriend(LinphoneFriend lf) throws LinphoneCoreException { addFriend(nativePtr, ((LinphoneFriendImpl) lf).nativePtr); } - + public synchronized LinphoneFriendList createLinphoneFriendList() { return new LinphoneFriendListImpl(this); } - + public synchronized void addFriendList(LinphoneFriendList friendList) throws LinphoneCoreException { addFriendList(nativePtr,((LinphoneFriendListImpl)friendList).nativePtr); } - + public synchronized void removeFriendList(LinphoneFriendList friendList) throws LinphoneCoreException { removeFriendList(nativePtr,((LinphoneFriendListImpl)friendList).nativePtr); } @@ -494,7 +494,7 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized LinphoneFriend[] getFriendList() { return getFriendList(nativePtr); } - + private native LinphoneFriendList[] getFriendLists(long nativePtr); public synchronized LinphoneFriendList[] getFriendLists() { return getFriendLists(nativePtr); @@ -932,25 +932,25 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized void tunnelEnable(boolean enable) { tunnelEnable(nativePtr, enable); } - + private native void tunnelSetMode(long nativePtr, int mode); @Override public synchronized void tunnelSetMode(LinphoneCore.TunnelMode mode) { tunnelSetMode(nativePtr, TunnelMode.enumToInt(mode)); } - + private native int tunnelGetMode(long nativePtr); @Override public synchronized LinphoneCore.TunnelMode tunnelGetMode() { return LinphoneCore.TunnelMode.intToEnum(tunnelGetMode(nativePtr)); } - + private native void tunnelEnableSip(long nativePtr, boolean enable); @Override public void tunnelEnableSip(boolean enable) { tunnelEnableSip(nativePtr, enable); } - + private native boolean tunnelSipEnabled(long nativePtr); @Override public boolean tunnelSipEnabled() { @@ -1270,7 +1270,7 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized void setCallLogsDatabasePath(String path) { setCallLogsDatabasePath(nativePtr, path); } - + public synchronized void setFriendsDatabasePath(String path) { setFriendsDatabasePath(nativePtr, path); } @@ -1453,13 +1453,13 @@ class LinphoneCoreImpl implements LinphoneCore { public synchronized void setVideoJittcomp(int value) { setVideoJittcomp(nativePtr, value); } - + private native void setFileTransferServer(long ptr, String serverUrl); @Override public synchronized void setFileTransferServer(String serverUrl) { setFileTransferServer(nativePtr, serverUrl); } - + private native String getFileTransferServer(long ptr); @Override public synchronized String getFileTransferServer() { @@ -1476,16 +1476,16 @@ class LinphoneCoreImpl implements LinphoneCore { return null; } } - + private native void addListener(long nativePtr, LinphoneCoreListener listener); @Override - public void addListener(LinphoneCoreListener listener) { + public synchronized void addListener(LinphoneCoreListener listener) { addListener(nativePtr, listener); } - + private native void removeListener(long nativePtr, LinphoneCoreListener listener); @Override - public void removeListener(LinphoneCoreListener listener) { + public synchronized void removeListener(LinphoneCoreListener listener) { removeListener(nativePtr, listener); } private native void setRemoteRingbackTone(long nativePtr, String file); @@ -1498,7 +1498,7 @@ class LinphoneCoreImpl implements LinphoneCore { public String getRemoteRingbackTone() { return getRemoteRingbackTone(nativePtr); } - + private native void uploadLogCollection(long nativePtr); @Override public void uploadLogCollection() { @@ -1507,7 +1507,7 @@ class LinphoneCoreImpl implements LinphoneCore { @Override public native void resetLogCollection(); - + private native void setPreferredFramerate(long nativePtr, float fps); @Override public void setPreferredFramerate(float fps) { @@ -1518,8 +1518,8 @@ class LinphoneCoreImpl implements LinphoneCore { public float getPreferredFramerate() { return getPreferredFramerate(nativePtr); } - - + + private native int setAudioMulticastAddr(long nativePtr, String ip); @Override public void setAudioMulticastAddr(String ip) throws LinphoneCoreException { @@ -1547,18 +1547,18 @@ class LinphoneCoreImpl implements LinphoneCore { public void setAudioMulticastTtl(int ttl) throws LinphoneCoreException { if (setAudioMulticastTtl(nativePtr, ttl)!=0) throw new LinphoneCoreException("bad ttl value ["+ttl+"]"); - + } private native int setVideoMulticastTtl(long ptr,int ttl); @Override public void setVideoMulticastTtl(int ttl) throws LinphoneCoreException { if (setVideoMulticastTtl(nativePtr, ttl)!=0) - throw new LinphoneCoreException("bad ttl value ["+ttl+"]"); + throw new LinphoneCoreException("bad ttl value ["+ttl+"]"); } private native int getAudioMulticastTtl(long ptr); @Override public int getAudioMulticastTtl() { - return getAudioMulticastTtl(nativePtr); + return getAudioMulticastTtl(nativePtr); } private native int getVideoMulticastTtl(long ptr); @Override @@ -1576,7 +1576,7 @@ class LinphoneCoreImpl implements LinphoneCore { return audioMulticastEnabled(nativePtr); } private native void enableVideoMulticast(long ptr,boolean yesno); - + @Override public void enableVideoMulticast(boolean yesno) { enableVideoMulticast(nativePtr,yesno); @@ -1683,7 +1683,7 @@ class LinphoneCoreImpl implements LinphoneCore { public void setSipNetworkReachable(boolean isReachable) { setSipNetworkReachable(nativePtr, isReachable); } - + private native void setMediaNetworkReachable(long nativePtr, boolean isReachable); @Override public void setMediaNetworkReachable(boolean isReachable) { @@ -1717,17 +1717,17 @@ class LinphoneCoreImpl implements LinphoneCore { public void setDefaultSoundDevices() { setDefaultSoundDevices(nativePtr); } - + private native boolean isLimeEncryptionAvailable(long nativePtr); public synchronized boolean isLimeEncryptionAvailable() { return isLimeEncryptionAvailable(nativePtr); } - + private native void setLimeEncryption(long nativePtr, int value); public synchronized void setLimeEncryption(LinphoneLimeState lime) { setLimeEncryption(nativePtr, lime.mValue); } - + private native int getLimeEncryption(long nativePtr); public synchronized LinphoneLimeState getLimeEncryption() { return LinphoneLimeState.fromInt(getLimeEncryption(nativePtr)); diff --git a/mediastreamer2 b/mediastreamer2 index 3e5e374d4..e84be0bfa 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 3e5e374d4e5cb1a0b39e2dfa2c926180b5de35fa +Subproject commit e84be0bfaf9bbd2786228db6064811ef2a58aee6 diff --git a/oRTP b/oRTP index b1b2c1c27..49fdc102f 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit b1b2c1c2729400762050cdb247a466cd2636d92c +Subproject commit 49fdc102fe59adda8011a9d554493749aebad35b diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c index 601b3ad34..cff0219c2 100644 --- a/tester/call_single_tester.c +++ b/tester/call_single_tester.c @@ -1325,39 +1325,41 @@ static void ice_added_by_reinvite(void){ LinphoneCallParams *params; LinphoneCall *c; bool_t call_ok; - + lp_config_set_int(linphone_core_get_config(marie->lc), "net", "allow_late_ice", 1); lp_config_set_int(linphone_core_get_config(pauline->lc), "net", "allow_late_ice", 1); BC_ASSERT_TRUE((call_ok=call(pauline,marie))); if (!call_ok) goto end; liblinphone_tester_check_rtcp(marie,pauline); - + /*enable ICE on both ends*/ pol = linphone_core_get_nat_policy(marie->lc); linphone_nat_policy_enable_ice(pol, TRUE); linphone_nat_policy_enable_stun(pol, TRUE); linphone_core_set_nat_policy(marie->lc, pol); - + pol = linphone_core_get_nat_policy(pauline->lc); linphone_nat_policy_enable_ice(pol, TRUE); linphone_nat_policy_enable_stun(pol, TRUE); linphone_core_set_nat_policy(pauline->lc, pol); - + + linphone_core_manager_wait_for_stun_resolution(marie); + linphone_core_manager_wait_for_stun_resolution(pauline); + c = linphone_core_get_current_call(marie->lc); params = linphone_core_create_call_params(marie->lc, c); linphone_core_update_call(marie->lc, c, params); linphone_call_params_destroy(params); - BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallUpdatedByRemote,1)); /*wait for the ICE reINVITE*/ BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,3)); BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,3)); BC_ASSERT_TRUE(check_ice(marie, pauline, LinphoneIceStateHostConnection)); - + end_call(pauline, marie); - + end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -1800,6 +1802,9 @@ static void audio_call_with_ice_no_matching_audio_codecs(void) { linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); + linphone_core_manager_wait_for_stun_resolution(marie); + linphone_core_manager_wait_for_stun_resolution(pauline); + out_call = linphone_core_invite_address(marie->lc, pauline->identity); linphone_call_ref(out_call); BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingInit, 1)); @@ -4159,6 +4164,7 @@ static void call_record_with_custom_rtp_modifier(void) { } static void recovered_call_on_network_switch_in_early_state_1(void) { + const LinphoneCallParams *remote_params; LinphoneCall *incoming_call; LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); @@ -4174,6 +4180,12 @@ static void recovered_call_on_network_switch_in_early_state_1(void) { BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallOutgoingRinging, 2)); incoming_call = linphone_core_get_current_call(pauline->lc); + remote_params = linphone_call_get_remote_params(incoming_call); + BC_ASSERT_PTR_NOT_NULL(remote_params); + if (remote_params != NULL) { + const char *replaces_header = linphone_call_params_get_custom_header(remote_params, "Replaces"); + BC_ASSERT_PTR_NOT_NULL(replaces_header); + } linphone_core_accept_call(pauline->lc, incoming_call); BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 1)); BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1)); @@ -4198,7 +4210,6 @@ static void recovered_call_on_network_switch_in_early_state_2(void) { incoming_call = linphone_core_get_current_call(pauline->lc); linphone_core_accept_call(pauline->lc, incoming_call); - //linphone_core_iterate(pauline->lc); linphone_core_set_network_reachable(marie->lc, FALSE); wait_for(marie->lc, pauline->lc, &marie->stat.number_of_NetworkReachableFalse, 1); linphone_core_set_network_reachable(marie->lc, TRUE); @@ -4481,6 +4492,8 @@ static void _call_with_network_switch(bool_t use_ice, bool_t with_socket_refresh if (use_ice){ linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); + linphone_core_manager_wait_for_stun_resolution(marie); + linphone_core_manager_wait_for_stun_resolution(pauline); } if (with_socket_refresh){ lp_config_set_int(linphone_core_get_config(marie->lc), "net", "recreate_sockets_when_network_is_up", 1); @@ -5393,14 +5406,14 @@ test_t call_tests[] = { TEST_NO_TAG("Call record with custom RTP Modifier", call_record_with_custom_rtp_modifier), TEST_NO_TAG("Call with network switch", call_with_network_switch), TEST_NO_TAG("Call with network switch and no recovery possible", call_with_network_switch_no_recovery), - TEST_NO_TAG("Recovered call on network switch in early state 1", recovered_call_on_network_switch_in_early_state_1), - TEST_NO_TAG("Recovered call on network switch in early state 2", recovered_call_on_network_switch_in_early_state_2), - TEST_NO_TAG("Recovered call on network switch in early state 3", recovered_call_on_network_switch_in_early_state_3), - TEST_NO_TAG("Recovered call on network switch in early state 4", recovered_call_on_network_switch_in_early_state_4), - TEST_NO_TAG("Recovered call on network switch during re-invite 1", recovered_call_on_network_switch_during_reinvite_1), - TEST_NO_TAG("Recovered call on network switch during re-invite 2", recovered_call_on_network_switch_during_reinvite_2), - TEST_NO_TAG("Recovered call on network switch during re-invite 3", recovered_call_on_network_switch_during_reinvite_3), - TEST_NO_TAG("Recovered call on network switch during re-invite 4", recovered_call_on_network_switch_during_reinvite_4), + TEST_ONE_TAG("Recovered call on network switch in early state 1", recovered_call_on_network_switch_in_early_state_1, "CallRecovery"), + TEST_ONE_TAG("Recovered call on network switch in early state 2", recovered_call_on_network_switch_in_early_state_2, "CallRecovery"), + TEST_ONE_TAG("Recovered call on network switch in early state 3", recovered_call_on_network_switch_in_early_state_3, "CallRecovery"), + TEST_ONE_TAG("Recovered call on network switch in early state 4", recovered_call_on_network_switch_in_early_state_4, "CallRecovery"), + TEST_ONE_TAG("Recovered call on network switch during re-invite 1", recovered_call_on_network_switch_during_reinvite_1, "CallRecovery"), + TEST_ONE_TAG("Recovered call on network switch during re-invite 2", recovered_call_on_network_switch_during_reinvite_2, "CallRecovery"), + TEST_ONE_TAG("Recovered call on network switch during re-invite 3", recovered_call_on_network_switch_during_reinvite_3, "CallRecovery"), + TEST_ONE_TAG("Recovered call on network switch during re-invite 4", recovered_call_on_network_switch_during_reinvite_4, "CallRecovery"), TEST_ONE_TAG("Call with network switch and ICE", call_with_network_switch_and_ice, "ICE"), TEST_ONE_TAG("Call with network switch, ICE and RTT", call_with_network_switch_ice_and_rtt, "ICE"), TEST_NO_TAG("Call with network switch with socket refresh", call_with_network_switch_and_socket_refresh), diff --git a/tester/call_video_tester.c b/tester/call_video_tester.c index 62a19ae23..354a9b325 100644 --- a/tester/call_video_tester.c +++ b/tester/call_video_tester.c @@ -1092,6 +1092,9 @@ static void call_with_ice_video_and_rtt(void) { linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); + linphone_core_manager_wait_for_stun_resolution(marie); + linphone_core_manager_wait_for_stun_resolution(pauline); + linphone_core_set_audio_port(marie->lc, -1); linphone_core_set_video_port(marie->lc, -1); linphone_core_set_text_port(marie->lc, -1); diff --git a/tester/eventapi_tester.c b/tester/eventapi_tester.c index 76533857b..a4cbb1d87 100644 --- a/tester/eventapi_tester.c +++ b/tester/eventapi_tester.c @@ -307,6 +307,12 @@ static void subscribe_test_manually_refreshed(void){ } static void subscribe_loosing_dialog(void) { +#ifdef WIN32 + /*Unfortunately this test doesn't work on windows due to the way closed TCP ports behave. + * Unlike linux and macOS, released TCP port don't send an ICMP error (or maybe at least for a period of time. + * This prevents this test from working, see comments below*/ + ms_warning("subscribe_loosing_dialog() skipped on windows."); +#else LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); LinphoneContent* content; @@ -345,12 +351,16 @@ static void subscribe_loosing_dialog(void) { pauline = linphone_core_manager_new( "pauline_tcp_rc"); lcs = bctbx_list_append(lcs, pauline->lc); - /*marie will retry the subscription*/ + /* Marie will retry the subscription. + * She will first receive a 503 Service unavailable from flexisip thanks the ICMP error returned by the no longer existing Pauline. + * Then she will forge a new SUBSCRIBE in order to restart a new dialog, and this one will reach the new Pauline.*/ BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingProgress,2,8000)); /*and get it accepted again*/ BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,2,5000)); BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,5000)); - BC_ASSERT_EQUAL(linphone_event_get_subscription_state(pauline->lev), LinphoneSubscriptionActive, int, "%d"); + BC_ASSERT_PTR_NOT_NULL(pauline->lev); + if (pauline->lev) BC_ASSERT_EQUAL(linphone_event_get_subscription_state(pauline->lev), LinphoneSubscriptionActive, int, "%d"); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,2,5000)); linphone_event_terminate(lev); @@ -362,6 +372,7 @@ static void subscribe_loosing_dialog(void) { linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); bctbx_list_free(lcs); +#endif } static void subscribe_with_io_error(void) { @@ -418,6 +429,53 @@ static void subscribe_with_io_error(void) { bctbx_list_free(lcs); } +static void subscribe_not_timely_responded(void) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + LinphoneContent* content; + LinphoneEvent *lev; + int expires= 4; + bctbx_list_t* lcs=bctbx_list_append(NULL,marie->lc); + + lcs=bctbx_list_append(lcs,pauline->lc); + + content = linphone_core_create_content(marie->lc); + linphone_content_set_type(content,"application"); + linphone_content_set_subtype(content,"somexml"); + linphone_content_set_buffer(content,subscribe_content,strlen(subscribe_content)); + + lev=linphone_core_create_subscribe(marie->lc,pauline->identity,"dodo",expires); + linphone_event_add_custom_header(lev,"My-Header","pouet"); + linphone_event_add_custom_header(lev,"My-Header2","pimpon"); + linphone_event_send_subscribe(lev,content); + + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionOutgoingProgress,1,1000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionIncomingReceived,1,3000)); + + + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionActive,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionActive,1,5000)); + + /*make sure marie receives first notification before terminating*/ + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_NotifyReceived,1,5000)); + + /* now pauline is no longer scheduled (simulating a very big latency in the network) */ + lcs = bctbx_list_remove(lcs, pauline->lc); + /*marie's dialog will expire while the SUBSCRIBE refresh is in progress*/ + wait_for_list(lcs, NULL, 0, 8000); + + lcs = bctbx_list_append(lcs, pauline->lc); + wait_for_list(lcs, NULL, 0, 3000); + linphone_event_terminate(lev); + BC_ASSERT_TRUE(wait_for_list(lcs,&marie->stat.number_of_LinphoneSubscriptionTerminated,1,5000)); + BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneSubscriptionTerminated,1,5000)); + + linphone_content_unref(content); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + bctbx_list_free(lcs); +} + static void publish_test_with_args(bool_t refresh, int expires){ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); @@ -513,6 +571,7 @@ test_t event_tests[] = { TEST_ONE_TAG("Subscribe with io error", subscribe_with_io_error, "presence"), TEST_ONE_TAG("Subscribe manually refreshed", subscribe_test_manually_refreshed, "presence"), TEST_ONE_TAG("Subscribe terminated by notifier", subscribe_test_terminated_by_notifier, "presence"), + TEST_ONE_TAG("Subscribe not timely responded", subscribe_not_timely_responded, "presence"), TEST_ONE_TAG("Publish", publish_test, "presence"), TEST_ONE_TAG("Publish without expires", publish_without_expires, "presence"), TEST_ONE_TAG("Publish without automatic refresh",publish_no_auto_test, "presence"), diff --git a/tester/flexisip/flexisip.conf b/tester/flexisip/flexisip.conf index 5ad6cb028..5c29e9e7f 100644 --- a/tester/flexisip/flexisip.conf +++ b/tester/flexisip/flexisip.conf @@ -605,7 +605,7 @@ time-period=15000 # Maximum packet rate received in [time-period] millisecond(s) to # consider it as a DoS attack. # Default value: 20 -packet-rate-limit=5 +packet-rate-limit=10 # Number of minutes to ban the ip/port using iptables (might be # less because it justs uses the minutes of the clock, not the seconds. diff --git a/tester/local_tester_hosts b/tester/local_tester_hosts index de1edc48c..0a78dd3e9 100644 --- a/tester/local_tester_hosts +++ b/tester/local_tester_hosts @@ -1 +1,4 @@ -127.0.0.1 sip2.linphone.org sip.example.org sipopen.example.org auth.example.org auth1.example.org auth2.example.org altname.linphone.org sip.wildcard1.linphone.org altname.wildcard2.linphone.org +127.0.0.1 sip2.linphone.org sip.example.org sipopen.example.org auth.example.org auth1.example.org auth2.example.org altname.linphone.org sip.wildcard1.linphone.org altname.wildcard2.linphone.org sipv4.example.org +2001:41d0:2:14b0::1 sip2.linphone.org sip.example.org sipopen.example.org auth.example.org auth1.example.org auth2.example.org altname.linphone.org sip.wildcard1.linphone.org altname.wildcard2.linphone.org +188.165.46.90 tunnel.wildcard2.linphone.org +64:ff9b::94.23.19.176 sipv4-nat64.example.org diff --git a/tester/message_tester.c b/tester/message_tester.c index 77ba69b18..957455a40 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -910,6 +910,7 @@ void lime_transfer_message_base(bool_t encrypt_file,bool_t download_file_from_st char *filepath; char *send_filepath = bc_tester_res("images/nowebcamCIF.jpg"); char *receive_filepath = bc_tester_file("receive_file.dump"); + MSList * msg_list = NULL; marie = linphone_core_manager_new( "marie_rc"); pauline = linphone_core_manager_new( "pauline_tcp_rc"); @@ -963,11 +964,10 @@ void lime_transfer_message_base(bool_t encrypt_file,bool_t download_file_from_st const LinphoneContent* content; if (download_file_from_stored_msg) { LinphoneChatRoom *marie_room = linphone_core_get_chat_room(marie->lc, pauline->identity); - MSList * msgs = linphone_chat_room_get_history(marie_room,1); - BC_ASSERT_PTR_NOT_NULL(msgs); - if (!msgs) goto end; - recv_msg = (LinphoneChatMessage *)msgs->data; - ms_list_free(msgs); + msg_list = linphone_chat_room_get_history(marie_room,1); + BC_ASSERT_PTR_NOT_NULL(msg_list); + if (!msg_list) goto end; + recv_msg = (LinphoneChatMessage *)msg_list->data; } else { recv_msg = marie->stat.last_received_chat_message; } @@ -987,6 +987,7 @@ void lime_transfer_message_base(bool_t encrypt_file,bool_t download_file_from_st linphone_chat_message_download_file(recv_msg); BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1)); compare_files(send_filepath, receive_filepath); + bctbx_list_free_with_data(msg_list, (bctbx_list_free_func)linphone_chat_message_unref); } BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,2, int, "%d"); // file transfer diff --git a/tester/presence_server_tester.c b/tester/presence_server_tester.c index c26af0bb9..a74abc7d0 100644 --- a/tester/presence_server_tester.c +++ b/tester/presence_server_tester.c @@ -633,13 +633,14 @@ static void test_presence_list_subscribe_with_error(bool_t io_error) { ms_message("Simulating in/out packets losses"); sal_set_send_error(laure->lc->sal,1500); /*make sure no refresh is sent, trash the message without generating error*/ sal_set_recv_error(laure->lc->sal, 1500); /*make sure server notify to close the dialog is also ignored*/ - wait_for_list(lcs, &dummy, 1, 5000); /* Wait a little bit for the subscribe to happen */ + wait_for_list(lcs, &dummy, 1, 32000); /* Wait a little bit for the subscribe transaction to timeout */ } /*restart normal behavior*/ sal_set_send_error(laure->lc->sal,0); sal_set_recv_error(laure->lc->sal, 1); + /*a new subscribe should be sent */ - BC_ASSERT_TRUE(wait_for_until(laure->lc, pauline->lc, &laure->stat.number_of_LinphonePresenceActivityVacation, 3, 6000)); /* give time for subscription to recover to avoid to receive 491 Request pending*/ + BC_ASSERT_TRUE(wait_for_until(laure->lc, pauline->lc, &laure->stat.number_of_LinphonePresenceActivityVacation, 3, 9000)); /* give time for subscription to recover to avoid to receive 491 Request pending*/ linphone_core_set_presence_model(pauline->lc, linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityAway, NULL)); diff --git a/tester/presence_tester.c b/tester/presence_tester.c index 823dd19e6..24dd44052 100644 --- a/tester/presence_tester.c +++ b/tester/presence_tester.c @@ -545,7 +545,9 @@ static void simple_subscribe_with_friend_from_rc(void) { if (bctbx_list_size(linphone_core_get_friend_list(marie->lc))>0) { pauline_as_friend = (LinphoneFriend*)linphone_core_get_friend_list(marie->lc)->data; + linphone_friend_edit(pauline_as_friend); linphone_friend_set_address(pauline_as_friend, pauline->identity); /*hack to update addr with port number*/ + linphone_friend_done(pauline_as_friend); } BC_ASSERT_TRUE (wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityOnline,1)); diff --git a/tester/proxy_config_tester.c b/tester/proxy_config_tester.c index 9e9afd6ec..edd01f04f 100644 --- a/tester/proxy_config_tester.c +++ b/tester/proxy_config_tester.c @@ -36,10 +36,10 @@ static void phone_normalization_without_proxy(void) { BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "012 345 6789"), "0123456789"); BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+33123456789"), "+33123456789"); BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+33012345678"), "+33012345678"); - BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+33 0012345678"), "+330012345678"); + BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+33 0012345678"), "+33012345678"); BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+33012345678"), "+33012345678"); - BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+3301234567891"), "+3301234567891"); - BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+33 01234567891"), "+3301234567891"); + BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+3301234567891"), "+33234567891"); + BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "+33 01234567891"), "+33234567891"); BC_ASSERT_PTR_NULL(phone_normalization(NULL, "I_AM_NOT_A_NUMBER")); // invalid phone number BC_ASSERT_STRING_EQUAL(phone_normalization(NULL, "0"), "0"); @@ -59,14 +59,16 @@ static void phone_normalization_with_proxy(void) { LinphoneProxyConfig *proxy = linphone_proxy_config_new(); linphone_proxy_config_set_dial_prefix(proxy, "33"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "012 3456 789"), "+33123456789"); + linphone_proxy_config_set_dial_prefix(proxy, NULL); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+33123456789"), "+33123456789"); - BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+33 0123456789"), "+330123456789"); - BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+330012345678"), "+330012345678"); + BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+33 0123456789"), "+33123456789"); + BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+330012345678"), "+33012345678"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+3301 2345678"), "+33012345678"); - BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+3301234567891"), "+3301234567891"); + BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+3301234567891"), "+33234567891"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+33 (0) 1 23 45 67 89"), "+33123456789"); + BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+90 (903) 1234567"), "+909031234567"); - + linphone_proxy_config_set_dial_prefix(proxy, "33"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "123456789"), "+33123456789"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, " 0123456789"), "+33123456789"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "0012345678"), "+12345678"); @@ -106,8 +108,8 @@ static void phone_normalization_with_proxy(void) { BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+330123456"), "+330123456"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+3301234567"), "+3301234567"); BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+33012345678"), "+33012345678"); - BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+330123456789"), "+330123456789"); - BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+3301234567890"), "+3301234567890"); + BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+330123456789"), "+33123456789"); + BC_ASSERT_STRING_EQUAL(phone_normalization(proxy, "+3301234567890"), "+33234567890"); // invalid prefix - use a generic dialplan with 10 max length linphone_proxy_config_set_dial_prefix(proxy, "99"); diff --git a/tester/quality_reporting_tester.c b/tester/quality_reporting_tester.c index 5a15109c1..67f707eb8 100644 --- a/tester/quality_reporting_tester.c +++ b/tester/quality_reporting_tester.c @@ -414,7 +414,7 @@ static void quality_reporting_interval_report_video_and_rtt(void) { end_call(marie, pauline); /*wait for publish triggered by the end of call to be completed*/ - wait_for_until(marie->lc,pauline->lc,NULL,0,3000); + wait_for_until(marie->lc,pauline->lc,NULL,0,6000); } linphone_call_params_destroy(marie_params); diff --git a/tester/register_tester.c b/tester/register_tester.c index 9915bbe5b..557c680cf 100644 --- a/tester/register_tester.c +++ b/tester/register_tester.c @@ -592,7 +592,7 @@ static void transport_dont_bind(void){ tr.tls_port = LC_SIP_TRANSPORT_DONTBIND; linphone_core_set_sip_transports(pauline->lc, &tr); - BC_ASSERT_TRUE(wait_for_until(pauline->lc,pauline->lc,&counters->number_of_LinphoneRegistrationOk,2,9000)); + BC_ASSERT_TRUE(wait_for_until(pauline->lc,pauline->lc,&counters->number_of_LinphoneRegistrationOk,2,15000)); memset(&tr, 0, sizeof(tr)); linphone_core_get_sip_transports_used(pauline->lc, &tr); BC_ASSERT_EQUAL(tr.udp_port, 0, int, "%i"); diff --git a/tester/vcard_tester.c b/tester/vcard_tester.c index 3bbff9141..31d243955 100644 --- a/tester/vcard_tester.c +++ b/tester/vcard_tester.c @@ -53,8 +53,8 @@ static void linphone_vcard_import_export_friends_test(void) { linphone_friend_list_unref(lfl); remove(export_filepath); - ms_free(import_filepath); - ms_free(export_filepath); + bc_free(import_filepath); + bc_free(export_filepath); linphone_core_manager_destroy(manager); } @@ -106,7 +106,7 @@ static void linphone_vcard_import_a_lot_of_friends_test(void) { linphone_friend_list_unref(lfl); - ms_free(import_filepath); + bc_free(import_filepath); linphone_core_manager_destroy(manager); } @@ -243,9 +243,9 @@ static void friends_migration(void) { BC_ASSERT_EQUAL(lp_config_get_int(lpc, "misc", "friends_migration_done", 0), 1, int, "%i"); friends_from_db = bctbx_list_free_with_data(friends_from_db, (void (*)(void *))linphone_friend_unref); - unlink(friends_db); - ms_free(friends_db); linphone_core_manager_destroy(manager); + unlink(friends_db); + bc_free(friends_db); } typedef struct _LinphoneFriendListStats { @@ -368,11 +368,11 @@ static void friends_sqlite_storage(void) { end: ms_free(stats); - unlink(friends_db); - ms_free(friends_db); linphone_address_unref(addr); linphone_core_destroy(lc); linphone_core_v_table_destroy(v_table); + unlink(friends_db); + bc_free(friends_db); } #endif @@ -472,10 +472,10 @@ static void carddav_sync_2(void) { BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i"); ms_free(stats); - unlink(friends_db); - ms_free(friends_db); linphone_carddav_context_destroy(c); linphone_core_manager_destroy(manager); + unlink(friends_db); + bc_free(friends_db); } static void carddav_sync_3(void) { @@ -512,11 +512,10 @@ static void carddav_sync_3(void) { BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i"); ms_free(stats); - unlink(friends_db); - ms_free(friends_db); linphone_carddav_context_destroy(c); - c = NULL; linphone_core_manager_destroy(manager); + unlink(friends_db); + bc_free(friends_db); } static void carddav_sync_4(void) { @@ -798,8 +797,8 @@ test_t vcard_tests[] = { TEST_NO_TAG("vCard creation for existing friends", linphone_vcard_update_existing_friends_test), TEST_NO_TAG("vCard phone numbers and SIP addresses", linphone_vcard_phone_numbers_and_sip_addresses), #ifdef SQLITE_STORAGE_ENABLED - TEST_ONE_TAG("Friends working if no db set", friends_if_no_db_set, "LeaksMemory"), - TEST_ONE_TAG("Friends storage migration from rc to db", friends_migration, "LeaksMemory"), + TEST_NO_TAG("Friends working if no db set", friends_if_no_db_set), + TEST_NO_TAG("Friends storage migration from rc to db", friends_migration), TEST_NO_TAG("Friends storage in sqlite database", friends_sqlite_storage), #endif TEST_NO_TAG("CardDAV clean", carddav_clean), // This is to ensure the content of the test addressbook is in the correct state for the following tests diff --git a/tools/genapixml.py b/tools/genapixml.py index 4c9d3374a..4326055ad 100755 --- a/tools/genapixml.py +++ b/tools/genapixml.py @@ -305,7 +305,7 @@ class Project: para.remove(n) for n in para.findall('.//ref'): n.attrib = {} - for n in para.findall(".//mslist"): + for n in para.findall(".//bctbx_list"): para.remove(n) if descriptionNode.tag == 'parameterdescription': descriptionNode.tag = 'description' @@ -439,7 +439,7 @@ class Project: returndesc = node.find("./detaileddescription/para/simplesect[@kind='return']") if returndesc is not None: if returnarg.ctype == 'MSList' or returnarg.ctype == 'bctbx_list_t': - n = returndesc.find('.//mslist') + n = returndesc.find('.//bctbxlist') if n is not None: returnarg.containedType = n.text returnarg.description = self.__cleanDescription(returndesc) @@ -510,7 +510,7 @@ class Project: returndesc = node.find("./detaileddescription/para/simplesect[@kind='return']") if returndesc is not None: if returnarg.ctype == 'MSList' or returnarg.ctype == 'bctbx_list_t': - n = returndesc.find('.//mslist') + n = returndesc.find('.//bctbxlist') if n is not None: returnarg.containedType = n.text returnarg.description = self.__cleanDescription(returndesc) @@ -533,7 +533,7 @@ class Project: for paramdesc in paramdescs: if arg.name == paramdesc.find('./parameternamelist').find('./parametername').text: if arg.ctype == 'MSList' or arg.ctype == 'bctbx_list_t': - n = paramdesc.find('.//mslist') + n = paramdesc.find('.//bctbxlist') if n is not None: arg.containedType = n.text arg.description = self.__cleanDescription(paramdesc.find('./parameterdescription')) diff --git a/tools/python/apixml2python/handwritten_declarations.mustache b/tools/python/apixml2python/handwritten_declarations.mustache index ca7cfd1c4..5f87cc257 100644 --- a/tools/python/apixml2python/handwritten_declarations.mustache +++ b/tools/python/apixml2python/handwritten_declarations.mustache @@ -24,8 +24,8 @@ typedef struct { LCSipTransports lcst; } pylinphone_SipTransportsObject; -PyObject * PyList_FromMSListOfString(const bctbx_list_t *msl); -bctbx_list_t * PyList_AsMSListOfString(PyObject *pyl); +PyObject * PyList_FromBctbxListOfString(const bctbx_list_t *msl); +bctbx_list_t * PyList_AsBctbxListOfString(PyObject *pyl); int PyLinphoneVideoSize_Check(PyObject *p); MSVideoSize PyLinphoneVideoSize_AsMSVideoSize(PyObject *obj); @@ -44,4 +44,4 @@ static int pylinphone_Buffer_set_content(PyObject *self, PyObject *value, void * static PyObject * pylinphone_Content_get_buffer(PyObject *self, void *closure); static int pylinphone_Content_set_buffer(PyObject *self, PyObject *value, void *closure); -static PyObject * pylinphone_LpConfig_get_sections_names(PyObject *self, void *closure); \ No newline at end of file +static PyObject * pylinphone_LpConfig_get_sections_names(PyObject *self, void *closure); diff --git a/tools/python/apixml2python/handwritten_definitions.mustache b/tools/python/apixml2python/handwritten_definitions.mustache index f87dfe7f2..fb27b8864 100644 --- a/tools/python/apixml2python/handwritten_definitions.mustache +++ b/tools/python/apixml2python/handwritten_definitions.mustache @@ -1,4 +1,4 @@ -PyObject * PyList_FromMSListOfString(const bctbx_list_t *msl) { +PyObject * PyList_FromBctbxListOfString(const bctbx_list_t *msl) { PyObject *pyl = PyList_New(0); while (msl != NULL) { PyObject *item = Py_BuildValue("z", (const char *)msl->data); @@ -8,7 +8,7 @@ PyObject * PyList_FromMSListOfString(const bctbx_list_t *msl) { return pyl; } -bctbx_list_t * PyList_AsMSListOfString(PyObject *pyl) { +bctbx_list_t * PyList_AsBctbxListOfString(PyObject *pyl) { bctbx_list_t *msl = NULL; Py_ssize_t idx; Py_ssize_t size = PyList_Size(pyl); diff --git a/tools/python/apixml2python/linphone.py b/tools/python/apixml2python/linphone.py index 288660327..483cd93ed 100644 --- a/tools/python/apixml2python/linphone.py +++ b/tools/python/apixml2python/linphone.py @@ -53,6 +53,10 @@ def compute_event_name(s, className): first = False return event_name +def is_const_from_complete_type(complete_type): + splitted_type = complete_type.split(' ') + return 'const' in splitted_type + class HandWrittenCode: def __init__(self, _class, name, func_list, doc = ''): @@ -95,6 +99,7 @@ class ArgumentType: self.check_condition = None self.convert_code = None self.convert_from_func = None + self.free_convert_result_func = None self.fmt_str = 'O' self.cfmt_str = '%p' self.cnativefmt_str = '%p' @@ -102,7 +107,7 @@ class ArgumentType: self.cast_convert_func_result = True self.__compute() if (self.basic_type == 'MSList' or self.basic_type == 'bctbx_list_t') and self.contained_type is not None and self.contained_type != 'const char *': - self.linphone_module.mslist_types.add(self.contained_type) + self.linphone_module.bctbxlist_types.add(self.contained_type) def __compute(self): splitted_type = self.complete_type.split(' ') @@ -217,12 +222,14 @@ class ArgumentType: elif self.basic_type == 'MSList' or self.basic_type == 'bctbx_list_t': if self.contained_type == 'const char *': self.type_str = 'list of string' - self.convert_code = "{result_name}{result_suffix} = {cast}PyList_AsMSListOfString({arg_name});\n" - self.convert_from_func = 'PyList_FromMSListOfString' + self.convert_code = "{result_name}{result_suffix} = {cast}PyList_AsBctbxListOfString({arg_name});\n" + self.convert_from_func = 'PyList_FromBctbxListOfString' else: self.type_str = 'list of linphone.' + self.contained_type - self.convert_code = "{result_name}{result_suffix} = {cast}PyList_AsMSListOf" + self.contained_type + "({arg_name});\n" - self.convert_from_func = 'PyList_FromMSListOf' + self.contained_type + self.convert_code = "{result_name}{result_suffix} = {cast}PyList_AsBctbxListOf" + self.contained_type + "({arg_name});\n" + self.convert_from_func = 'PyList_FromBctbxListOf' + self.contained_type + if not is_const_from_complete_type(self.complete_type): + self.free_convert_result_func = "bctbx_list_free" self.check_condition = "!PyList_Check({arg_name})" self.fmt_str = 'O' self.cfmt_str = '%p' @@ -372,6 +379,7 @@ class MethodDefinition: def format_c_function_call(self): arg_names = [] c_function_call_code = '' + cfree_argument_code = '' for xml_method_arg in self.xml_method_args: arg_name = "_" + xml_method_arg.get('name') arg_type = xml_method_arg.get('type') @@ -382,6 +390,10 @@ class MethodDefinition: arg_names.append(arg_name + "_native_ptr") elif argument_type.fmt_str == 'O' and argument_type.convert_code is not None: arg_names.append(arg_name + "_native_obj") + if argument_type.free_convert_result_func is not None and not is_const_from_complete_type(arg_complete_type): + cfree_argument_code = \ +"""{free_func}({arg_name}_native_obj); +""".format(free_func=argument_type.free_convert_result_func, arg_name=arg_name) else: arg_names.append(arg_name) if is_callback(self.return_complete_type): @@ -412,6 +424,10 @@ class MethodDefinition: convert_from_code = \ """pyresult = {convert_func}(cresult); """.format(convert_func=return_argument_type.convert_from_func) + if return_argument_type.free_convert_result_func is not None: + cfree_code = \ +"""{free_func}(cresult); +""".format(free_func=return_argument_type.free_convert_result_func) result_variable = 'pyresult' else: result_variable = 'cresult' @@ -421,12 +437,14 @@ class MethodDefinition: cfree_code = 'ms_free(cresult);'; body = \ """ {c_function_call_code} + {cfree_argument_code} pylinphone_dispatch_messages(); {from_native_pointer_code} {convert_from_code} {build_value_code} {cfree_code} """.format(c_function_call_code=c_function_call_code, + cfree_argument_code=cfree_argument_code, from_native_pointer_code=from_native_pointer_code, convert_from_code=convert_from_code, build_value_code=build_value_code, @@ -535,12 +553,6 @@ class MethodDefinition: self.self_arg = self.xml_method_args[0] self.xml_method_args = self.xml_method_args[1:] - def remove_const_from_complete_type(self, complete_type): - splitted_type = complete_type.split(' ') - while 'const' in splitted_type: - splitted_type.remove('const') - return ' '.join(splitted_type) - def find_class_definition(self, basic_type): basic_type = strip_leading_linphone(basic_type) for c in self.linphone_module.classes: @@ -799,15 +811,21 @@ class SetterMethodDefinition(MethodDefinition): """ {method_name}(native_ptr, pylinphone_{class_name}_callback_{callback_name}); pylinphone_dispatch_messages(); """.format(method_name=self.method_node.get('name'), class_name=self.class_['class_name'], callback_name=compute_event_name(self.first_argument_type.complete_type, self.class_['class_name'])) + cfree_argument_code = '' suffix = '' if self.first_argument_type.fmt_str == 'O' and self.first_argument_type.use_native_pointer: suffix = '_native_ptr' elif self.first_argument_type.fmt_str == 'O' and self.first_argument_type.convert_code is not None: suffix = '_native_obj' + if self.first_argument_type.free_convert_result_func is not None and not is_const_from_complete_type(self.first_argument_type.complete_type): + cfree_argument_code = \ +"""{free_func}({arg_name}_native_obj); +""".format(free_func=self.first_argument_type.free_convert_result_func, arg_name="_" + self.first_arg_name) return \ """ {method_name}(native_ptr, {arg_name}{suffix}); + {cfree_argument_code} pylinphone_dispatch_messages(); -""".format(arg_name="_" + self.first_arg_name, method_name=self.method_node.get('name'), suffix=suffix) +""".format(arg_name="_" + self.first_arg_name, method_name=self.method_node.get('name'), suffix=suffix, cfree_argument_code=cfree_argument_code) def format_return_trace(self): return "\tpylinphone_trace(-1, \"[PYLINPHONE] <<< %s -> 0\", __FUNCTION__);\n" @@ -989,7 +1007,7 @@ class LinphoneModule(object): def __init__(self, tree, blacklisted_classes, blacklisted_events, blacklisted_functions, hand_written_codes): self.internal_instance_method_names = ['destroy', 'ref', 'unref'] self.internal_property_names = ['user_data'] - self.mslist_types = Set([]) + self.bctbxlist_types = Set([]) self.enums = [] self.enum_names = [] self.cfunction2methodmap = {} @@ -1225,14 +1243,14 @@ class LinphoneModule(object): except Exception, e: e.args += (c['class_name'], 'dealloc_body') raise - # Convert mslist_types to a list of dictionaries for the template + # Convert bctbxlist_types to a list of dictionaries for the template d = [] - for mslist_type in self.mslist_types: + for bctbxlist_type in self.bctbxlist_types: t = {} - t['c_contained_type'] = mslist_type - t['python_contained_type'] = strip_leading_linphone(mslist_type) + t['c_contained_type'] = bctbxlist_type + t['python_contained_type'] = strip_leading_linphone(bctbxlist_type) d.append(t) - self.mslist_types = d + self.bctbxlist_types = d def __format_doc_node(self, node): desc = '' diff --git a/tools/python/apixml2python/linphone_module.mustache b/tools/python/apixml2python/linphone_module.mustache index aca0bd6ca..deadebe2b 100644 --- a/tools/python/apixml2python/linphone_module.mustache +++ b/tools/python/apixml2python/linphone_module.mustache @@ -71,8 +71,8 @@ static PyObject * pylinphone_{{class_name}}_instance_method_{{method_name}}(PyOb {{/class_instance_hand_written_methods}} {{/classes}} -{{#mslist_types}} -PyObject * PyList_FromMSListOf{{c_contained_type}}(const bctbx_list_t *msl) { +{{#bctbxlist_types}} +PyObject * PyList_FromBctbxListOf{{c_contained_type}}(const bctbx_list_t *msl) { PyObject *pyl = PyList_New(0); while (msl != NULL) { {{c_contained_type}} *native_ptr = ({{c_contained_type}} *)msl->data; @@ -83,7 +83,7 @@ PyObject * PyList_FromMSListOf{{c_contained_type}}(const bctbx_list_t *msl) { return pyl; } -bctbx_list_t * PyList_AsMSListOf{{c_contained_type}}(PyObject *pyl) { +bctbx_list_t * PyList_AsBctbxListOf{{c_contained_type}}(PyObject *pyl) { bctbx_list_t *msl = NULL; Py_ssize_t idx; Py_ssize_t size = PyList_Size(pyl); @@ -95,7 +95,7 @@ bctbx_list_t * PyList_AsMSListOf{{c_contained_type}}(PyObject *pyl) { return msl; } -{{/mslist_types}} +{{/bctbxlist_types}} {{#core_events}} {{{event_callback_definition}}}