Sync codes
authorJungki Kwak <jungki.kwak@samsung.com>
Tue, 4 Sep 2012 10:18:23 +0000 (19:18 +0900)
committerJungki Kwak <jungki.kwak@samsung.com>
Tue, 4 Sep 2012 10:18:23 +0000 (19:18 +0900)
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
include/url_download.h
include/url_download_private.h
packaging/capi-web-url-download.spec
src/url_download.c [deleted file]
src/url_download_provider.c

index 8a35d49aae6089aff31bdd0f42a8166f969e5d35..75fa02178c3b5dc80115b7c09a6dbca056d9126e 100644 (file)
@@ -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})
 
index 764e4fdd803a875bdb39b58a264a83ea7b7abe3b..9df844b514f70e58c4c412991b2796d980f764cd 100644 (file)
@@ -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"
 
 
 /**
index 7e688d7aa6257ddfc69968084fc9d67db9f7c5f9..5bed71a2dfcbe8ba3cf6317b1fd35f5618b94833 100644 (file)
 #define __TIZEN_WEB_URL_DOWNLOAD_PRIVATE_H__
 
 #include <bundle.h>
-#ifndef ENABLE_DOWNLOAD_PROVIDER
-#include <download-agent-interface.h>
-#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;
index 4d03027c45fef64db67114d092411fea53eaf614..210551ca748a8c4b03ebe7571508d46b7ed8c0e1 100644 (file)
@@ -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 <jungki.kwak@samsung.com>
+- 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 <justine.bang@samsung.com>
 - 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 (file)
index 2c57b47..0000000
+++ /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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <dlog.h>
-#include <download-agent-interface.h>
-
-#include <url_download.h>
-#include <url_download_private.h>
-
-#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; i<http_field_array.position; i++)
-               {
-                       LOGI("[%s] header[%d] = [%s]", __FUNCTION__, i, http_field_array.array[i]);
-               }
-       }
-
-       *fields = http_field_array.array;
-       *fields_length = http_field_array.array_length;
-
-       return URL_DOWNLOAD_ERROR_NONE;
-}
-
-
-int url_download_set_started_cb(url_download_h download, url_download_started_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.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;
-}
-
index 70f9a6dbcef1473f227021ac1f30cbaf412e37a3..f8a4a6ec7563f629c04d6778736e3bdbcf45f103 100644 (file)
@@ -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);
                }