Override account creator service
The Linphone account creator allows to create accounts, check if an account exist, etc... Liblinphone provides a default account creator service to handle accounts on sip.linphone.org but also allows developers to implement their own account creator service.
Linphone Android, Linphone IOS, and Linphone desktop use a Linphone implementation of account creator based on XML-RPC requests.
How does it work
The Linphone account creator follows a common pattern for available actions. Each action like create, exist and so on can be implemented using function of type:
Implementation must synchronously and asynchronously return a value of type LinphoneAccountCreatorStatus as a provisional status.
A final result must taken as a result of a remote action must be notified and forward to response callback corresponding by the implementor using corresponding functions as listed in the callbacks section.
Callbacks
The following functions can be implemented:
Account creator constructor
- Set with this function:
void linphone_account_creator_service_set_constructor_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when an account creator is created with this function:
LinphoneAccountCreator * linphone_account_creator_new(LinphoneCore *core, const char *xmlrpc_url);Account creator destructor
- Set with this function:
void linphone_account_creator_service_set_destructor_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when an account creator is destroyed with this function:
void linphone_account_creator_unref(LinphoneAccountCreator *creator);Is account exist
- Set with this function:
void linphone_account_creator_service_set_is_account_exist_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_is_account_exist(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_account_exist(const LinphoneAccountCreatorCbs *cbs);Create account
- Set with this function:
void linphone_account_creator_service_set_create_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_create_account(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_create_account(const LinphoneAccountCreatorCbs *cbs);Activate account
- Set with this function:
void linphone_account_creator_service_set_activate_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_activate_account(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_activate_account(const LinphoneAccountCreatorCbs *cbs);Is account activated
- Set with this function:
void linphone_account_creator_service_set_is_account_activated_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_is_account_activated(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_account_activated(const LinphoneAccountCreatorCbs *cbs);Is alias used
- Set with this function:
void linphone_account_creator_service_set_is_alias_used_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_is_alias_used(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_alias_used(const LinphoneAccountCreatorCbs *cbs);Link account
- Set with this function:
void linphone_account_creator_service_set_link_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_link_account(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_link_account(const LinphoneAccountCreatorCbs *cbs);Activate alias
- Set with this function:
void linphone_account_creator_service_set_activate_alias_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_activate_alias(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_activate_alias(const LinphoneAccountCreatorCbs *cbs);Recover account
- Set with this function:
void linphone_account_creator_service_set_recover_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_recover_account(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_recover_account(const LinphoneAccountCreatorCbs *cbs);Is account linked
- Set with this function:
void linphone_account_creator_service_set_is_account_linked_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you call:
LinphoneAccountCreatorStatus linphone_account_creator_is_account_linked(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_account_linked(const LinphoneAccountCreatorCbs *cbs);Update account
- Set with this function:
void linphone_account_creator_service_set_update_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);- Invoked when you called:
LinphoneAccountCreatorStatus linphone_account_creator_update_account(LinphoneAccountCreator *creator);- Associated response callback:
LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_update_account(const LinphoneAccountCreatorCbs *cbs);
How to use it
Create your own implemenation and set it by default to LinphoneCore.
LinphoneAccountCreatorService *service = linphone_account_creator_service_new();
// Set your callbacks
linphone_account_creator_service_set_constructor_cb(service, linphone_account_creator_constructor_custom);
linphone_account_creator_service_set_destructor_cb(service, linphone_account_creator_destructor_custom);
...
linphone_account_creator_service_set_update_account_cb(service, linphone_account_creator_update_account_custom);
// Do not forget to set your implementation to LinphoneCore
linphone_core_set_account_creator_service(lc, service);
Sample code
This is an example of custom request to know if an account exist.
// If no username is set we can't know if this account exist
if (!creator->username) {
// We notify the response callback to notify it
linphone_account_creator_cbs_get_is_account_exist(linphone_account_creator_get_callbacks(creator))
(creator, LinphoneRequestMissingArguments, "Missing required parameters");
// The request failed
return LinphoneRequestMissingArguments;
}
if (str_cmp("user_exist", creator->username) != 0) {
// Account exists so we call the callback to notify it
linphone_account_creator_cbs_get_is_account_exist(linphone_account_creator_get_callbacks(creator))
(creator, LinphoneRequestAccountExist, "Account exist");
} else {
// Account does not exist so we call the callback to notify it
linphone_account_creator_cbs_get_is_account_exist(linphone_account_creator_get_callbacks(creator))
(creator, LinphoneRequestAccountNotExist, "Account does not exist");
}
// The request passed
return LinphoneRequestOk;
}
void main(void) {
LinphoneCoreVTable vtable = {0};
LinphoneCore *lc = linphone_core_new(&vtable, NULL, NULL, NULL);
// Create a new service
LinphoneAccountCreatorService *service = linphone_account_creator_service_new();
// Set your callback
linphone_account_creator_service_set_is_account_exist_cb(service, my_account_creator_request_is_account_exist);
// Do not forget to set your implementation to LinphoneCore
linphone_core_set_account_creator_service(lc, service);
// Create a new account creator that has your implementation of is_account_exist callback
LinphoneAccountCreator *creator = linphone_account_creator_new(lc, "url://serveur.com");
linphone_account_creator_set_username(creator, "user_exist");
// Send request
if (linphone_account_creator_is_account_exist(creator) != LinphoneRequestOk) {
ms_message("Error with the request is_account_exist");
}
linphone_account_creator_unref(creator);
linphone_core_destroy(lc);
}