Fix bug(import playlist)
[platform/core/api/media-content.git] / src / media_playlist.c
1 /*
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
17
18 #include <media_filter.h>
19 #include <media_info.h>
20 #include <media_info_private.h>
21 #include <media_playlist.h>
22 #include <media_util_private.h>
23
24
25 #define PLAYLIST_ARRAY_SIZE                             20
26 #define PLAYLIST_ARRAY_EXPAND                   10
27 #define MAX_TMP_STR                                             2048
28
29 static void __media_playlist_item_add(media_playlist_s *playlist, media_playlist_item_s *item_s);
30 static void __media_playlist_item_release(media_playlist_s *playlist);
31 static int __media_playlist_insert_playlist_record(const char *playlist_name, int *playlist_id);
32 static int __media_playlist_insert_item_to_playlist(int playlist_id, const char *media_id);
33 static int __media_playlist_remove_item_from_playlist(int playlist_id, int playlist_member_id);
34 static int __media_playlist_update_playlist_name(int playlist_id, const char *playlist_name);
35 static int __media_playlist_update_thumbnail_path(int playlist_id, const char *path);
36 static int __media_playlist_update_play_order(int playlist_id, int playlist_member_id, int play_order);
37 static int __media_playlist_reset_file(const char* playlist_path);
38 static int __media_playlist_append_to_file(const char* playlist_path, const char* path);
39 static int __media_playlist_import_item_from_file(const char* playlist_path, char*** const item_list, int* item_count);
40 static int __media_playlist_destroy_import_item(char** item_list, int item_count);
41 static void __media_playlist_destroy_export_item(gpointer data);
42
43 static void __media_playlist_item_add(media_playlist_s *playlist, media_playlist_item_s *item_s)
44 {
45         playlist->item_list = g_list_append(playlist->item_list, item_s);
46 }
47
48 static void __media_playlist_item_release(media_playlist_s *playlist)
49 {
50         int idx = 0;
51         int list_cnt = 0;
52         media_playlist_item_s *item = NULL;
53
54         list_cnt = g_list_length(playlist->item_list);
55
56         media_content_debug("list_cnt : [%d]", list_cnt);
57
58         for (idx = 0; idx < list_cnt; idx++) {
59                 item = (media_playlist_item_s*)g_list_nth_data(playlist->item_list, idx);
60                 if (item != NULL) {
61                         SAFE_FREE(item->media_id);
62                         SAFE_FREE(item->playlist_name);
63                         SAFE_FREE(item->thumbnail_path);
64                         SAFE_FREE(item);
65                 }
66         }
67
68         g_list_free(playlist->item_list);
69         playlist->item_list = NULL;
70
71 }
72
73 static int __media_playlist_insert_playlist_record(const char *playlist_name, int *playlist_id)
74 {
75         int ret = MEDIA_CONTENT_ERROR_NONE;
76         char *query_str = NULL;
77         char *select_query = NULL;
78         sqlite3_stmt *stmt = NULL;
79
80         query_str = sqlite3_mprintf(INSERT_PLAYLIST_TO_PLAYLIST, playlist_name);
81
82         ret = _content_query_sql(query_str);
83         SQLITE3_SAFE_FREE(query_str);
84         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
85
86         select_query = sqlite3_mprintf(SELECT_PLAYLIST_ID_FROM_PLAYLIST, playlist_name);
87
88         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
89         SQLITE3_SAFE_FREE(select_query);
90         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
91
92         while (sqlite3_step(stmt) == SQLITE_ROW)
93                 *playlist_id = (int)sqlite3_column_int(stmt, 0);
94
95         SQLITE3_FINALIZE(stmt);
96
97         return MEDIA_CONTENT_ERROR_NONE;
98 }
99
100 static int __media_playlist_insert_item_to_playlist(int playlist_id, const char *media_id)
101 {
102         int ret = MEDIA_CONTENT_ERROR_NONE;
103         sqlite3_stmt *stmt = NULL;
104         char select_query[DEFAULT_QUERY_SIZE];
105         char *query_str = NULL;
106         int play_order = 0;
107
108         memset(select_query, 0x00, sizeof(select_query));
109
110         snprintf(select_query, sizeof(select_query), SELECT_MAX_PLAY_ORDER_FROM_PLAYLIST_VIEW, playlist_id);
111
112         /* get the max play_order */
113         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
114         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
115
116         while (sqlite3_step(stmt) == SQLITE_ROW)
117                 play_order = (int)sqlite3_column_int(stmt, 0);
118
119         SQLITE3_FINALIZE(stmt);
120
121         ++play_order;
122
123         query_str = sqlite3_mprintf("INSERT INTO %q (playlist_id, media_uuid, play_order) values (%d, '%q', %d);",
124                         DB_TABLE_PLAYLIST_MAP, playlist_id, media_id, play_order);
125         ret = media_svc_append_query(query_str, tzplatform_getuid(TZ_USER_NAME));
126
127         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
128 }
129
130 static int __media_playlist_remove_item_from_playlist(int playlist_id, int playlist_member_id)
131 {
132         int ret = MEDIA_CONTENT_ERROR_NONE;
133         char *query_str = NULL;
134
135         query_str = sqlite3_mprintf(REMOVE_PLAYLIST_ITEM_FROM_PLAYLIST_MAP, playlist_id, playlist_member_id);
136         ret = media_svc_append_query(query_str, tzplatform_getuid(TZ_USER_NAME));
137
138         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
139 }
140
141 static int __media_playlist_update_playlist_name(int playlist_id, const char *playlist_name)
142 {
143         int ret = MEDIA_CONTENT_ERROR_NONE;
144         char *query_str = NULL;
145
146         query_str = sqlite3_mprintf(UPDATE_PLAYLIST_NAME_FROM_PLAYLIST, playlist_name, playlist_id);
147         ret = media_svc_append_query(query_str, tzplatform_getuid(TZ_USER_NAME));
148
149         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
150 }
151
152 static int __media_playlist_update_thumbnail_path(int playlist_id, const char *path)
153 {
154         int ret = MEDIA_CONTENT_ERROR_NONE;
155         char *query_str = NULL;
156
157         query_str = sqlite3_mprintf(UPDATE_PLAYLIST_THUMBNAIL_FROM_PLAYLIST, path, playlist_id);
158         ret = media_svc_append_query(query_str, tzplatform_getuid(TZ_USER_NAME));
159
160         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
161 }
162
163 static int __media_playlist_update_play_order(int playlist_id, int playlist_member_id, int play_order)
164 {
165         int ret = MEDIA_CONTENT_ERROR_NONE;
166         char *query_str = NULL;
167
168         query_str = sqlite3_mprintf(UPDATE_PLAYLIST_ORDER_FROM_PLAYLIST_MAP, play_order, playlist_id, playlist_member_id);
169         ret = media_svc_append_query(query_str, tzplatform_getuid(TZ_USER_NAME));
170
171         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
172 }
173
174 static bool __media_playlist_media_info_cb(media_info_h media, void *user_data)
175 {
176         int ret = MEDIA_CONTENT_ERROR_NONE;
177         char **media_id = (char**)user_data;
178
179         ret = media_info_get_media_id(media, media_id);
180         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, FALSE, "media_info_get_media_id fail");
181
182         return TRUE;
183 }
184
185 static bool __media_playlist_member_cb(int playlist_member_id, media_info_h media, void *user_data)
186 {
187         int ret = MEDIA_CONTENT_ERROR_NONE;
188         GList **list = (GList**)user_data;
189         char *path = NULL;
190
191         ret = media_info_get_file_path(media, &path);
192         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, FALSE, "media_info_get_file_path fail");
193
194         *list = g_list_append(*list, path);
195
196         return TRUE;
197 }
198
199 static int __media_playlist_reset_file(const char* playlist_path)
200 {
201         FILE *fp = NULL;
202
203         fp = fopen(playlist_path, "wb");
204         media_content_retvm_if(fp == NULL, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "fopen fail");
205
206         fputs("", fp);  /* remove previous playlist */
207
208         fclose(fp);
209
210         return MEDIA_CONTENT_ERROR_NONE;
211 }
212
213 static int __media_playlist_append_to_file(const char* playlist_path, const char* path)
214 {
215         FILE *fp = NULL;
216
217         fp = fopen(playlist_path, "a"); /* append only */
218         media_content_retvm_if(fp == NULL, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "fopen fail");
219
220         fputs(path, fp);
221
222         fputs("\n", fp);
223
224         fclose(fp);
225
226         return MEDIA_CONTENT_ERROR_NONE;
227 }
228
229 static int __media_playlist_import_item_from_file(const char* playlist_path, char*** const item_list, int* item_count)
230 {
231         int current_index = 0;
232         int current_max_size = PLAYLIST_ARRAY_SIZE;
233         int tmp_str_len = 0;
234         char *tmp_buf = NULL;
235         char tmp_str[MAX_QUERY_SIZE] = {0, };
236         char repl_item[MAX_QUERY_SIZE] = {0, };
237         FILE *fp = NULL;
238         long int file_size = 0;
239
240         *item_list = NULL; *item_count = 0;
241
242         fp = fopen(playlist_path, "rb");
243         media_content_retvm_if(fp == NULL, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "fopen fail");
244
245         fseek(fp, 0, SEEK_END);
246         file_size = ftell(fp);
247         fseek(fp, 0 , SEEK_SET);
248
249         if (file_size == 0) {
250                 media_content_debug("file is empty.");
251                 fclose(fp);
252                 return MEDIA_CONTENT_ERROR_NONE;
253         }
254
255         *item_list = calloc(current_max_size, sizeof(char*));
256         if (*item_list == NULL) {
257                 fclose(fp);
258                 SAFE_FREE(*item_list);
259                 media_content_error("Out of Memory");
260                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
261         }
262         memset(tmp_str, 0, sizeof(MAX_QUERY_SIZE));
263
264         while (fgets(tmp_str, MAX_QUERY_SIZE, fp) != NULL) {
265                 memset(repl_item, 0, sizeof(repl_item));
266                 _media_content_replace_path(tmp_str, repl_item);
267                 tmp_str_len = strlen(repl_item);
268                 if (tmp_str_len > 0 && repl_item[tmp_str_len - 1] == '\n')
269                         repl_item[tmp_str_len - 1] = '\0';
270
271                 tmp_str_len = strlen(repl_item);
272
273                 if (tmp_str_len > 0 && repl_item[0] != '#') {
274                         if (!(current_index < (current_max_size - 1))) {
275                                 current_max_size += PLAYLIST_ARRAY_EXPAND;
276                                 char **tmp_ptr = calloc(current_max_size, sizeof(char*));
277                                 if (tmp_ptr == NULL) {
278                                         __media_playlist_destroy_import_item(*item_list, current_index);
279                                         media_content_error("Out of Memory");
280                                         fclose(fp);
281                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
282                                 }
283                                 memmove(tmp_ptr, *item_list, sizeof(char*) * current_index);
284                                 SAFE_FREE(*item_list);
285                                 *item_list = tmp_ptr;
286                         }
287
288                         (*item_list)[current_index] = malloc(tmp_str_len + 1);
289                         if ((*item_list)[current_index] == NULL) {
290                                 __media_playlist_destroy_import_item(*item_list, current_index);
291                                 media_content_error("Out of Memory");
292                                 fclose(fp);
293                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
294                         }
295                         memset((*item_list)[current_index], 0, tmp_str_len + 1);
296                         memmove((*item_list)[current_index], repl_item, tmp_str_len);
297
298                         current_index += 1;
299                 }
300
301                 tmp_buf += (tmp_str_len);
302         }
303
304         *item_count = current_index;
305         fclose(fp);
306
307         return MEDIA_CONTENT_ERROR_NONE;
308 }
309
310 static int __media_playlist_destroy_import_item(char** item_list, int item_count)
311 {
312         int i = 0;
313
314         for (i = 0; i < item_count; ++i) {
315                 SAFE_FREE(item_list[i]);
316                 item_list[i] = NULL;
317         }
318
319         if (item_list != NULL) {
320                 SAFE_FREE(item_list);
321                 item_list = NULL;
322         }
323
324         return MEDIA_CONTENT_ERROR_NONE;
325 }
326
327 static void __media_playlist_destroy_export_item(gpointer data)
328 {
329         SAFE_FREE(data);
330         data = NULL;
331 }
332
333 int media_playlist_insert_to_db(const char *name, media_playlist_h *playlist)
334 {
335         int ret = MEDIA_CONTENT_ERROR_NONE;
336         int playlist_id = 0;
337
338         if (!STRING_VALID(name)) {
339                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
340                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
341         }
342
343         media_playlist_s *_playlist = (media_playlist_s*)calloc(1, sizeof(media_playlist_s));
344         media_content_retvm_if(_playlist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
345
346         ret = __media_playlist_insert_playlist_record(name, &playlist_id);
347
348         if (ret != MEDIA_CONTENT_ERROR_NONE) {
349                 SAFE_FREE(_playlist);
350                 return ret;
351         }
352
353         _playlist->playlist_id = playlist_id;
354         _playlist->name = strdup(name);
355
356         if (_playlist->name == NULL) {
357                 SAFE_FREE(_playlist);
358                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
359                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
360         }
361
362         *playlist = (media_playlist_h)_playlist;
363
364         return ret;
365 }
366
367 int media_playlist_delete_from_db(int playlist_id)
368 {
369         int ret = MEDIA_CONTENT_ERROR_NONE;
370         char *query_str = NULL;
371
372         if (playlist_id < 0) {
373                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
374                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
375         }
376
377         query_str = sqlite3_mprintf(DELETE_PLAYLIST_FROM_PLAYLIST, playlist_id);
378
379         ret = _content_query_sql(query_str);
380
381         SQLITE3_SAFE_FREE(query_str);
382
383         return ret;
384 }
385
386 int media_playlist_get_playlist_count_from_db(filter_h filter, int *playlist_count)
387 {
388         int ret = MEDIA_CONTENT_ERROR_NONE;
389
390         if (playlist_count != NULL) {
391                 ret = _media_db_get_group_count(filter, MEDIA_GROUP_PLAYLIST, playlist_count);
392         } else {
393                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
394                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
395         }
396
397         return ret;
398 }
399
400 int media_playlist_foreach_playlist_from_db(filter_h filter, media_playlist_cb callback, void *user_data)
401 {
402         int ret = MEDIA_CONTENT_ERROR_NONE;
403
404         if (callback == NULL) {
405                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
406                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
407         }
408
409         ret = _media_db_get_playlist(filter, callback, user_data);
410
411         return ret;
412 }
413
414 int media_playlist_get_media_count_from_db(int playlist_id, filter_h filter, int *media_count)
415 {
416         int ret = MEDIA_CONTENT_ERROR_NONE;
417
418         if ((playlist_id > 0) && (media_count != NULL)) {
419                 ret = _media_db_get_group_item_count_by_id(playlist_id, filter, MEDIA_GROUP_PLAYLIST, media_count);
420         } else {
421                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
422                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
423         }
424
425         return ret;
426 }
427
428 int media_playlist_foreach_media_from_db(int playlist_id, filter_h filter, playlist_member_cb callback, void *user_data)
429 {
430         int ret = MEDIA_CONTENT_ERROR_NONE;
431
432         if ((playlist_id > 0) && (callback != NULL)) {
433                 ret = _media_db_get_playlist_item(playlist_id, filter, callback, user_data);
434         } else {
435                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
436                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
437         }
438
439         return ret;
440 }
441
442 int media_playlist_destroy(media_playlist_h playlist)
443 {
444         int ret = MEDIA_CONTENT_ERROR_NONE;
445         media_playlist_s *_playlist = (media_playlist_s*)playlist;
446
447         if (_playlist) {
448                 SAFE_FREE(_playlist->name);
449                 SAFE_FREE(_playlist->thumbnail_path);
450                 SAFE_FREE(_playlist);
451
452                 ret = MEDIA_CONTENT_ERROR_NONE;
453         } else {
454                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
455                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
456         }
457
458         return ret;
459 }
460
461 int media_playlist_clone(media_playlist_h *dst, media_playlist_h src)
462 {
463         int ret = MEDIA_CONTENT_ERROR_NONE;
464         media_playlist_s *_src = (media_playlist_s*)src;
465
466         if (_src != NULL) {
467                 media_playlist_s *_dst = (media_playlist_s*)calloc(1, sizeof(media_playlist_s));
468                 media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
469
470                 _dst->playlist_id = _src->playlist_id;
471
472                 if (STRING_VALID(_src->name)) {
473                         _dst->name = strdup(_src->name);
474                         if (_dst->name == NULL) {
475                                 media_playlist_destroy((media_playlist_h)_dst);
476                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
477                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
478                         }
479                 }
480
481                 *dst = (media_playlist_h)_dst;
482
483                 ret = MEDIA_CONTENT_ERROR_NONE;
484         } else {
485                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
486                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
487         }
488
489         return ret;
490 }
491
492 int media_playlist_get_playlist_from_db(int playlist_id, media_playlist_h *playlist)
493 {
494         int ret = MEDIA_CONTENT_ERROR_NONE;
495         sqlite3_stmt *stmt = NULL;
496         char select_query[DEFAULT_QUERY_SIZE];
497
498         if (playlist_id > 0) {
499                 memset(select_query, 0x00, sizeof(select_query));
500
501                 snprintf(select_query, sizeof(select_query), SELECT_PLAYLIST_FROM_PLAYLIST, playlist_id);
502
503                 ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
504                 media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
505
506                 media_playlist_s *_playlist = NULL;
507
508                 while (sqlite3_step(stmt) == SQLITE_ROW) {
509                         if (_playlist)
510                                 media_playlist_destroy((media_playlist_h)_playlist);
511
512                         _playlist = (media_playlist_s*)calloc(1, sizeof(media_playlist_s));
513                         if (_playlist == NULL) {
514                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
515                                 SQLITE3_FINALIZE(stmt);
516                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
517                         }
518
519                         _playlist->playlist_id = (int)sqlite3_column_int(stmt, 0);
520                         _playlist->name = g_strdup((const char *)sqlite3_column_text(stmt, 1));
521                         _playlist->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, 3));
522
523                         *playlist = (media_playlist_h)_playlist;
524                 }
525
526                 SQLITE3_FINALIZE(stmt);
527         } else {
528                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
529                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
530         }
531
532         return ret;
533 }
534
535 int media_playlist_get_playlist_id(media_playlist_h playlist, int *playlist_id)
536 {
537         int ret = MEDIA_CONTENT_ERROR_NONE;
538
539         media_playlist_s *_playlist = (media_playlist_s*)playlist;
540
541         if ((_playlist != NULL) && (playlist_id != NULL)) {
542                 *playlist_id = _playlist->playlist_id;
543         } else {
544                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
545                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
546         }
547
548         return ret;
549 }
550
551 int media_playlist_get_name(media_playlist_h playlist, char **name)
552 {
553         int ret = MEDIA_CONTENT_ERROR_NONE;
554         media_playlist_s *_playlist = (media_playlist_s*)playlist;
555         if (_playlist) {
556                 if (STRING_VALID(_playlist->name)) {
557                         *name = strdup(_playlist->name);
558                         media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
559                 } else {
560                         *name = NULL;
561                 }
562
563                 ret = MEDIA_CONTENT_ERROR_NONE;
564         } else {
565                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
566                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
567         }
568
569         return ret;
570 }
571
572 int media_playlist_get_thumbnail_path(media_playlist_h playlist, char **path)
573 {
574         int ret = MEDIA_CONTENT_ERROR_NONE;
575         media_playlist_s *_playlist = (media_playlist_s*)playlist;
576         if (_playlist) {
577                 if (STRING_VALID(_playlist->thumbnail_path)) {
578                         *path = strdup(_playlist->thumbnail_path);
579                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
580                 } else {
581                         *path = NULL;
582                 }
583
584                 ret = MEDIA_CONTENT_ERROR_NONE;
585         } else {
586                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
587                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
588         }
589
590         return ret;
591 }
592
593 int media_playlist_get_play_order(media_playlist_h playlist, int playlist_member_id, int *play_order)
594 {
595         int ret = MEDIA_CONTENT_ERROR_NONE;
596         media_playlist_s *_playlist = (media_playlist_s*)playlist;
597         int playlist_id = 0;
598         sqlite3_stmt *stmt = NULL;
599         char select_query[DEFAULT_QUERY_SIZE];
600
601         if ((_playlist == NULL) || (playlist_member_id < 0) || (play_order == NULL)) {
602                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
603                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
604         }
605
606         playlist_id = _playlist->playlist_id;
607
608         memset(select_query, 0x00, sizeof(select_query));
609
610         snprintf(select_query, sizeof(select_query), SELECT_PLAY_ORDER_FROM_PLAYLIST_VIEW, playlist_id, playlist_member_id);
611
612         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
613         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
614
615         while (sqlite3_step(stmt) == SQLITE_ROW)
616                 *play_order = (int)sqlite3_column_int(stmt, 0);
617
618         SQLITE3_FINALIZE(stmt);
619
620         return ret;
621 }
622
623 int media_playlist_set_name(media_playlist_h playlist, const char *playlist_name)
624 {
625         int ret = MEDIA_CONTENT_ERROR_NONE;
626         media_playlist_s *_playlist = (media_playlist_s*)playlist;
627
628         if (_playlist != NULL && STRING_VALID(playlist_name)) {
629                 SAFE_FREE(_playlist->name);
630
631                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
632                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
633
634                 item->playlist_name = strdup(playlist_name);
635                 item->function = MEDIA_PLAYLIST_UPDATE_PLAYLIST_NAME;
636                 if (item->playlist_name == NULL) {
637                         SAFE_FREE(item);
638                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
639                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
640                 }
641
642                 _playlist->name = strdup(playlist_name);
643                 if (_playlist->name == NULL) {
644                         SAFE_FREE(item->playlist_name);
645                         SAFE_FREE(item);
646                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
647                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
648                 }
649
650                 __media_playlist_item_add(_playlist, item);
651         } else {
652                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
653                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
654         }
655
656         return ret;
657 }
658
659 int media_playlist_set_thumbnail_path(media_playlist_h playlist, const char *path)
660 {
661         int ret = MEDIA_CONTENT_ERROR_NONE;
662         media_playlist_s *_playlist = (media_playlist_s*)playlist;
663         char repl_path[MAX_QUERY_SIZE] = {0, };
664
665         if (_playlist != NULL && STRING_VALID(path)) {
666                 SAFE_FREE(_playlist->thumbnail_path);
667
668                 memset(repl_path, 0, sizeof(repl_path));
669                 ret = _media_content_replace_path(path, repl_path);
670                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
671
672                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
673                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
674
675                 item->thumbnail_path = strdup(repl_path);
676                 item->function = MEDIA_PLAYLIST_UPDATE_THUMBNAIL_PATH;
677                 if (item->thumbnail_path == NULL) {
678                         SAFE_FREE(item);
679                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
680                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
681                 }
682
683                 _playlist->thumbnail_path = strdup(path);
684                 if (_playlist->thumbnail_path == NULL) {
685                         SAFE_FREE(item->thumbnail_path);
686                         SAFE_FREE(item);
687                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
688                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
689                 }
690
691                 __media_playlist_item_add(_playlist, item);
692         } else {
693                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
694                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
695         }
696
697         return ret;
698 }
699
700 int media_playlist_set_play_order(media_playlist_h playlist, int playlist_member_id, int play_order)
701 {
702         int ret = MEDIA_CONTENT_ERROR_NONE;
703         media_playlist_s *_playlist = (media_playlist_s*)playlist;
704
705         if ((_playlist != NULL) && (playlist_member_id > 0) && (play_order >= 0)) {
706                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
707                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
708
709                 item->playlist_member_id = playlist_member_id;
710                 item->function = MEDIA_PLAYLIST_UPDATE_PLAY_ORDER;
711                 item->play_order = play_order;
712
713                 __media_playlist_item_add(_playlist, item);
714         } else {
715                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
716                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
717         }
718
719         return ret;
720 }
721
722 int media_playlist_add_media(media_playlist_h playlist, const char *media_id)
723 {
724         int ret = MEDIA_CONTENT_ERROR_NONE;
725         media_playlist_s *_playlist = (media_playlist_s*)playlist;
726
727         if (_playlist != NULL && STRING_VALID(media_id)) {
728                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
729                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
730
731                 item->media_id = strdup(media_id);
732                 item->function = MEDIA_PLAYLIST_ADD;
733
734                 if (item->media_id == NULL) {
735                         SAFE_FREE(item);
736                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
737                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
738                 }
739
740                 __media_playlist_item_add(_playlist, item);
741         } else {
742                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
743                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
744         }
745
746         return ret;
747 }
748
749
750 int media_playlist_remove_media(media_playlist_h playlist, int playlist_member_id)
751 {
752         int ret = MEDIA_CONTENT_ERROR_NONE;
753         media_playlist_s *_playlist = (media_playlist_s*)playlist;
754
755         if ((_playlist != NULL) && (playlist_member_id > 0)) {
756                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
757                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
758
759                 item->playlist_member_id = playlist_member_id;
760                 item->function = MEDIA_PLAYLIST_REMOVE;
761
762                 __media_playlist_item_add(_playlist, item);
763         } else {
764                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
765                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
766         }
767
768         return ret;
769 }
770
771 int media_playlist_update_to_db(media_playlist_h playlist)
772 {
773         int ret = MEDIA_CONTENT_ERROR_NONE;
774         media_playlist_s *_playlist = (media_playlist_s*)playlist;
775         int idx = 0;
776         int length = 0;
777         media_playlist_item_s *_playlist_item = NULL;
778
779         if (_playlist == NULL) {
780                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
781                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
782         }
783
784         if (_playlist->item_list != NULL) {
785                 length = g_list_length(_playlist->item_list);
786         } else {
787                 media_content_debug("operation list length is 0");
788                 return MEDIA_CONTENT_ERROR_NONE;
789         }
790
791         for (idx = 0; idx < length; idx++) {
792                 _playlist_item = (media_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
793                 if (_playlist_item != NULL) {
794                         switch (_playlist_item->function) {
795                         case MEDIA_PLAYLIST_ADD:
796                         {
797                                 ret = __media_playlist_insert_item_to_playlist(_playlist->playlist_id, _playlist_item->media_id);
798                         }
799                         break;
800
801                         case MEDIA_PLAYLIST_REMOVE:
802                         {
803                                 ret = __media_playlist_remove_item_from_playlist(_playlist->playlist_id, _playlist_item->playlist_member_id);
804                         }
805                         break;
806
807                         case MEDIA_PLAYLIST_UPDATE_PLAYLIST_NAME:
808                         {
809                                 ret = __media_playlist_update_playlist_name(_playlist->playlist_id, _playlist_item->playlist_name);
810                         }
811                         break;
812
813                         case MEDIA_PLAYLIST_UPDATE_THUMBNAIL_PATH:
814                         {
815                                 ret = __media_playlist_update_thumbnail_path(_playlist->playlist_id, _playlist_item->thumbnail_path);
816                         }
817                         break;
818
819                         case MEDIA_PLAYLIST_UPDATE_PLAY_ORDER:
820                         {
821                                 ret = __media_playlist_update_play_order(_playlist->playlist_id, _playlist_item->playlist_member_id, _playlist_item->play_order);
822                         }
823                         break;
824
825                         default:
826                         break;
827                         }
828                 }
829         }
830         ret = media_svc_send_query(tzplatform_getuid(TZ_USER_NAME));
831
832         __media_playlist_item_release(_playlist);
833
834         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
835 }
836
837 int media_playlist_import_from_file(const char *path, const char *playlist_name, media_playlist_h *playlist)
838 {
839         int ret = MEDIA_CONTENT_ERROR_NONE;
840         char** import_item_list = NULL;
841         int import_item_count = 0;
842         int idx;
843         char repl_path[MAX_QUERY_SIZE] = {0, };
844
845         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
846         media_content_retvm_if(!STRING_VALID(playlist_name), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid playlist_name");
847         memset(repl_path, 0, sizeof(repl_path));
848         ret = _media_content_replace_path(path, repl_path);
849         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
850
851         ret = media_playlist_insert_to_db(playlist_name, playlist);
852         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_playlist_insert_to_db fail");
853
854         ret = __media_playlist_import_item_from_file(repl_path, &import_item_list, &import_item_count);
855         if (ret != MEDIA_CONTENT_ERROR_NONE) {
856                 __media_playlist_destroy_import_item(import_item_list, import_item_count);
857                 media_content_error("Fail to get playlist from file");
858                 return ret;
859         }
860
861         if (import_item_count == 0)
862                 media_content_debug("The playlist from file is empty");
863
864         for (idx = 0; idx < import_item_count; idx++) {
865                 filter_h filter = NULL;
866                 char *media_id = NULL;
867                 char *condition = NULL;
868
869                 ret = media_filter_create(&filter);
870                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
871                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
872                         media_filter_destroy(filter);
873                         media_content_error("error media_filter_create");
874                         return ret;
875                 }
876                 condition = sqlite3_mprintf("path = '%q'", import_item_list[idx]);
877                 ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
878                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
879                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
880                         media_filter_destroy(filter);
881                         SQLITE3_SAFE_FREE(condition);
882                         media_content_error("error media_filter_set_condition");
883                         return ret;
884                 }
885                 ret = _media_db_get_group_item(NULL, filter, __media_playlist_media_info_cb, &media_id, MEDIA_GROUP_NONE);
886                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
887                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
888                         media_filter_destroy(filter);
889                         SAFE_FREE(media_id);
890                         SQLITE3_SAFE_FREE(condition);
891                         media_content_error("error media_info_foreach_media_from_db");
892                         return ret;
893                 }
894                 ret = media_playlist_add_media((media_playlist_h)*playlist, media_id);
895                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
896                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
897                         media_filter_destroy(filter);
898                         SAFE_FREE(media_id);
899                         SQLITE3_SAFE_FREE(condition);
900                         media_content_error("error media_playlist_add_media");
901                         return ret;
902                 }
903                 media_filter_destroy(filter);
904                 SAFE_FREE(media_id);
905                 SQLITE3_SAFE_FREE(condition);
906         }
907
908         ret = media_playlist_update_to_db(*playlist);
909         if (ret != MEDIA_CONTENT_ERROR_NONE) {
910                 __media_playlist_destroy_import_item(import_item_list, import_item_count);
911                 media_content_error("Fail to update playlist to db");
912                 return ret;
913         }
914         __media_playlist_destroy_import_item(import_item_list, import_item_count);
915
916         return ret;
917 }
918
919 int media_playlist_export_to_file(media_playlist_h playlist, const char* path)
920 {
921         int ret = MEDIA_CONTENT_ERROR_NONE;
922         media_playlist_s *_playlist = (media_playlist_s*)playlist;
923         GList *item_list = NULL;
924         unsigned int idx = 0;
925         char repl_path[MAX_QUERY_SIZE] = {0, };
926         char repl_item[MAX_QUERY_SIZE] = {0, };
927
928         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
929         media_content_retvm_if(_playlist == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid playlist");
930         media_content_retvm_if(_playlist->playlist_id <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid playlist_id");
931         memset(repl_path, 0, sizeof(repl_path));
932         ret = _media_content_replace_path(path, repl_path);
933         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
934
935         ret = _media_db_get_playlist_item(_playlist->playlist_id, NULL, __media_playlist_member_cb, &item_list);
936         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "_media_db_get_playlist_item fail");
937
938         ret = __media_playlist_reset_file(repl_path);
939         if (ret != MEDIA_CONTENT_ERROR_NONE) {
940                 g_list_free_full(item_list, __media_playlist_destroy_export_item);
941                 media_content_error("Fail to init playlist file");
942                 return ret;
943         }
944
945         for (idx = 0; idx < g_list_length(item_list); idx++) {
946                 char *item = g_list_nth_data(item_list, idx);
947                 memset(repl_item, 0, sizeof(repl_item));
948                 ret = _media_content_rollback_path(item, repl_item);
949
950                 ret = __media_playlist_append_to_file(repl_path, repl_item);
951                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
952                         g_list_free_full(item_list, __media_playlist_destroy_export_item);
953                         media_content_error("Fail to export paths into file");
954                         return ret;
955                 }
956         }
957
958         g_list_free_full(item_list, __media_playlist_destroy_export_item);
959
960         return ret;
961 }