Rework presence to remove online and offline virtual activities and introduce consolidated presence.

This commit is contained in:
Ghislain MARY 2017-03-17 14:50:28 +01:00
parent 87871f56fd
commit c979eeaa34
12 changed files with 313 additions and 124 deletions

View file

@ -504,7 +504,8 @@ void linphone_friend_invalidate_subscription(LinphoneFriend *lf){
while (iterator) {
LinphoneFriendPresence *lfp = (LinphoneFriendPresence *)bctbx_list_get_data(iterator);
linphone_presence_model_unref(lfp->presence);
lfp->presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityOffline, "unknown activity");
lfp->presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(lfp->presence, LinphonePresenceBasicStatusClosed);
linphone_core_notify_notify_presence_received_for_uri_or_tel(lc, lf, lfp->uri_or_tel, lfp->presence);
iterator = bctbx_list_next(iterator);
}
@ -649,13 +650,6 @@ LinphoneOnlineStatus linphone_friend_get_status(const LinphoneFriend *lf){
case LinphonePresenceActivityUnknown:
/* Rely on the basic status information. */
break;
case LinphonePresenceActivityOnline:
/* Should not happen! */
/*ms_warning("LinphonePresenceActivityOnline should not happen here!");*/
break;
case LinphonePresenceActivityOffline:
online_status = LinphoneStatusOffline;
break;
}
}
}
@ -688,6 +682,12 @@ const LinphonePresenceModel * linphone_friend_get_presence_model(const LinphoneF
return presence;
}
LinphoneConsolidatedPresence linphone_friend_get_consolidated_presence(const LinphoneFriend *lf) {
const LinphonePresenceModel *model = linphone_friend_get_presence_model(lf);
if (!model) return LinphoneConsolidatedPresenceOffline;
return linphone_presence_model_get_consolidated_presence(model);
}
const LinphonePresenceModel * linphone_friend_get_presence_model_for_uri_or_tel(const LinphoneFriend *lf, const char *uri_or_tel) {
LinphoneFriendPresence *lfp = find_presence_model_for_uri_or_tel(lf, uri_or_tel);
if (lfp) return lfp->presence;

View file

@ -92,6 +92,7 @@ int main(int argc, char *argv[]){
char* password=NULL;
LinphoneFriend* my_friend=NULL;
LinphonePresenceModel *model;
/* takes sip uri identity from the command line arguments */
if (argc>1){
@ -173,7 +174,10 @@ int main(int argc, char *argv[]){
}
/*set my status to online*/
linphone_core_set_presence_model(lc, linphone_presence_model_new_with_activity(LinphonePresenceActivityOnline, NULL));
model = linphone_presence_model_new();
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusOpen);
linphone_core_set_presence_model(lc, model);
linphone_presence_model_unref(model);
/* main loop for receiving notifications and doing background linphone core work: */
while(running){
@ -182,7 +186,10 @@ int main(int argc, char *argv[]){
}
/* change my presence status to offline*/
linphone_core_set_presence_model(lc, linphone_presence_model_new_with_activity(LinphonePresenceActivityOffline, NULL));
model = linphone_presence_model_new();
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusClosed);
linphone_core_set_presence_model(lc, model);
linphone_presence_model_unref(model);
linphone_core_iterate(lc); /* just to make sure new status is initiate message is issued */
linphone_friend_edit(my_friend); /* start editing friend */

View file

@ -1934,7 +1934,8 @@ static void linphone_core_start(LinphoneCore * lc) {
sip_config_read(lc);
video_config_read(lc);
//autoreplier_config_init(&lc->autoreplier_conf);
lc->presence_model=linphone_presence_model_new_with_activity(LinphonePresenceActivityOnline, NULL);
lc->presence_model=linphone_presence_model_new();
linphone_presence_model_set_basic_status(lc->presence_model, LinphonePresenceBasicStatusOpen);
misc_config_read(lc);
ui_config_read(lc);
#ifdef TUNNEL_ENABLED
@ -3628,18 +3629,20 @@ void linphone_core_set_delayed_timeout(LinphoneCore *lc, int seconds){
void linphone_core_set_presence_info(LinphoneCore *lc, int minutes_away, const char *contact, LinphoneOnlineStatus os) {
LinphonePresenceModel *presence = NULL;
LinphonePresenceActivity *activity = NULL;
char *description = NULL;
LinphonePresenceActivityType acttype = LinphonePresenceActivityUnknown;
if (minutes_away>0) lc->minutes_away=minutes_away;
presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusOpen);
switch (os) {
case LinphoneStatusOffline:
acttype = LinphonePresenceActivityOffline;
break;
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusClosed);
goto end;
case LinphoneStatusOnline:
acttype = LinphonePresenceActivityOnline;
break;
goto end;
case LinphoneStatusBusy:
acttype = LinphonePresenceActivityBusy;
break;
@ -3658,6 +3661,7 @@ void linphone_core_set_presence_info(LinphoneCore *lc, int minutes_away, const c
case LinphoneStatusDoNotDisturb:
acttype = LinphonePresenceActivityBusy;
description = "Do not disturb";
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusClosed);
break;
case LinphoneStatusMoved:
acttype = LinphonePresenceActivityPermanentAbsence;
@ -3677,9 +3681,14 @@ void linphone_core_set_presence_info(LinphoneCore *lc, int minutes_away, const c
ms_warning("Invalid status LinphoneStatusEnd");
return;
}
presence = linphone_presence_model_new_with_activity(acttype, description);
activity = linphone_presence_activity_new(acttype, description);
linphone_presence_model_add_activity(presence, activity);
linphone_presence_activity_unref(activity);
end:
linphone_presence_model_set_contact(presence, contact);
linphone_core_set_presence_model(lc, presence);
linphone_presence_model_unref(presence);
}
void linphone_core_send_presence(LinphoneCore *lc, LinphonePresenceModel *presence){
@ -3688,12 +3697,10 @@ void linphone_core_send_presence(LinphoneCore *lc, LinphonePresenceModel *presen
}
void linphone_core_set_presence_model(LinphoneCore *lc, LinphonePresenceModel *presence) {
linphone_core_send_presence(lc,presence);
if ((lc->presence_model != NULL) && (lc->presence_model != presence)) {
linphone_presence_model_unref(lc->presence_model);
lc->presence_model = presence;
}
linphone_presence_model_ref(presence);
linphone_core_send_presence(lc, presence);
if (lc->presence_model != NULL) linphone_presence_model_unref(lc->presence_model);
lc->presence_model = presence;
}
LinphoneOnlineStatus linphone_core_get_presence_info(const LinphoneCore *lc){
@ -3704,10 +3711,6 @@ LinphoneOnlineStatus linphone_core_get_presence_info(const LinphoneCore *lc){
if (activity) {
description = linphone_presence_activity_get_description(activity);
switch (linphone_presence_activity_get_type(activity)) {
case LinphonePresenceActivityOffline:
return LinphoneStatusOffline;
case LinphonePresenceActivityOnline:
return LinphoneStatusOnline;
case LinphonePresenceActivityBusy:
if (description != NULL) {
if (strcmp(description, "Do not disturb") == 0)
@ -3757,6 +3760,53 @@ LinphonePresenceModel * linphone_core_get_presence_model(const LinphoneCore *lc)
return lc->presence_model;
}
LinphoneConsolidatedPresence linphone_core_get_consolidated_presence(const LinphoneCore *lc) {
LinphoneProxyConfig *cfg = lc->default_proxy;
if ((cfg != NULL) && !linphone_proxy_config_publish_enabled(cfg)) return LinphoneConsolidatedPresenceOffline;
return linphone_presence_model_get_consolidated_presence(linphone_core_get_presence_model(lc));
}
void linphone_core_set_consolidated_presence(LinphoneCore *lc, LinphoneConsolidatedPresence presence) {
LinphoneProxyConfig *cfg;
LinphonePresenceModel *model;
LinphonePresenceActivity *activity = NULL;
cfg = linphone_core_get_default_proxy_config(lc);
if ((cfg != NULL) && (presence == LinphoneConsolidatedPresenceOffline) && linphone_proxy_config_publish_enabled(cfg)) {
/* Unpublish when going offline before changing the presence model. */
linphone_proxy_config_edit(cfg);
linphone_proxy_config_enable_publish(cfg, FALSE);
linphone_proxy_config_done(cfg);
}
model = linphone_presence_model_new();
switch (presence) {
case LinphoneConsolidatedPresenceOnline:
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusOpen);
break;
case LinphoneConsolidatedPresenceBusy:
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusOpen);
activity = linphone_presence_activity_new(LinphonePresenceActivityAway, NULL);
break;
case LinphoneConsolidatedPresenceDoNotDisturb:
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusClosed);
activity = linphone_presence_activity_new(LinphonePresenceActivityAway, NULL);
break;
case LinphoneConsolidatedPresenceOffline:
default:
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusClosed);
break;
}
if (activity != NULL) linphone_presence_model_add_activity(model, activity);
linphone_core_set_presence_model(lc, model);
linphone_presence_model_unref(model);
if ((cfg != NULL) && (presence != LinphoneConsolidatedPresenceOffline) && !linphone_proxy_config_publish_enabled(cfg)) {
/* When going online or busy, publish after changing the presence model. */
linphone_proxy_config_edit(cfg);
linphone_proxy_config_enable_publish(cfg, TRUE);
linphone_proxy_config_done(cfg);
}
}
int linphone_core_get_play_level(LinphoneCore *lc) {
return lc->sound_conf.play_lev;
}

View file

@ -85,6 +85,7 @@ struct _LinphonePresenceModel {
bctbx_list_t *services; /**< A list of _LinphonePresenceService structures. Also named tuples in the RFC. */
bctbx_list_t *persons; /**< A list of _LinphonePresencePerson structures. */
bctbx_list_t *notes; /**< A list of _LinphonePresenceNote structures. */
bool_t is_online;
};
BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphonePresenceModel);
@ -116,16 +117,6 @@ static char * generate_presence_id(void) {
return ms_strdup(id);
}
static const char * presence_basic_status_to_string(LinphonePresenceBasicStatus basic_status) {
switch (basic_status) {
case LinphonePresenceBasicStatusOpen:
return "open";
case LinphonePresenceBasicStatusClosed:
default:
return "closed";
}
}
static void presence_note_uninit(LinphonePresenceNote *note) {
ms_free(note->content);
if (note->lang != NULL) {
@ -280,6 +271,7 @@ static void presence_model_uninit(LinphonePresenceModel *model) {
LinphonePresenceModel * linphone_presence_model_new_with_activity(LinphonePresenceActivityType acttype, const char *description) {
LinphonePresenceModel *model = linphone_presence_model_new();
if (model != NULL) {
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusOpen);
linphone_presence_model_set_activity(model, acttype, description);
}
return model;
@ -288,6 +280,7 @@ LinphonePresenceModel * linphone_presence_model_new_with_activity(LinphonePresen
LinphonePresenceModel * linphone_presence_model_new_with_activity_and_note(LinphonePresenceActivityType acttype, const char *description, const char *note, const char *lang) {
LinphonePresenceModel *model = linphone_presence_model_new();
if (model != NULL) {
linphone_presence_model_set_basic_status(model, LinphonePresenceBasicStatusOpen);
linphone_presence_model_set_activity(model, acttype, description);
linphone_presence_model_add_note(model, note, lang);
}
@ -393,26 +386,11 @@ LinphonePresenceActivity * linphone_presence_model_get_activity(const LinphonePr
}
int linphone_presence_model_set_activity(LinphonePresenceModel *model, LinphonePresenceActivityType acttype, const char *description) {
LinphonePresenceBasicStatus basic_status = LinphonePresenceBasicStatusOpen;
LinphonePresenceActivity *activity;
int err = 0;
if (model == NULL) return -1;
switch (acttype) {
case LinphonePresenceActivityAppointment:
case LinphonePresenceActivityBusy:
case LinphonePresenceActivityMeeting:
case LinphonePresenceActivityPermanentAbsence:
case LinphonePresenceActivityOffline:
case LinphonePresenceActivityWorship:
basic_status = LinphonePresenceBasicStatusClosed;
break;
default:
basic_status = LinphonePresenceBasicStatusOpen;
break;
}
if (linphone_presence_model_set_basic_status(model, basic_status) < 0) return -1;
linphone_presence_model_clear_activities(model);
activity = linphone_presence_activity_new(acttype, description);
if (activity == NULL) return -1;
@ -704,6 +682,19 @@ const LinphoneAddress * linphone_presence_model_get_presentity(const LinphonePre
return model->presentity;
}
LinphoneConsolidatedPresence linphone_presence_model_get_consolidated_presence(const LinphonePresenceModel *model) {
LinphonePresenceBasicStatus basic_status;
if (linphone_presence_model_is_online(model)) return LinphoneConsolidatedPresenceOnline;
basic_status = linphone_presence_model_get_basic_status(model);
if (basic_status == LinphonePresenceBasicStatusClosed) {
unsigned int nb_activities = linphone_presence_model_get_nb_activities(model);
if (nb_activities == 0) return LinphoneConsolidatedPresenceOffline;
else return LinphoneConsolidatedPresenceDoNotDisturb;
}
return LinphoneConsolidatedPresenceBusy;
}
BELLE_SIP_INSTANCIATE_VPTR(
LinphonePresenceModel,
belle_sip_object_t,
@ -717,6 +708,16 @@ BELLE_SIP_INSTANCIATE_VPTR(
* PRESENCE SERVICE FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES *
****************************************************************************/
char * linphone_presence_basic_status_to_string(LinphonePresenceBasicStatus basic_status) {
switch (basic_status) {
case LinphonePresenceBasicStatusOpen:
return ms_strdup("open");
case LinphonePresenceBasicStatusClosed:
default:
return ms_strdup("closed");
}
}
LinphonePresenceService * linphone_presence_service_new(const char *id, LinphonePresenceBasicStatus basic_status, const char *contact) {
LinphonePresenceService *service;
char *service_id;
@ -993,23 +994,13 @@ LinphonePresenceActivity * linphone_presence_activity_new(LinphonePresenceActivi
char * linphone_presence_activity_to_string(const LinphonePresenceActivity *activity) {
LinphonePresenceActivityType acttype = linphone_presence_activity_get_type(activity);
const char *description = linphone_presence_activity_get_description(activity);
const char *acttype_str;
if (acttype == LinphonePresenceActivityOffline)
acttype_str = "offline";
else if (acttype == LinphonePresenceActivityOnline)
acttype_str = "online";
else
acttype_str = presence_activity_type_to_string(acttype);
const char *acttype_str = acttype_str = presence_activity_type_to_string(acttype);
return ms_strdup_printf("%s%s%s", acttype_str,
(description == NULL) ? "" : ": ",
(description == NULL) ? "" : description);
}
LinphonePresenceActivityType linphone_presence_activity_get_type(const LinphonePresenceActivity *activity) {
if (activity == NULL)
return LinphonePresenceActivityOffline;
return activity->type;
}
@ -1264,6 +1255,11 @@ static int process_pidf_xml_presence_services(xmlparsing_context_t *xml_ctx, Lin
return -1;
}
snprintf(xpath_str, sizeof(xpath_str), "%s[%i]/pidf:status/pidfonline:online", service_prefix, i);
if (linphone_get_xml_xpath_object_for_node_list(xml_ctx, xpath_str) != NULL) {
model->is_online = TRUE;
}
snprintf(xpath_str, sizeof(xpath_str), "%s[%i]/pidf:timestamp", service_prefix, i);
timestamp_str = linphone_get_xml_text_content(xml_ctx, xpath_str);
@ -1480,6 +1476,7 @@ static LinphonePresenceModel * process_pidf_xml_presence_notification(xmlparsing
xmlXPathRegisterNs(xml_ctx->xpath_ctx, (const xmlChar *)"pidf", (const xmlChar *)"urn:ietf:params:xml:ns:pidf");
xmlXPathRegisterNs(xml_ctx->xpath_ctx, (const xmlChar *)"dm", (const xmlChar *)"urn:ietf:params:xml:ns:pidf:data-model");
xmlXPathRegisterNs(xml_ctx->xpath_ctx, (const xmlChar *)"rpid", (const xmlChar *)"urn:ietf:params:xml:ns:pidf:rpid");
xmlXPathRegisterNs(xml_ctx->xpath_ctx, (const xmlChar *)"pidfonline", (const xmlChar *)"http://www.linphone.org/xsds/pidfonline.xsd");
err = process_pidf_xml_presence_services(xml_ctx, model);
if (err == 0) {
err = process_pidf_xml_presence_persons(xml_ctx, model);
@ -1525,8 +1522,13 @@ void linphone_core_reject_subscriber(LinphoneCore *lc, LinphoneFriend *lf){
}
void linphone_core_notify_all_friends(LinphoneCore *lc, LinphonePresenceModel *presence){
char *activity_str;
LinphonePresenceActivity *activity = linphone_presence_model_get_activity(presence);
char *activity_str = linphone_presence_activity_to_string(activity);
if (activity == NULL) {
activity_str = linphone_presence_basic_status_to_string(linphone_presence_model_get_basic_status(presence));
} else {
activity_str = linphone_presence_activity_to_string(activity);
}
LinphoneFriendList *lfl = linphone_core_get_default_friend_list(lc);
ms_message("Notifying all friends that we are [%s]", activity_str);
if (activity_str != NULL) ms_free(activity_str);
@ -1612,6 +1614,7 @@ void linphone_notify_parse_presence(const char *content_type, const char *conten
struct _presence_service_obj_st {
xmlTextWriterPtr writer;
const char *contact;
bool_t online;
int *err;
};
@ -1663,7 +1666,7 @@ static int write_xml_presence_timestamp(xmlTextWriterPtr writer, time_t timestam
return err;
}
static int write_xml_presence_service(xmlTextWriterPtr writer, LinphonePresenceService *service, const char *contact) {
static int write_xml_presence_service(xmlTextWriterPtr writer, LinphonePresenceService *service, const char *contact, bool_t online) {
int err = xmlTextWriterStartElement(writer, (const xmlChar *)"tuple");
if (err >= 0) {
if ((service == NULL) || (service->id == NULL)) {
@ -1678,9 +1681,20 @@ static int write_xml_presence_service(xmlTextWriterPtr writer, LinphonePresenceS
err = xmlTextWriterStartElement(writer, (const xmlChar *)"status");
}
if (err >= 0) {
char *basic_status_str;
LinphonePresenceBasicStatus basic_status = LinphonePresenceBasicStatusClosed;
if (service != NULL) basic_status = service->status;
err = xmlTextWriterWriteElement(writer, (const xmlChar *)"basic", (const xmlChar *)presence_basic_status_to_string(basic_status));
basic_status_str = linphone_presence_basic_status_to_string(basic_status);
err = xmlTextWriterWriteElement(writer, (const xmlChar *)"basic", (const xmlChar *)basic_status_str);
ms_free(basic_status_str);
}
if (online) {
if (err >= 0) {
err = xmlTextWriterStartElementNS(writer, (const xmlChar *)"pidfonline", (const xmlChar *)"online", NULL);
}
if (err >= 0) {
err = xmlTextWriterEndElement(writer);
}
}
if (err >= 0) {
/* Close the "status" element. */
@ -1724,17 +1738,9 @@ static int write_xml_presence_service(xmlTextWriterPtr writer, LinphonePresenceS
return err;
}
static bool_t is_valid_activity(LinphonePresenceActivity *activity) {
if ((activity->type == LinphonePresenceActivityOffline) || (activity->type == LinphonePresenceActivityOnline))
return FALSE;
return TRUE;
}
static int write_xml_presence_activity(xmlTextWriterPtr writer, LinphonePresenceActivity *activity) {
int err;
if (is_valid_activity(activity) == FALSE) return 0;
err = xmlTextWriterStartElementNS(writer, (const xmlChar *)"rpid",
(const xmlChar *)presence_activity_type_to_string(activity->type), NULL);
if ((err >= 0) && (activity->description != NULL)) {
@ -1751,21 +1757,9 @@ static void write_xml_presence_activity_obj(LinphonePresenceActivity *activity,
if (err < 0) *st->err = err;
}
static void person_has_valid_activity(LinphonePresenceActivity *activity, bool_t *has_valid_activities) {
if (is_valid_activity(activity) == TRUE) *has_valid_activities = TRUE;
}
static bool_t person_has_valid_activities(LinphonePresencePerson *person) {
bool_t has_valid_activities = FALSE;
bctbx_list_for_each2(person->activities, (MSIterate2Func)person_has_valid_activity, &has_valid_activities);
return has_valid_activities;
}
static int write_xml_presence_person(xmlTextWriterPtr writer, LinphonePresencePerson *person) {
int err;
if ((person_has_valid_activities(person) == FALSE) && (person->notes == NULL)) return 0;
err = xmlTextWriterStartElementNS(writer, (const xmlChar *)"dm", (const xmlChar *)"person", NULL);
if (err >= 0) {
if (person->id == NULL) {
@ -1776,7 +1770,7 @@ static int write_xml_presence_person(xmlTextWriterPtr writer, LinphonePresencePe
err = xmlTextWriterWriteAttribute(writer, (const xmlChar *)"id", (const xmlChar *)person->id);
}
}
if ((err >= 0) && ((person->activities_notes != NULL) || (person_has_valid_activities(person) == TRUE))) {
if ((err >= 0) && ((person->activities_notes != NULL) || (person->activities != NULL))) {
err = xmlTextWriterStartElementNS(writer, (const xmlChar *)"rpid", (const xmlChar *)"activities", NULL);
if ((err >= 0) && (person->activities_notes != NULL)) {
struct _presence_note_obj_st st;
@ -1814,7 +1808,7 @@ static int write_xml_presence_person(xmlTextWriterPtr writer, LinphonePresencePe
}
static void write_xml_presence_service_obj(LinphonePresenceService *service, struct _presence_service_obj_st *st) {
int err = write_xml_presence_service(st->writer, service, st->contact);
int err = write_xml_presence_service(st->writer, service, st->contact, st->online);
if (err < 0) *st->err = err;
}
@ -1823,6 +1817,14 @@ static void write_xml_presence_person_obj(LinphonePresencePerson *person, struct
if (err < 0) *st->err = err;
}
bool_t linphone_presence_model_is_online(const LinphonePresenceModel *model) {
if ((model->is_online == TRUE)
|| ((linphone_presence_model_get_basic_status(model) == LinphonePresenceBasicStatusOpen)
&& (linphone_presence_model_get_nb_activities(model) == 0)))
return TRUE;
return FALSE;
}
char *linphone_presence_model_to_xml(LinphonePresenceModel *model) {
xmlBufferPtr buf = NULL;
xmlTextWriterPtr writer = NULL;
@ -1855,22 +1857,27 @@ char *linphone_presence_model_to_xml(LinphonePresenceModel *model) {
}
if (err >= 0) {
err = xmlTextWriterWriteAttributeNS(writer, (const xmlChar *)"xmlns", (const xmlChar *)"dm",
NULL, (const xmlChar *)"urn:ietf:params:xml:ns:pidf:data-model");
NULL, (const xmlChar *)"urn:ietf:params:xml:ns:pidf:data-model");
}
if (err >= 0) {
err = xmlTextWriterWriteAttributeNS(writer, (const xmlChar *)"xmlns", (const xmlChar *)"rpid",
NULL, (const xmlChar *)"urn:ietf:params:xml:ns:pidf:rpid");
NULL, (const xmlChar *)"urn:ietf:params:xml:ns:pidf:rpid");
}
if ((err >= 0) && linphone_presence_model_is_online(model)) {
err = xmlTextWriterWriteAttributeNS(writer, (const xmlChar *)"xmlns", (const xmlChar *)"pidfonline",
NULL, (const xmlChar *)"http://www.linphone.org/xsds/pidfonline.xsd");
}
if (err >= 0) {
err = xmlTextWriterWriteAttribute(writer, (const xmlChar *)"entity", (const xmlChar *)contact);
}
if (err >= 0) {
if ((model == NULL) || (model->services == NULL)) {
err = write_xml_presence_service(writer, NULL, contact);
err = write_xml_presence_service(writer, NULL, contact, FALSE);
} else {
struct _presence_service_obj_st st={0};
st.writer = writer;
st.contact = contact; /*default value*/
st.online = linphone_presence_model_is_online(model);
st.err = &err;
bctbx_list_for_each2(model->services, (MSIterate2Func)write_xml_presence_service_obj, &st);
}
@ -1911,7 +1918,14 @@ void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeStatus ss, Sa
char *tmp;
LinphoneFriend *lf = NULL;
const LinphoneAddress *friend=NULL;
LinphonePresenceModel *presence = model ? (LinphonePresenceModel *)model:linphone_presence_model_new_with_activity(LinphonePresenceActivityOffline, NULL);
LinphonePresenceModel *presence;
if (model != NULL) {
presence = (LinphonePresenceModel *)model;
} else {
presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusClosed);
}
if (linphone_core_get_default_friend_list(lc) != NULL)
lf=linphone_core_find_friend_by_out_subscribe(lc, op);
@ -1926,7 +1940,11 @@ void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeStatus ss, Sa
friend=linphone_friend_get_address(lf);
if (friend != NULL) {
tmp=linphone_address_as_string(friend);
activity_str = linphone_presence_activity_to_string(activity);
if (activity == NULL) {
activity_str = linphone_presence_basic_status_to_string(linphone_presence_model_get_basic_status(presence));
} else {
activity_str = linphone_presence_activity_to_string(activity);
}
ms_message("We are notified that [%s] has presence [%s]", tmp, activity_str);
if (activity_str != NULL) ms_free(activity_str);
ms_free(tmp);

View file

@ -853,7 +853,7 @@ int linphone_proxy_config_send_publish(LinphoneProxyConfig *proxy, LinphonePrese
}
if (!(presence_body = linphone_presence_model_to_xml(presence))) {
ms_error("Cannot publish presence model [%p] for proxy config [%p] because of xml serilization error",presence,proxy);
ms_error("Cannot publish presence model [%p] for proxy config [%p] because of xml serialization error",presence,proxy);
return -1;
}

View file

@ -4813,6 +4813,20 @@ LINPHONE_PUBLIC LinphoneOnlineStatus linphone_core_get_presence_info(const Linph
*/
LINPHONE_PUBLIC LinphonePresenceModel * linphone_core_get_presence_model(const LinphoneCore *lc);
/**
* Get my consolidated presence
* @param[in] lc LinphoneCore object
* @return My consolidated presence
*/
LINPHONE_PUBLIC LinphoneConsolidatedPresence linphone_core_get_consolidated_presence(const LinphoneCore *lc);
/**
* Set my consolidated presence
* @param[in] lc LinphoneCore object
* @param[in] presence LinphoneConsolidatedPresence value
*/
LINPHONE_PUBLIC void linphone_core_set_consolidated_presence(LinphoneCore *lc, LinphoneConsolidatedPresence presence);
/**
* @deprecated Use linphone_core_interpret_url() instead
*/

View file

@ -209,6 +209,13 @@ LINPHONE_PUBLIC LinphoneSubscriptionState linphone_friend_get_subscription_state
*/
LINPHONE_PUBLIC const LinphonePresenceModel * linphone_friend_get_presence_model(const LinphoneFriend *lf);
/**
* Get the consolidated presence of a friend.
* @param[in] lf LinphoneFriend object
* @return The consolidated presence of the friend
*/
LINPHONE_PUBLIC LinphoneConsolidatedPresence linphone_friend_get_consolidated_presence(const LinphoneFriend *lf);
/**
* Get the presence model for a specific SIP URI or phone number of a friend
* @param[in] lf A #LinphoneFriend object

View file

@ -195,6 +195,13 @@ LINPHONE_PUBLIC int linphone_presence_model_add_note(LinphonePresenceModel *mode
*/
LINPHONE_PUBLIC int linphone_presence_model_clear_notes(LinphonePresenceModel *model);
/**
* Get the consolidated presence from a presence model.
* @param[in] model LinphonePresenceModel object
* @return The LinphoneConsolidatedPresence corresponding to the presence model
*/
LINPHONE_PUBLIC LinphoneConsolidatedPresence linphone_presence_model_get_consolidated_presence(const LinphonePresenceModel *model);
/*****************************************************************************
* PRESENCE MODEL FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES *
@ -270,11 +277,30 @@ LINPHONE_PUBLIC int linphone_presence_model_add_person(LinphonePresenceModel *mo
*/
LINPHONE_PUBLIC int linphone_presence_model_clear_persons(LinphonePresenceModel *model);
/**
* Tells whether a presence model is considered online.
* It is any of theses cases:
* - basic status is'open' and no activities
* - explicit 'online' tag in the status
* @param[in] model LinphonePresenceModel object
* @return A boolean value telling whether the presence model is considered online or not.
*/
LINPHONE_PUBLIC bool_t linphone_presence_model_is_online(const LinphonePresenceModel *model);
/*****************************************************************************
* PRESENCE SERVICE FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES *
****************************************************************************/
/**
* Gets the string representation of a presence basic status.
* @param[in] basic_status A LinphonePresenceBasicStatus for which to get a string representation.
* @return A pointer a dynamically allocated string representing the given basic status.
*
* The returned string is to be freed by calling ms_free().
*/
char * linphone_presence_basic_status_to_string(LinphonePresenceBasicStatus basic_status);
/**
* Creates a presence service.
* @param[in] id The id of the presence service to be created. Can be NULL to generate it automatically.

View file

@ -339,6 +339,20 @@ typedef enum _LinphoneConfiguringState {
LinphoneConfiguringSkipped
} LinphoneConfiguringState;
/**
* Consolidated presence information: 'online' means the user is open for communication,
* 'busy' means the user is open for communication but involved in an other activity,
* 'do not disturb' means the user is not open for communication, and 'offline' means
* that no presence information is available.
* @ingroup buddy_list
*/
typedef enum _LinphoneConsolidatedPresence {
LinphoneConsolidatedPresenceOnline,
LinphoneConsolidatedPresenceBusy,
LinphoneConsolidatedPresenceDoNotDisturb,
LinphoneConsolidatedPresenceOffline
} LinphoneConsolidatedPresence;
typedef struct _LinphoneContactProvider LinphoneContactProvider;
typedef struct _LinphoneContactSearch LinphoneContactSearch;
@ -617,12 +631,6 @@ typedef struct _LinphonePresenceActivity LinphonePresenceActivity;
* @ingroup buddy_list
*/
typedef enum LinphonePresenceActivityType {
/** This value is not defined in the RFC, it corresponds to no activity with a basic status of "closed". */
LinphonePresenceActivityOffline,
/** This value is not defined in the RFC, it corresponds to no activity with a basic status of "open". */
LinphonePresenceActivityOnline,
/** The person has a calendar appointment, without specifying exactly of what type. This activity is
* indicated if more detailed information is not available or the person chooses not to reveal more
* information. */

9
share/xml/pidfonline.xsd Normal file
View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.linphone.org/xsds/pidfonline.xsd"
xmlns:tns="http://www.linphone.org/xsds/pidfonline.xsd"
elementFormDefault="qualified">
<xs:element name="online" type="empty"></xs:element>
</xs:schema>

View file

@ -65,6 +65,7 @@ static void simple(void) {
linphone_core_add_friend(marie->lc, f);
linphone_core_set_presence_model(pauline->lc, pauline_presence);
linphone_presence_model_unref(pauline_presence);
BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityDinner,1));
activity = linphone_presence_model_get_activity(linphone_friend_get_presence_model(f));
@ -103,10 +104,13 @@ static void fast_activity_change(void) {
/* pauline_Presence activity without description. */
pauline_presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityDinner, NULL);
linphone_core_set_presence_model(pauline->lc, pauline_presence);
linphone_presence_model_unref(pauline_presence);
pauline_presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityTV, NULL);
linphone_core_set_presence_model(pauline->lc, pauline_presence);
linphone_presence_unref(pauline_presence);
pauline_presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityAway, NULL);
linphone_core_set_presence_model(pauline->lc, pauline_presence);
linphone_presence_unref(pauline_presence);
BC_ASSERT_TRUE(wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityDinner,1));
activity = linphone_presence_model_get_activity(linphone_friend_get_presence_model(f));
@ -166,6 +170,7 @@ static void subscriber_no_longer_reachable(void){
presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityBusy,NULL);
linphone_core_set_presence_model(pauline1->lc,presence);
linphone_presence_model_unref(presence);
previous_number_of_LinphonePresenceActivityOnline=marie->stat.number_of_LinphonePresenceActivityOnline;
@ -185,8 +190,10 @@ static void subscriber_no_longer_reachable(void){
* The client handles this subscription terminated event.
* It will not resubmit a new SUBSCRIBE until expiration of the current one.
*/
presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityOnline,NULL);
presence =linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusOpen);
linphone_core_set_presence_model(pauline1->lc,presence);
linphone_presence_model_unref(presence);
/*because subscription is not restarted, the online status shall not be notified again.*/
BC_ASSERT_FALSE(wait_for_list(lcs,&marie->stat.number_of_LinphonePresenceActivityOnline,previous_number_of_LinphonePresenceActivityOnline+1, 8000));
@ -225,6 +232,7 @@ static void subscribe_with_late_publish(void) {
/*enable publish*/
presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityPresentation,NULL);
linphone_core_set_presence_model(marie->lc,presence);
linphone_presence_model_unref(presence);
proxy = linphone_core_get_default_proxy_config(marie->lc);
linphone_proxy_config_edit(proxy);
@ -237,6 +245,7 @@ static void subscribe_with_late_publish(void) {
presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityBusy,NULL);
linphone_core_set_presence_model(marie->lc,presence);
linphone_presence_model_unref(presence);
/*wait for new status*/
BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphonePresenceActivityBusy,1,2000));
@ -258,9 +267,15 @@ static void subscribe_with_late_publish(void) {
BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphonePresenceActivityBusy,3,5000));/*re- schedule marie to clean up things*/
/*simulate a rapid presence change to make sure only first and last are transmited*/
linphone_core_set_presence_model(marie->lc,linphone_presence_model_new_with_activity(LinphonePresenceActivityAway,NULL));
linphone_core_set_presence_model(marie->lc,linphone_presence_model_new_with_activity(LinphonePresenceActivityBreakfast,NULL));
linphone_core_set_presence_model(marie->lc,linphone_presence_model_new_with_activity(LinphonePresenceActivityAppointment,NULL));
presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityAway,NULL);
linphone_core_set_presence_model(marie->lc, presence);
linphone_presence_model_unref(presence);
presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityBreakfast,NULL);
linphone_core_set_presence_model(marie->lc, presence);
linphone_presence_model_unref(presence);
presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityAppointment,NULL);
linphone_core_set_presence_model(marie->lc, presence);
linphone_presence_model_unref(presence);
BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphonePresenceActivityAppointment,1,5000));
@ -324,6 +339,7 @@ static void test_forked_subscribe_notify_publish(void) {
presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityBusy,NULL);
linphone_core_set_presence_model(marie->lc,presence);
linphone_presence_model_unref(presence);
/*wait for new status*/
wait_for_list(lcs,&pauline->stat.number_of_LinphonePresenceActivityBusy,1,3000);
@ -332,6 +348,7 @@ static void test_forked_subscribe_notify_publish(void) {
presence =linphone_presence_model_new_with_activity( LinphonePresenceActivityMeeting,NULL);
linphone_core_set_presence_model(marie2->lc,presence);
linphone_presence_model_unref(presence);
/*wait for new status*/
BC_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphonePresenceActivityMeeting,1,3000));
@ -353,6 +370,7 @@ static void test_presence_list_base(bool_t enable_compression) {
const char *marie_identity;
const char *pauline_identity;
bctbx_list_t* lcs = NULL;
LinphonePresenceModel *presence;
laure_identity = get_identity(laure);
marie_identity = get_identity(marie);
@ -364,8 +382,12 @@ static void test_presence_list_base(bool_t enable_compression) {
enable_deflate_content_encoding(pauline, enable_compression);
enable_deflate_content_encoding(laure, enable_compression);
linphone_core_set_presence_model(marie->lc, linphone_core_create_presence_model_with_activity(marie->lc, LinphonePresenceActivityBusy, NULL));
linphone_core_set_presence_model(pauline->lc, linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL));
presence = linphone_core_create_presence_model_with_activity(marie->lc, LinphonePresenceActivityBusy, NULL);
linphone_core_set_presence_model(marie->lc, presence);
linphone_presence_model_unref(presence);
presence = linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
lfl = linphone_core_create_friend_list(laure->lc);
linphone_friend_list_set_rls_uri(lfl, rls_uri);
@ -381,7 +403,10 @@ static void test_presence_list_base(bool_t enable_compression) {
linphone_core_remove_friend_list(laure->lc, linphone_core_get_default_friend_list(laure->lc));
linphone_core_add_friend_list(laure->lc, lfl);
linphone_friend_list_unref(lfl);
linphone_core_set_presence_model(laure->lc, linphone_core_create_presence_model_with_activity(laure->lc, LinphonePresenceActivityOnline, NULL));
presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusOpen);
linphone_core_set_presence_model(laure->lc, presence);
linphone_presence_model_unref(presence);
lcs = bctbx_list_append(lcs, laure->lc);
lcs = bctbx_list_append(lcs, marie->lc);
@ -434,7 +459,9 @@ static void test_presence_list_base(bool_t enable_compression) {
BC_ASSERT_EQUAL(linphone_friend_get_status(lf), LinphoneStatusBusy, int, "%d");
if (!BC_ASSERT_TRUE(lf->presence_received)) goto end;
linphone_core_set_presence_model(marie->lc, linphone_core_create_presence_model_with_activity(marie->lc, LinphonePresenceActivityOnThePhone, NULL));
presence = linphone_core_create_presence_model_with_activity(marie->lc, LinphonePresenceActivityOnThePhone, NULL);
linphone_core_set_presence_model(marie->lc, presence);
linphone_presence_model_unref(presence);
wait_for_list(lcs, &laure->stat.number_of_NotifyPresenceReceived, 4, 4000);
/* The number of PresenceReceived events can be 3 or 4 here. TODO: ideally it should always be 3. */
@ -513,10 +540,13 @@ static void test_presence_list_subscribe_before_publish(void) {
const char *pauline_identity;
bctbx_list_t* lcs = NULL;
int dummy = 0;
LinphonePresenceModel *presence;
pauline_identity = get_identity(pauline);
linphone_core_set_presence_model(pauline->lc, linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL));
presence = linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_unref(presence);
lfl = linphone_core_create_friend_list(laure->lc);
linphone_friend_list_set_rls_uri(lfl, rls_uri);
@ -527,7 +557,10 @@ static void test_presence_list_subscribe_before_publish(void) {
linphone_core_remove_friend_list(laure->lc, linphone_core_get_default_friend_list(laure->lc));
linphone_core_add_friend_list(laure->lc, lfl);
linphone_friend_list_unref(lfl);
linphone_core_set_presence_model(laure->lc, linphone_core_create_presence_model_with_activity(laure->lc, LinphonePresenceActivityOnline, NULL));
presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusOpen);
linphone_core_set_presence_model(laure->lc, presence);
linphone_presence_model_unref(presence);
linphone_friend_list_update_subscriptions(linphone_core_get_default_friend_list(laure->lc), NULL, FALSE);
lcs = bctbx_list_append(lcs, laure->lc);
@ -586,12 +619,14 @@ static void test_presence_list_subscribe_with_error(bool_t io_error) {
const char *pauline_identity;
bctbx_list_t* lcs = NULL;
int dummy = 0;
LinphonePresenceModel *presence;
lp_config_set_int(laure->lc->config, "sip", "rls_presence_expires", 5);
pauline_identity = get_identity(pauline);
linphone_core_set_presence_model(pauline->lc, linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL));
presence = linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
lfl = linphone_core_create_friend_list(laure->lc);
linphone_friend_list_set_rls_uri(lfl, rls_uri);
@ -604,7 +639,10 @@ static void test_presence_list_subscribe_with_error(bool_t io_error) {
linphone_core_remove_friend_list(laure->lc, linphone_core_get_default_friend_list(laure->lc));
linphone_core_add_friend_list(laure->lc, lfl);
linphone_friend_list_unref(lfl);
linphone_core_set_presence_model(laure->lc, linphone_core_create_presence_model_with_activity(laure->lc, LinphonePresenceActivityOnline, NULL));
presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusOpen);
linphone_core_set_presence_model(laure->lc, presence);
linphone_presence_model_unref(presence);
linphone_friend_list_update_subscriptions(linphone_core_get_default_friend_list(laure->lc));
lcs = bctbx_list_append(lcs, laure->lc);
lcs = bctbx_list_append(lcs, pauline->lc);
@ -640,7 +678,9 @@ static void test_presence_list_subscribe_with_error(bool_t io_error) {
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));
presence = linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityAway, NULL);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
BC_ASSERT_TRUE(wait_for_until(laure->lc, pauline->lc, &laure->stat.number_of_LinphonePresenceActivityAway, 1, 6000));
lf = linphone_friend_list_find_friend_by_uri(linphone_core_get_default_friend_list(laure->lc), pauline_identity);
@ -667,12 +707,14 @@ static void presence_list_subscribe_network_changes(void) {
const char *pauline_identity;
bctbx_list_t* lcs = NULL;
int dummy = 0;
LinphonePresenceModel *presence;
lp_config_set_int(laure->lc->config, "sip", "rls_presence_expires", 5);
pauline_identity = get_identity(pauline);
linphone_core_set_presence_model(pauline->lc, linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL));
presence = linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityVacation, NULL);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
lfl = linphone_core_create_friend_list(laure->lc);
linphone_friend_list_set_rls_uri(lfl, rls_uri);
@ -685,7 +727,10 @@ static void presence_list_subscribe_network_changes(void) {
linphone_core_remove_friend_list(laure->lc, linphone_core_get_default_friend_list(laure->lc));
linphone_core_add_friend_list(laure->lc, lfl);
linphone_friend_list_unref(lfl);
linphone_core_set_presence_model(laure->lc, linphone_core_create_presence_model_with_activity(laure->lc, LinphonePresenceActivityOnline, NULL));
presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusOpen);
linphone_core_set_presence_model(laure->lc, presence);
linphone_presence_model_unref(presence);
linphone_friend_list_update_subscriptions(linphone_core_get_default_friend_list(laure->lc));
lcs = bctbx_list_append(lcs, laure->lc);
lcs = bctbx_list_append(lcs, pauline->lc);
@ -715,7 +760,9 @@ static void presence_list_subscribe_network_changes(void) {
/*a new subscribe should be sent */
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));
presence = linphone_core_create_presence_model_with_activity(pauline->lc, LinphonePresenceActivityAway, NULL);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
BC_ASSERT_TRUE(wait_for_until(laure->lc, pauline->lc, &laure->stat.number_of_LinphonePresenceActivityAway, 1, 6000));
lf = linphone_friend_list_find_friend_by_uri(linphone_core_get_default_friend_list(laure->lc), pauline_identity);

View file

@ -72,10 +72,6 @@ void notify_presence_received(LinphoneCore *lc, LinphoneFriend * lf) {
for (i=0;counters->last_received_presence&&i<linphone_presence_model_get_nb_activities(counters->last_received_presence); i++) {
LinphonePresenceActivity *activity = linphone_presence_model_get_nth_activity(counters->last_received_presence, i);
switch (linphone_presence_activity_get_type(activity)) {
case LinphonePresenceActivityOffline:
counters->number_of_LinphonePresenceActivityOffline++; break;
case LinphonePresenceActivityOnline:
counters->number_of_LinphonePresenceActivityOnline++; break;
case LinphonePresenceActivityAppointment:
counters->number_of_LinphonePresenceActivityAppointment++; break;
case LinphonePresenceActivityAway:
@ -167,8 +163,10 @@ static void simple_publish_with_expire(int expires) {
BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,1));
BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,1));
presence =linphone_presence_model_new_with_activity(LinphonePresenceActivityOffline,NULL);
presence = linphone_presence_model_new();
linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusClosed);
linphone_core_set_presence_model(marie->lc,presence);
linphone_presence_model_unref(presence);
BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,2));
BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,2));
@ -401,6 +399,7 @@ static void presence_information(void) {
/* Presence activity without description. */
presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityDinner, NULL);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityDinner,1);
BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityDinner, 1, int, "%d");
activity = linphone_presence_model_get_activity(marie->stat.last_received_presence);
@ -412,6 +411,7 @@ static void presence_information(void) {
/* Presence activity with description. */
presence = linphone_presence_model_new_with_activity(LinphonePresenceActivitySteering, bike_description);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivitySteering,1);
BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivitySteering, 1, int, "%d");
activity = linphone_presence_model_get_activity(marie->stat.last_received_presence);
@ -424,6 +424,7 @@ static void presence_information(void) {
/* Presence activity with description and note. */
presence = linphone_presence_model_new_with_activity_and_note(LinphonePresenceActivityVacation, NULL, vacation_note, vacation_lang);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityVacation,1);
BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityVacation, 1, int, "%d");
activity = linphone_presence_model_get_activity(marie->stat.last_received_presence);
@ -445,6 +446,7 @@ static void presence_information(void) {
presence = linphone_presence_model_new_with_activity(LinphonePresenceActivityOnThePhone, NULL);
linphone_presence_model_set_contact(presence, contact);
linphone_core_set_presence_model(pauline->lc, presence);
linphone_presence_model_unref(presence);
wait_for(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePresenceActivityOnThePhone,1);
BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityOnThePhone, 1, int, "%d");
contact2 = linphone_presence_model_get_contact(presence);
@ -462,6 +464,7 @@ static void presence_information(void) {
BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePresenceActivityShopping, 1, int, "%d");
presence_timestamp = linphone_presence_model_get_timestamp(presence);
BC_ASSERT_GREATER((unsigned)presence_timestamp , (unsigned)current_timestamp, unsigned, "%u");
linphone_presence_model_unref(presence);
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);