use dp_request_slots as user_data of da_agent
authorBang Kwang-Min <justine.bang@samsung.com>
Mon, 29 Apr 2013 07:40:07 +0000 (16:40 +0900)
committerBang Kwang-Min <justine.bang@samsung.com>
Thu, 9 May 2013 06:38:52 +0000 (15:38 +0900)
Issue : P130423-8649

cause : can not null-checking in da agent callbacks
resolution : 1. set dp_request_slots instead of dp_request pointer to user_data of callbacks
             2. apply mutex in da_download_start API

Change-Id: I66576583f3f55073fd8a8119af303b4c62755036

provider/download-provider-da-interface.c
provider/download-provider-db.c
provider/download-provider-thread-queue.c
provider/include/download-provider-da-interface.h

index ed466dd..e311899 100755 (executable)
@@ -108,11 +108,12 @@ static void __download_info_cb(user_download_info_t *info, void *user_data)
                TRACE_ERROR("[NULL-CHECK] Agent info");
                return ;
        }
-       if (!user_data) {
-               TRACE_ERROR("[NULL-CHECK] user_data");
+       dp_request_slots *request_slot = (dp_request_slots *) user_data;
+       if (request_slot == NULL || request_slot->request == NULL) {
+               TRACE_ERROR("[NULL-CHECK] request req_id:%d", info->download_id);
                return ;
        }
-       dp_request *request = (dp_request *) user_data;
+       dp_request *request = request_slot->request;
        if (request->id < 0 || (request->agent_id != info->download_id)) {
                TRACE_ERROR("[NULL-CHECK] agent_id : %d req_id %d",
                        request->agent_id, info->download_id);
@@ -197,14 +198,15 @@ static void __progress_cb(user_progress_info_t *info, void *user_data)
                TRACE_ERROR("[NULL-CHECK] Agent info");
                return ;
        }
-       if (!user_data) {
-               TRACE_ERROR("[NULL-CHECK] user_data");
+       dp_request_slots *request_slot = (dp_request_slots *) user_data;
+       if (request_slot == NULL || request_slot->request == NULL) {
+               TRACE_ERROR("[NULL-CHECK] request req_id:%d", info->download_id);
                return ;
        }
-       dp_request *request = (dp_request *) user_data;
+       dp_request *request = request_slot->request;
        if (request->id < 0 || (request->agent_id != info->download_id)) {
-               TRACE_ERROR("[NULL-CHECK][%d] agent_id : %d req_id %d",
-                       request->id, request->agent_id, info->download_id);
+               TRACE_ERROR("[NULL-CHECK] agent_id : %d req_id %d",
+                       request->agent_id, info->download_id);
                return ;
        }
 
@@ -240,14 +242,15 @@ static void __finished_cb(user_finished_info_t *info, void *user_data)
        }
        TRACE_INFO("Agent ID[%d] err[%d] http_status[%d]",
                info->download_id, info->err, info->http_status);
-       if (!user_data) {
-               TRACE_ERROR("[NULL-CHECK] user_data");
+       dp_request_slots *request_slot = (dp_request_slots *) user_data;
+       if (request_slot == NULL || request_slot->request == NULL) {
+               TRACE_ERROR("[NULL-CHECK] request req_id:%d", info->download_id);
                return ;
        }
-       dp_request *request = (dp_request *) user_data;
+       dp_request *request = request_slot->request;
        if (request->id < 0 || (request->agent_id != info->download_id)) {
-               TRACE_ERROR("[NULL-CHECK][%d] agent_id : %d req_id %d",
-                       request->id, request->agent_id, info->download_id);
+               TRACE_ERROR("[NULL-CHECK] agent_id : %d req_id %d",
+                       request->agent_id, info->download_id);
                return ;
        }
 
@@ -384,14 +387,15 @@ static void __finished_cb(user_finished_info_t *info, void *user_data)
 static void __paused_cb(user_paused_info_t *info, void *user_data)
 {
        TRACE_INFO("");
-       dp_request *request = (dp_request *) user_data;
-       if (!request) {
-               TRACE_ERROR("[NULL-CHECK] request");
+       dp_request_slots *request_slot = (dp_request_slots *) user_data;
+       if (request_slot == NULL || request_slot->request == NULL) {
+               TRACE_ERROR("[NULL-CHECK] request req_id:%d", info->download_id);
                return ;
        }
+       dp_request *request = request_slot->request;
        if (request->id < 0 || (request->agent_id != info->download_id)) {
-               TRACE_ERROR("[NULL-CHECK][%d] agent_id : %d req_id %d",
-                       request->id, request->agent_id, info->download_id);
+               TRACE_ERROR("[NULL-CHECK] agent_id : %d req_id %d",
+                       request->agent_id, info->download_id);
                return ;
        }
 
@@ -499,7 +503,7 @@ dp_error_type dp_pause_agent_download(int req_id)
 // 0 : success
 // -1 : failed
 // -2 : pended
-dp_error_type dp_start_agent_download(dp_request *request)
+dp_error_type dp_start_agent_download(dp_request_slots *request_slot)
 {
        int da_ret = -1;
        int req_dl_id = -1;
@@ -508,14 +512,17 @@ dp_error_type dp_start_agent_download(dp_request *request)
        char *etag = NULL;
 
        TRACE_INFO("");
-       if (!request) {
+       if (request_slot == NULL || request_slot->request == NULL) {
                TRACE_ERROR("[NULL-CHECK] download_clientinfo_slot");
                return DP_ERROR_INVALID_PARAMETER;
        }
+       dp_request *request = request_slot->request;
+       CLIENT_MUTEX_LOCK(&(request->mutex));
 
        char *url = dp_request_get_url(request->id, request, &errorcode);
        if (url == NULL) {
                TRACE_ERROR("[ERROR][%d] URL is NULL", request->id);
+               CLIENT_MUTEX_UNLOCK(&(request->mutex));
                return DP_ERROR_INVALID_URL;
        }
        char *destination =
@@ -560,7 +567,7 @@ dp_error_type dp_start_agent_download(dp_request *request)
                }
        }
 
-       ext_data.user_data = (void *)request;
+       ext_data.user_data = (void *)request_slot;
 
        // call start API of agent lib
        da_ret =
@@ -590,14 +597,17 @@ dp_error_type dp_start_agent_download(dp_request *request)
        if (da_ret == DA_ERR_ALREADY_MAX_DOWNLOAD) {
                TRACE_INFO("[PENDING][%d] DA_ERR_ALREADY_MAX_DOWNLOAD [%d]",
                        request->id, da_ret);
+               CLIENT_MUTEX_UNLOCK(&(request->mutex));
                return DP_ERROR_TOO_MANY_DOWNLOADS;
        } else if (da_ret != DA_RESULT_OK) {
                TRACE_ERROR("[ERROR][%d] DP_ERROR_CONNECTION_FAILED [%d]",
                        request->id, da_ret);
+               CLIENT_MUTEX_UNLOCK(&(request->mutex));
                return __change_error(da_ret);
        }
        TRACE_INFO("[SUCCESS][%d] agent_id [%d]", request->id, req_dl_id);
        request->agent_id = req_dl_id;
+       CLIENT_MUTEX_UNLOCK(&(request->mutex));
        return DP_ERROR_NONE;
 }
 
index 7dc26c9..ead22ca 100755 (executable)
@@ -710,7 +710,7 @@ char *dp_db_get_text_column(int id, char *table, char *column)
                __dp_finalize(stmt);
                return columntext;
        }
-       TRACE_ERROR("[SQL] [%s]", sqlite3_errmsg(g_dp_db_handle));
+       TRACE_INFO("[No DATA]");
        __dp_finalize(stmt);
        return NULL;
 }
@@ -758,6 +758,7 @@ int dp_db_get_int_column(int id, char *table, char *column)
                __dp_finalize(stmt);
                return columnvalue;
        }
+       TRACE_INFO("[No DATA]");
        __dp_finalize(stmt);
        return -1;
 }
@@ -805,7 +806,7 @@ long long dp_db_get_int64_column(int id, char *table, char *column)
                __dp_finalize(stmt);
                return columnvalue;
        }
-       TRACE_ERROR("[SQL] [%s]", sqlite3_errmsg(g_dp_db_handle));
+       TRACE_INFO("[No DATA]");
        __dp_finalize(stmt);
        return -1;
 }
index 512e7dd..a145ce0 100755 (executable)
@@ -122,18 +122,19 @@ static void *__request_download_start_agent(void *args)
 {
        dp_error_type errcode = DP_ERROR_NONE;
 
-       dp_request *request = (dp_request *) args;
-       if (!request) {
+       dp_request_slots *request_slot = (dp_request_slots *) args;
+       if (request_slot == NULL || request_slot->request == NULL) {
                TRACE_ERROR("[NULL-CHECK] download_clientinfo_slot");
                pthread_exit(NULL);
                return 0;
        }
+       dp_request *request = request_slot->request;
 
        if (dp_is_alive_download(request->agent_id)) {
                errcode = dp_resume_agent_download(request->agent_id);
        } else {
                // call agent start function
-               errcode = dp_start_agent_download(request);
+               errcode = dp_start_agent_download(request_slot);
        }
 
        CLIENT_MUTEX_LOCK(&(request->mutex));
@@ -179,17 +180,18 @@ static void *__request_download_start_agent(void *args)
 /// @brief create thread.
 /// @warning if failed to create thread, change to PENED.
 /// @param the pointer of memory slot allocated for this request.
-static int __request_download_start_thread(dp_request *request)
+static int __request_download_start_thread(dp_request_slots *request_slot)
 {
        // declare all resources
        pthread_t thread_pid;
        pthread_attr_t thread_attr;
 
        TRACE_INFO("");
-       if (!request) {
+       if (request_slot == NULL || request_slot->request == NULL) {
                TRACE_ERROR("[CRITICAL] Invalid Address");
                return -1;
        }
+       dp_request *request = request_slot->request;
 
        // initialize
        if (pthread_attr_init(&thread_attr) != 0) {
@@ -205,7 +207,7 @@ static int __request_download_start_thread(dp_request *request)
 
        request->state = DP_STATE_CONNECTING;
        if (pthread_create(&thread_pid, &thread_attr,
-                                       __request_download_start_agent, request) != 0) {
+                                       __request_download_start_agent, request_slot) != 0) {
                TRACE_STRERROR("[ERROR][%d] pthread_create", request->id);
                pthread_attr_destroy(&thread_attr);
                request->state = DP_STATE_QUEUED;
@@ -302,7 +304,7 @@ void *dp_thread_queue_manager(void *arg)
                                                        (privates->is_connected_wifi_direct == 1 &&
                                                                request->network_type ==
                                                                        DP_NETWORK_TYPE_WIFI_DIRECT)) {
-                                                       if (__request_download_start_thread(request) == 0) {
+                                                       if (__request_download_start_thread(&privates->requests[i]) == 0) {
                                                                TRACE_INFO
                                                                        ("[Guarantee Intant Download] Group [%s]", group->pkgname);
                                                                active_count++;
@@ -332,7 +334,7 @@ void *dp_thread_queue_manager(void *arg)
                                if (i >= 0) {
                                        TRACE_INFO("Found WIFI-Direct request %d", i);
                                        request = privates->requests[i].request;
-                                       if (__request_download_start_thread(request) == 0)
+                                       if (__request_download_start_thread(&privates->requests[i]) == 0)
                                                active_count++;
                                        continue;
                                }
@@ -350,7 +352,7 @@ void *dp_thread_queue_manager(void *arg)
                        TRACE_INFO("QUEUE Status now %d active %d/%d", i,
                                active_count, DP_MAX_DOWNLOAD_AT_ONCE);
                        request = privates->requests[i].request;
-                       __request_download_start_thread(request);
+                       __request_download_start_thread(&privates->requests[i]);
                        active_count++;
                }
                CLIENT_MUTEX_UNLOCK(&(g_dp_queue_mutex));
index dcafc1a..ab6e716 100755 (executable)
@@ -20,7 +20,7 @@
 int dp_is_file_exist(const char *file_path);
 int dp_init_agent();
 void dp_deinit_agent();
-dp_error_type dp_start_agent_download(dp_request *request);
+dp_error_type dp_start_agent_download(dp_request_slots *request);
 dp_error_type dp_resume_agent_download(int req_id);
 dp_error_type dp_pause_agent_download(int req_id);
 dp_error_type dp_cancel_agent_download(int req_id);