4 * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jungki Kwak <jungki.kwak@samsung.com>, Keunsoon Lee <keunsoon.lee@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
20 * @file download-agent-interface.c
21 * @brief Interface for Download Agent.
22 * @author Keunsoon Lee(keunsoon.lee@samsung.com)
23 * @author Jungki Kwak(jungki.kwak@samsung.com)
26 #include "download-agent-interface.h"
27 #include "download-agent-debug.h"
28 #include "download-agent-utils.h"
29 #include "download-agent-http-mgr.h"
30 #include "download-agent-http-misc.h"
31 #include "download-agent-client-mgr.h"
32 #include "download-agent-dl-mgr.h"
33 #include "download-agent-basic.h"
34 #include "download-agent-file.h"
35 #include "download-agent-installation.h"
38 da_client_cb_t *da_client_callback,
39 da_download_managing_method download_method)
41 da_result_t ret = DA_RESULT_OK;
43 DA_LOG_FUNC_START(Default);
45 if (!da_client_callback) {
46 ret = DA_ERR_INVALID_ARGUMENT;
51 if (ret != DA_RESULT_OK)
54 ret = init_client_app_mgr();
55 if (ret != DA_RESULT_OK)
58 ret = reg_client_app(da_client_callback, download_method);
59 if (ret != DA_RESULT_OK)
62 ret = init_http_mgr();
63 if (ret != DA_RESULT_OK)
66 ret = init_download_mgr();
67 if (ret != DA_RESULT_OK)
70 ret = create_temp_saved_dir();
71 if (ret != DA_RESULT_OK)
75 if (DA_RESULT_OK != ret)
78 DA_LOG_CRITICAL(Default, "Return ret = %d", ret);
83 /* TODO:: deinit should clean up all the clients... */
86 da_result_t ret = DA_RESULT_OK;
87 char *client_dir_path = DA_NULL;
89 DA_LOG_FUNC_START(Default);
90 if (DA_FALSE == is_this_client_available()) {
91 ret = DA_ERR_INVALID_CLIENT;
96 deinit_download_mgr();
98 ret = get_client_download_path(&client_dir_path);
99 if (ret == DA_RESULT_OK) {
100 ret = clean_files_from_dir(client_dir_path);
102 if (client_dir_path) {
103 free(client_dir_path);
104 client_dir_path = DA_NULL;
109 DA_LOG(Default, "====== da_deinit EXIT =====");
114 int da_start_download(
116 da_handle_t *da_dl_req_id)
118 da_result_t ret = DA_RESULT_OK;
120 DA_LOG_FUNC_START(Default);
122 DA_LOG(Default, "url = %s", url);
124 *da_dl_req_id = DA_INVALID_ID;
126 if (DA_FALSE == is_this_client_available()) {
127 ret = DA_ERR_INVALID_CLIENT;
131 if (DA_FALSE == is_valid_url(url, &ret))
134 ret = start_download(url, da_dl_req_id);
135 if (ret != DA_RESULT_OK)
139 DA_LOG_CRITICAL(Default, "Return: Dl req id = %d, ret = %d", *da_dl_req_id, ret);
143 int da_start_download_with_extension(
145 da_handle_t *da_dl_req_id,
149 da_result_t ret = DA_RESULT_OK;
151 char *property_name = NULL;
152 int req_header_count = 0;
155 extension_data_t extension_data;
157 DA_LOG_FUNC_START(Default);
159 DA_LOG(Default, "url = %s", url);
161 *da_dl_req_id = DA_INVALID_ID;
162 extension_data.request_header= NULL;
163 extension_data.request_header_count = NULL;
164 extension_data.install_path = NULL;
165 extension_data.file_name = NULL;
166 extension_data.user_data = NULL;
168 if (DA_FALSE == is_this_client_available()) {
169 ret = DA_ERR_INVALID_CLIENT;
173 if (DA_FALSE == is_valid_url(url, &ret))
176 va_start(argptr, da_dl_req_id);
177 property_name = va_arg(argptr, char*);
179 // FIXME How about changing type for property_name enum?
180 if (!property_name) {
181 DA_LOG_ERR(Default, "No property input!");
182 ret = DA_ERR_INVALID_ARGUMENT;
184 while (property_name && (ret == DA_RESULT_OK)) {
185 DA_LOG_VERBOSE(Default, "property_name = [%s]", property_name);
187 if (!strncmp(property_name, DA_FEATURE_USER_DATA, strlen(DA_FEATURE_USER_DATA))) {
188 extension_data.user_data = va_arg(argptr, void*);
189 if (extension_data.user_data) {
190 property_name = va_arg(argptr, char*);
192 DA_LOG_ERR(Default, "No property value for DA_FEATURE_USER_DATA!");
193 ret = DA_ERR_INVALID_ARGUMENT;
195 } else if (!strncmp(property_name, DA_FEATURE_INSTALL_PATH, strlen(DA_FEATURE_INSTALL_PATH))) {
196 extension_data.install_path = va_arg(argptr, const char*);
197 if (extension_data.install_path) {
198 property_name = va_arg(argptr, char*);
200 DA_LOG_ERR(Default, "No property value for DA_FEATURE_INSTALL_PATH!");
201 ret = DA_ERR_INVALID_ARGUMENT;
203 } else if (!strncmp(property_name, DA_FEATURE_FILE_NAME, strlen(DA_FEATURE_FILE_NAME))) {
204 extension_data.file_name = va_arg(argptr, const char*);
205 if (extension_data.file_name) {
206 property_name = va_arg(argptr, char*);
208 DA_LOG_ERR(Default, "No property value for DA_FEATURE_FILE_NAME!");
209 ret = DA_ERR_INVALID_ARGUMENT;
211 } else if (!strncmp(property_name, DA_FEATURE_REQUEST_HEADER, strlen(DA_FEATURE_REQUEST_HEADER))) {
212 extension_data.request_header = va_arg(argptr, const char **);
213 extension_data.request_header_count = va_arg(argptr, const int *);
214 if (extension_data.request_header &&
215 extension_data.request_header_count) {
216 property_name = va_arg(argptr, char *);
218 DA_LOG_ERR(Default, "No property value for DA_FEATURE_REQUEST_HEADER!");
219 ret = DA_ERR_INVALID_ARGUMENT;
222 DA_LOG_ERR(Default, "Unknown property name; [%s]", property_name);
223 ret = DA_ERR_INVALID_ARGUMENT;
230 if (ret != DA_RESULT_OK)
233 if (extension_data.request_header_count) {
234 DA_LOG_VERBOSE(Default, "input request_header_count = [%d]",
235 *(extension_data.request_header_count));
236 for (i = 0; i < *(extension_data.request_header_count); i++)
238 if (extension_data.request_header[i]) {
240 DA_LOG_VERBOSE(Default, "request_header = [%s]",
241 extension_data.request_header[i]);
244 DA_LOG(Default, "actual request_header_count = [%d]", req_header_count);
245 if (*(extension_data.request_header_count) != req_header_count) {
246 DA_LOG_ERR(Default, "Request header count is not matched with number of request header array");
247 extension_data.request_header = NULL;
248 extension_data.request_header_count = NULL;
252 if (extension_data.install_path)
253 DA_LOG_VERBOSE(Default, "install path = [%s]", extension_data.install_path);
255 if (extension_data.file_name)
256 DA_LOG_VERBOSE(Default, "file_name = [%s]", extension_data.file_name);
258 ret = start_download_with_extension(url, da_dl_req_id, &extension_data);
261 DA_LOG_CRITICAL(Default, "Return: Dl req id = %d, ret = %d", *da_dl_req_id, ret);
265 int da_cancel_download(da_handle_t da_dl_req_id)
267 da_result_t ret = DA_RESULT_OK;
269 DA_LOG_FUNC_START(Default);
271 DA_LOG_VERBOSE(Default, "Cancel for dl_req_id = %d", da_dl_req_id);
273 if (DA_FALSE == is_this_client_available()) {
274 ret = DA_ERR_INVALID_CLIENT;
278 ret = cancel_download(da_dl_req_id);
281 DA_LOG_CRITICAL(Default, "Return: Cancel id = %d, ret = %d", da_dl_req_id, ret);
285 int da_suspend_download(da_handle_t da_dl_req_id)
287 da_result_t ret = DA_RESULT_OK;
289 DA_LOG_FUNC_START(Default);
291 DA_LOG_VERBOSE(Default, "Suspend for dl_req_id = %d", da_dl_req_id);
293 if (DA_FALSE == is_this_client_available()) {
294 ret = DA_ERR_INVALID_CLIENT;
297 ret = suspend_download(da_dl_req_id);
300 DA_LOG_CRITICAL(Default, "Return: Suspend id = %d, ret = %d", da_dl_req_id, ret);
304 int da_resume_download(da_handle_t da_dl_req_id)
306 da_result_t ret = DA_RESULT_OK;
308 DA_LOG_FUNC_START(Default);
310 DA_LOG_VERBOSE(Default, "Resume for dl_req_id = %d", da_dl_req_id);
312 if (DA_FALSE == is_this_client_available()) {
313 ret = DA_ERR_INVALID_CLIENT;
316 ret = resume_download(da_dl_req_id);
319 DA_LOG_CRITICAL(Default, "Return: Resume id = %d, ret = %d", da_dl_req_id, ret);