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