Fix bug related 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 = NULL;
236         char repl_item[MAX_QUERY_SIZE] = {0, };
237
238         FILE *fp = NULL;
239         long int file_size = 0;
240
241         *item_list = NULL; *item_count = 0;
242
243         fp = fopen(playlist_path, "rb");
244         media_content_retvm_if(fp == NULL, MEDIA_CONTENT_ERROR_INVALID_OPERATION, "fopen fail");
245
246         fseek(fp, 0, SEEK_END);
247         file_size = ftell(fp);
248         fseek(fp, 0 , SEEK_SET);
249
250         if (file_size == 0) {
251                 media_content_debug("file is empty.");
252                 fclose(fp);
253                 return MEDIA_CONTENT_ERROR_NONE;
254         }
255
256         *item_list = calloc(current_max_size, sizeof(char*));
257         tmp_str = malloc(MAX_QUERY_SIZE);
258         if (tmp_str == NULL || *item_list == NULL) {
259                 fclose(fp);
260                 SAFE_FREE(*item_list);
261                 SAFE_FREE(tmp_str);
262                 media_content_error("Out of Memory");
263                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
264         }
265         memset(tmp_str, 0, sizeof(MAX_QUERY_SIZE));
266
267         while (fgets(tmp_str, MAX_QUERY_SIZE, fp) != NULL) {
268                 memset(repl_item, 0, sizeof(repl_item));
269                 _media_content_replace_path(tmp_str, repl_item);
270                 tmp_str_len = strlen(repl_item);
271                 if (repl_item[tmp_str_len - 1] == '\n')
272                         repl_item[tmp_str_len - 1] = '\0';
273
274                 SAFE_FREE(tmp_str);
275                 tmp_str = strndup(repl_item, strlen(repl_item));
276
277                 if (tmp_str[0] != '#') {
278                         if (!(current_index < (current_max_size - 1))) {
279                                 current_max_size += PLAYLIST_ARRAY_EXPAND;
280                                 char **tmp_ptr = calloc(current_max_size, sizeof(char*));
281                                 if (tmp_ptr == NULL) {
282                                         __media_playlist_destroy_import_item(*item_list, current_index);
283                                         SAFE_FREE(tmp_str);
284                                         media_content_error("Out of Memory");
285                                         fclose(fp);
286                                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
287                                 }
288                                 memmove(tmp_ptr, *item_list, sizeof(char*) * current_index);
289                                 SAFE_FREE(*item_list);
290                                 *item_list = tmp_ptr;
291                         }
292
293                         (*item_list)[current_index] = malloc(tmp_str_len + 1);
294                         if ((*item_list)[current_index] == NULL) {
295                                 __media_playlist_destroy_import_item(*item_list, current_index);
296                                 SAFE_FREE(tmp_str);
297                                 media_content_error("Out of Memory");
298                                 fclose(fp);
299                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
300                         }
301                         memset((*item_list)[current_index], 0, tmp_str_len + 1);
302                         memmove((*item_list)[current_index], tmp_str, tmp_str_len);
303
304                         current_index += 1;
305                 }
306
307                 tmp_buf += (tmp_str_len);
308         }
309
310         *item_count = current_index;
311         SAFE_FREE(tmp_str);
312         fclose(fp);
313
314         return MEDIA_CONTENT_ERROR_NONE;
315 }
316
317 static int __media_playlist_destroy_import_item(char** item_list, int item_count)
318 {
319         int i = 0;
320
321         for (i = 0; i < item_count; ++i) {
322                 SAFE_FREE(item_list[i]);
323                 item_list[i] = NULL;
324         }
325
326         if (item_list != NULL) {
327                 SAFE_FREE(item_list);
328                 item_list = NULL;
329         }
330
331         return MEDIA_CONTENT_ERROR_NONE;
332 }
333
334 static void __media_playlist_destroy_export_item(gpointer data)
335 {
336         SAFE_FREE(data);
337         data = NULL;
338 }
339
340 int media_playlist_insert_to_db(const char *name, media_playlist_h *playlist)
341 {
342         int ret = MEDIA_CONTENT_ERROR_NONE;
343         int playlist_id = 0;
344
345         if (!STRING_VALID(name)) {
346                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
347                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
348         }
349
350         media_playlist_s *_playlist = (media_playlist_s*)calloc(1, sizeof(media_playlist_s));
351         media_content_retvm_if(_playlist == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
352
353         ret = __media_playlist_insert_playlist_record(name, &playlist_id);
354
355         if (ret != MEDIA_CONTENT_ERROR_NONE) {
356                 SAFE_FREE(_playlist);
357                 return ret;
358         }
359
360         _playlist->playlist_id = playlist_id;
361         _playlist->name = strdup(name);
362
363         if (_playlist->name == NULL) {
364                 SAFE_FREE(_playlist);
365                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
366                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
367         }
368
369         *playlist = (media_playlist_h)_playlist;
370
371         return ret;
372 }
373
374 int media_playlist_delete_from_db(int playlist_id)
375 {
376         int ret = MEDIA_CONTENT_ERROR_NONE;
377         char *query_str = NULL;
378
379         if (playlist_id < 0) {
380                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
381                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
382         }
383
384         query_str = sqlite3_mprintf(DELETE_PLAYLIST_FROM_PLAYLIST, playlist_id);
385
386         ret = _content_query_sql(query_str);
387
388         SQLITE3_SAFE_FREE(query_str);
389
390         return ret;
391 }
392
393 int media_playlist_get_playlist_count_from_db(filter_h filter, int *playlist_count)
394 {
395         int ret = MEDIA_CONTENT_ERROR_NONE;
396
397         if (playlist_count != NULL) {
398                 ret = _media_db_get_group_count(filter, MEDIA_GROUP_PLAYLIST, playlist_count);
399         } else {
400                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
401                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
402         }
403
404         return ret;
405 }
406
407 int media_playlist_foreach_playlist_from_db(filter_h filter, media_playlist_cb callback, void *user_data)
408 {
409         int ret = MEDIA_CONTENT_ERROR_NONE;
410
411         if (callback == NULL) {
412                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
413                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
414         }
415
416         ret = _media_db_get_playlist(filter, callback, user_data);
417
418         return ret;
419 }
420
421 int media_playlist_get_media_count_from_db(int playlist_id, filter_h filter, int *media_count)
422 {
423         int ret = MEDIA_CONTENT_ERROR_NONE;
424
425         if ((playlist_id > 0) && (media_count != NULL)) {
426                 ret = _media_db_get_group_item_count_by_id(playlist_id, filter, MEDIA_GROUP_PLAYLIST, media_count);
427         } else {
428                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
429                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
430         }
431
432         return ret;
433 }
434
435 int media_playlist_foreach_media_from_db(int playlist_id, filter_h filter, playlist_member_cb callback, void *user_data)
436 {
437         int ret = MEDIA_CONTENT_ERROR_NONE;
438
439         if ((playlist_id > 0) && (callback != NULL)) {
440                 ret = _media_db_get_playlist_item(playlist_id, filter, callback, user_data);
441         } else {
442                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
443                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
444         }
445
446         return ret;
447 }
448
449 int media_playlist_destroy(media_playlist_h playlist)
450 {
451         int ret = MEDIA_CONTENT_ERROR_NONE;
452         media_playlist_s *_playlist = (media_playlist_s*)playlist;
453
454         if (_playlist) {
455                 SAFE_FREE(_playlist->name);
456                 SAFE_FREE(_playlist->thumbnail_path);
457                 SAFE_FREE(_playlist);
458
459                 ret = MEDIA_CONTENT_ERROR_NONE;
460         } else {
461                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
462                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
463         }
464
465         return ret;
466 }
467
468 int media_playlist_clone(media_playlist_h *dst, media_playlist_h src)
469 {
470         int ret = MEDIA_CONTENT_ERROR_NONE;
471         media_playlist_s *_src = (media_playlist_s*)src;
472
473         if (_src != NULL) {
474                 media_playlist_s *_dst = (media_playlist_s*)calloc(1, sizeof(media_playlist_s));
475                 media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
476
477                 _dst->playlist_id = _src->playlist_id;
478
479                 if (STRING_VALID(_src->name)) {
480                         _dst->name = strdup(_src->name);
481                         if (_dst->name == NULL) {
482                                 media_playlist_destroy((media_playlist_h)_dst);
483                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
484                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
485                         }
486                 }
487
488                 *dst = (media_playlist_h)_dst;
489
490                 ret = MEDIA_CONTENT_ERROR_NONE;
491         } else {
492                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
493                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
494         }
495
496         return ret;
497 }
498
499 int media_playlist_get_playlist_from_db(int playlist_id, media_playlist_h *playlist)
500 {
501         int ret = MEDIA_CONTENT_ERROR_NONE;
502         sqlite3_stmt *stmt = NULL;
503         char select_query[DEFAULT_QUERY_SIZE];
504
505         if (playlist_id > 0) {
506                 memset(select_query, 0x00, sizeof(select_query));
507
508                 snprintf(select_query, sizeof(select_query), SELECT_PLAYLIST_FROM_PLAYLIST, playlist_id);
509
510                 ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
511                 media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
512
513                 media_playlist_s *_playlist = NULL;
514
515                 while (sqlite3_step(stmt) == SQLITE_ROW) {
516                         if (_playlist)
517                                 media_playlist_destroy((media_playlist_h)_playlist);
518
519                         _playlist = (media_playlist_s*)calloc(1, sizeof(media_playlist_s));
520                         if (_playlist == NULL) {
521                                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
522                                 SQLITE3_FINALIZE(stmt);
523                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
524                         }
525
526                         _playlist->playlist_id = (int)sqlite3_column_int(stmt, 0);
527                         _playlist->name = g_strdup((const char *)sqlite3_column_text(stmt, 1));
528                         _playlist->thumbnail_path = g_strdup((const char *)sqlite3_column_text(stmt, 3));
529
530                         *playlist = (media_playlist_h)_playlist;
531                 }
532
533                 SQLITE3_FINALIZE(stmt);
534         } else {
535                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
536                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
537         }
538
539         return ret;
540 }
541
542 int media_playlist_get_playlist_id(media_playlist_h playlist, int *playlist_id)
543 {
544         int ret = MEDIA_CONTENT_ERROR_NONE;
545
546         media_playlist_s *_playlist = (media_playlist_s*)playlist;
547
548         if ((_playlist != NULL) && (playlist_id != NULL)) {
549                 *playlist_id = _playlist->playlist_id;
550         } else {
551                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
552                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
553         }
554
555         return ret;
556 }
557
558 int media_playlist_get_name(media_playlist_h playlist, char **name)
559 {
560         int ret = MEDIA_CONTENT_ERROR_NONE;
561         media_playlist_s *_playlist = (media_playlist_s*)playlist;
562         if (_playlist) {
563                 if (STRING_VALID(_playlist->name)) {
564                         *name = strdup(_playlist->name);
565                         media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
566                 } else {
567                         *name = NULL;
568                 }
569
570                 ret = MEDIA_CONTENT_ERROR_NONE;
571         } else {
572                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
573                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
574         }
575
576         return ret;
577 }
578
579 int media_playlist_get_thumbnail_path(media_playlist_h playlist, char **path)
580 {
581         int ret = MEDIA_CONTENT_ERROR_NONE;
582         media_playlist_s *_playlist = (media_playlist_s*)playlist;
583         if (_playlist) {
584                 if (STRING_VALID(_playlist->thumbnail_path)) {
585                         *path = strdup(_playlist->thumbnail_path);
586                         media_content_retvm_if(*path == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
587                 } else {
588                         *path = NULL;
589                 }
590
591                 ret = MEDIA_CONTENT_ERROR_NONE;
592         } else {
593                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
594                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
595         }
596
597         return ret;
598 }
599
600 int media_playlist_get_play_order(media_playlist_h playlist, int playlist_member_id, int *play_order)
601 {
602         int ret = MEDIA_CONTENT_ERROR_NONE;
603         media_playlist_s *_playlist = (media_playlist_s*)playlist;
604         int playlist_id = 0;
605         sqlite3_stmt *stmt = NULL;
606         char select_query[DEFAULT_QUERY_SIZE];
607
608         if ((_playlist == NULL) || (playlist_member_id < 0) || (play_order == NULL)) {
609                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
610                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
611         }
612
613         playlist_id = _playlist->playlist_id;
614
615         memset(select_query, 0x00, sizeof(select_query));
616
617         snprintf(select_query, sizeof(select_query), SELECT_PLAY_ORDER_FROM_PLAYLIST_VIEW, playlist_id, playlist_member_id);
618
619         ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
620         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
621
622         while (sqlite3_step(stmt) == SQLITE_ROW)
623                 *play_order = (int)sqlite3_column_int(stmt, 0);
624
625         SQLITE3_FINALIZE(stmt);
626
627         return ret;
628 }
629
630 int media_playlist_set_name(media_playlist_h playlist, const char *playlist_name)
631 {
632         int ret = MEDIA_CONTENT_ERROR_NONE;
633         media_playlist_s *_playlist = (media_playlist_s*)playlist;
634
635         if (_playlist != NULL && STRING_VALID(playlist_name)) {
636                 SAFE_FREE(_playlist->name);
637
638                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
639                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
640
641                 item->playlist_name = strdup(playlist_name);
642                 item->function = MEDIA_PLAYLIST_UPDATE_PLAYLIST_NAME;
643                 if (item->playlist_name == NULL) {
644                         SAFE_FREE(item);
645                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
646                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
647                 }
648
649                 _playlist->name = strdup(playlist_name);
650                 if (_playlist->name == NULL) {
651                         SAFE_FREE(item->playlist_name);
652                         SAFE_FREE(item);
653                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
654                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
655                 }
656
657                 __media_playlist_item_add(_playlist, item);
658         } else {
659                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
660                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
661         }
662
663         return ret;
664 }
665
666 int media_playlist_set_thumbnail_path(media_playlist_h playlist, const char *path)
667 {
668         int ret = MEDIA_CONTENT_ERROR_NONE;
669         media_playlist_s *_playlist = (media_playlist_s*)playlist;
670         char repl_path[MAX_QUERY_SIZE] = {0, };
671
672         if (_playlist != NULL && STRING_VALID(path)) {
673                 SAFE_FREE(_playlist->thumbnail_path);
674
675                 memset(repl_path, 0, sizeof(repl_path));
676                 ret = _media_content_replace_path(path, repl_path);
677                 media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
678
679                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
680                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
681
682                 item->thumbnail_path = strdup(repl_path);
683                 item->function = MEDIA_PLAYLIST_UPDATE_THUMBNAIL_PATH;
684                 if (item->thumbnail_path == NULL) {
685                         SAFE_FREE(item);
686                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
687                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
688                 }
689
690                 _playlist->thumbnail_path = strdup(path);
691                 if (_playlist->thumbnail_path == NULL) {
692                         SAFE_FREE(item->thumbnail_path);
693                         SAFE_FREE(item);
694                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
695                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
696                 }
697
698                 __media_playlist_item_add(_playlist, item);
699         } else {
700                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
701                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
702         }
703
704         return ret;
705 }
706
707 int media_playlist_set_play_order(media_playlist_h playlist, int playlist_member_id, int play_order)
708 {
709         int ret = MEDIA_CONTENT_ERROR_NONE;
710         media_playlist_s *_playlist = (media_playlist_s*)playlist;
711
712         if ((_playlist != NULL) && (playlist_member_id > 0) && (play_order >= 0)) {
713                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
714                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
715
716                 item->playlist_member_id = playlist_member_id;
717                 item->function = MEDIA_PLAYLIST_UPDATE_PLAY_ORDER;
718                 item->play_order = play_order;
719
720                 __media_playlist_item_add(_playlist, item);
721         } else {
722                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
723                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
724         }
725
726         return ret;
727 }
728
729 int media_playlist_add_media(media_playlist_h playlist, const char *media_id)
730 {
731         int ret = MEDIA_CONTENT_ERROR_NONE;
732         media_playlist_s *_playlist = (media_playlist_s*)playlist;
733
734         if (_playlist != NULL && STRING_VALID(media_id)) {
735                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
736                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
737
738                 item->media_id = strdup(media_id);
739                 item->function = MEDIA_PLAYLIST_ADD;
740
741                 if (item->media_id == NULL) {
742                         SAFE_FREE(item);
743                         media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
744                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
745                 }
746
747                 __media_playlist_item_add(_playlist, item);
748         } else {
749                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
750                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
751         }
752
753         return ret;
754 }
755
756
757 int media_playlist_remove_media(media_playlist_h playlist, int playlist_member_id)
758 {
759         int ret = MEDIA_CONTENT_ERROR_NONE;
760         media_playlist_s *_playlist = (media_playlist_s*)playlist;
761
762         if ((_playlist != NULL) && (playlist_member_id > 0)) {
763                 media_playlist_item_s *item = (media_playlist_item_s*)calloc(1, sizeof(media_playlist_item_s));
764                 media_content_retvm_if(item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
765
766                 item->playlist_member_id = playlist_member_id;
767                 item->function = MEDIA_PLAYLIST_REMOVE;
768
769                 __media_playlist_item_add(_playlist, item);
770         } else {
771                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
772                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
773         }
774
775         return ret;
776 }
777
778 int media_playlist_update_to_db(media_playlist_h playlist)
779 {
780         int ret = MEDIA_CONTENT_ERROR_NONE;
781         media_playlist_s *_playlist = (media_playlist_s*)playlist;
782         int idx = 0;
783         int length = 0;
784         media_playlist_item_s *_playlist_item = NULL;
785
786         if (_playlist == NULL) {
787                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
788                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
789         }
790
791         if (_playlist->item_list != NULL) {
792                 length = g_list_length(_playlist->item_list);
793         } else {
794                 media_content_debug("operation list length is 0");
795                 return MEDIA_CONTENT_ERROR_NONE;
796         }
797
798         for (idx = 0; idx < length; idx++) {
799                 _playlist_item = (media_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx);
800                 if (_playlist_item != NULL) {
801                         switch (_playlist_item->function) {
802                         case MEDIA_PLAYLIST_ADD:
803                         {
804                                 ret = __media_playlist_insert_item_to_playlist(_playlist->playlist_id, _playlist_item->media_id);
805                         }
806                         break;
807
808                         case MEDIA_PLAYLIST_REMOVE:
809                         {
810                                 ret = __media_playlist_remove_item_from_playlist(_playlist->playlist_id, _playlist_item->playlist_member_id);
811                         }
812                         break;
813
814                         case MEDIA_PLAYLIST_UPDATE_PLAYLIST_NAME:
815                         {
816                                 ret = __media_playlist_update_playlist_name(_playlist->playlist_id, _playlist_item->playlist_name);
817                         }
818                         break;
819
820                         case MEDIA_PLAYLIST_UPDATE_THUMBNAIL_PATH:
821                         {
822                                 ret = __media_playlist_update_thumbnail_path(_playlist->playlist_id, _playlist_item->thumbnail_path);
823                         }
824                         break;
825
826                         case MEDIA_PLAYLIST_UPDATE_PLAY_ORDER:
827                         {
828                                 ret = __media_playlist_update_play_order(_playlist->playlist_id, _playlist_item->playlist_member_id, _playlist_item->play_order);
829                         }
830                         break;
831
832                         default:
833                         break;
834                         }
835                 }
836         }
837         ret = media_svc_send_query(tzplatform_getuid(TZ_USER_NAME));
838
839         __media_playlist_item_release(_playlist);
840
841         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
842 }
843
844 int media_playlist_import_from_file(const char *path, const char *playlist_name, media_playlist_h *playlist)
845 {
846         int ret = MEDIA_CONTENT_ERROR_NONE;
847         char** import_item_list = NULL;
848         int import_item_count = 0;
849         int idx;
850         char repl_path[MAX_QUERY_SIZE] = {0, };
851
852         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
853         media_content_retvm_if(!STRING_VALID(playlist_name), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid playlist_name");
854         memset(repl_path, 0, sizeof(repl_path));
855         ret = _media_content_replace_path(path, repl_path);
856         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
857
858         ret = media_playlist_insert_to_db(playlist_name, playlist);
859         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "media_playlist_insert_to_db fail");
860
861         ret = __media_playlist_import_item_from_file(repl_path, &import_item_list, &import_item_count);
862         if (ret != MEDIA_CONTENT_ERROR_NONE) {
863                 __media_playlist_destroy_import_item(import_item_list, import_item_count);
864                 media_content_error("Fail to get playlist from file");
865                 return ret;
866         }
867
868         if (import_item_count == 0)
869                 media_content_debug("The playlist from file is empty");
870
871         for (idx = 0; idx < import_item_count; idx++) {
872                 filter_h filter = NULL;
873                 char *media_id = NULL;
874                 char *condition = NULL;
875
876                 ret = media_filter_create(&filter);
877                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
878                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
879                         media_filter_destroy(filter);
880                         media_content_error("error media_filter_create");
881                         return ret;
882                 }
883                 condition = sqlite3_mprintf("path = '%q'", import_item_list[idx]);
884                 ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
885                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
886                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
887                         media_filter_destroy(filter);
888                         SQLITE3_SAFE_FREE(condition);
889                         media_content_error("error media_filter_set_condition");
890                         return ret;
891                 }
892                 ret = _media_db_get_group_item(NULL, filter, __media_playlist_media_info_cb, &media_id, MEDIA_GROUP_NONE);
893                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
894                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
895                         media_filter_destroy(filter);
896                         SAFE_FREE(media_id);
897                         SQLITE3_SAFE_FREE(condition);
898                         media_content_error("error media_info_foreach_media_from_db");
899                         return ret;
900                 }
901                 ret = media_playlist_add_media((media_playlist_h)*playlist, media_id);
902                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
903                         __media_playlist_destroy_import_item(import_item_list, import_item_count);
904                         media_filter_destroy(filter);
905                         SAFE_FREE(media_id);
906                         SQLITE3_SAFE_FREE(condition);
907                         media_content_error("error media_playlist_add_media");
908                         return ret;
909                 }
910                 media_filter_destroy(filter);
911                 SAFE_FREE(media_id);
912                 SQLITE3_SAFE_FREE(condition);
913         }
914
915         ret = media_playlist_update_to_db(*playlist);
916         if (ret != MEDIA_CONTENT_ERROR_NONE) {
917                 __media_playlist_destroy_import_item(import_item_list, import_item_count);
918                 media_content_error("Fail to update playlist to db");
919                 return ret;
920         }
921         __media_playlist_destroy_import_item(import_item_list, import_item_count);
922
923         return ret;
924 }
925
926 int media_playlist_export_to_file(media_playlist_h playlist, const char* path)
927 {
928         int ret = MEDIA_CONTENT_ERROR_NONE;
929         media_playlist_s *_playlist = (media_playlist_s*)playlist;
930         GList *item_list = NULL;
931         unsigned int idx = 0;
932         char repl_path[MAX_QUERY_SIZE] = {0, };
933         char repl_item[MAX_QUERY_SIZE] = {0, };
934
935         media_content_retvm_if(!STRING_VALID(path), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid path");
936         media_content_retvm_if(_playlist == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid playlist");
937         media_content_retvm_if(_playlist->playlist_id <= 0, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "Invalid playlist_id");
938         memset(repl_path, 0, sizeof(repl_path));
939         ret = _media_content_replace_path(path, repl_path);
940         media_content_retvm_if(!STRING_VALID(repl_path), MEDIA_CONTENT_ERROR_INVALID_OPERATION, "path replacement failed");
941
942         ret = _media_db_get_playlist_item(_playlist->playlist_id, NULL, __media_playlist_member_cb, &item_list);
943         media_content_retvm_if(ret != MEDIA_CONTENT_ERROR_NONE, ret, "_media_db_get_playlist_item fail");
944
945         ret = __media_playlist_reset_file(repl_path);
946         if (ret != MEDIA_CONTENT_ERROR_NONE) {
947                 g_list_free_full(item_list, __media_playlist_destroy_export_item);
948                 media_content_error("Fail to init playlist file");
949                 return ret;
950         }
951
952         for (idx = 0; idx < g_list_length(item_list); idx++) {
953                 char *item = g_list_nth_data(item_list, idx);
954                 memset(repl_item, 0, sizeof(repl_item));
955                 ret = _media_content_rollback_path(item, repl_item);
956
957                 ret = __media_playlist_append_to_file(repl_path, repl_item);
958                 if (ret != MEDIA_CONTENT_ERROR_NONE) {
959                         g_list_free_full(item_list, __media_playlist_destroy_export_item);
960                         media_content_error("Fail to export paths into file");
961                         return ret;
962                 }
963         }
964
965         g_list_free_full(item_list, __media_playlist_destroy_export_item);
966
967         return ret;
968 }