2 * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include "download-agent-debug.h"
23 #include "download-agent-mime-util.h"
24 #include "download-agent-pthread.h"
26 #define IS_PROHIBITED_CHAR(c) ((c) == ';' || (c) == '\\' || (c) == '/' || (c) == ':' || (c) == '*' || (c) == '?' || (c) == '"' || (c) == '>' || (c) == '<' || (c) == '|' || (c) == '(' || (c) == ')')
27 #define IS_SPACE_CHARACTER(c) ((c) == ' ' || (c) == '\t')
29 #define DD_MIME_STR "application/vnd.oma.dd+xml"
30 #define DD_EXT_STR "*.dd"
31 #define DRM_MIME_STR "application/vnd.oma.drm.message"
32 #define DRM_EXT_STR "*.dcf"
33 #define MAX_EXT_TABLE_INDEX 16
34 Ext_translation_table ext_trans_table [MAX_EXT_TABLE_INDEX] = {
40 {"*.jpe", "*.jpg"},//5
45 {"CMakeLists.txt", "*.cmake"},//10
47 {"Makefile", "makefile"},
50 {"*.divx", "*.avi"},//15
52 /* This is samsung mime policy
53 * 1. if the mime is audio/m4a, the extension name is defined as "m4a" for launching music player
55 #ifdef _SAMSUNG_MIME_POLICY
56 #define MAX_SEC_MIME_TABLE_INDEX 1
57 struct sec_mime_table_t {
61 struct sec_mime_table_t sec_mime_table [MAX_SEC_MIME_TABLE_INDEX] = {
66 const char *ambiguous_MIME_Type_list[] = {
68 "application/octet-stream"
71 /* Because xdgmime is not thread safety, this mutex is necessary */
72 pthread_mutex_t mutex_for_xdgmime = PTHREAD_MUTEX_INITIALIZER;
74 da_bool_t is_ambiguous_MIME_Type(const char *in_mime_type)
76 // DA_LOG_FUNC_START(Default);
82 int list_size = sizeof(ambiguous_MIME_Type_list) / sizeof(const char *);
83 for (index = 0 ; index < list_size ; index++) {
84 if (0 == strncmp(in_mime_type, ambiguous_MIME_Type_list[index],
85 strlen(ambiguous_MIME_Type_list[index]))) {
86 DA_LOG(Default,"It is ambiguous! [%s]", ambiguous_MIME_Type_list[index]);
94 da_result_t da_mime_get_ext_name(char *mime, char **ext)
96 da_result_t ret = DA_RESULT_OK;
97 const char **extlist = DA_NULL;
98 const char *unaliased_mimetype = DA_NULL;
99 char ext_temp[DA_MAX_STR_LEN] = {0,};
102 DA_LOG_FUNC_START(Default);
104 if (DA_NULL == mime || DA_NULL == ext) {
105 ret = DA_ERR_INVALID_ARGUMENT;
106 DA_LOG_ERR(Default,"Invalid mime type");
109 DA_LOG_VERBOSE(Default,"mime str[%s]ptr[%p]len[%d]",mime,mime,strlen(mime));
110 /* unaliased_mimetype means representative mime among similar types */
111 _da_thread_mutex_lock(&mutex_for_xdgmime);
112 unaliased_mimetype = xdg_mime_unalias_mime_type(mime);
113 _da_thread_mutex_unlock(&mutex_for_xdgmime);
115 if (unaliased_mimetype == DA_NULL) {
116 ret = DA_ERR_INVALID_MIME_TYPE;
117 DA_LOG_ERR(Default,"Invalid mime type : No unsaliased mime type");
120 DA_LOG(Default,"unaliased_mimetype[%s]\n",unaliased_mimetype);
122 /* Get extension name from shared-mime-info */
123 _da_thread_mutex_lock(&mutex_for_xdgmime);
124 extlist = xdg_mime_get_file_names_from_mime_type(unaliased_mimetype);
125 _da_thread_mutex_unlock(&mutex_for_xdgmime);
126 if (extlist == DA_NULL || *extlist == DA_NULL) {
128 ret = DA_ERR_INVALID_MIME_TYPE;
129 DA_LOG(Default,"No extension list");
130 #ifdef _SAMSUNG_MIME_POLICY
131 for (i = 0; i < MAX_SEC_MIME_TABLE_INDEX; i++)
133 if (strncmp(sec_mime_table[i].mime, mime, strlen(mime)) == 0) {
134 strncpy(ext_temp, sec_mime_table[i].ext, DA_MAX_STR_LEN-1);
140 } else { /* For drm case, this else statement is needed */
141 DA_LOG(Default,"extlist[%s]\n",*extlist);
142 strncpy(ext_temp, *extlist, DA_MAX_STR_LEN);
143 /* If only one extension name is existed, don't enter here */
144 while (*extlist != NULL) {
146 /* If there are existed many extension names,
147 * try to search common extension name from table
148 * with first mime type at extension list*/
149 for (i = 0; i < MAX_EXT_TABLE_INDEX; i++)
151 if (strncmp(ext_trans_table[i].standard,*extlist,
152 strlen(*extlist)) == 0) {
153 memset(ext_temp, 0x00, DA_MAX_STR_LEN);
154 strncpy(ext_temp,ext_trans_table[i].normal, DA_MAX_STR_LEN-1);
158 DA_LOG(Default,"index[%d]\n",i);
159 /* If there is a mime at extension transform table */
160 if (i < MAX_EXT_TABLE_INDEX) {
163 DA_LOG(Default,"extlist[%s]\n",*extlist);
166 DA_LOG(Default,"extension from shared mime info[%s]",ext_temp);
169 if (strlen(ext_temp) < 1) {
170 /* If there is no mime string for OMD descriptor mime type */
171 if (strncmp(DD_MIME_STR,mime,strlen(DD_MIME_STR)) == 0) {
172 strncpy(ext_temp, DD_EXT_STR, DA_MAX_STR_LEN-1);
174 /* If there is no extension name for "applicaion/vnd.oma.drm.messeages"
175 * at shared-mime-info*/
176 } else if (strncmp(DRM_MIME_STR,mime,strlen(DD_MIME_STR)) == 0) {
177 strncpy(ext_temp, DRM_EXT_STR, DA_MAX_STR_LEN-1);
178 /* If there is extension name at extlist, the return value can have an error.*/
181 ret = DA_ERR_INVALID_MIME_TYPE;
182 DA_LOG_ERR(Default,"Invalid mime type : no extension name at list");
185 if (ret != DA_RESULT_OK)
188 temp = strchr(ext_temp,'.');
194 DA_LOG(Default,"final extension name:[%s]",temp);
195 *ext = (char*)calloc(1, strlen(temp) + 1);
196 if (*ext != DA_NULL) {
197 strncpy(*ext, temp,strlen(temp));
199 ret = DA_ERR_FAIL_TO_MEMALLOC ;
206 da_bool_t da_get_extension_name_from_url(char *url, char **ext)
208 da_bool_t ret = DA_TRUE;
209 char *buff = DA_NULL;
210 char *temp_str = DA_NULL;
213 DA_LOG_FUNC_START(Default);
215 if (DA_NULL == url || DA_NULL == ext) {
217 DA_LOG_ERR(Default,"Invalid Argument");
221 if ((temp_str = strrchr(url,'/'))) {
222 if ((buff = strrchr(temp_str,'.'))) {
225 /* check to exist "?" after extension name */
226 q = strrchr(buff,'?');
228 buf_len = strlen(buff) - strlen(q);
230 buf_len = strlen(buff);
232 *ext = (char*) calloc(1, buf_len + 1) ;
234 if (DA_NULL == *ext) {
236 DA_LOG_ERR(Default,"Memory Fail");
239 strncpy(*ext,buff,buf_len);
240 DA_LOG(Default,"extention name[%s]",*ext);
252 /* FIXME move this function to another file */
253 da_bool_t da_get_file_name_from_url(char *url, char **name)
255 da_bool_t ret = DA_TRUE;
256 char *buff = DA_NULL;
263 char name_buff[DA_MAX_FILE_PATH_LEN] = {0,};
265 DA_LOG_FUNC_START(Default);
267 if (DA_NULL == url || DA_NULL == name) {
269 DA_LOG_ERR(Default,"Invalid Argument");
273 if (!strstr(url, "http") && !strstr(url, "https")) {
275 DA_LOG_ERR(Default,"Invalid Argument");
279 buff = (char*) calloc(1, strlen(url) +1);
280 if(DA_NULL == buff) {
282 DA_LOG_ERR(Default,"Memory Fail");
286 while((c = url[i++]) != 0) {
288 char buffer[3] = {0,};
289 buffer[0] = url[i++];
290 buffer[1] = url[i++];
291 buff[j++] = (char)strtol(buffer,NULL,16);
296 End = strstr(buff, "?");
297 if (DA_NULL != End) {
299 while(*(Start) != '/') {
302 if ((*(Start) == '/') && ((len_name = (End - Start)) > 1)) {
304 if (DA_MAX_FILE_PATH_LEN <= len_name) {
305 strncpy(name_buff, Start, DA_MAX_FILE_PATH_LEN-1);
306 name_buff[DA_MAX_FILE_PATH_LEN-1] = '\0';
308 strncpy(name_buff, Start, len_name);
309 name_buff[len_name] = '\0';
313 goto ERR ; /*Name not found*/
316 int urlLen = strlen (buff);
318 Start_pos = urlLen - 1;
320 while(Start_pos > 0) {
321 if(buff[Start_pos] == '/')
326 if (Start_pos == 0 || urlLen - Start_pos <= 0) {
330 while(Start_pos < urlLen) {
331 name_buff[len_name++] = buff[Start_pos++];
332 if (DA_MAX_FILE_PATH_LEN <= len_name) {
333 name_buff[DA_MAX_FILE_PATH_LEN-1] ='\0';
340 End = strrchr(name_buff, '.');
344 DA_LOG(Default,"file name BEFORE removing prohibited character = %s", name_buff);
345 delete_prohibited_char(name_buff, strlen(name_buff));
346 DA_LOG(Default,"file name AFTER removing prohibited character = %s", name_buff);
347 len_name = strlen(name_buff);
348 *name = (char*) calloc(1, len_name + 1);
350 strncpy(*name, name_buff,len_name);
353 DA_LOG(Default,"Extracted file name : %s", *name);
362 void delete_prohibited_char(char *szTarget, int str_len)
364 char *chk_str = NULL;
369 if(szTarget == NULL || str_len <= 0 || strlen(szTarget) != str_len) {
370 DA_LOG_ERR(Default,"Invaild Parameter\n");
374 chk_str = (char *)calloc(1, str_len + 1);
378 while(szTarget[j] != '\0') {
379 if(IS_PROHIBITED_CHAR(szTarget[j]) == DA_FALSE &&
380 IS_SPACE_CHARACTER(szTarget[j]) == DA_FALSE) {
381 chk_str[i] = szTarget[j];
388 tar_len = strlen(chk_str);
393 for(i = 0; i < tar_len; i++)
395 szTarget[i] = chk_str[i];
400 if(chk_str != NULL) {