From e48eb2611dfefe0836c7e44b3e52569a605ac441 Mon Sep 17 00:00:00 2001 From: Jungki Kwak Date: Tue, 4 Sep 2012 19:18:23 +0900 Subject: [PATCH] Sync codes Change the name of application operation Remove unused code which is base on libdownload-agent Add exception handling for non requestid Call clear_provider after getting the state url_download_get_state return IO error Resolve prevent defects modified: CMakeLists.txt modified: include/url_download.h modified: include/url_download_private.h modified: packaging/capi-web-url-download.spec deleted: src/url_download.c modified: src/url_download_provider.c --- CMakeLists.txt | 15 +- include/url_download.h | 2 +- include/url_download_private.h | 12 - packaging/capi-web-url-download.spec | 15 +- src/url_download.c | 1313 -------------------------- src/url_download_provider.c | 243 +++-- 6 files changed, 169 insertions(+), 1431 deletions(-) delete mode 100644 src/url_download.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a35d49..75fa021 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,19 +4,13 @@ SET(fw_name "capi-web-url-download") PROJECT(${fw_name}) -OPTION(ENABLE_PROVIDER "Support download through download-provider daemon" ON) - SET(CMAKE_INSTALL_PREFIX /usr) SET(PREFIX ${CMAKE_INSTALL_PREFIX}) SET(INC_DIR include) INCLUDE_DIRECTORIES(${INC_DIR}) -IF (ENABLE_PROVIDER) - SET(requires "dlog capi-base-common bundle capi-appfw-app-manager capi-appfw-application download-provider") -ELSE (ENABLE_PROVIDER) - SET(requires "dlog capi-base-common bundle libdownload-agent") -ENDIF (ENABLE_PROVIDER) +SET(requires "dlog capi-base-common bundle capi-appfw-app-manager capi-appfw-application download-provider") MESSAGE(STATUS "PACKAGES : ${requires}") SET(pc_requires "capi-base-common capi-appfw-application") @@ -38,12 +32,7 @@ ADD_DEFINITIONS("-DSLP_DEBUG") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -Wl,--rpath=/usr/lib") -IF (ENABLE_PROVIDER) - ADD_DEFINITIONS("-DENABLE_DOWNLOAD_PROVIDER") - SET(SOURCES src/url_download_provider.c) -ELSE (ENABLE_PROVIDER) - SET(SOURCES src/url_download.c) -ENDIF (ENABLE_PROVIDER) +SET(SOURCES src/url_download_provider.c) MESSAGE(STATUS "SOURCES : ${SOURCES}") ADD_LIBRARY(${fw_name} SHARED ${SOURCES}) diff --git a/include/url_download.h b/include/url_download.h index 764e4fd..9df844b 100644 --- a/include/url_download.h +++ b/include/url_download.h @@ -33,7 +33,7 @@ extern "C" /** * @brief Name for download service operation. Download Manager application is launched. */ -#define SERVICE_OPERATION_DOWNLOAD "http://tizen.org/appsvc/operation/download" +#define SERVICE_OPERATION_DOWNLOAD "http://tizen.org/appcontrol/operation/download" /** diff --git a/include/url_download_private.h b/include/url_download_private.h index 7e688d7..5bed71a 100644 --- a/include/url_download_private.h +++ b/include/url_download_private.h @@ -19,19 +19,12 @@ #define __TIZEN_WEB_URL_DOWNLOAD_PRIVATE_H__ #include -#ifndef ENABLE_DOWNLOAD_PROVIDER -#include -#endif #ifdef __cplusplus extern "C" { #endif -#ifndef ENABLE_DOWNLOAD_PROVIDER -typedef da_client_cb_t *url_download_agent_h; -#endif - /** * url_download_cb_s */ @@ -53,14 +46,9 @@ struct url_download_cb_s { }; struct url_download_s { -#ifndef ENABLE_DOWNLOAD_PROVIDER - url_download_agent_h agent; - da_handle_t id; -#else uint id; uint enable_notification; int requestid; -#endif struct url_download_cb_s callback; url_download_state_e state; char *url; diff --git a/packaging/capi-web-url-download.spec b/packaging/capi-web-url-download.spec index 4d03027..210551c 100644 --- a/packaging/capi-web-url-download.spec +++ b/packaging/capi-web-url-download.spec @@ -1,9 +1,8 @@ -%define ENABLE_DOWNLOAD_PROVIDER 1 Name: capi-web-url-download Summary: CAPI for content download with web url Version: 0.0.8 -Release: 5 +Release: 6 Group: TO_BE_FILLED_IN License: TO_BE_FILLED_IN URL: N/A @@ -11,13 +10,9 @@ Source0: %{name}-%{version}.tar.gz BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(bundle) BuildRequires: pkgconfig(dlog) -%if %ENABLE_DOWNLOAD_PROVIDER BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(download-provider) -%else -BuildRequires: pkgconfig(libdownload-agent) -%endif BuildRequires: cmake BuildRequires: expat-devel @@ -59,6 +54,14 @@ rm -rf %{buildroot} /usr/include/web/url_download.h %changelog +* Tue Sep 04 2012 Jungki Kwak +- Remove unused code which is base on libdownload-agent +- Change the name of application operation +- Add exception handling for non requestid +- Call clear_provider after getting the state +- url_download_get_state return IO error +- Resolve prevent defects + * Mon Sep 03 2012 Kwangmin Bang - stop the download even if no socket or callback - pause/resume the download even if no socket or callback diff --git a/src/url_download.c b/src/url_download.c deleted file mode 100644 index 2c57b47..0000000 --- a/src/url_download.c +++ /dev/null @@ -1,1313 +0,0 @@ -/* - * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include -#include - -#include -#include - -#ifdef LOG_TAG -#undef LOG_TAG -#endif - -#define LOG_TAG "TIZEN_N_URL_DOWNLOAD" - - -#define STATE_IS_RUNNING(_download_) \ - (_download_->state == URL_DOWNLOAD_STATE_DOWNLOADING \ - || _download_->state == URL_DOWNLOAD_STATE_PAUSED) - - -#define STRING_IS_INVALID(_string_) \ - (_string_ == NULL || _string_[0] == '\0') - - -static bool DBG_AGENT = true; -static bool DBG_HTTP_HEADER = true; -static bool DBG_DOWNLOAD = true; - -static void url_download_agent_state_cb(user_notify_info_t *notify_info, void* user_param); -static void url_download_agent_progress_cb(user_download_info_t *download_info,void* user_param); -static int url_download_start_resume(url_download_h download); -static int url_download_start_download(url_download_h download); - - -static const char* url_download_error_to_string(int error_code) -{ - char *error_name = NULL; - - switch (error_code) - { - case URL_DOWNLOAD_ERROR_NONE: - error_name = "ERROR_NONE"; - break; - case URL_DOWNLOAD_ERROR_INVALID_PARAMETER: - error_name = "INVALID_PARAMETER"; - break; - case URL_DOWNLOAD_ERROR_OUT_OF_MEMORY: - error_name = "OUT_OF_MEMORY"; - break; - case URL_DOWNLOAD_ERROR_IO_ERROR: - error_name = "IO_ERROR"; - break; - case URL_DOWNLOAD_ERROR_NETWORK_UNREACHABLE: - error_name = "NETWORK_UNREACHABLE"; - break; - case URL_DOWNLOAD_ERROR_CONNECTION_TIMED_OUT: - error_name = "CONNECTION_TIMED_OUT"; - break; - case URL_DOWNLOAD_ERROR_FIELD_NOT_FOUND: - error_name = "FIELD_NOT_FOUND"; - break; - case URL_DOWNLOAD_ERROR_NO_SPACE: - error_name = "NO_SPACE"; - break; - case URL_DOWNLOAD_ERROR_INVALID_STATE: - error_name = "INVALID_STATE"; - break; - case URL_DOWNLOAD_ERROR_CONNECTION_FAILED: - error_name = "CONNECTION_FAILED"; - break; - case URL_DOWNLOAD_ERROR_SSL_FAILED: - error_name = "SSL_FAILED"; - break; - case URL_DOWNLOAD_ERROR_INVALID_URL: - error_name = "INVALID_URL"; - break; - case URL_DOWNLOAD_ERROR_INVALID_DESTINATION: - error_name = "INVALID_DESTINATION"; - break; - case URL_DOWNLOAD_ERROR_TOO_MANY_DOWNLOADS: - error_name = "FULL_OF_MAX_DOWNLOAD_ITEMS"; - default: - error_name = "UNKNOWN"; - break; - } - return error_name; -} - -static int url_download_error(const char *function, int error_code, const char *description) -{ - const char *error_name = NULL; - - error_name = url_download_error_to_string(error_code); - - if (description) - { - LOGE("[%s] %s(0x%08x) : %s", function, error_name, error_code, description); - } - else - { - LOGE("[%s] %s(0x%08x)", function, error_name, error_code); - } - - return error_code; -} - -static const char* url_download_state_to_string(url_download_state_e state) -{ - switch (state) - { - case URL_DOWNLOAD_STATE_READY: - return "READY"; - - case URL_DOWNLOAD_STATE_DOWNLOADING: - return "DOWNLOADING"; - - case URL_DOWNLOAD_STATE_PAUSED: - return "PAUSED"; - - case URL_DOWNLOAD_STATE_COMPLETED: - return "COMPLETED"; - - default: - return "INVALID"; - } -} - -static int url_download_error_invalid_state(const char *function, url_download_h download) -{ - LOGE("[%s] INVALID_STATE(0x%08x) : state(%s)", - function, URL_DOWNLOAD_ERROR_INVALID_STATE, url_download_state_to_string(download->state)); - - return URL_DOWNLOAD_ERROR_INVALID_STATE; -} - -struct _download_list_t { - url_download_h data; - struct _download_list_t *next; -}; -static int _download_agent_reference = 0; -static da_client_cb_t *_download_agent = NULL; -static struct _download_list_t *_download_list = NULL; - -static int url_download_agent_create(url_download_agent_h *agent) -{ - int retcode; - - if (_download_agent == NULL) - { - _download_agent = calloc(1, sizeof(da_client_cb_t)); - - if (!_download_agent) - { - return URL_DOWNLOAD_ERROR_OUT_OF_MEMORY; - } - - _download_agent->user_noti_cb = url_download_agent_state_cb; - _download_agent->update_dl_info_cb = url_download_agent_progress_cb; - _download_agent->send_dd_info_cb = NULL; - _download_agent->go_to_next_url_cb = NULL; - - retcode = da_init(_download_agent, DA_DOWNLOAD_MANAGING_METHOD_AUTO); - - if (retcode) - { - free(_download_agent); - _download_agent = NULL; - return URL_DOWNLOAD_ERROR_IO_ERROR; - } - - LOGI_IF(DBG_AGENT, "[%s] download-agent is created", __FUNCTION__); - - } - - _download_agent_reference++; - - *agent = _download_agent; - - LOGI_IF(DBG_AGENT, "[%s] download-agent reference(%d)", __FUNCTION__, _download_agent_reference); - - return URL_DOWNLOAD_ERROR_NONE; -} - -static void url_download_agent_destroy(url_download_agent_h agent) -{ - if (agent == NULL || agent != _download_agent) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - return; - } - - _download_agent_reference--; - - if (_download_agent_reference <= 0) - { - da_deinit(); - - free(_download_agent); - _download_agent = NULL; - - _download_agent_reference = 0; - - LOGI_IF(DBG_AGENT, "[%s] download-agent is destroyed", __FUNCTION__); - } - - LOGI_IF(DBG_AGENT, "[%s] download-agent reference(%d)", __FUNCTION__, _download_agent_reference); - -} - -static url_download_error_e url_download_agent_error(int error) -{ - switch (error) - { - case DA_RESULT_OK: - return URL_DOWNLOAD_ERROR_NONE; - - case DA_ERR_NETWORK_FAIL: - return URL_DOWNLOAD_ERROR_CONNECTION_FAILED; - - case DA_ERR_UNREACHABLE_SERVER: - return URL_DOWNLOAD_ERROR_NETWORK_UNREACHABLE; - - case DA_ERR_HTTP_TIMEOUT: - return URL_DOWNLOAD_ERROR_CONNECTION_TIMED_OUT; - - case DA_ERR_SSL_FAIL: - return URL_DOWNLOAD_ERROR_SSL_FAILED; - - case DA_ERR_FAIL_TO_ACCESS_FILE: - case DA_ERR_FAIL_TO_ACCESS_STORAGE: - case DA_ERR_FAIL_TO_INSTALL_FILE: - return URL_DOWNLOAD_ERROR_INVALID_DESTINATION; - - case DA_ERR_DISK_FULL: - return URL_DOWNLOAD_ERROR_NO_SPACE; - - case DA_ERR_INVALID_URL: - case DA_ERR_UNSUPPORTED_PROTOCAL: - return URL_DOWNLOAD_ERROR_INVALID_URL; - - case DA_ERR_INVALID_INSTALL_PATH: - return URL_DOWNLOAD_ERROR_INVALID_DESTINATION; - case DA_ERR_ALREADY_MAX_DOWNLOAD: - return URL_DOWNLOAD_ERROR_TOO_MANY_DOWNLOADS; - default: - return URL_DOWNLOAD_ERROR_IO_ERROR; - } -} - - -static int url_download_agent_dispatch_state_change(int da_state, url_download_state_e prev_state, url_download_state_e *next_state) -{ - switch (da_state) - { - case DA_STATE_DOWNLOAD_STARTED: - case DA_STATE_RESUMED: - *next_state = URL_DOWNLOAD_STATE_DOWNLOADING; - return URL_DOWNLOAD_ERROR_NONE; - - case DA_STATE_FINISHED: - *next_state = URL_DOWNLOAD_STATE_COMPLETED; - return URL_DOWNLOAD_ERROR_NONE; - - case DA_STATE_CANCELED: - case DA_STATE_FAILED: - *next_state = URL_DOWNLOAD_STATE_READY; - return URL_DOWNLOAD_ERROR_NONE; - - case DA_STATE_SUSPENDED: - *next_state = URL_DOWNLOAD_STATE_PAUSED; - return URL_DOWNLOAD_ERROR_NONE; - - case DA_STATE_DOWNLOADING: - if (prev_state == URL_DOWNLOAD_STATE_PAUSED) - { - *next_state = URL_DOWNLOAD_STATE_DOWNLOADING; - return URL_DOWNLOAD_ERROR_NONE; - } - return URL_DOWNLOAD_ERROR_INVALID_STATE; - - default: - return URL_DOWNLOAD_ERROR_INVALID_STATE; - } -} - - -static bool is_available_download_data(url_download_h download) -{ - struct _download_list_t *head = NULL; - bool ret = false; - head = _download_list; - while(head) - { - if (head->data == download) - { - ret = true; - break; - } - head = head->next; - } - return ret; -} - -static void url_download_agent_state_cb(user_notify_info_t *notify_info, void *user_data) -{ - url_download_h download = NULL; - url_download_state_e state = -1; - url_download_error_e stopped_code = URL_DOWNLOAD_ERROR_NONE; - - if (user_data == NULL) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to get the download handle"); - return; - } - - download = (url_download_h)user_data; - if (!is_available_download_data(download)) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, "download item is already destroyed"); - return; - } -/* - if (download->agent == NULL) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to get the download agent handle"); - return; - } -*/ - if (url_download_agent_dispatch_state_change(notify_info->state, download->state, &state)) - { - LOGI_IF(DBG_AGENT, "[%s] id[%d]no need to dispatch state change : da-state(%d)", __FUNCTION__, download->id, notify_info->state); - return; - } - - LOGI_IF(DBG_AGENT, "[%s] id(%d), state(%s)", __FUNCTION__, download->id, url_download_state_to_string(state)); - - switch (state) - { - case URL_DOWNLOAD_STATE_READY: - download->state = URL_DOWNLOAD_STATE_READY; - if (download->callback.stopped) - { - stopped_code = url_download_agent_error(notify_info->err); - LOGI_IF(DBG_AGENT, "[%s] id(%d), stopped by [%s]", - __FUNCTION__, download->id, url_download_error_to_string(stopped_code)); - download->callback.stopped(download,stopped_code, download->callback.stopped_user_data); - } - return; - - case URL_DOWNLOAD_STATE_DOWNLOADING: - download->state = URL_DOWNLOAD_STATE_DOWNLOADING; - if (download->callback.started) - { - download->callback.started(download, download->callback.started_user_data); - } - return; - - case URL_DOWNLOAD_STATE_PAUSED: - download->state = URL_DOWNLOAD_STATE_PAUSED; - if (download->callback.paused) - { - download->callback.paused(download, download->callback.paused_user_data); - } - return; - - case URL_DOWNLOAD_STATE_COMPLETED: - download->state = URL_DOWNLOAD_STATE_COMPLETED; - if (download->callback.completed) - { - download->callback.completed(download, download->completed_path, download->callback.completed_user_data); - } - return; - - default: - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "invalid state change event"); - return; - } - -} - - -static void url_download_agent_progress_cb(user_download_info_t *download_info,void* user_data) -{ - url_download_h download; - - if (user_data == NULL) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to get the download handle"); - return; - } - - download = (url_download_h)user_data; - - if (!is_available_download_data(download)) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, "download item is already destroyed"); - return; - } - - if (download_info->saved_path != NULL) - { - download->completed_path = strdup(download_info->saved_path); - } - - if (download->callback.progress) - { - download->callback.progress( - download, - download_info->total_received_size, download_info->file_size, - download->callback.progress_user_data); - } -} - - -int url_download_create(url_download_h *download) -{ - url_download_agent_h agent; - url_download_h download_new; - struct _download_list_t *head = NULL; - struct _download_list_t *temp_item = NULL; - - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - download_new = (url_download_h)calloc(1, sizeof(struct url_download_s)); - - if (download_new == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - - if (url_download_agent_create(&agent)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to initialize an agent"); - } - - download_new->agent = agent; - - download_new->http_header = bundle_create(); - - if (!download_new->http_header) - { - url_download_destroy(download_new); - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to initialize a bundle"); - } - - download_new->state = URL_DOWNLOAD_STATE_READY; - *download = download_new; - if (_download_list == NULL) - { - _download_list = calloc(1, sizeof(struct _download_list_t)); - if (_download_list == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - _download_list->data = download_new; - } else { - head = _download_list; - while (head->next) - { - head = head->next; - } - temp_item = calloc(1, sizeof(struct _download_list_t)); - if (temp_item == NULL) { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - temp_item->data = download_new; - head->next = temp_item; - } - - return URL_DOWNLOAD_ERROR_NONE; -} - -int url_download_destroy(url_download_h download) -{ - struct _download_list_t *head = NULL; - struct _download_list_t *prev = NULL; - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - url_download_stop(download); - } - - if (download->url) - { - free(download->url); - download->url = NULL; - } - - if (download->destination) - { - free(download->destination); - download->destination = NULL; - } - - if (download->http_header) - { - bundle_free(download->http_header); - download->http_header = NULL; - } - - if (download->completed_path) - { - free(download->completed_path); - download->completed_path = NULL; - } - - memset(&(download->callback), 0x00, sizeof(struct url_download_cb_s)); - download->id = -1; - - url_download_agent_destroy(download->agent); - - head = _download_list; - while (head) - { - if (head->data && head->data == download) - { - head->data = NULL; - if (prev) - { - if (head->next) - prev->next = head->next; - else - prev->next = NULL; - } - else - { - if (head->next) - _download_list = head->next; - else - _download_list = NULL; - } - free(head); - head = NULL; - break; - } - prev = head; - head = head->next; - } - - free(download); - download = NULL; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_set_url(url_download_h download, const char *url) -{ - char *url_dup = NULL; - - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - if (url != NULL) - { - url_dup = strdup(url); - - if (url_dup == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - } - - if (download->url != NULL) - { - free(download->url); - } - - download->url = url_dup; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_get_url(url_download_h download, char **url) -{ - char *url_dup = NULL; - - if (download == NULL || url == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (download->url != NULL) - { - url_dup = strdup(download->url); - - if (url_dup == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - } - - *url = url_dup; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_set_destination(url_download_h download, const char *path) -{ - char *path_dup = NULL; - - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - if (path != NULL) - { - path_dup = strdup(path); - - if (path_dup == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - } - - if (download->destination != NULL) - { - free(download->destination); - } - - download->destination = path_dup; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_get_destination(url_download_h download, char **path) -{ - char *path_dup = NULL; - - if (download == NULL || path == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (download->destination != NULL) - { - path_dup = strdup(download->destination); - - if (path_dup == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - } - - *path = path_dup; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_add_http_header_field(url_download_h download, const char *field, const char *value) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STRING_IS_INVALID(field) || STRING_IS_INVALID(value)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - if (bundle_get_val(download->http_header, field)) - { - bundle_del(download->http_header, field); - } - - if (bundle_add(download->http_header, field, value)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - } - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_get_http_header_field(url_download_h download, const char *field, char **value) -{ - const char *bundle_value; - char *field_value_dup; - - if (download == NULL || value == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STRING_IS_INVALID(field)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - bundle_value = bundle_get_val(download->http_header, field); - - if (bundle_value == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_FIELD_NOT_FOUND, NULL); - } - - field_value_dup = strdup(bundle_value); - - if (field_value_dup == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - - *value = field_value_dup; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_remove_http_header_field(url_download_h download, const char *field) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STRING_IS_INVALID(field)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, "invalid field"); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - if (!bundle_get_val(download->http_header, field)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_FIELD_NOT_FOUND, NULL); - } - - if (bundle_del(download->http_header, field)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - } - - return URL_DOWNLOAD_ERROR_NONE; -} - -typedef struct http_field_array_s{ - char **array; - int array_length; - int position; -} http_field_array_t; - -static void url_download_get_all_http_header_fields_iterator(const char *field_name, const char *field_value, void *user_data) -{ - http_field_array_t *http_field_array; - char *field_buffer; - int field_buffer_length; - const char *field_delimiters = ": "; - - http_field_array = user_data; - - if (http_field_array == NULL) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - return; - } - - // REF : http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 - field_buffer_length = strlen(field_name) + strlen(field_delimiters) + strlen(field_value) + 1; - - field_buffer = calloc(field_buffer_length, sizeof(char)); - - if (field_buffer == NULL) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - return; - } - - snprintf(field_buffer, field_buffer_length, "%s%s%s", field_name, field_delimiters, field_value); - - http_field_array->array[http_field_array->position] = field_buffer; - http_field_array->position++; - -} - -static int url_download_get_all_http_header_fields(url_download_h download, char ***fields, int *fields_length) -{ - http_field_array_t http_field_array; - - if (download == NULL || fields == NULL || fields_length == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - http_field_array.position = 0; - http_field_array.array_length = bundle_get_count(download->http_header); - http_field_array.array = calloc(http_field_array.array_length, sizeof(char*)); - - if (http_field_array.array == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_OUT_OF_MEMORY, NULL); - } - - bundle_iterate(download->http_header, url_download_get_all_http_header_fields_iterator, &http_field_array); - - if (DBG_HTTP_HEADER) - { - int i=0; - - for (i=0; icallback.started = callback; - download->callback.started_user_data = user_data; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_unset_started_cb(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.started = NULL; - download->callback.started_user_data = NULL; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_set_paused_cb(url_download_h download, url_download_paused_cb callback, void* user_data) -{ - if (download == NULL || callback == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.paused = callback; - download->callback.paused_user_data = user_data; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_unset_paused_cb(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.paused = NULL; - download->callback.paused_user_data = NULL; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_set_completed_cb(url_download_h download, url_download_completed_cb callback, void* user_data) -{ - if (download == NULL || callback == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.completed = callback; - download->callback.completed_user_data = user_data; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_unset_completed_cb(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.completed = NULL; - download->callback.completed_user_data = NULL; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_set_stopped_cb(url_download_h download, url_download_stopped_cb callback, void* user_data) -{ - if (download == NULL || callback == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.stopped = callback; - download->callback.stopped_user_data = user_data; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_unset_stopped_cb(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.stopped = NULL; - download->callback.stopped_user_data = NULL; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_set_progress_cb(url_download_h download, url_download_progress_cb callback, void *user_data) -{ - if (download == NULL || callback == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.progress = callback; - download->callback.progress_user_data = user_data; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_unset_progress_cb(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (STATE_IS_RUNNING(download)) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - download->callback.progress = NULL; - download->callback.progress_user_data = NULL; - - return URL_DOWNLOAD_ERROR_NONE; -} - -static int url_download_start_download(url_download_h download) -{ - enum { - FEATURE_DEFAULT = 0, - FEATURE_DESTINATION = 1, - FEATURE_HTTP = 2, - FEATURE_DESTINATION_HTTP = 3, - }; - - int retcode; - int feature_set = 0; - int feature_oma_off = DA_FEATURE_OFF; - - char **http_headers = NULL; - int http_headers_length = 0; - - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - download->id = -1; - download->completed_path = NULL; - - if (STRING_IS_INVALID(download->url)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, "URL is invalid"); - } - - if (download->destination != NULL) - { - feature_set += FEATURE_DESTINATION; - } - - if (bundle_get_count(download->http_header) > 0) - { - feature_set += FEATURE_HTTP; - - if (url_download_get_all_http_header_fields(download, &http_headers, &http_headers_length)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "Failed to set HTTP headers"); - } - } - - LOGI_IF(DBG_DOWNLOAD, "[%s] try to start download : URL(%s) feature(%d)", __FUNCTION__, download->url, feature_set); - - switch (feature_set) - { - case FEATURE_DEFAULT: - retcode = da_start_download_with_extension( - download->url, - &(download->id), - DA_FEATURE_OMA_AUTO_DOWNLOAD, &feature_oma_off, - DA_FEATURE_USER_DATA, download, - NULL - ); - break; - - case FEATURE_DESTINATION: - retcode = da_start_download_with_extension( - download->url, - &(download->id), - DA_FEATURE_OMA_AUTO_DOWNLOAD, &feature_oma_off, - DA_FEATURE_USER_DATA, download, - DA_FEATURE_INSTALL_PATH, download->destination, - NULL - ); - break; - - case FEATURE_HTTP: - retcode = da_start_download_with_extension( - download->url, - &(download->id), - DA_FEATURE_OMA_AUTO_DOWNLOAD, &feature_oma_off, - DA_FEATURE_USER_DATA, download, - DA_FEATURE_REQUEST_HEADER, http_headers, &http_headers_length, - NULL - ); - break; - - case FEATURE_DESTINATION_HTTP: - retcode = da_start_download_with_extension( - download->url, - &(download->id), - DA_FEATURE_OMA_AUTO_DOWNLOAD, &feature_oma_off, - DA_FEATURE_USER_DATA, download, - DA_FEATURE_INSTALL_PATH, download->destination, - DA_FEATURE_REQUEST_HEADER, http_headers, &http_headers_length, - NULL - ); - break; - - default: - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "Invalid feature reqeust"); - } - - LOGI_IF(DBG_DOWNLOAD, "[%s] id(%d) feature(%d) da-retcode(%d)", __FUNCTION__, download->id, feature_set, retcode); - - if (retcode) - { - return url_download_error(__FUNCTION__, url_download_agent_error(retcode), "failed to start the download"); - } - else - { - download->state = URL_DOWNLOAD_STATE_DOWNLOADING; - return URL_DOWNLOAD_ERROR_NONE; - } -} - - -static int url_download_start_resume(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (da_resume_download(download->id)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to resume the download"); - } - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_start(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (!is_available_download_data(download)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, "download item is already destroyed!!!!!!!!"); - } - - switch (download->state) - { - case URL_DOWNLOAD_STATE_COMPLETED: - case URL_DOWNLOAD_STATE_READY: - return url_download_start_download(download); - - case URL_DOWNLOAD_STATE_DOWNLOADING: - return url_download_error_invalid_state(__FUNCTION__, download); - - case URL_DOWNLOAD_STATE_PAUSED: - return url_download_start_resume(download); - - default: - return url_download_error_invalid_state(__FUNCTION__, download); - } -} - -int url_download_pause(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (download->state != URL_DOWNLOAD_STATE_DOWNLOADING) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - if (da_suspend_download(download->id)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to pause the download"); - } - - return URL_DOWNLOAD_ERROR_NONE; -} - - -int url_download_stop(url_download_h download) -{ - if (download == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - if (download->state != URL_DOWNLOAD_STATE_DOWNLOADING) - { - return url_download_error_invalid_state(__FUNCTION__, download); - } - - if (da_cancel_download(download->id)) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, "failed to stop the download"); - } - - return URL_DOWNLOAD_ERROR_NONE; -} - -int url_download_get_state(url_download_h download, url_download_state_e *state) -{ - if (download == NULL || state == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - *state = download->state; - - return URL_DOWNLOAD_ERROR_NONE; -} - - -typedef struct { - url_download_h download; - url_download_http_header_field_cb callback; - void* user_data; - bool foreach_break; -} foreach_context_http_header_field_t; - -static void url_download_foreach_http_header_field_iterator(const char *field_name, const char *field_value, void *user_data) -{ - foreach_context_http_header_field_t *foreach_context; - - foreach_context = user_data; - - if (foreach_context == NULL) - { - url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - return; - } - - - if (foreach_context->foreach_break == true) - { - return; - } - - if (foreach_context->callback != NULL) - { - foreach_context->foreach_break = !foreach_context->callback(foreach_context->download, - field_name, foreach_context->user_data); - } - -} - -int url_download_foreach_http_header_field(url_download_h download, url_download_http_header_field_cb callback, void *user_data) -{ - foreach_context_http_header_field_t foreach_context = { - .download = download, - .callback = callback, - .user_data = user_data, - .foreach_break = false - }; - - if (download == NULL || callback == NULL) - { - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); - } - - bundle_iterate(download->http_header, url_download_foreach_http_header_field_iterator, &foreach_context); - - return URL_DOWNLOAD_ERROR_NONE; -} - diff --git a/src/url_download_provider.c b/src/url_download_provider.c index 70f9a6d..f8a4a6e 100644 --- a/src/url_download_provider.c +++ b/src/url_download_provider.c @@ -403,9 +403,9 @@ void *run_event_server(void *args) LOGI("[%s] DOWNLOAD_CONTROL_GET_DOWNLOAD_INFO [%d]%",__FUNCTION__, downloadinfo.file_size); download->state = URL_DOWNLOAD_STATE_DOWNLOADING; download->file_size = downloadinfo.file_size; - if (downloadinfo.mime_type && strlen(downloadinfo.mime_type) > 0) + if (strlen(downloadinfo.mime_type) > 0) download->mime_type = strdup(downloadinfo.mime_type); - if (downloadinfo.content_name && strlen(downloadinfo.content_name) > 0) { + if (strlen(downloadinfo.content_name) > 0) { download->content_name = strdup(downloadinfo.content_name); LOGI("content_name[%s] %", downloadinfo.content_name); } @@ -441,8 +441,7 @@ void *run_event_server(void *args) downloadinginfo.received_size, download->file_size, download->callback.progress_user_data); } - if (downloadinginfo.saved_path && - strlen(downloadinginfo.saved_path) > 0) { + if (strlen(downloadinginfo.saved_path) > 0) { LOGI("[%s] saved path [%s]",__FUNCTION__, downloadinginfo.saved_path); download->completed_path = strdup(downloadinginfo.saved_path); } @@ -712,16 +711,16 @@ int url_download_start(url_download_h download, int *id) if (download->requestid > 0) requestMsg.requestid = download->requestid; - if (download->url) + if (download->url && strlen(download->url) < DP_MAX_URL_LEN) requestMsg.url.length = strlen(download->url); - if (download->destination) + if (download->destination && strlen(download->destination) < DP_MAX_PATH_LEN) requestMsg.install_path.length = strlen(download->destination); - if (download->content_name) + if (download->content_name && strlen(download->content_name) < DP_MAX_STR_LEN) requestMsg.filename.length = strlen(download->content_name); - if (download->service_data_len > 0 && download->service_data) { + if (download->service_data_len > 0) { requestMsg.service_data.length = download->service_data_len; } @@ -743,12 +742,18 @@ int url_download_start(url_download_h download, int *id) char *app_pkgname = NULL; pid_t client_pid = getpid(); int errcode = app_manager_get_package(client_pid, &app_pkgname); - if (errcode == APP_MANAGER_ERROR_NONE) + if (errcode == APP_MANAGER_ERROR_NONE + && app_pkgname + && strlen(app_pkgname) < DP_MAX_STR_LEN) requestMsg.client_packagename.length = strlen(app_pkgname); else LOGE("[%s] Failed to get app_pkgname app_manager_get_package",__FUNCTION__); - ipc_send_download_control(download->sockfd, DOWNLOAD_CONTROL_START); + if (ipc_send_download_control(download->sockfd, DOWNLOAD_CONTROL_START) + != DOWNLOAD_CONTROL_START) { + LOGE("[%s] [%d] URL_DOWNLOAD_ERROR_IO_ERROR", __FUNCTION__, __LINE__); + return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } if (ipc_send_request_stateinfo(download->sockfd, &requestMsg) != URL_DOWNLOAD_ERROR_NONE) { @@ -759,11 +764,10 @@ int url_download_start(url_download_h download, int *id) return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); } - if (requestMsg.client_packagename.length) { + if (requestMsg.client_packagename.length && app_pkgname) { if (send(download->sockfd, app_pkgname, requestMsg.client_packagename.length * sizeof(char), 0) < 0) { - if (app_pkgname) - free(app_pkgname); + free(app_pkgname); LOGE("[%s]request send system error : %s", __FUNCTION__, strerror(errno)); return url_download_error(__FUNCTION__, @@ -773,7 +777,7 @@ int url_download_start(url_download_h download, int *id) if (app_pkgname) free(app_pkgname); - if (requestMsg.url.length) { + if (requestMsg.url.length && download->url) { if (send(download->sockfd, download->url, requestMsg.url.length * sizeof(char), 0) < 0) { LOGE("[%s]request send system error : %s", @@ -782,7 +786,7 @@ int url_download_start(url_download_h download, int *id) URL_DOWNLOAD_ERROR_IO_ERROR, NULL); } } - if (requestMsg.install_path.length) { + if (requestMsg.install_path.length && download->destination) { if (send(download->sockfd, download->destination, requestMsg.install_path.length * sizeof(char), 0) < 0) { LOGE("[%s]request send system error : %s", @@ -792,7 +796,7 @@ int url_download_start(url_download_h download, int *id) } } - if (requestMsg.filename.length) { + if (requestMsg.filename.length && download->content_name) { if (send(download->sockfd, download->content_name, requestMsg.filename.length * sizeof(char), 0) < 0) { LOGE("[%s]request send system error : %s", @@ -802,7 +806,7 @@ int url_download_start(url_download_h download, int *id) } } - if (requestMsg.service_data.length) { + if (requestMsg.service_data.length && download->service_data) { if (send(download->sockfd, download->service_data, requestMsg.service_data.length * sizeof(char), 0) < 0) { LOGE("[%s]request send system error : %s", @@ -915,14 +919,18 @@ int url_download_start(url_download_h download, int *id) // send pause message int url_download_pause(url_download_h download) { - if (download == NULL) + if (download == NULL || download->requestid <= 0) return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); if (download->state != URL_DOWNLOAD_STATE_DOWNLOADING) return url_download_error_invalid_state(__FUNCTION__, download); if (download->sockfd > 0) { - ipc_send_download_control(download->sockfd, DOWNLOAD_CONTROL_PAUSE); + if (ipc_send_download_control(download->sockfd, DOWNLOAD_CONTROL_PAUSE) + != DOWNLOAD_CONTROL_PAUSE) { + LOGE("[%s] [%d] URL_DOWNLOAD_ERROR_IO_ERROR", __FUNCTION__, __LINE__); + return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } if (!(download->callback.completed || download->callback.stopped || download->callback.progress @@ -939,25 +947,38 @@ int url_download_pause(url_download_h download) } else { // if no socket int sockfd = _connect_download_provider(); if (sockfd > 0) { - ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_PAUSE); - download_request_info requestMsg; - memset(&requestMsg, 0x00, sizeof(download_request_info)); - if (download->requestid > 0) + if (ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_PAUSE) + == DOWNLOAD_CONTROL_PAUSE) { + download_request_info requestMsg; + memset(&requestMsg, 0x00, sizeof(download_request_info)); requestMsg.requestid = download->requestid; - if (ipc_send_request_stateinfo(sockfd, &requestMsg) - != URL_DOWNLOAD_ERROR_NONE) { - LOGE("[%s]request send system error : %s", - __FUNCTION__, strerror(errno)); - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - } - // Sync style - if (ipc_receive_header(sockfd) == DOWNLOAD_CONTROL_GET_STATE_INFO) { - download_state_info stateinfo; - if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) + if (ipc_send_request_stateinfo(sockfd, &requestMsg) + != URL_DOWNLOAD_ERROR_NONE) { + LOGE("[%s]request send system error : %s", + __FUNCTION__, strerror(errno)); + _clear_socket(sockfd); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - download->state = url_download_provider_state(stateinfo.state); - } else + } + // Sync style + if (ipc_receive_header(sockfd) + == DOWNLOAD_CONTROL_GET_STATE_INFO) { + download_state_info stateinfo; + if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) { + LOGE("[%s][%d] read failure",__FUNCTION__, __LINE__); + _clear_download_provider(sockfd); + _clear_socket(sockfd); + return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + download->state + = url_download_provider_state(stateinfo.state); + } + } else { + _clear_socket(sockfd); + LOGE("[%s][%d] ipc_send_download_control failure",__FUNCTION__, __LINE__); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + // alert download-provider can free memory + _clear_download_provider(sockfd); // close socket. _clear_socket(sockfd); } @@ -967,14 +988,18 @@ int url_download_pause(url_download_h download) int url_download_resume(url_download_h download) { - if (download == NULL) + if (download == NULL || download->requestid <= 0) return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); if (download->state != URL_DOWNLOAD_STATE_PAUSED) return url_download_error_invalid_state(__FUNCTION__, download); if (download->sockfd > 0) { - ipc_send_download_control(download->sockfd, DOWNLOAD_CONTROL_RESUME); + if (ipc_send_download_control(download->sockfd, DOWNLOAD_CONTROL_RESUME) + != DOWNLOAD_CONTROL_RESUME) { + LOGE("[%s] [%d] URL_DOWNLOAD_ERROR_IO_ERROR", __FUNCTION__, __LINE__); + return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } if (!(download->callback.completed || download->callback.stopped || download->callback.progress @@ -991,25 +1016,38 @@ int url_download_resume(url_download_h download) } else { // if no socket int sockfd = _connect_download_provider(); if (sockfd > 0) { - ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_RESUME); - download_request_info requestMsg; - memset(&requestMsg, 0x00, sizeof(download_request_info)); - if (download->requestid > 0) + if (ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_RESUME) + == DOWNLOAD_CONTROL_RESUME) { + download_request_info requestMsg; + memset(&requestMsg, 0x00, sizeof(download_request_info)); requestMsg.requestid = download->requestid; - if (ipc_send_request_stateinfo(sockfd, &requestMsg) - != URL_DOWNLOAD_ERROR_NONE) { - LOGE("[%s]request send system error : %s", - __FUNCTION__, strerror(errno)); - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - } - // Sync style - if (ipc_receive_header(sockfd) == DOWNLOAD_CONTROL_GET_STATE_INFO) { - download_state_info stateinfo; - if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) + if (ipc_send_request_stateinfo(sockfd, &requestMsg) + != URL_DOWNLOAD_ERROR_NONE) { + _clear_socket(sockfd); + LOGE("[%s]request send system error : %s", + __FUNCTION__, strerror(errno)); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - download->state = url_download_provider_state(stateinfo.state); - } else + } + // Sync style + if (ipc_receive_header(sockfd) + == DOWNLOAD_CONTROL_GET_STATE_INFO) { + download_state_info stateinfo; + if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) { + LOGE("[%s][%d] read failure",__FUNCTION__, __LINE__); + _clear_download_provider(sockfd); + _clear_socket(sockfd); + return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + download->state + = url_download_provider_state(stateinfo.state); + } + } else { + _clear_socket(sockfd); + LOGE("[%s][%d] ipc_send_download_control failure",__FUNCTION__, __LINE__); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + // alert download-provider can free memory + _clear_download_provider(sockfd); // close socket. _clear_socket(sockfd); } @@ -1021,7 +1059,7 @@ int url_download_resume(url_download_h download) // send stop message int url_download_stop(url_download_h download) { - if (download == NULL) + if (download == NULL || download->requestid <= 0) return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); if (download->state != URL_DOWNLOAD_STATE_DOWNLOADING @@ -1050,25 +1088,38 @@ int url_download_stop(url_download_h download) } else { // if no socket int sockfd = _connect_download_provider(); if (sockfd > 0) { - ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_STOP); - download_request_info requestMsg; - memset(&requestMsg, 0x00, sizeof(download_request_info)); - if (download->requestid > 0) + if (ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_STOP) + == DOWNLOAD_CONTROL_STOP) { + download_request_info requestMsg; + memset(&requestMsg, 0x00, sizeof(download_request_info)); requestMsg.requestid = download->requestid; - if (ipc_send_request_stateinfo(sockfd, &requestMsg) - != URL_DOWNLOAD_ERROR_NONE) { - LOGE("[%s]request send system error : %s", - __FUNCTION__, strerror(errno)); - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - } - // Sync style - if (ipc_receive_header(sockfd) == DOWNLOAD_CONTROL_GET_STATE_INFO) { - download_state_info stateinfo; - if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) + if (ipc_send_request_stateinfo(sockfd, &requestMsg) + != URL_DOWNLOAD_ERROR_NONE) { + _clear_socket(sockfd); + LOGE("[%s]request send system error : %s", + __FUNCTION__, strerror(errno)); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - download->state = url_download_provider_state(stateinfo.state); - } else + } + // Sync style + if (ipc_receive_header(sockfd) + == DOWNLOAD_CONTROL_GET_STATE_INFO) { + download_state_info stateinfo; + if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) { + LOGE("[%s][%d] read failure",__FUNCTION__, __LINE__); + _clear_download_provider(sockfd); + _clear_socket(sockfd); + return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + download->state + = url_download_provider_state(stateinfo.state); + } + } else { + _clear_socket(sockfd); + LOGE("[%s][%d] ipc_send_download_control failure",__FUNCTION__, __LINE__); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + // alert download-provider can free memory + _clear_download_provider(sockfd); // close socket. _clear_socket(sockfd); } @@ -1081,6 +1132,11 @@ int url_download_get_state(url_download_h download, url_download_state_e *state) if (download == NULL || state == NULL) return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_INVALID_PARAMETER, NULL); + if (download->requestid <= 0) { + *state = download->state; + return URL_DOWNLOAD_ERROR_NONE; + } + if (download->sockfd > 0) { if (!(download->callback.completed || download->callback.stopped @@ -1103,25 +1159,40 @@ int url_download_get_state(url_download_h download, url_download_state_e *state) } else { // create new connection temporary, get info from provider. int sockfd = _connect_download_provider(); if (sockfd > 0) { - ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_GET_STATE_INFO); - download_request_info requestMsg; - memset(&requestMsg, 0x00, sizeof(download_request_info)); - if (download->requestid > 0) + if (ipc_send_download_control(sockfd, DOWNLOAD_CONTROL_GET_STATE_INFO) + == DOWNLOAD_CONTROL_GET_STATE_INFO) { + download_request_info requestMsg; + memset(&requestMsg, 0x00, sizeof(download_request_info)); requestMsg.requestid = download->requestid; - if (ipc_send_request_stateinfo(sockfd, &requestMsg) - != URL_DOWNLOAD_ERROR_NONE) { - LOGE("[%s]request send system error : %s", - __FUNCTION__, strerror(errno)); - return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - } - // Sync style - if (ipc_receive_header(sockfd) == DOWNLOAD_CONTROL_GET_STATE_INFO) { - download_state_info stateinfo; - if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) + if (ipc_send_request_stateinfo(sockfd, &requestMsg) + != URL_DOWNLOAD_ERROR_NONE) { + _clear_socket(sockfd); + LOGE("[%s]request send system error : %s", + __FUNCTION__, strerror(errno)); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); - download->state = url_download_provider_state(stateinfo.state); - } else + } + // Sync style + if (ipc_receive_header(sockfd) + == DOWNLOAD_CONTROL_GET_STATE_INFO) { + download_state_info stateinfo; + if (read(sockfd, &stateinfo, sizeof(download_state_info)) < 0) { + LOGE("[%s][%d] read failure",__FUNCTION__, __LINE__); + _clear_download_provider(sockfd); + _clear_socket(sockfd); + return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + download->state + = url_download_provider_state(stateinfo.state); + } + // else means NONE + download->state = URL_DOWNLOAD_STATE_READY; + } else { + _clear_socket(sockfd); + LOGE("[%s][%d] ipc_send_download_control failure",__FUNCTION__, __LINE__); return url_download_error(__FUNCTION__, URL_DOWNLOAD_ERROR_IO_ERROR, NULL); + } + // alert download-provider can free memory + _clear_download_provider(sockfd); // close socket. _clear_socket(sockfd); } -- 2.34.1