From affd021540f6f0245803105b9e129521f6ff2a62 Mon Sep 17 00:00:00 2001 From: Guillaume BIENKOWSKI Date: Mon, 7 Apr 2014 13:43:38 +0200 Subject: [PATCH] Add the ability to use a file:// protocol for provisioning --- coreapi/remote_provisioning.c | 63 +++++++++++++++++------ tester/rcfiles/marie_remote_localfile2_rc | 11 ++++ tester/rcfiles/marie_remote_localfile_rc | 3 ++ tester/remote_provisioning_tester.c | 43 ++++++++++------ 4 files changed, 88 insertions(+), 32 deletions(-) create mode 100644 tester/rcfiles/marie_remote_localfile2_rc create mode 100644 tester/rcfiles/marie_remote_localfile_rc diff --git a/coreapi/remote_provisioning.c b/coreapi/remote_provisioning.c index 7deb4d5e6..96ee2a6dd 100644 --- a/coreapi/remote_provisioning.c +++ b/coreapi/remote_provisioning.c @@ -52,11 +52,32 @@ static void linphone_remote_provisioning_apply(LinphoneCore *lc, const char *xml } } +static int linphone_remote_provisioning_load_file( LinphoneCore* lc, const char* file_path){ + int status = -1; + FILE* f = fopen(file_path, "r"); + + if( f ){ + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + char* provisioning = ms_malloc(fsize + 1); + fread(provisioning, fsize, 1, f); + fclose(f); + linphone_remote_provisioning_apply(lc, provisioning); + status = 0; + } else { + ms_error("Couldn't open file %s for provisioning", file_path); + } + + return status; +} + static void belle_request_process_response_event(void *ctx, const belle_http_response_event_t *event) { LinphoneCore *lc = (LinphoneCore *)ctx; belle_sip_message_t *body = BELLE_SIP_MESSAGE(event->response); const char *message = belle_sip_message_get_body(body); - + if (belle_http_response_get_status_code(event->response) == 200) { linphone_remote_provisioning_apply(lc, message); } else { @@ -80,23 +101,31 @@ static void belle_request_process_auth_requested(void *ctx, belle_sip_auth_event } int linphone_remote_provisioning_download_and_apply(LinphoneCore *lc, const char *remote_provisioning_uri) { - belle_generic_uri_t *uri=belle_generic_uri_parse(remote_provisioning_uri); - belle_http_request_listener_callbacks_t belle_request_listener = { - belle_request_process_response_event, - belle_request_process_io_error, - belle_request_process_timeout, - belle_request_process_auth_requested - }; - belle_http_request_listener_t *listener = belle_http_request_listener_create_from_callbacks(&belle_request_listener, lc); - belle_http_request_t *request; - - if (uri==NULL) { - belle_sip_error("Invalid provisioning URI [%s]",remote_provisioning_uri); - return -1; + const char* file_path = strstr(remote_provisioning_uri, "file://"); + + if( file_path == remote_provisioning_uri ){ + // We allow for 'local remote-provisioning' in case the file is to be opened from the hard drive + file_path += strlen("file://"); + return linphone_remote_provisioning_load_file(lc, file_path); + } else { + belle_generic_uri_t *uri=belle_generic_uri_parse(remote_provisioning_uri); + belle_http_request_listener_callbacks_t belle_request_listener = { + belle_request_process_response_event, + belle_request_process_io_error, + belle_request_process_timeout, + belle_request_process_auth_requested + }; + belle_http_request_listener_t *listener = belle_http_request_listener_create_from_callbacks(&belle_request_listener, lc); + belle_http_request_t *request; + + if (uri==NULL) { + belle_sip_error("Invalid provisioning URI [%s]",remote_provisioning_uri); + return -1; + } + request=belle_http_request_create("GET",uri, NULL); + belle_http_provider_send_request(lc->http_provider, request, listener); + return 0; } - request=belle_http_request_create("GET",uri, NULL); - belle_http_provider_send_request(lc->http_provider, request, listener); - return 0; } void linphone_core_set_provisioning_uri(LinphoneCore *lc, const char *uri) { diff --git a/tester/rcfiles/marie_remote_localfile2_rc b/tester/rcfiles/marie_remote_localfile2_rc new file mode 100644 index 000000000..d41ca4c8d --- /dev/null +++ b/tester/rcfiles/marie_remote_localfile2_rc @@ -0,0 +1,11 @@ + + +
+ 0 + 1 +
+
+ 1 + 1 +
+
diff --git a/tester/rcfiles/marie_remote_localfile_rc b/tester/rcfiles/marie_remote_localfile_rc new file mode 100644 index 000000000..b2f947607 --- /dev/null +++ b/tester/rcfiles/marie_remote_localfile_rc @@ -0,0 +1,3 @@ +[misc] +config-uri=file://./rcfiles/marie_remote_localfile2_rc + diff --git a/tester/remote_provisioning_tester.c b/tester/remote_provisioning_tester.c index f38ab9a67..99bfbcc6a 100644 --- a/tester/remote_provisioning_tester.c +++ b/tester/remote_provisioning_tester.c @@ -1,19 +1,19 @@ /* - liblinphone_tester - liblinphone test suite - Copyright (C) 2013 Belledonne Communications SARL + liblinphone_tester - liblinphone test suite + Copyright (C) 2013 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 as published by - the Free Software Foundation, either version 2 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include @@ -29,9 +29,9 @@ void linphone_configuration_status(LinphoneCore *lc, LinphoneConfiguringState st if (status == LinphoneConfiguringSkipped) { counters->number_of_LinphoneConfiguringSkipped++; } else if (status == LinphoneConfiguringFailed) { - counters->number_of_LinphoneConfiguringFailed++; + counters->number_of_LinphoneConfiguringFailed++; } else if (status == LinphoneConfiguringSuccessful) { - counters->number_of_LinphoneConfiguringSuccessful++; + counters->number_of_LinphoneConfiguringSuccessful++; } } @@ -89,6 +89,18 @@ static void remote_provisioning_default_values(void) { linphone_core_manager_destroy(marie); } +static void remote_provisioning_file(void) { + LinphoneCoreManager* marie = linphone_core_manager_new2("marie_remote_localfile_rc", FALSE); + const LpConfig* conf; + CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphoneConfiguringSuccessful,1)); + + conf = linphone_core_get_config( marie->lc ); + CU_ASSERT_EQUAL( lp_config_get_int(conf,"misc","tester_file_ok", 0), 1 ); + + linphone_core_manager_destroy(marie); +} + + test_t remote_provisioning_tests[] = { { "Remote provisioning skipped", remote_provisioning_skipped }, { "Remote provisioning successful behind http", remote_provisioning_http }, @@ -96,7 +108,8 @@ test_t remote_provisioning_tests[] = { { "Remote provisioning 404 not found", remote_provisioning_not_found }, { "Remote provisioning invalid", remote_provisioning_invalid }, { "Remote provisioning transient successful", remote_provisioning_transient }, - { "Remote provisioning default values", remote_provisioning_default_values } + { "Remote provisioning default values", remote_provisioning_default_values }, + { "Remote provisioning from file", remote_provisioning_file } }; test_suite_t remote_provisioning_test_suite = {