Commit 0370aa9e authored by Sylvain Berfini's avatar Sylvain Berfini 🎩

Added new callback for synchronization done + fixed small issue: when contact...

Added new callback for synchronization done + fixed small issue: when contact was removed from the server, it was trying to remove it again
parent 9cec5641
......@@ -133,7 +133,7 @@ static void linphone_carddav_vcards_pulled(LinphoneCardDavContext *cdc, MSList *
}
}
ms_list_free(vCards);
linphone_carddav_sync_done(cdc, TRUE, "");
linphone_carddav_sync_done(cdc, TRUE, NULL);
}
static MSList* parse_vcards_from_xml_response(const char *body) {
......@@ -342,7 +342,7 @@ static void process_response_from_carddav_request(void *data, const belle_http_r
}
linphone_vcard_set_etag(lvc, etag);
linphone_carddav_sync_done(query->context, TRUE, "");
linphone_carddav_sync_done(query->context, TRUE, NULL);
linphone_friend_unref(lf);
} else {
// For some reason, server didn't return the eTag of the updated/created vCard
......@@ -362,7 +362,7 @@ static void process_response_from_carddav_request(void *data, const belle_http_r
}
break;
case LinphoneCardDavQueryTypeDelete:
linphone_carddav_sync_done(query->context, TRUE, "");
linphone_carddav_sync_done(query->context, TRUE, NULL);
break;
default:
ms_error("Unknown request: %i", query->type);
......
......@@ -80,6 +80,14 @@ void linphone_friend_list_cbs_set_contact_updated(LinphoneFriendListCbs *cbs, Li
cbs->contact_updated_cb = cb;
}
LinphoneFriendListSyncStateChangedCb linphone_friend_list_cbs_get_sync_status_changed(const LinphoneFriendListCbs *cbs) {
return cbs->sync_state_changed_cb;
}
void linphone_friend_list_cbs_set_sync_status_changed(LinphoneFriendListCbs *cbs, LinphoneFriendListSyncStateChangedCb cb) {
cbs->sync_state_changed_cb = cb;
}
static char * create_resource_list_xml(const LinphoneFriendList *list) {
char *xml_content = NULL;
MSList *elem;
......@@ -425,21 +433,30 @@ LinphoneFriendListStatus linphone_friend_list_import_friend(LinphoneFriendList *
return LinphoneFriendListOK;
}
static void carddav_done(LinphoneCardDavContext *cdc, bool_t success, const char *msg) {
static void carddav_done(LinphoneCardDavContext *cdc, bool_t success, const char *msg) {
if (cdc && cdc->friend_list->cbs->sync_state_changed_cb) {
cdc->friend_list->cbs->sync_state_changed_cb(cdc->friend_list, success ? LinphoneFriendListSyncSuccessful : LinphoneFriendListSyncFailure, msg);
}
linphone_carddav_context_destroy(cdc);
}
LinphoneFriendListStatus linphone_friend_list_remove_friend(LinphoneFriendList *list, LinphoneFriend *lf) {
static LinphoneFriendListStatus _linphone_friend_list_remove_friend(LinphoneFriendList *list, LinphoneFriend *lf, bool_t remove_from_server) {
MSList *elem = ms_list_find(list->friends, lf);
LinphoneCardDavContext *cdc = linphone_carddav_context_new(list);
if (elem == NULL) return LinphoneFriendListNonExistentFriend;
#ifdef FRIENDS_SQL_STORAGE_ENABLED
linphone_core_remove_friend_from_db(lf->lc, lf);
#endif
if (cdc) {
cdc->sync_done_cb = carddav_done;
linphone_carddav_delete_vcard(cdc, lf);
if (remove_from_server) {
LinphoneVCard *lvc = linphone_friend_get_vcard(lf);
if (lvc && linphone_vcard_get_uid(lvc)) {
LinphoneCardDavContext *cdc = linphone_carddav_context_new(list);
cdc->sync_done_cb = carddav_done;
if (cdc->friend_list->cbs->sync_state_changed_cb) {
cdc->friend_list->cbs->sync_state_changed_cb(cdc->friend_list, LinphoneFriendListSyncStarted, NULL);
}
linphone_carddav_delete_vcard(cdc, lf);
}
}
lf->friend_list = NULL;
......@@ -448,6 +465,10 @@ LinphoneFriendListStatus linphone_friend_list_remove_friend(LinphoneFriendList *
return LinphoneFriendListOK;
}
LinphoneFriendListStatus linphone_friend_list_remove_friend(LinphoneFriendList *list, LinphoneFriend *lf) {
return _linphone_friend_list_remove_friend(list, lf, TRUE);
}
const MSList * linphone_friend_list_get_friends(const LinphoneFriendList *list) {
return list->friends;
}
......@@ -461,6 +482,9 @@ void linphone_friend_list_update_dirty_friends(LinphoneFriendList *list) {
while (dirty_friends) {
LinphoneFriend *lf = (LinphoneFriend *)dirty_friends->data;
if (lf) {
if (cdc->friend_list->cbs->sync_state_changed_cb) {
cdc->friend_list->cbs->sync_state_changed_cb(cdc->friend_list, LinphoneFriendListSyncStarted, NULL);
}
linphone_carddav_put_vcard(cdc, lf);
}
dirty_friends = ms_list_next(dirty_friends);
......@@ -482,7 +506,7 @@ static void carddav_created(LinphoneCardDavContext *cdc, LinphoneFriend *lf) {
static void carddav_removed(LinphoneCardDavContext *cdc, LinphoneFriend *lf) {
if (cdc) {
LinphoneFriendList *lfl = cdc->friend_list;
linphone_friend_list_remove_friend(lfl, lf);
_linphone_friend_list_remove_friend(lfl, lf, FALSE);
if (cdc->friend_list->cbs->contact_deleted_cb) {
cdc->friend_list->cbs->contact_deleted_cb(lfl, lf);
}
......@@ -513,6 +537,9 @@ void linphone_friend_list_synchronize_friends_from_server(LinphoneFriendList *li
cdc->contact_removed_cb = carddav_removed;
cdc->contact_updated_cb = carddav_updated;
cdc->sync_done_cb = carddav_done;
if (cdc && cdc->friend_list->cbs->sync_state_changed_cb) {
cdc->friend_list->cbs->sync_state_changed_cb(cdc->friend_list, LinphoneFriendListSyncStarted, NULL);
}
linphone_carddav_synchronize(cdc);
}
}
......
......@@ -49,6 +49,15 @@ typedef enum _LinphoneFriendListStatus {
LinphoneFriendListInvalidFriend
} LinphoneFriendListStatus;
/**
* Enum describing the status of a CardDAV synchronization
*/
typedef enum _LinphoneFriendListSyncStatus {
LinphoneFriendListSyncStarted,
LinphoneFriendListSyncSuccessful,
LinphoneFriendListSyncFailure
} LinphoneFriendListSyncStatus;
/**
* The LinphoneFriendList object representing a list of friends.
**/
......@@ -252,6 +261,11 @@ typedef void (*LinphoneFriendListContactDeletedCb)(LinphoneFriendList *list, Lin
**/
typedef void (*LinphoneFriendListContactUpdatedCb)(LinphoneFriendList *list, LinphoneFriend *new_friend, LinphoneFriend *old_friend);
/**
* Callback used to notify the status of the synchronization has changed
**/
typedef void (*LinphoneFriendListSyncStateChangedCb)(LinphoneFriendList *list, LinphoneFriendListSyncStatus status, const char *msg);
/**
* Get the LinphoneFriendListCbs object associated with a LinphoneFriendList.
* @param[in] request LinphoneXmlRpcRequest object
......@@ -328,6 +342,20 @@ LINPHONE_PUBLIC LinphoneFriendListContactUpdatedCb linphone_friend_list_cbs_get_
**/
LINPHONE_PUBLIC void linphone_friend_list_cbs_set_contact_updated(LinphoneFriendListCbs *cbs, LinphoneFriendListContactUpdatedCb cb);
/**
* Get the sync status changed callback.
* @param[in] cbs LinphoneFriendListCbs object.
* @return The current sync status changedcallback.
**/
LINPHONE_PUBLIC LinphoneFriendListSyncStateChangedCb linphone_friend_list_cbs_get_sync_status_changed(const LinphoneFriendListCbs *cbs);
/**
* Set the contact updated callback.
* @param[in] cbs LinphoneFriendListCbs object.
* @param[in] cb The sync status changed to be used.
**/
LINPHONE_PUBLIC void linphone_friend_list_cbs_set_sync_status_changed(LinphoneFriendListCbs *cbs, LinphoneFriendListSyncStateChangedCb cb);
/**
* Starts a CardDAV synchronization using value set using linphone_friend_list_set_uri.
* @param[in] list LinphoneFriendList object.
......
......@@ -702,6 +702,7 @@ struct _LinphoneFriendListCbs {
LinphoneFriendListContactCreatedCb contact_created_cb;
LinphoneFriendListContactDeletedCb contact_deleted_cb;
LinphoneFriendListContactUpdatedCb contact_updated_cb;
LinphoneFriendListSyncStateChangedCb sync_state_changed_cb;
};
BELLE_SIP_DECLARE_VPTR(LinphoneFriendListCbs);
......
......@@ -439,6 +439,15 @@ static void carddav_contact_updated(LinphoneFriendList *list, LinphoneFriend *ne
stats->updated_contact_count++;
}
static void carddav_sync_status_changed(LinphoneFriendList *list, LinphoneFriendListSyncStatus status, const char *msg) {
LinphoneCardDAVStats *stats = (LinphoneCardDAVStats *)linphone_friend_list_cbs_get_user_data(list->cbs);
char *state = status == LinphoneFriendListSyncStarted ? "Sync started" : (status == LinphoneFriendListSyncFailure ? "Sync failure" : "Sync successful");
ms_message("[CardDAV] %s : %s", state, msg);
if (status == LinphoneFriendListSyncFailure || status == LinphoneFriendListSyncSuccessful) {
stats->sync_done_count++;
}
}
static void carddav_integration(void) {
LinphoneCoreManager *manager = linphone_core_manager_new2("carddav_rc", FALSE);
LinphoneFriendList *lfl = linphone_core_create_friend_list(manager->lc);
......@@ -456,30 +465,34 @@ static void carddav_integration(void) {
linphone_friend_list_cbs_set_contact_created(cbs, carddav_contact_created);
linphone_friend_list_cbs_set_contact_deleted(cbs, carddav_contact_deleted);
linphone_friend_list_cbs_set_contact_updated(cbs, carddav_contact_updated);
linphone_friend_list_cbs_set_sync_status_changed(cbs, carddav_sync_status_changed);
linphone_core_add_friend_list(manager->lc, lfl);
BC_ASSERT_PTR_NULL(linphone_vcard_get_uid(lvc));
BC_ASSERT_EQUAL(ms_list_size(lfl->dirty_friends_to_update), 0, int, "%d");
BC_ASSERT_EQUAL_FATAL(linphone_friend_list_add_friend(lfl, lf), LinphoneFriendListOK, int, "%d");
BC_ASSERT_EQUAL(ms_list_size(lfl->dirty_friends_to_update), 1, int, "%d");
wait_for_until(manager->lc, NULL, NULL, 1, 2000);
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
BC_ASSERT_EQUAL(ms_list_size(lfl->dirty_friends_to_update), 0, int, "%d");
BC_ASSERT_PTR_NOT_NULL(linphone_vcard_get_uid(lvc));
linphone_friend_list_remove_friend(lfl, lf);
BC_ASSERT_EQUAL(ms_list_size(lfl->friends), 0, int, "%d");
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 2, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 2, int, "%i");
linphone_friend_unref(lf);
lf = NULL;
lvc = linphone_vcard_new_from_vcard4_buffer("BEGIN:VCARD\r\nVERSION:4.0\r\nFN:Ghislain Mary\r\nIMPP;TYPE=work:sip:ghislain@sip.linphone.org\r\nEND:VCARD\r\n");
lf = linphone_friend_new_from_vcard(lvc);
BC_ASSERT_EQUAL_FATAL(linphone_friend_list_import_friend(lfl, lf, FALSE), LinphoneFriendListOK, int, "%d");
BC_ASSERT_EQUAL_FATAL(linphone_friend_list_add_local_friend(lfl, lf), LinphoneFriendListOK, int, "%d");
linphone_friend_unref(lf);
lvc2 = linphone_vcard_new_from_vcard4_buffer("BEGIN:VCARD\r\nVERSION:4.0\r\nFN:Sylvain Berfini\r\nIMPP:sip:sberfini@sip.linphone.org\r\nUID:1f08dd48-29ac-4097-8e48-8596d7776283\r\nEND:VCARD\r\n");
linphone_vcard_set_url(lvc2, "/sabredav/addressbookserver.php/addressbooks/sylvain/default/me.vcf");
lf2 = linphone_friend_new_from_vcard(lvc2);
linphone_friend_set_ref_key(lf2, refkey);
BC_ASSERT_EQUAL_FATAL(linphone_friend_list_import_friend(lfl, lf2, FALSE), LinphoneFriendListOK, int, "%d");
BC_ASSERT_EQUAL_FATAL(linphone_friend_list_add_local_friend(lfl, lf2), LinphoneFriendListOK, int, "%d");
linphone_friend_unref(lf2);
BC_ASSERT_EQUAL(lfl->revision, 0, int, "%i");
......@@ -491,6 +504,8 @@ static void carddav_integration(void) {
wait_for_until(manager->lc, NULL, &stats->updated_contact_count, 1, 2000);
BC_ASSERT_EQUAL(stats->updated_contact_count, 1, int, "%i");
BC_ASSERT_NOT_EQUAL(lfl->revision, 0, int, "%i");
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 3, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 3, int, "%i");
BC_ASSERT_EQUAL_FATAL(ms_list_size(lfl->friends), 1, int, "%i");
lf = (LinphoneFriend *)lfl->friends->data;
......@@ -526,17 +541,22 @@ static void carddav_clean(void) { // This is to ensure the content of the test
linphone_friend_list_cbs_set_contact_created(cbs, carddav_contact_created);
linphone_friend_list_cbs_set_contact_deleted(cbs, carddav_contact_deleted);
linphone_friend_list_cbs_set_contact_updated(cbs, carddav_contact_updated);
linphone_friend_list_cbs_set_sync_status_changed(cbs, carddav_sync_status_changed);
linphone_core_add_friend_list(manager->lc, lfl);
linphone_friend_list_set_uri(lfl, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default");
linphone_friend_list_synchronize_friends_from_server(lfl);
wait_for_until(manager->lc, NULL, NULL, 0, 5000);
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
stats->sync_done_count = 0;
friends = ms_list_copy(lfl->friends);
while (friends) {
LinphoneFriend *lf = (LinphoneFriend *)friends->data;
linphone_friend_list_remove_friend(lfl, lf);
wait_for_until(manager->lc, NULL, NULL, 0, 2000);
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
stats->sync_done_count = 0;
stats->removed_contact_count = 0;
friends = ms_list_next(friends);
}
......@@ -545,7 +565,8 @@ static void carddav_clean(void) { // This is to ensure the content of the test
linphone_vcard_set_url(lvc, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default/me.vcf");
lf = linphone_friend_new_from_vcard(lvc);
linphone_friend_list_add_friend(lfl, lf);
wait_for_until(manager->lc, NULL, NULL, 0, 2000);
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
ms_free(stats);
linphone_friend_unref(lf);
......@@ -563,14 +584,19 @@ static void carddav_multiple_sync(void) {
linphone_friend_list_cbs_set_contact_created(cbs, carddav_contact_created);
linphone_friend_list_cbs_set_contact_deleted(cbs, carddav_contact_deleted);
linphone_friend_list_cbs_set_contact_updated(cbs, carddav_contact_updated);
linphone_friend_list_cbs_set_sync_status_changed(cbs, carddav_sync_status_changed);
linphone_core_add_friend_list(manager->lc, lfl);
linphone_friend_list_set_uri(lfl, "http://192.168.0.230/sabredav/addressbookserver.php/addressbooks/sylvain/default");
linphone_friend_list_synchronize_friends_from_server(lfl);
wait_for_until(manager->lc, NULL, NULL, 0, 5000);
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 1, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 1, int, "%i");
linphone_friend_list_synchronize_friends_from_server(lfl);
wait_for_until(manager->lc, NULL, NULL, 0, 5000);
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 2, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 2, int, "%i");
linphone_friend_list_synchronize_friends_from_server(lfl);
wait_for_until(manager->lc, NULL, &stats->sync_done_count, 3, 2000);
BC_ASSERT_EQUAL(stats->sync_done_count, 3, int, "%i");
BC_ASSERT_EQUAL(stats->removed_contact_count, 0, int, "%i");
linphone_friend_list_unref(lfl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment