diff --git a/coreapi/CMakeLists.txt b/coreapi/CMakeLists.txt index 2baada846..c4105536b 100644 --- a/coreapi/CMakeLists.txt +++ b/coreapi/CMakeLists.txt @@ -91,6 +91,7 @@ set(SOURCE_FILES xml2lpc.c xml2lpc.h xml.c + vtables.c ) if(ENABLE_TUNNEL) list(APPEND SOURCE_FILES diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index 7f9d0027b..5a347f3d2 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -81,6 +81,7 @@ liblinphone_la_SOURCES=\ sipsetup.c sipsetup.h \ xml2lpc.c \ xml.c \ + vtables.c \ $(GITVERSION_FILE) if BUILD_UPNP diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index acc5b9580..f9a0bf612 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1,6 +1,7 @@ /* linphone Copyright (C) 2000 Simon MORLAT (simon.morlat@linphone.org) +Copyright (C) 2010 Belledonne Communications SARL This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -1618,7 +1619,7 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab memcpy(local_vtable,vtable,sizeof(LinphoneCoreVTable)); - lc->vtables=ms_list_append(lc->vtables,local_vtable); + _linphone_core_add_listener(lc, local_vtable, TRUE); linphone_core_set_state(lc,LinphoneGlobalStartup,"Starting up"); ortp_init(); @@ -6348,7 +6349,7 @@ static void linphone_core_uninit(LinphoneCore *lc) ms_exit(); linphone_core_set_state(lc,LinphoneGlobalOff,"Off"); linphone_core_deactivate_log_serialization_if_needed(); - ms_list_free_with_data(lc->vtables,(void (*)(void *))linphone_core_v_table_destroy); + ms_list_free_with_data(lc->vtable_refs,(void (*)(void *))v_table_reference_destroy); } static void set_network_reachable(LinphoneCore* lc,bool_t isReachable, time_t curtime){ @@ -7130,144 +7131,6 @@ int linphone_payload_type_get_channels(const LinphonePayloadType *pt) { return pt->channels; } -LinphoneCoreVTable *linphone_core_v_table_new() { - return ms_new0(LinphoneCoreVTable,1); -} - -void linphone_core_v_table_set_user_data(LinphoneCoreVTable *table, void *data) { - table->user_data = data; -} - -void* linphone_core_v_table_get_user_data(LinphoneCoreVTable *table) { - return table->user_data; -} - -void linphone_core_v_table_destroy(LinphoneCoreVTable* table) { - ms_free(table); -} - -LinphoneCoreVTable *linphone_core_get_current_vtable(LinphoneCore *lc) { - return lc->current_vtable; -} - -#define NOTIFY_IF_EXIST(function_name) \ - MSList* iterator; \ - ms_message ("Linphone core [%p] notifying [%s]",lc,#function_name);\ - for (iterator=lc->vtables; iterator!=NULL; iterator=iterator->next) \ - if ((lc->current_vtable=((LinphoneCoreVTable*)(iterator->data)))->function_name)\ - ((LinphoneCoreVTable*)(iterator->data))->function_name -void linphone_core_notify_global_state_changed(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message) { - NOTIFY_IF_EXIST(global_state_changed)(lc,gstate,message); -} -void linphone_core_notify_call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message){ - NOTIFY_IF_EXIST(call_state_changed)(lc,call,cstate,message); -} -void linphone_core_notify_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t on, const char *authentication_token) { - NOTIFY_IF_EXIST(call_encryption_changed)(lc,call,on,authentication_token); -} -void linphone_core_notify_registration_state_changed(LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState cstate, const char *message){ - NOTIFY_IF_EXIST(registration_state_changed)(lc,cfg,cstate,message); -} -void linphone_core_notify_show_interface(LinphoneCore *lc){ - NOTIFY_IF_EXIST(show)(lc); -} -void linphone_core_notify_display_status(LinphoneCore *lc, const char *message) { - NOTIFY_IF_EXIST(display_status)(lc,message); -} -void linphone_core_notify_display_message(LinphoneCore *lc, const char *message){ - NOTIFY_IF_EXIST(display_message)(lc,message); -} -void linphone_core_notify_display_warning(LinphoneCore *lc, const char *message){ - NOTIFY_IF_EXIST(display_warning)(lc,message); -} -void linphone_core_notify_display_url(LinphoneCore *lc, const char *message, const char *url){ - NOTIFY_IF_EXIST(display_url)(lc,message,url); -} -void linphone_core_notify_notify_presence_received(LinphoneCore *lc, LinphoneFriend * lf){ - NOTIFY_IF_EXIST(notify_presence_received)(lc,lf); -} -void linphone_core_notify_new_subscription_requested(LinphoneCore *lc, LinphoneFriend *lf, const char *url){ - NOTIFY_IF_EXIST(new_subscription_requested)(lc,lf,url); -} -void linphone_core_notify_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain){ - NOTIFY_IF_EXIST(auth_info_requested)(lc,realm,username,domain); -} -void linphone_core_notify_call_log_updated(LinphoneCore *lc, LinphoneCallLog *newcl){ - NOTIFY_IF_EXIST(call_log_updated)(lc,newcl); -} -void linphone_core_notify_text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message){ - NOTIFY_IF_EXIST(text_received)(lc,room,from,message); -} -void linphone_core_notify_message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message){ - NOTIFY_IF_EXIST(message_received)(lc,room,message); -} -void linphone_core_notify_file_transfer_recv(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size) { - NOTIFY_IF_EXIST(file_transfer_recv)(lc,message,content,buff,size); -} -void linphone_core_notify_file_transfer_send(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, char* buff, size_t* size) { - NOTIFY_IF_EXIST(file_transfer_send)(lc,message,content,buff,size); -} -void linphone_core_notify_file_transfer_progress_indication(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t total) { - NOTIFY_IF_EXIST(file_transfer_progress_indication)(lc,message,content,offset,total); -} -void linphone_core_notify_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) { - NOTIFY_IF_EXIST(is_composing_received)(lc,room); -} -void linphone_core_notify_dtmf_received(LinphoneCore* lc, LinphoneCall *call, int dtmf) { - NOTIFY_IF_EXIST(dtmf_received)(lc,call,dtmf); -} -bool_t linphone_core_dtmf_received_has_listener(const LinphoneCore* lc) { - MSList* iterator; - for (iterator=lc->vtables; iterator!=NULL; iterator=iterator->next) - if (((LinphoneCoreVTable*)(iterator->data))->dtmf_received) - return TRUE; - return FALSE; -} -void linphone_core_notify_refer_received(LinphoneCore *lc, const char *refer_to) { - NOTIFY_IF_EXIST(refer_received)(lc,refer_to); -} -void linphone_core_notify_buddy_info_updated(LinphoneCore *lc, LinphoneFriend *lf) { - NOTIFY_IF_EXIST(buddy_info_updated)(lc,lf); -} -void linphone_core_notify_transfer_state_changed(LinphoneCore *lc, LinphoneCall *transfered, LinphoneCallState new_call_state) { - NOTIFY_IF_EXIST(transfer_state_changed)(lc,transfered,new_call_state); -} -void linphone_core_notify_call_stats_updated(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallStats *stats) { - NOTIFY_IF_EXIST(call_stats_updated)(lc,call,stats); -} -void linphone_core_notify_info_received(LinphoneCore *lc, LinphoneCall *call, const LinphoneInfoMessage *msg) { - NOTIFY_IF_EXIST(info_received)(lc,call,msg); -} -void linphone_core_notify_configuring_status(LinphoneCore *lc, LinphoneConfiguringState status, const char *message) { - NOTIFY_IF_EXIST(configuring_status)(lc,status,message); -} -void linphone_core_notify_network_reachable(LinphoneCore *lc, bool_t reachable) { - NOTIFY_IF_EXIST(network_reachable)(lc,reachable); -} -void linphone_core_notify_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *notified_event, const LinphoneContent *body) { - NOTIFY_IF_EXIST(notify_received)(lc,lev,notified_event,body); -} -void linphone_core_notify_subscription_state_changed(LinphoneCore *lc, LinphoneEvent *lev, LinphoneSubscriptionState state) { - NOTIFY_IF_EXIST(subscription_state_changed)(lc,lev,state); -} -void linphone_core_notify_publish_state_changed(LinphoneCore *lc, LinphoneEvent *lev, LinphonePublishState state) { - NOTIFY_IF_EXIST(publish_state_changed)(lc,lev,state); -} -void linphone_core_notify_log_collection_upload_state_changed(LinphoneCore *lc, LinphoneCoreLogCollectionUploadState state, const char *info) { - NOTIFY_IF_EXIST(log_collection_upload_state_changed)(lc, state, info); -} -void linphone_core_notify_log_collection_upload_progress_indication(LinphoneCore *lc, size_t offset, size_t total) { - NOTIFY_IF_EXIST(log_collection_upload_progress_indication)(lc, offset, total); -} -void linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable) { - ms_message("Vtable [%p] registered on core [%p]",lc,vtable); - lc->vtables=ms_list_append(lc->vtables,vtable); -} -void linphone_core_remove_listener(LinphoneCore *lc, const LinphoneCoreVTable *vtable) { - ms_message("Vtable [%p] unregistered on core [%p]",lc,vtable); - lc->vtables=ms_list_remove(lc->vtables,(void*)vtable); -} - int linphone_core_set_audio_multicast_addr(LinphoneCore *lc, const char* ip) { char* new_value; if (ip && !ms_is_multicast(ip)) { @@ -7296,7 +7159,6 @@ const char* linphone_core_get_audio_multicast_addr(const LinphoneCore *lc) { return lc->rtp_conf.audio_multicast_addr; } - const char* linphone_core_get_video_multicast_addr(const LinphoneCore *lc){ return lc->rtp_conf.video_multicast_addr; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 94ab09d62..5452523eb 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -1890,7 +1890,7 @@ typedef struct _LinphoneCoreVTable{ LinphoneCoreNetworkReachableCb network_reachable; /**< Callback to report IP network status (I.E up/down )*/ LinphoneCoreLogCollectionUploadStateChangedCb log_collection_upload_state_changed; /**< Callback to upload collected logs */ LinphoneCoreLogCollectionUploadProgressIndicationCb log_collection_upload_progress_indication; /**< Callback to indicate log collection upload progress */ - void *user_data; + void *user_data; /**NewGlobalRef(jlistener); - for (iterator = core->vtables; iterator != NULL; ) { - LinphoneCoreVTable *vTable = (LinphoneCoreVTable*)(iterator->data); + for (iterator = core->vtable_refs; iterator != NULL; ) { + VTableReference *ref=(VTableReference*)(iterator->data); + LinphoneCoreVTable *vTable = ref->valid ? ref->vtable : NULL; iterator = iterator->next; //Because linphone_core_remove_listener may change the list if (vTable) { LinphoneCoreData *data = (LinphoneCoreData*) linphone_core_v_table_get_user_data(vTable); diff --git a/coreapi/private.h b/coreapi/private.h index 46a5ea733..baef0ae6e 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -717,7 +717,7 @@ typedef struct _LinphoneConference LinphoneConference; struct _LinphoneCore { - MSList* vtables; + MSList* vtable_refs; Sal *sal; LinphoneGlobalState state; struct _LpConfig *config; @@ -767,6 +767,8 @@ struct _LinphoneCore char* zrtp_secrets_cache; char* user_certificates_path; LinphoneVideoPolicy video_policy; + time_t network_last_check; + bool_t use_files; bool_t apply_nat_settings; bool_t initial_subscribes_sent; @@ -776,13 +778,11 @@ struct _LinphoneCore bool_t auto_net_state_mon; bool_t network_reachable; bool_t network_reachable_to_be_notified; /*set to true when state must be notified in next iterate*/ + bool_t use_preview_window; - - time_t network_last_check; - bool_t network_last_status; bool_t ringstream_autorelease; - bool_t pad[2]; + bool_t vtables_running; char localip[LINPHONE_IPADDR_SIZE]; int device_rotation; int max_calls; @@ -1121,6 +1121,18 @@ void linphone_core_multicast_lock_acquire(LinphoneCore *lc); void linphone_core_multicast_lock_release(LinphoneCore *lc); #endif +struct _VTableReference{ + LinphoneCoreVTable *vtable; + bool_t valid; + bool_t autorelease; +}; + +typedef struct _VTableReference VTableReference; + +void v_table_reference_destroy(VTableReference *ref); + +void _linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable, bool_t autorelease); + #ifdef __cplusplus } #endif diff --git a/oRTP b/oRTP index f3a7c4d92..9f6a7f42e 160000 --- a/oRTP +++ b/oRTP @@ -1 +1 @@ -Subproject commit f3a7c4d92dd9e18ff63c744611aac7f1adb12aca +Subproject commit 9f6a7f42e0ee7ce89452ee9f7be8b97b891370ed diff --git a/tester/call_tester.c b/tester/call_tester.c index 22a076570..4410bb7b7 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2673,9 +2673,7 @@ static void call_rejected_because_wrong_credentials_with_params(const char* user linphone_core_set_user_agent(marie->lc,user_agent,NULL); } if (!enable_auth_req_cb) { - - ((LinphoneCoreVTable*)(marie->lc->vtables->data))->auth_info_requested=NULL; - + ((VTableReference*)(marie->lc->vtable_refs->data))->vtable->auth_info_requested=NULL; linphone_core_add_auth_info(marie->lc,wrong_auth_info); }