void linphone_core_setup_local_rtp_profile(LinphoneCore *lc) { int i; MSList *audiopt,*videopt; PayloadType *payload; bool_t prepend; lc->local_profile=rtp_profile_clone_full(&av_profile); /* first look at the list given by configuration file to see if it is correct */ audiopt=fix_codec_list(lc->local_profile,lc->codecs_conf.audio_codecs); videopt=fix_codec_list(lc->local_profile,lc->codecs_conf.video_codecs); /* now find and add payloads that are not listed in the configuration codec list */ for (i=0;i<127;i++) { payload=rtp_profile_get_payload(lc->local_profile,i); if (payload!=NULL){ if (payload_type_get_user_data(payload)!=NULL) continue; /* find a mediastreamer codec for this payload type */ if (ms_filter_codec_supported(payload->mime_type)){ MSFilterDesc *desc=ms_filter_get_encoder(payload->mime_type); ms_message("Adding new codec %s/%i",payload->mime_type,payload->clock_rate); payload_type_set_enable(payload,1); payload_type_set_user_data(payload,(void *)desc->text); prepend=FALSE; /* by default, put speex and theora on top of list*/ if (strcmp(payload->mime_type,"speex")==0) prepend=TRUE; if (strcmp(payload->mime_type,"theora")==0) prepend=TRUE; switch (payload->type){ case PAYLOAD_AUDIO_CONTINUOUS: case PAYLOAD_AUDIO_PACKETIZED: if (prepend) audiopt=ms_list_prepend(audiopt,(void *)payload); else audiopt=ms_list_append(audiopt,(void *)payload); break; case PAYLOAD_VIDEO: if (prepend) videopt=ms_list_prepend(videopt,(void *)payload); else videopt=ms_list_append(videopt,(void *)payload); break; default: ms_error("Unsupported rtp media type."); } } } } ms_list_for_each(lc->codecs_conf.audio_codecs,(void (*)(void*))payload_type_destroy); ms_list_for_each(lc->codecs_conf.video_codecs,(void (*)(void *))payload_type_destroy); ms_list_free(lc->codecs_conf.audio_codecs); ms_list_free(lc->codecs_conf.video_codecs); /* set the fixed lists instead:*/ lc->codecs_conf.audio_codecs=audiopt; lc->codecs_conf.video_codecs=videopt; }
void ms_filter_register(MSFilterDesc *desc) { if (desc->id==MS_FILTER_NOT_SET_ID) { ms_fatal("MSFilterId for %s not set !",desc->name); } /*lastly registered encoder/decoders may replace older ones*/ desc_list=ms_list_prepend(desc_list,desc); }
void linphone_core_store_call_log(LinphoneCore *lc, LinphoneCallLog *log) { if (lc && lc->logs_db){ char *from, *to; char *buf; from = linphone_address_as_string(log->from); to = linphone_address_as_string(log->to); buf = sqlite3_mprintf("INSERT INTO call_history VALUES(NULL,%Q,%Q,%i,%i,%lld,%lld,%i,%i,%f,%Q,%Q);", from, to, log->dir, log->duration, (int64_t)log->start_date_time, (int64_t)log->connected_date_time, log->status, log->video_enabled ? 1 : 0, log->quality, log->call_id, log->refkey ); linphone_sql_request_generic(lc->logs_db, buf); sqlite3_free(buf); ms_free(from); ms_free(to); log->storage_id = sqlite3_last_insert_rowid(lc->logs_db); } if (lc) { lc->call_logs = ms_list_prepend(lc->call_logs, linphone_call_log_ref(log)); } }
void linphone_call_log_completed(LinphoneCall *call){ LinphoneCore *lc=call->core; call->log->duration=time(NULL)-call->start_time; if (call->log->status==LinphoneCallMissed){ char *info; lc->missed_calls++; info=ortp_strdup_printf(ngettext("You have missed %i call.", "You have missed %i calls.", lc->missed_calls), lc->missed_calls); if (lc->vtable.display_status!=NULL) lc->vtable.display_status(lc,info); ms_free(info); } lc->call_logs=ms_list_prepend(lc->call_logs,(void *)call->log); if (ms_list_size(lc->call_logs)>lc->max_call_logs){ MSList *elem,*prevelem=NULL; /*find the last element*/ for(elem=lc->call_logs;elem!=NULL;elem=elem->next){ prevelem=elem; } elem=prevelem; linphone_call_log_destroy((LinphoneCallLog*)elem->data); lc->call_logs=ms_list_remove_link(lc->call_logs,elem); } if (lc->vtable.call_log_updated!=NULL){ lc->vtable.call_log_updated(lc,call->log); } call_logs_write_to_config_file(lc); }
void ms_factory_register_filter(MSFactory* factory, MSFilterDesc* desc ) { if (desc->id==MS_FILTER_NOT_SET_ID){ ms_fatal("MSFilterId for %s not set !",desc->name); } desc->flags|=MS_FILTER_IS_ENABLED; /*by default a registered filter is enabled*/ /*lastly registered encoder/decoders may replace older ones*/ factory->desc_list=ms_list_prepend(factory->desc_list,desc); }
void ms_filter_postpone_task(MSFilter *f, MSFilterFunc taskfunc){ MSFilterTask *task; MSTicker *ticker=f->ticker; if (ticker==NULL){ ms_error("ms_filter_postpone_task(): this method cannot be called outside of filter's process method."); return; } task=ms_new0(MSFilterTask,1); task->f=f; task->taskfunc=taskfunc; ticker->task_list=ms_list_prepend(ticker->task_list,task); f->postponed_task++; }
/* DB layout: * | 0 | storage_id * | 1 | localContact * | 2 | remoteContact * | 3 | direction flag * | 4 | message * | 5 | time (unused now, used to be string-based timestamp) * | 6 | read flag * | 7 | status * | 8 | external body url * | 9 | utc timestamp * | 10 | app data text * | 11 | linphone content */ static void create_chat_message(char **argv, void *data){ LinphoneChatRoom *cr = (LinphoneChatRoom *)data; LinphoneAddress *from; LinphoneAddress *to; unsigned int storage_id = atoi(argv[0]); // check if the message exists in the transient list, in which case we should return that one. LinphoneChatMessage* new_message = get_transient_message(cr, storage_id); if( new_message == NULL ){ new_message = linphone_chat_room_create_message(cr, argv[4]); if(atoi(argv[3])==LinphoneChatMessageIncoming){ new_message->dir=LinphoneChatMessageIncoming; from=linphone_address_new(argv[2]); to=linphone_address_new(argv[1]); } else { new_message->dir=LinphoneChatMessageOutgoing; from=linphone_address_new(argv[1]); to=linphone_address_new(argv[2]); } linphone_chat_message_set_from(new_message,from); linphone_address_destroy(from); if (to){ linphone_chat_message_set_to(new_message,to); linphone_address_destroy(to); } if( argv[9] != NULL ){ new_message->time = (time_t)atol(argv[9]); } else { new_message->time = time(NULL); } new_message->is_read=atoi(argv[6]); new_message->state=atoi(argv[7]); new_message->storage_id=storage_id; new_message->external_body_url= argv[8] ? ms_strdup(argv[8]) : NULL; new_message->appdata = argv[10]? ms_strdup(argv[10]) : NULL; if (argv[11] != NULL) { int id = atoi(argv[11]); if (id >= 0) { fetch_content_from_database(cr->lc->db, new_message, id); } } } cr->messages_hist=ms_list_prepend(cr->messages_hist,new_message); }
MSList *ms_list_insert(MSList *list, MSList *before, void *data){ MSList *elem; if (list==NULL || before==NULL) return ms_list_append(list,data); for(elem=list;elem!=NULL;elem=ms_list_next(elem)){ if (elem==before){ if (elem->prev==NULL) return ms_list_prepend(list,data); else{ MSList *nelem=ms_list_new(data); nelem->prev=elem->prev; nelem->next=elem; elem->prev->next=nelem; elem->prev=nelem; } } } return list; }
static bool_t is_duplicate_msg(LinphoneCore *lc, const char *msg_id){ MSList *elem=lc->last_recv_msg_ids; MSList *tail=NULL; int i; bool_t is_duplicate=FALSE; for(i=0;elem!=NULL;elem=elem->next,i++){ if (strcmp((const char*)elem->data,msg_id)==0){ is_duplicate=TRUE; } tail=elem; } if (!is_duplicate){ lc->last_recv_msg_ids=ms_list_prepend(lc->last_recv_msg_ids,ms_strdup(msg_id)); } if (i>=10){ ms_free(tail->data); lc->last_recv_msg_ids=ms_list_remove_link(lc->last_recv_msg_ids,tail); } return is_duplicate; }
static void print_graph(MSFilter *f, MSTicker *s, MSList **unschedulable, bool_t force_schedule){ int i; MSQueue *l; if (f->last_tick!=s->ticks ){ if (filter_can_process(f,s->ticks) || force_schedule) { /* this is a candidate */ f->last_tick=s->ticks; ms_message("print_graphs: %s", f->desc->name); /* now recurse to next filters */ for(i=0;i<f->desc->noutputs;i++){ l=f->outputs[i]; if (l!=NULL){ print_graph(l->next.filter,s,unschedulable, force_schedule); } } }else{ /* this filter has not all inputs that have been filled by filters before it. */ *unschedulable=ms_list_prepend(*unschedulable,f); } } }
/* DB layout: * | 0 | storage_id * | 1 | localContact * | 2 | remoteContact * | 3 | direction flag * | 4 | message * | 5 | time (unused now, used to be string-based timestamp) * | 6 | read flag * | 7 | status * | 8 | external body url * | 9 | utc timestamp * | 10 | app data text * | 11 | linphone content id */ static int create_chat_message(void *data, int argc, char **argv, char **colName){ LinphoneChatRoom *cr = (LinphoneChatRoom *)data; unsigned int storage_id = atoi(argv[0]); // check if the message exists in the transient list, in which case we should return that one. LinphoneChatMessage* new_message = get_transient_message(cr, storage_id); if( new_message == NULL ){ LinphoneAddress *local_addr=linphone_address_new(argv[1]); new_message = linphone_chat_room_create_message(cr, argv[4]); if(atoi(argv[3])==LinphoneChatMessageIncoming){ new_message->dir=LinphoneChatMessageIncoming; linphone_chat_message_set_from(new_message,linphone_chat_room_get_peer_address(cr)); new_message->to = local_addr; /*direct assignation to avoid a copy*/ } else { new_message->dir=LinphoneChatMessageOutgoing; new_message->from = local_addr; /*direct assignation to avoid a copy*/ linphone_chat_message_set_to(new_message,linphone_chat_room_get_peer_address(cr)); } new_message->time = (time_t)atol(argv[9]); new_message->is_read=atoi(argv[6]); new_message->state=atoi(argv[7]); new_message->storage_id=storage_id; new_message->external_body_url= ms_strdup(argv[8]); new_message->appdata = ms_strdup(argv[10]); if (argv[11] != NULL) { int id = atoi(argv[11]); if (id >= 0) { fetch_content_from_database(cr->lc->db, new_message, id); } } } cr->messages_hist=ms_list_prepend(cr->messages_hist,new_message); return 0; }
void ms_web_cam_manager_prepend_cam(MSWebCamManager *m, MSWebCam *c){ ms_message("Webcam %s prepended",ms_web_cam_get_string_id(c)); m->cams=ms_list_prepend(m->cams,c); }
void ms_factory_register_offer_answer_provider(MSFactory *f, MSOfferAnswerProvider *offer_answer_prov){ if (ms_list_find(f->offer_answer_provider_list, offer_answer_prov)) return; /*avoid registering several time the same pointer*/ f->offer_answer_provider_list = ms_list_prepend(f->offer_answer_provider_list, offer_answer_prov); }