4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hyunjun Ko <zzoon.ko@samsung.com>, Haejeong Kim <backto.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
26 #include "media-svc-env.h"
27 #include "media-svc-util.h"
28 #include "audio-svc.h"
29 #include "audio-svc-error.h"
30 #include "audio-svc-debug.h"
31 #include "audio-svc-utils.h"
32 #include "audio-svc-music-table.h"
33 #include "audio-svc-playlist-table.h"
34 #include "audio-svc-types-priv.h"
35 #include "audio-svc-db-utils.h"
37 #define AUDIO_SVC_DATABASE_NAME "/opt/dbspace/.media.db"
39 static __thread int g_audio_svc_item_valid_data_cnt = 1;
40 static __thread int g_audio_svc_item_valid_cur_data_cnt = 0;
42 static __thread int g_audio_svc_move_item_data_cnt = 1;
43 static __thread int g_audio_svc_move_item_cur_data_cnt = 0;
45 static __thread int g_audio_svc_insert_item_data_cnt = 1;
46 static __thread int g_audio_svc_insert_item_cur_data_cnt = 0;
48 int audio_svc_create_table(MediaSvcHandle *handle)
50 int ret = AUDIO_SVC_ERROR_NONE;
51 sqlite3 * db_handle = (sqlite3 *)handle;
53 if(db_handle == NULL) {
54 audio_svc_error("Handle is NULL");
55 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
58 ret = _audio_svc_create_music_table(db_handle);
59 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
61 ret = _audio_svc_create_playlist_table(db_handle);
62 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
64 ret = _audio_svc_create_folder_table(db_handle);
65 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
67 return AUDIO_SVC_ERROR_NONE;
70 int audio_svc_delete_all(MediaSvcHandle *handle, audio_svc_storage_type_e storage_type)
72 char * dirpath = NULL;
73 int ret = AUDIO_SVC_ERROR_NONE;
74 sqlite3 * db_handle = (sqlite3 *)handle;
76 if(db_handle == NULL) {
77 audio_svc_error("Handle is NULL");
78 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
81 if (storage_type != AUDIO_SVC_STORAGE_PHONE
82 && storage_type != AUDIO_SVC_STORAGE_MMC) {
83 audio_svc_error("storage type should be phone or mmc");
84 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
87 ret = _audio_svc_truncate_music_table(db_handle, storage_type);
88 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
90 /* 20111110, make each thumbnail */
91 /* 20110428, thumbnail path depends on th album ID. So Don't remove all file in special directory. */
92 dirpath = (storage_type == AUDIO_SVC_STORAGE_PHONE) ? AUDIO_SVC_THUMB_PHONE_PATH : AUDIO_SVC_THUMB_MMC_PATH;
94 /* remove thumbnails */
95 audio_svc_debug("dirpath [%s]", dirpath);
96 ret = _audio_svc_remove_all_files_in_dir(dirpath);
97 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
99 /* update folder table */
100 ret = _audio_svc_delete_folder(db_handle, storage_type, NULL);
101 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
104 ret = _audio_svc_check_and_update_albums_table(NULL);
105 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
108 return AUDIO_SVC_ERROR_NONE;
111 int audio_svc_insert_item_start(MediaSvcHandle *handle, int data_cnt)
113 audio_svc_debug("Transaction data count : [%d]", data_cnt);
116 audio_svc_error("Handle is NULL");
117 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
121 audio_svc_error("data_cnt shuld be bigger than 1. data_cnt : [%d]", data_cnt);
122 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
125 g_audio_svc_insert_item_data_cnt = data_cnt;
126 g_audio_svc_insert_item_cur_data_cnt = 0;
128 return AUDIO_SVC_ERROR_NONE;
131 int audio_svc_insert_item_end(MediaSvcHandle *handle)
133 audio_svc_debug_func();
135 int ret = AUDIO_SVC_ERROR_NONE;
136 sqlite3 * db_handle = (sqlite3 *)handle;
138 if(db_handle == NULL) {
139 audio_svc_error("Handle is NULL");
140 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
143 if (g_audio_svc_insert_item_cur_data_cnt > 0) {
145 ret = _audio_svc_list_query_do(db_handle, AUDIO_SVC_QUERY_INSERT_ITEM);
148 g_audio_svc_insert_item_data_cnt = 1;
149 g_audio_svc_insert_item_cur_data_cnt = 0;
154 int audio_svc_insert_item(MediaSvcHandle *handle, audio_svc_storage_type_e storage_type,
155 const char *path, audio_svc_category_type_e category)
157 int ret = AUDIO_SVC_ERROR_NONE;
158 sqlite3 * db_handle = (sqlite3 *)handle;
160 if(db_handle == NULL) {
161 audio_svc_error("Handle is NULL");
162 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
165 if (storage_type != AUDIO_SVC_STORAGE_PHONE
166 && storage_type != AUDIO_SVC_STORAGE_MMC) {
167 audio_svc_error("storage type is incorrect(%d)", storage_type);
168 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
171 if (!STRING_VALID(path)) {
172 audio_svc_error("path is NULL");
173 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
176 audio_svc_debug("storage[%d], path[%s], category[%d]", storage_type, path, category);
178 if ((category != AUDIO_SVC_CATEGORY_MUSIC)
179 && (category != AUDIO_SVC_CATEGORY_SOUND)) {
180 audio_svc_error("invalid category condition");
181 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
184 audio_svc_audio_item_s item;
185 memset(&item, 0, sizeof(audio_svc_audio_item_s));
187 item.category = category;
188 item.time_added = time(NULL);
190 ret = _audio_svc_extract_metadata_audio(storage_type, path, &item);
191 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
193 if (g_audio_svc_insert_item_data_cnt == 1) {
195 return _audio_svc_insert_item_with_data(db_handle, &item, FALSE);
198 else if(g_audio_svc_insert_item_cur_data_cnt < (g_audio_svc_insert_item_data_cnt - 1)) {
200 ret = _audio_svc_insert_item_with_data(db_handle, &item, TRUE);
201 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
202 g_audio_svc_insert_item_cur_data_cnt ++;
205 else if (g_audio_svc_insert_item_cur_data_cnt == (g_audio_svc_insert_item_data_cnt - 1)) {
207 ret = _audio_svc_insert_item_with_data(db_handle, &item, TRUE);
208 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
210 ret = _audio_svc_list_query_do(db_handle, AUDIO_SVC_QUERY_INSERT_ITEM);
211 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
213 g_audio_svc_insert_item_cur_data_cnt = 0;
217 audio_svc_debug("Error in audio_svc_insert_item");
218 return AUDIO_SVC_ERROR_INTERNAL;
221 return AUDIO_SVC_ERROR_NONE;
224 int audio_svc_insert_item_immediately(MediaSvcHandle *handle, audio_svc_storage_type_e storage_type,
225 const char *path, audio_svc_category_type_e category)
227 int ret = AUDIO_SVC_ERROR_NONE;
228 sqlite3 * db_handle = (sqlite3 *)handle;
230 if(db_handle == NULL) {
231 audio_svc_error("Handle is NULL");
232 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
235 if (storage_type != AUDIO_SVC_STORAGE_PHONE
236 && storage_type != AUDIO_SVC_STORAGE_MMC) {
237 audio_svc_error("storage type is incorrect(%d)", storage_type);
238 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
241 if (!STRING_VALID(path)) {
242 audio_svc_error("path is NULL");
243 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
246 audio_svc_debug("storage[%d], path[%s], category[%d]", storage_type, path, category);
248 if ((category != AUDIO_SVC_CATEGORY_MUSIC)
249 && (category != AUDIO_SVC_CATEGORY_SOUND)) {
250 audio_svc_error("invalid category condition");
251 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
254 audio_svc_audio_item_s item;
255 memset(&item, 0, sizeof(audio_svc_audio_item_s));
257 item.category = category;
258 item.time_added = time(NULL);
260 ret = _audio_svc_extract_metadata_audio(storage_type, path, &item);
261 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
263 return _audio_svc_insert_item_with_data(db_handle, &item, FALSE);
266 int audio_svc_get_item_by_path(MediaSvcHandle *handle, const char *path, AudioHandleType * item_handle)
268 sqlite3 * db_handle = (sqlite3 *)handle;
270 if(db_handle == NULL) {
271 audio_svc_error("Handle is NULL");
272 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
275 if (!STRING_VALID(path)) {
276 audio_svc_error("file path is null");
277 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
279 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *) item_handle;
281 audio_svc_error("item is null");
282 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
285 memset(item, 0, sizeof(audio_svc_audio_item_s));
287 return _audio_svc_select_music_record_by_path(db_handle, path, item);
290 int audio_svc_get_item_by_audio_id(MediaSvcHandle *handle, const char *audio_id, AudioHandleType *item_handle)
292 sqlite3 * db_handle = (sqlite3 *)handle;
294 if(db_handle == NULL) {
295 audio_svc_error("Handle is NULL");
296 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
299 if (!STRING_VALID(audio_id)) {
300 audio_svc_error("invalid audio_id");
301 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
304 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *) item_handle;
307 audio_svc_error("item is null");
308 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
311 memset(item, 0, sizeof(audio_svc_audio_item_s));
313 return _audio_svc_select_music_record_by_audio_id(db_handle, audio_id, item);
316 int audio_svc_delete_item_by_path(MediaSvcHandle *handle, const char *path)
318 int ret = AUDIO_SVC_ERROR_NONE;
319 sqlite3 * db_handle = (sqlite3 *)handle;
321 if(db_handle == NULL) {
322 audio_svc_error("Handle is NULL");
323 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
326 if (!STRING_VALID(path)) {
327 audio_svc_error("file path is null");
328 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
331 audio_svc_audio_item_s item;
332 memset(&item, 0, sizeof(audio_svc_audio_item_s));
334 ret = _audio_svc_select_music_record_by_path(db_handle, path, &item);
335 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
337 ret = _audio_svc_delete_music_record_by_audio_id(db_handle, item.audio_uuid);
338 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
340 ret = _audio_svc_delete_playlist_item_records_by_audio_id(db_handle, item.audio_uuid);
341 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
343 ret = _audio_svc_check_and_update_folder_table(db_handle, path);
344 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
347 ret = _audio_svc_check_and_update_albums_table(item.audio.album);
348 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
351 if (strlen(item.thumbname) > 0) {
352 ret = _audio_svc_check_and_remove_thumbnail(item.thumbname);
353 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
356 if (strlen(item.thumbname) > 0) {
357 if (_audio_svc_remove_file(item.thumbname) == FALSE) {
358 audio_svc_error("fail to remove thumbnail file.");
359 return AUDIO_SVC_ERROR_INTERNAL;
362 return AUDIO_SVC_ERROR_NONE;
365 int audio_svc_move_item_start(MediaSvcHandle *handle, int data_cnt)
367 audio_svc_debug("Transaction data count : [%d]", data_cnt);
370 audio_svc_error("Handle is NULL");
371 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
375 audio_svc_error("data_cnt shuld be bigger than 1. data_cnt : [%d]", data_cnt);
376 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
379 g_audio_svc_move_item_data_cnt = data_cnt;
380 g_audio_svc_move_item_cur_data_cnt = 0;
382 return AUDIO_SVC_ERROR_NONE;
385 int audio_svc_move_item_end(MediaSvcHandle *handle)
387 int ret = AUDIO_SVC_ERROR_NONE;
388 sqlite3 * db_handle = (sqlite3 *)handle;
390 if(db_handle == NULL) {
391 audio_svc_error("Handle is NULL");
392 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
395 audio_svc_debug_func();
397 if (g_audio_svc_move_item_cur_data_cnt > 0) {
399 g_audio_svc_move_item_data_cnt = 1;
400 g_audio_svc_move_item_cur_data_cnt = 0;
402 ret = _audio_svc_list_query_do(db_handle, AUDIO_SVC_QUERY_MOVE_ITEM);
403 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
406 g_audio_svc_move_item_data_cnt = 1;
407 g_audio_svc_move_item_cur_data_cnt = 0;
409 ret = _audio_svc_update_folder_table(db_handle);
410 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
412 return AUDIO_SVC_ERROR_NONE;
415 //old db was separated into phone and mmc table.
416 //so when src_storage and dest_storage is not same, then need to remove old one and insert new one
417 //since audio_id in mmc table is started with over 5000001 . but don't need to do like this anymore.
418 int audio_svc_move_item(MediaSvcHandle *handle, audio_svc_storage_type_e src_storage,
419 const char *src_path,
420 audio_svc_storage_type_e dest_storage,
421 const char *dest_path)
423 char folder_id[AUDIO_SVC_UUID_SIZE+1] = {0,};
424 int ret = AUDIO_SVC_ERROR_NONE;
426 sqlite3 * db_handle = (sqlite3 *)handle;
428 if(db_handle == NULL) {
429 audio_svc_error("Handle is NULL");
430 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
433 if (!STRING_VALID(src_path)) {
434 audio_svc_error("src_path is null");
435 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
438 if (!STRING_VALID(dest_path)) {
439 audio_svc_error("dest_path is null");
440 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
443 if (src_storage != AUDIO_SVC_STORAGE_PHONE
444 && src_storage != AUDIO_SVC_STORAGE_MMC) {
445 audio_svc_error("storage type should be phone or mmc");
446 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
449 if (dest_storage != AUDIO_SVC_STORAGE_PHONE
450 && dest_storage != AUDIO_SVC_STORAGE_MMC) {
451 audio_svc_error("storage type should be phone or mmc");
452 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
455 audio_svc_debug("g_audio_svc_move_item_data_cnt =[%d], g_audio_svc_move_item_cur_data_cnt =[%d]",
456 g_audio_svc_move_item_data_cnt , g_audio_svc_move_item_cur_data_cnt );
458 if (g_audio_svc_move_item_data_cnt == 1) {
459 /* update path and storage type*/
460 ret = _audio_svc_update_path_and_storage_in_music_record(db_handle, src_path, dest_path, dest_storage);
461 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
464 ret = _audio_svc_get_and_append_folder_id_by_path(db_handle, dest_path, dest_storage, folder_id);
465 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
467 /* update folder_id */
468 ret = _audio_svc_update_folder_id_in_music_record(db_handle, dest_path, folder_id);
469 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
471 /* remove old folder path */
472 ret = _audio_svc_check_and_update_folder_table(db_handle, src_path);
473 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
475 else if (g_audio_svc_move_item_cur_data_cnt < (g_audio_svc_move_item_data_cnt - 1)) {
477 ret = _audio_svc_get_and_append_folder_id_by_path(db_handle, dest_path, dest_storage, folder_id);
478 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
480 ret = _audio_svc_move_item_query_add(db_handle, src_path, dest_path, dest_storage, folder_id);
482 g_audio_svc_move_item_cur_data_cnt ++;
484 else if (g_audio_svc_move_item_cur_data_cnt == (g_audio_svc_move_item_data_cnt - 1)) {
486 ret = _audio_svc_get_and_append_folder_id_by_path(db_handle, dest_path, dest_storage, folder_id);
487 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
489 ret = _audio_svc_move_item_query_add(db_handle, src_path, dest_path, dest_storage, folder_id);
491 ret = _audio_svc_list_query_do(db_handle, AUDIO_SVC_QUERY_MOVE_ITEM);
492 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
494 g_audio_svc_move_item_cur_data_cnt = 0;
497 audio_svc_debug("Error in audio_svc_move_item");
498 return AUDIO_SVC_ERROR_INTERNAL;
501 return AUDIO_SVC_ERROR_NONE;
504 int audio_svc_refresh_metadata(MediaSvcHandle *handle, const char *audio_id)
506 int ret = AUDIO_SVC_ERROR_NONE;
507 sqlite3 * db_handle = (sqlite3 *)handle;
509 if(db_handle == NULL) {
510 audio_svc_error("Handle is NULL");
511 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
514 if (!STRING_VALID(audio_id)) {
515 audio_svc_error("invalid audio_id");
516 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
519 audio_svc_audio_item_s item;
520 memset(&item, 0, sizeof(audio_svc_audio_item_s));
522 ret = _audio_svc_select_music_record_by_audio_id(db_handle, audio_id, &item);
523 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
525 if (item.audio.duration > 0) {
526 audio_svc_debug("The item has already valid metadata");
527 return AUDIO_SVC_ERROR_NONE;
530 ret = _audio_svc_extract_metadata_audio(item.storage_type, item.pathname, &item);
531 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
533 return _audio_svc_update_metadata_in_music_record(db_handle, audio_id, &item);
536 int audio_svc_count_group_item(MediaSvcHandle *handle, audio_svc_group_type_e group_type,
537 const char *limit_string1,
538 const char *limit_string2,
539 const char *filter_string,
540 const char *filter_string2, int *count)
542 sqlite3 * db_handle = (sqlite3 *)handle;
544 if(db_handle == NULL) {
545 audio_svc_error("Handle is NULL");
546 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
549 if (group_type < AUDIO_SVC_GROUP_BY_ALBUM
550 || group_type > AUDIO_SVC_GROUP_BY_COMPOSER) {
551 audio_svc_error("group type is wrong : %d", group_type);
552 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
555 if ((group_type == AUDIO_SVC_GROUP_BY_ARTIST_ALBUM ||
556 group_type == AUDIO_SVC_GROUP_BY_GENRE_ARTIST ||
557 group_type == AUDIO_SVC_GROUP_BY_GENRE_ALBUM) &&
558 /* && (!limit_string1 || strlen(limit_string1) == 0)) */
560 audio_svc_error("limit string1 should be entered");
561 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
564 if ((group_type == AUDIO_SVC_GROUP_BY_GENRE_ARTIST_ALBUM) &&
565 /* && (!limit_string2 || strlen(limit_string2) == 0)) */
567 audio_svc_error("limit_string2 should be entered");
568 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
572 audio_svc_error("invalid count condition");
573 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
576 return _audio_svc_count_music_group_records(db_handle, group_type, limit_string1,
579 filter_string2, count);
582 int audio_svc_get_group_item(MediaSvcHandle *handle, audio_svc_group_type_e group_type,
583 const char *limit_string1,
584 const char *limit_string2,
585 const char *filter_string,
586 const char *filter_string2, int offset, int rows,
587 AudioHandleType *result_records)
589 sqlite3 * db_handle = (sqlite3 *)handle;
591 if(db_handle == NULL) {
592 audio_svc_error("Handle is NULL");
593 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
596 audio_svc_group_item_s *result_groups =
597 (audio_svc_group_item_s *) result_records;
599 if (group_type < AUDIO_SVC_GROUP_BY_ALBUM
600 || group_type > AUDIO_SVC_GROUP_BY_COMPOSER) {
601 audio_svc_error("group type is wrong : %d", group_type);
602 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
605 if ((group_type == AUDIO_SVC_GROUP_BY_ARTIST_ALBUM ||
606 group_type == AUDIO_SVC_GROUP_BY_GENRE_ARTIST ||
607 group_type == AUDIO_SVC_GROUP_BY_GENRE_ALBUM ||
608 group_type == AUDIO_SVC_GROUP_BY_GENRE_ARTIST_ALBUM) &&
609 /* && (!limit_string1 || strlen(limit_string1) == 0)) */
611 audio_svc_error("limit_string1 should be entered");
612 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
615 if ((group_type == AUDIO_SVC_GROUP_BY_GENRE_ARTIST_ALBUM) &&
616 /* && (!limit_string2 || strlen(limit_string2) == 0)) */
618 audio_svc_error("limit_string2 should be entered");
619 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
622 if (offset < 0 || rows <= 0) {
623 audio_svc_error("offset(%d) or rows value(%d) is wrong", offset,
625 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
628 if (!result_records) {
630 ("The memory for search records should be allocated ");
631 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
634 return _audio_svc_get_music_group_records(db_handle, group_type, limit_string1,
635 limit_string2, filter_string,
636 filter_string2, offset, rows,
641 int audio_svc_count_list_item(MediaSvcHandle *handle, audio_svc_track_type_e item_type,
642 const char *type_string, const char *type_string2,
643 const char *filter_string,
644 const char *filter_string2, int *count)
646 sqlite3 * db_handle = (sqlite3 *)handle;
648 if(db_handle == NULL) {
649 audio_svc_error("Handle is NULL");
650 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
653 if (item_type < AUDIO_SVC_TRACK_ALL
654 || item_type > AUDIO_SVC_TRACK_BY_PLAYLIST) {
655 audio_svc_error("item type is wrong : %d", item_type);
656 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
659 if (((item_type >= AUDIO_SVC_TRACK_BY_ALBUM)
660 && (item_type <= AUDIO_SVC_TRACK_BY_COMPOSER)) && (!type_string)) {
661 audio_svc_error("type_string should be entered");
662 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
665 if (((item_type == AUDIO_SVC_TRACK_BY_ARTIST_GENRE)
666 || (item_type == AUDIO_SVC_TRACK_BY_ARTIST_ALBUM))
667 && (!type_string2)) {
668 audio_svc_error("type_string2 should be entered");
669 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
673 audio_svc_error("invalid count condition");
674 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
677 return _audio_svc_count_music_track_records(db_handle, item_type, type_string,
678 type_string2, filter_string,
679 filter_string2, count);
682 int audio_svc_get_list_item(MediaSvcHandle *handle, audio_svc_track_type_e item_type,
683 const char *type_string, const char *type_string2,
684 const char *filter_string,
685 const char *filter_string2, int offset, int rows,
686 AudioHandleType *track)
688 audio_svc_list_item_s *result_track = (audio_svc_list_item_s *) track;
689 sqlite3 * db_handle = (sqlite3 *)handle;
691 if(db_handle == NULL) {
692 audio_svc_error("Handle is NULL");
693 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
696 if (item_type < AUDIO_SVC_TRACK_ALL
697 || item_type > AUDIO_SVC_TRACK_BY_PLAYLIST) {
698 audio_svc_error("track type is wrong : %d", item_type);
699 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
702 if (((item_type >= AUDIO_SVC_TRACK_BY_ALBUM)
703 && (item_type <= AUDIO_SVC_TRACK_BY_COMPOSER)) && (!type_string)) {
704 audio_svc_error("type_string should be entered");
705 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
708 if (((item_type == AUDIO_SVC_TRACK_BY_ARTIST_GENRE)
709 || (item_type == AUDIO_SVC_TRACK_BY_ARTIST_ALBUM))
710 && (!type_string2)) {
711 audio_svc_error("type_string2 should be entered");
712 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
715 if (offset < 0 || rows <= 0) {
716 audio_svc_error("offset(%d) or row value(%d) is wrong", offset,
718 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
723 ("The memory for search records should be allocated ");
724 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
727 memset(result_track, 0, sizeof(audio_svc_list_item_s) * rows);
729 return _audio_svc_get_music_track_records(db_handle, item_type, type_string,
730 type_string2, filter_string,
731 filter_string2, offset, rows,
736 int audio_svc_get_audio_id_by_path(MediaSvcHandle *handle, const char *path, char *audio_id, size_t max_audio_id_length)
738 sqlite3 * db_handle = (sqlite3 *)handle;
740 if(db_handle == NULL) {
741 audio_svc_error("Handle is NULL");
742 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
745 if (!STRING_VALID(path)) {
746 audio_svc_error("file path is null");
747 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
750 if (audio_id == NULL) {
751 audio_svc_error("invalid audio_id condition");
752 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
755 return _audio_svc_search_audio_id_by_path(db_handle, path, audio_id);
758 int audio_svc_get_thumbnail_path_by_path(MediaSvcHandle *handle, const char *path, char *thumb_path,
759 size_t max_thumb_path_length)
761 sqlite3 * db_handle = (sqlite3 *)handle;
763 if(db_handle == NULL) {
764 audio_svc_error("Handle is NULL");
765 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
768 if (!STRING_VALID(path)) {
769 audio_svc_error("file path is null");
770 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
773 return _audio_svc_get_thumbnail_path_by_path(db_handle, path, thumb_path);
776 int audio_svc_add_playlist(MediaSvcHandle *handle, const char *playlist_name, int *playlist_id)
778 sqlite3 * db_handle = (sqlite3 *)handle;
780 if(db_handle == NULL) {
781 audio_svc_error("Handle is NULL");
782 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
785 if (!STRING_VALID(playlist_name)) {
786 audio_svc_error("invalid playlist_name");
787 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
790 if (playlist_id == NULL) {
791 audio_svc_error("invalid playlist_id");
792 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
795 return _audio_svc_insert_playlist_record(db_handle, playlist_name, playlist_id);
798 int audio_svc_delete_playlist(MediaSvcHandle *handle, int playlist_id)
800 sqlite3 * db_handle = (sqlite3 *)handle;
802 if(db_handle == NULL) {
803 audio_svc_error("Handle is NULL");
804 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
807 if (playlist_id < 0) {
808 audio_svc_error("invalid playlist_id");
809 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
812 return _audio_svc_delete_playlist_record(db_handle, playlist_id);
815 int audio_svc_update_playlist_name(MediaSvcHandle *handle, int playlist_id,
816 const char *new_playlist_name)
818 sqlite3 * db_handle = (sqlite3 *)handle;
820 if(db_handle == NULL) {
821 audio_svc_error("Handle is NULL");
822 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
825 if (playlist_id < 0) {
826 audio_svc_error("invalid playlist_id");
827 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
830 if (!STRING_VALID(new_playlist_name)) {
831 audio_svc_error("invalid playlist_name");
832 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
835 return _audio_svc_update_playlist_record_by_name(db_handle, playlist_id,
839 int audio_svc_count_playlist(MediaSvcHandle *handle, const char *filter_string,
840 const char *filter_string2, int *count)
842 sqlite3 * db_handle = (sqlite3 *)handle;
844 if(db_handle == NULL) {
845 audio_svc_error("Handle is NULL");
846 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
850 audio_svc_error("invalid count condition");
851 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
854 return _audio_svc_count_playlist_records(db_handle, filter_string, filter_string2,
858 int audio_svc_get_playlist(MediaSvcHandle *handle, const char *filter_string,
859 const char *filter_string2, int offset, int rows,
860 AudioHandleType *playlists)
862 sqlite3 * db_handle = (sqlite3 *)handle;
864 if(db_handle == NULL) {
865 audio_svc_error("Handle is NULL");
866 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
869 audio_svc_playlist_s *ret_playlists = (audio_svc_playlist_s *) playlists;
870 if (offset < 0 || rows <= 0) {
871 audio_svc_error("offset(%d) or row value(%d) is wrong", offset,
873 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
878 ("The memory for search records should be allocated ");
879 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
882 return _audio_svc_get_playlist_records(db_handle, offset, rows, filter_string,
883 filter_string2, ret_playlists);
886 int audio_svc_count_playlist_item(MediaSvcHandle *handle, int playlist_id, const char *filter_string,
887 const char *filter_string2, int *count)
889 sqlite3 * db_handle = (sqlite3 *)handle;
891 if(db_handle == NULL) {
892 audio_svc_error("Handle is NULL");
893 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
896 if (playlist_id < 0) {
897 audio_svc_error("invalid playlist_id");
898 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
902 audio_svc_error("invalid count condition");
903 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
906 return _audio_svc_count_playlist_item_records(db_handle, playlist_id,
908 filter_string2, count);
911 int audio_svc_get_playlist_item(MediaSvcHandle *handle, int playlist_id, const char *filter_string,
912 const char *filter_string2, int offset,
913 int rows, AudioHandleType *playlist_item)
915 sqlite3 * db_handle = (sqlite3 *)handle;
917 if(db_handle == NULL) {
918 audio_svc_error("Handle is NULL");
919 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
922 audio_svc_playlist_item_s *ret_playlist_item = (audio_svc_playlist_item_s *) playlist_item;
924 if (offset < 0 || rows <= 0) {
925 audio_svc_error("offset(%d) or row value(%d) is wrong", offset,
927 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
930 if (!playlist_item) {
932 ("The memory for search records should be allocated ");
933 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
936 memset(ret_playlist_item, 0, sizeof(audio_svc_playlist_item_s) * rows);
938 return _audio_svc_get_playlist_item_records(db_handle, playlist_id, filter_string,
939 filter_string2, offset,
940 rows, ret_playlist_item);
943 int audio_svc_get_playlist_id_by_playlist_name(MediaSvcHandle *handle, const char *playlist_name,
946 sqlite3 * db_handle = (sqlite3 *)handle;
948 if(db_handle == NULL) {
949 audio_svc_error("Handle is NULL");
950 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
953 if (!STRING_VALID(playlist_name)) {
954 audio_svc_error("invalid playlist_name");
955 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
958 if (playlist_id == NULL) {
959 audio_svc_error("invalid playlist_id");
960 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
963 return _audio_svc_get_playlist_id_by_name(db_handle, playlist_name, playlist_id);
966 int audio_svc_get_playlist_name_by_playlist_id(MediaSvcHandle *handle, int playlist_id,
968 size_t max_playlist_name_length)
970 sqlite3 * db_handle = (sqlite3 *)handle;
972 if(db_handle == NULL) {
973 audio_svc_error("Handle is NULL");
974 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
977 if (playlist_id < 0) {
978 audio_svc_error("invalid playlist_id");
979 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
982 return _audio_svc_get_playlist_name_by_playlist_id(db_handle, playlist_id,
986 int audio_svc_count_playlist_by_name(MediaSvcHandle *handle, const char *playlist_name, int *count)
988 sqlite3 * db_handle = (sqlite3 *)handle;
990 if(db_handle == NULL) {
991 audio_svc_error("Handle is NULL");
992 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
995 if (!STRING_VALID(playlist_name)) {
996 audio_svc_error("invalid playlist_name");
997 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1000 if (count == NULL) {
1001 audio_svc_error("invalid count condition");
1002 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1005 return _audio_svc_count_playlist_records_by_name(db_handle, playlist_name, count);
1008 int audio_svc_get_unique_playlist_name(MediaSvcHandle *handle, const char *orig_name, char *unique_name,
1009 size_t max_unique_name_length)
1011 int ret = AUDIO_SVC_ERROR_NONE;
1014 char playlist_name[AUDIO_SVC_PLAYLIST_NAME_SIZE] = { 0 };
1015 sqlite3 * db_handle = (sqlite3 *)handle;
1017 if(db_handle == NULL) {
1018 audio_svc_error("Handle is NULL");
1019 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1022 if (!STRING_VALID(orig_name)) {
1023 audio_svc_error("orig_name is NULL");
1024 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1027 snprintf(playlist_name, sizeof(playlist_name), "%s_001", orig_name);
1028 ret = audio_svc_count_playlist_by_name(db_handle, playlist_name, &count);
1029 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1035 snprintf(unique_name, AUDIO_SVC_PLAYLIST_NAME_SIZE,
1036 "%s_%.3d", orig_name, i + 1);
1037 ret = audio_svc_count_playlist_by_name(db_handle, unique_name, &count);
1038 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1041 return AUDIO_SVC_ERROR_NONE;
1047 return AUDIO_SVC_ERROR_MAKE_PLAYLIST_NAME_FAILED;
1050 snprintf(unique_name, AUDIO_SVC_PLAYLIST_NAME_SIZE, "%s_%.3d", orig_name, 1);
1051 return AUDIO_SVC_ERROR_NONE;
1054 return AUDIO_SVC_ERROR_NONE;
1057 int audio_svc_add_item_to_playlist(MediaSvcHandle *handle, int playlist_id, const char *audio_id)
1059 int ret = AUDIO_SVC_ERROR_NONE;
1060 sqlite3 * db_handle = (sqlite3 *)handle;
1062 if(db_handle == NULL) {
1063 audio_svc_error("Handle is NULL");
1064 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1067 if (playlist_id < 0) {
1068 audio_svc_error("invalid playlist idx");
1069 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1072 if (!STRING_VALID(audio_id)) {
1073 audio_svc_error("invalid audio_id");
1074 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1077 ret = _audio_svc_insert_playlist_item_record(db_handle, playlist_id, audio_id);
1078 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1080 if (playlist_id == AUDIO_SVC_FAVORITE_LIST_ID) {
1081 ret = _audio_svc_update_favourite_in_music_record(db_handle, audio_id, 1);
1082 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1088 int audio_svc_check_duplicate_insertion_in_playlist(MediaSvcHandle *handle, int playlist_id,
1089 const char *audio_id, int *count)
1091 sqlite3 * db_handle = (sqlite3 *)handle;
1093 if(db_handle == NULL) {
1094 audio_svc_error("Handle is NULL");
1095 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1098 if (playlist_id < 0) {
1099 audio_svc_error("invalid playlist idx");
1100 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1103 if (!STRING_VALID(audio_id)) {
1104 audio_svc_error("invalid audio_id");
1105 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1108 if (count == NULL) {
1109 audio_svc_error("invalid count condition");
1110 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1113 return _audio_svc_check_duplication_records_in_playlist(db_handle, playlist_id, audio_id, count);
1116 int audio_svc_update_playlist_item_play_order(MediaSvcHandle *handle, int playlist_id, int uid,
1119 sqlite3 * db_handle = (sqlite3 *)handle;
1121 if(db_handle == NULL) {
1122 audio_svc_error("Handle is NULL");
1123 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1126 if (playlist_id < 0) {
1127 audio_svc_error("invalid playlist id");
1128 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1131 if (new_play_order < 0) {
1132 audio_svc_error("invalid play_order idx");
1133 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1136 audio_svc_error("invalid uid");
1137 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1140 return _audio_svc_update_item_play_order(db_handle, playlist_id, uid, new_play_order);
1143 int audio_svc_remove_item_from_playlist_by_uid(MediaSvcHandle *handle, int playlist_id, int uid)
1145 int ret = AUDIO_SVC_ERROR_NONE;
1146 char audio_id[AUDIO_SVC_UUID_SIZE + 1] = {0, };
1147 sqlite3 * db_handle = (sqlite3 *)handle;
1149 if(db_handle == NULL) {
1150 audio_svc_error("Handle is NULL");
1151 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1154 if (playlist_id < 0) {
1155 audio_svc_error("invalid playlist idx");
1156 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1160 audio_svc_error("invalid audio_id");
1161 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1164 if (playlist_id == AUDIO_SVC_FAVORITE_LIST_ID) {
1166 ret = _audio_svc_get_audio_id_by_uid(db_handle, uid, audio_id);
1167 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1169 ret = _audio_svc_update_favourite_in_music_record(db_handle, audio_id, 0);
1170 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1173 ret = _audio_svc_delete_playlist_item_record_from_playlist_by_uid(db_handle, playlist_id, uid);
1174 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1179 int audio_svc_remove_item_from_playlist_by_audio_id(MediaSvcHandle *handle, int playlist_id,
1180 const char *audio_id)
1182 int ret = AUDIO_SVC_ERROR_NONE;
1183 sqlite3 * db_handle = (sqlite3 *)handle;
1185 if(db_handle == NULL) {
1186 audio_svc_error("Handle is NULL");
1187 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1190 if (playlist_id < 0) {
1191 audio_svc_error("invalid playlist idx");
1192 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1195 if (!STRING_VALID(audio_id)) {
1196 audio_svc_error("invalid audio_id");
1197 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1200 ret = _audio_svc_delete_playlist_item_record_from_playlist_by_audio_id(db_handle, playlist_id, audio_id);
1201 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1203 if (playlist_id == AUDIO_SVC_FAVORITE_LIST_ID) {
1204 ret = _audio_svc_update_favourite_in_music_record(db_handle, audio_id, 0);
1205 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1211 int audio_svc_set_db_valid(MediaSvcHandle *handle, audio_svc_storage_type_e storage_type, int valid)
1213 audio_svc_debug("storage:%d", storage_type);
1214 sqlite3 * db_handle = (sqlite3 *)handle;
1216 if(db_handle == NULL) {
1217 audio_svc_error("Handle is NULL");
1218 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1221 if (storage_type != AUDIO_SVC_STORAGE_PHONE
1222 && storage_type != AUDIO_SVC_STORAGE_MMC) {
1223 audio_svc_debug("storage type should be phone or mmc");
1224 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1227 return _audio_svc_update_valid_of_music_records(db_handle, storage_type, valid);
1230 int audio_svc_delete_invalid_items(MediaSvcHandle *handle, audio_svc_storage_type_e storage_type)
1232 int ret = AUDIO_SVC_ERROR_NONE;
1233 sqlite3 * db_handle = (sqlite3 *)handle;
1235 if(db_handle == NULL) {
1236 audio_svc_error("Handle is NULL");
1237 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1240 if (storage_type != AUDIO_SVC_STORAGE_PHONE
1241 && storage_type != AUDIO_SVC_STORAGE_MMC) {
1242 audio_svc_debug("storage type should be phone or mmc");
1243 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1246 ret = _audio_svc_delete_invalid_music_records(db_handle, storage_type);
1247 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1249 ret = _audio_svc_update_folder_table(db_handle);
1250 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1253 ret = _audio_svc_check_and_update_albums_table(NULL);
1254 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1257 return AUDIO_SVC_ERROR_NONE;
1260 int audio_svc_set_item_valid_start(MediaSvcHandle *handle, int data_cnt)
1262 audio_svc_debug("Transaction data count : [%d]", data_cnt);
1264 if(handle == NULL) {
1265 audio_svc_error("Handle is NULL");
1266 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1270 audio_svc_error("data_cnt shuld be bigger than 1. data_cnt : [%d]", data_cnt);
1271 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1274 g_audio_svc_item_valid_data_cnt = data_cnt;
1275 g_audio_svc_item_valid_cur_data_cnt = 0;
1277 return AUDIO_SVC_ERROR_NONE;
1280 int audio_svc_set_item_valid_end(MediaSvcHandle *handle)
1282 audio_svc_debug_func();
1284 int ret = AUDIO_SVC_ERROR_NONE;
1285 sqlite3 * db_handle = (sqlite3 *)handle;
1287 if(db_handle == NULL) {
1288 audio_svc_error("Handle is NULL");
1289 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1292 if (g_audio_svc_item_valid_cur_data_cnt > 0) {
1294 ret = _audio_svc_list_query_do(db_handle, AUDIO_SVC_QUERY_SET_ITEM_VALID);
1298 g_audio_svc_item_valid_data_cnt = 1;
1299 g_audio_svc_item_valid_cur_data_cnt = 0;
1304 int audio_svc_set_item_valid(MediaSvcHandle *handle, const char *path, int valid)
1306 int ret = AUDIO_SVC_ERROR_NONE;
1307 sqlite3 * db_handle = (sqlite3 *)handle;
1309 if(db_handle == NULL) {
1310 audio_svc_error("Handle is NULL");
1311 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1314 audio_svc_debug("path=[%s], valid=[%d]", path, valid);
1316 if (!STRING_VALID(path)) {
1317 audio_svc_error("path is NULL");
1318 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1321 #if 0 //original code
1322 return _audio_svc_update_valid_in_music_record(path, valid);
1324 #else //stack up querys and commit it at once when query counts are same as g_audio_svc_item_valid_data_cnt
1326 audio_svc_debug("g_audio_svc_item_valid_data_cnt =[%d], g_audio_svc_item_valid_cur_data_cnt =[%d]",
1327 g_audio_svc_item_valid_data_cnt , g_audio_svc_item_valid_cur_data_cnt );
1329 if (g_audio_svc_item_valid_data_cnt == 1) {
1331 return _audio_svc_update_valid_in_music_record(db_handle, path, valid);
1333 } else if (g_audio_svc_item_valid_cur_data_cnt < (g_audio_svc_item_valid_data_cnt - 1)) {
1335 ret = _audio_svc_update_valid_in_music_record_query_add(db_handle, path, valid);
1337 g_audio_svc_item_valid_cur_data_cnt ++;
1339 } else if (g_audio_svc_item_valid_cur_data_cnt == (g_audio_svc_item_valid_data_cnt - 1)) {
1341 ret = _audio_svc_update_valid_in_music_record_query_add(db_handle, path, valid);
1343 ret = _audio_svc_list_query_do(db_handle, AUDIO_SVC_QUERY_SET_ITEM_VALID);
1344 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1346 g_audio_svc_item_valid_cur_data_cnt = 0;
1350 audio_svc_debug("Error in audio_svc_set_item_valid");
1351 return AUDIO_SVC_ERROR_INTERNAL;
1354 return AUDIO_SVC_ERROR_NONE;
1358 int audio_svc_get_path_by_audio_id(MediaSvcHandle *handle, const char *audio_id, char *path,
1359 size_t max_path_length)
1361 int ret = AUDIO_SVC_ERROR_NONE;
1362 sqlite3 * db_handle = (sqlite3 *)handle;
1364 if(db_handle == NULL) {
1365 audio_svc_error("Handle is NULL");
1366 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1369 if (!STRING_VALID(audio_id)) {
1370 audio_svc_error("invalid audio_id");
1371 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1375 audio_svc_error("path must be allocated...");
1376 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1379 ret = _audio_svc_get_path(db_handle, audio_id, path);
1380 audio_svc_retv_if(ret != AUDIO_SVC_ERROR_NONE, ret);
1382 return AUDIO_SVC_ERROR_NONE;
1385 int audio_svc_group_item_new(AudioHandleType **record, int count)
1388 audio_svc_error("Invalid arguments");
1389 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1392 audio_svc_debug("count is [%d]", count);
1393 audio_svc_group_item_s *grp_item =
1394 (audio_svc_group_item_s *) malloc(count *
1395 sizeof(audio_svc_group_item_s));
1396 if (grp_item == NULL) {
1397 return AUDIO_SVC_ERROR_OUT_OF_MEMORY;
1399 memset(grp_item, 0, count * sizeof(audio_svc_group_item_s));
1401 *record = (AudioHandleType *) grp_item;
1403 return AUDIO_SVC_ERROR_NONE;
1406 int audio_svc_group_item_free(AudioHandleType *record)
1408 audio_svc_group_item_s *item = (audio_svc_group_item_s *) record;
1411 audio_svc_error("Invalid arguments");
1412 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1414 audio_svc_debug_func();
1417 return AUDIO_SVC_ERROR_NONE;
1420 int audio_svc_group_item_get_val(AudioHandleType *record, int index,
1421 audio_svc_group_item_type_e first_field_name,
1424 audio_svc_group_item_s *item = (audio_svc_group_item_s *) record;
1426 int ret = AUDIO_SVC_ERROR_NONE;
1427 int field_name = -1;
1430 audio_svc_error("Invalid arguments");
1431 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1435 audio_svc_error("Invalid arguments");
1436 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1439 if (first_field_name == -1) {
1440 audio_svc_error("Invalid arguments");
1441 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1444 field_name = first_field_name;
1445 va_start(var_args, first_field_name);
1447 while (field_name >= 0) {
1448 audio_svc_debug("field name = %d", field_name);
1449 switch (field_name) {
1450 case AUDIO_SVC_GROUP_ITEM_MAIN_INFO:
1452 char **val = va_arg((var_args), char **);
1453 int *size = va_arg((var_args), int *);
1454 if (strlen(item[index].maininfo) == 0) {
1455 audio_svc_debug("maininfo is NULL");
1458 *val = item[index].maininfo;
1459 *size = strlen(item[index].maininfo);
1463 case AUDIO_SVC_GROUP_ITEM_SUB_INFO:
1465 char **val = va_arg((var_args), char **);
1466 int *size = va_arg((var_args), int *);
1467 if (strlen(item[index].subinfo) == 0) {
1468 audio_svc_debug("subinfo is NULL");
1471 *val = item[index].subinfo;
1472 *size = strlen(item[index].subinfo);
1477 case AUDIO_SVC_GROUP_ITEM_RATING:
1479 int *val = va_arg((var_args), int *);
1480 *val = item[index].album_rating;
1483 case AUDIO_SVC_GROUP_ITEM_THUMBNAIL_PATH:
1485 char **val = va_arg((var_args), char **);
1486 int *size = va_arg((var_args), int *);
1487 if (strlen(item[index].thumbnail_path) == 0) {
1488 audio_svc_debug("thumb path is NULL");
1491 *val = item[index].thumbnail_path;
1493 strlen(item[index].thumbnail_path);
1500 audio_svc_error("Invalid arguments");
1501 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
1505 if (ret != AUDIO_SVC_ERROR_NONE) {
1506 audio_svc_error("error occured");
1511 field_name = va_arg(var_args, int);
1518 int audio_svc_group_item_get(AudioHandleType *record, int index, AudioHandleType **item)
1520 audio_svc_group_item_s *item_arr = (audio_svc_group_item_s *) record;
1523 audio_svc_error("Invalid arguments");
1524 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1527 *item = (AudioHandleType *) &(item_arr[index]);
1529 return AUDIO_SVC_ERROR_NONE;
1532 int audio_svc_list_item_new(AudioHandleType **record, int count)
1535 audio_svc_error("Invalid arguments");
1536 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1539 audio_svc_debug("count is [%d]", count);
1540 audio_svc_list_item_s *list_item =
1541 (audio_svc_list_item_s *) malloc(count *
1542 sizeof(audio_svc_list_item_s));
1543 if (list_item == NULL) {
1544 return AUDIO_SVC_ERROR_OUT_OF_MEMORY;
1546 memset(list_item, 0, count * sizeof(audio_svc_list_item_s));
1548 *record = (AudioHandleType *) list_item;
1550 return AUDIO_SVC_ERROR_NONE;
1553 int audio_svc_list_item_free(AudioHandleType *record)
1555 audio_svc_list_item_s *item = (audio_svc_list_item_s *) record;
1558 audio_svc_error("Invalid arguments");
1559 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1561 audio_svc_debug_func();
1564 return AUDIO_SVC_ERROR_NONE;
1567 int audio_svc_list_item_get_val(AudioHandleType *record, int index,
1568 audio_svc_list_item_type_e first_field_name,
1571 audio_svc_list_item_s *item = (audio_svc_list_item_s *) record;
1573 int ret = AUDIO_SVC_ERROR_NONE;
1574 int field_name = -1;
1577 audio_svc_error("Invalid arguments");
1578 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1582 audio_svc_error("Invalid arguments");
1583 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1586 if (first_field_name == -1) {
1587 audio_svc_error("Invalid arguments");
1588 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1591 field_name = first_field_name;
1592 va_start(var_args, first_field_name);
1594 while (field_name >= 0) {
1595 switch (field_name) {
1596 case AUDIO_SVC_LIST_ITEM_AUDIO_ID:
1598 char **val = va_arg((var_args), char **);
1599 int *size = va_arg((var_args), int *);
1600 if (strlen(item[index].audio_uuid) == 0) {
1601 audio_svc_error("audio_id is NULL");
1603 ret = AUDIO_SVC_ERROR_DB_NO_RECORD;
1605 *val = item[index].audio_uuid;
1606 *size = strlen(item[index].audio_uuid);
1610 case AUDIO_SVC_LIST_ITEM_PATHNAME:
1612 char **val = va_arg((var_args), char **);
1613 int *size = va_arg((var_args), int *);
1614 if (strlen(item[index].pathname) == 0) {
1615 audio_svc_debug("path is NULL");
1617 ret = AUDIO_SVC_ERROR_DB_NO_RECORD;
1619 *val = item[index].pathname;
1620 *size = strlen(item[index].pathname);
1625 case AUDIO_SVC_LIST_ITEM_DURATION:
1627 int *val = va_arg((var_args), int *);
1628 *val = item[index].duration;
1631 case AUDIO_SVC_LIST_ITEM_RATING:
1633 int *val = va_arg((var_args), int *);
1634 *val = item[index].rating;
1637 case AUDIO_SVC_LIST_ITEM_THUMBNAIL_PATH:
1639 char **val = va_arg((var_args), char **);
1640 int *size = va_arg((var_args), int *);
1641 if (strlen(item[index].thumbnail_path) == 0) {
1642 audio_svc_debug("thumb path is NULL");
1645 *val = item[index].thumbnail_path;
1647 strlen(item[index].thumbnail_path);
1652 case AUDIO_SVC_LIST_ITEM_TITLE:
1654 char **val = va_arg((var_args), char **);
1655 int *size = va_arg((var_args), int *);
1656 if (strlen(item[index].title) == 0) {
1657 audio_svc_debug("title is NULL");
1660 *val = item[index].title;
1661 *size = strlen(item[index].title);
1665 case AUDIO_SVC_LIST_ITEM_ARTIST:
1667 char **val = va_arg((var_args), char **);
1668 int *size = va_arg((var_args), int *);
1669 if (strlen(item[index].artist) == 0) {
1670 audio_svc_debug("artist is NULL");
1673 *val = item[index].artist;
1674 *size = strlen(item[index].artist);
1679 case AUDIO_SVC_LIST_ITEM_ALBUM:
1681 char **val = va_arg((var_args), char **);
1682 int *size = va_arg((var_args), int *);
1683 if (strlen(item[index].album) == 0) {
1684 audio_svc_debug("album is NULL");
1687 *val = item[index].album;
1688 *size = strlen(item[index].album);
1695 audio_svc_error("Invalid arguments");
1696 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
1700 if (ret != AUDIO_SVC_ERROR_NONE) {
1701 audio_svc_error("error occured");
1706 field_name = va_arg(var_args, int);
1713 int audio_svc_list_item_get(AudioHandleType *record, int index, AudioHandleType **item)
1715 audio_svc_list_item_s *item_arr = (audio_svc_list_item_s *) record;
1718 audio_svc_error("Invalid arguments");
1719 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1722 *item = (AudioHandleType *) &(item_arr[index]);
1724 return AUDIO_SVC_ERROR_NONE;
1727 int audio_svc_playlist_new(AudioHandleType **record, int count)
1730 audio_svc_error("Invalid arguments");
1731 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1733 audio_svc_debug("");
1735 audio_svc_playlist_s *playlist =
1736 (audio_svc_playlist_s *) malloc(count *
1737 sizeof(audio_svc_playlist_s));
1738 if (playlist == NULL) {
1739 return AUDIO_SVC_ERROR_OUT_OF_MEMORY;
1741 memset(playlist, 0, count * sizeof(audio_svc_playlist_s));
1743 *record = (AudioHandleType *) playlist;
1745 return AUDIO_SVC_ERROR_NONE;
1748 int audio_svc_playlist_free(AudioHandleType *record)
1750 audio_svc_playlist_s *item = (audio_svc_playlist_s *) record;
1753 audio_svc_error("Invalid arguments");
1754 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1759 return AUDIO_SVC_ERROR_NONE;
1763 int audio_svc_playlist_get_val(AudioHandleType *playlists, int index,
1764 audio_svc_playlist_e first_field_name, ...)
1766 int ret = AUDIO_SVC_ERROR_NONE;
1769 audio_svc_playlist_s *item = (audio_svc_playlist_s *) playlists;
1772 audio_svc_error("Invalid arguments");
1773 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1777 audio_svc_error("Invalid arguments");
1778 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1781 if (first_field_name == -1) {
1782 audio_svc_error("Invalid arguments");
1783 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1786 field_name = first_field_name;
1787 va_start(var_args, first_field_name);
1789 while (field_name >= 0) {
1790 audio_svc_debug("field name = %d", field_name);
1791 switch (field_name) {
1792 case AUDIO_SVC_PLAYLIST_ID:
1794 int *val = va_arg((var_args), int *);
1795 *val = item[index].playlist_id;
1798 case AUDIO_SVC_PLAYLIST_NAME:
1800 char **val = va_arg((var_args), char **);
1801 int *size = va_arg((var_args), int *);
1802 if (strlen(item[index].name) == 0) {
1803 audio_svc_error("name is NULL");
1806 *val = item[index].name;
1807 /* *size = AUDIO_SVC_PLAYLIST_NAME_SIZE; */
1808 *size = strlen(item[index].name);
1812 case AUDIO_SVC_PLAYLIST_THUMBNAIL_PATH:
1814 char **val = va_arg((var_args), char **);
1815 int *size = va_arg((var_args), int *);
1816 if (strlen(item[index].thumbnail_path) == 0) {
1818 ("thumbnail_path is NULL");
1821 *val = item[index].thumbnail_path;
1823 strlen(item[index].thumbnail_path);
1829 audio_svc_error("Invalid arguments");
1830 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
1834 if (ret != AUDIO_SVC_ERROR_NONE) {
1835 audio_svc_error("error occured");
1840 field_name = va_arg(var_args, int);
1844 return AUDIO_SVC_ERROR_NONE;
1847 int audio_svc_playlist_set_val(AudioHandleType *playlists, int index,
1848 audio_svc_playlist_e first_field_name, ...)
1850 int ret = AUDIO_SVC_ERROR_NONE;
1853 audio_svc_playlist_s *item = (audio_svc_playlist_s *) playlists;
1856 audio_svc_error("Invalid arguments");
1857 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1861 audio_svc_error("Invalid arguments");
1862 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1865 if (first_field_name == -1) {
1866 audio_svc_error("Invalid arguments");
1867 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1870 field_name = first_field_name;
1871 va_start(var_args, first_field_name);
1873 while (field_name >= 0) {
1874 audio_svc_debug("field name = %d", field_name);
1875 switch (field_name) {
1876 case AUDIO_SVC_PLAYLIST_NAME:
1878 char *val = va_arg((var_args), char *);
1879 int size = va_arg((var_args), int);
1880 _strncpy_safe(item[index].name, val,
1882 sizeof(item[index].name)));
1887 audio_svc_error("Invalid arguments");
1888 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
1892 if (ret != AUDIO_SVC_ERROR_NONE) {
1893 audio_svc_error("error occured");
1898 field_name = va_arg(var_args, int);
1902 return AUDIO_SVC_ERROR_NONE;
1905 int audio_svc_playlist_get_item(AudioHandleType *record, int index, AudioHandleType **plst)
1908 audio_svc_error("Invalid arguments");
1909 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1912 audio_svc_playlist_s *plst_arr = (audio_svc_playlist_s *) record;
1913 *plst = (AudioHandleType *) &(plst_arr[index]);
1915 return AUDIO_SVC_ERROR_NONE;
1918 int audio_svc_playlist_item_new(AudioHandleType **record, int count)
1921 audio_svc_error("Invalid arguments");
1922 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1924 audio_svc_debug("");
1926 audio_svc_playlist_item_s *plst_item =
1927 (audio_svc_playlist_item_s *) malloc(count *
1929 (audio_svc_playlist_item_s));
1930 if (plst_item == NULL) {
1931 return AUDIO_SVC_ERROR_OUT_OF_MEMORY;
1933 memset(plst_item, 0, count * sizeof(audio_svc_playlist_item_s));
1935 *record = (AudioHandleType *) plst_item;
1937 return AUDIO_SVC_ERROR_NONE;
1940 int audio_svc_playlist_item_free(AudioHandleType *record)
1942 audio_svc_playlist_item_s *item = (audio_svc_playlist_item_s *) record;
1945 audio_svc_error("Invalid arguments");
1946 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1948 audio_svc_debug_func();
1951 return AUDIO_SVC_ERROR_NONE;
1954 int audio_svc_playlist_item_get_val(AudioHandleType *record, int index,
1955 audio_svc_playlist_item_type_e
1956 first_field_name, ...)
1958 audio_svc_playlist_item_s *item = (audio_svc_playlist_item_s *) record;
1960 int ret = AUDIO_SVC_ERROR_NONE;
1961 int field_name = -1;
1964 audio_svc_error("Invalid arguments");
1965 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1969 audio_svc_error("Invalid arguments");
1970 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1973 if (first_field_name == -1) {
1974 audio_svc_error("Invalid arguments");
1975 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
1978 field_name = first_field_name;
1979 va_start(var_args, first_field_name);
1981 while (field_name >= 0) {
1982 audio_svc_debug("field name = %d", field_name);
1983 switch (field_name) {
1984 case AUDIO_SVC_PLAYLIST_ITEM_UID:
1986 int *val = va_arg((var_args), int *);
1987 *val = item[index].u_id;
1990 case AUDIO_SVC_PLAYLIST_ITEM_AUDIO_ID:
1992 char **val = va_arg((var_args), char **);
1993 int *size = va_arg((var_args), int *);
1994 if (strlen(item[index].audio_uuid) == 0) {
1995 audio_svc_error("audio_id is NULL");
1997 ret = AUDIO_SVC_ERROR_DB_NO_RECORD;
1999 *val = item[index].audio_uuid;
2000 *size = strlen(item[index].audio_uuid);
2004 case AUDIO_SVC_PLAYLIST_ITEM_PATHNAME:
2006 char **val = va_arg((var_args), char **);
2007 int *size = va_arg((var_args), int *);
2008 if (strlen(item[index].pathname) == 0) {
2009 audio_svc_debug("path is NULL");
2011 ret = AUDIO_SVC_ERROR_DB_NO_RECORD;
2013 *val = item[index].pathname;
2014 *size = strlen(item[index].pathname);
2019 case AUDIO_SVC_PLAYLIST_ITEM_DURATION:
2021 int *val = va_arg((var_args), int *);
2022 *val = item[index].duration;
2025 case AUDIO_SVC_PLAYLIST_ITEM_RATING:
2027 int *val = va_arg((var_args), int *);
2028 *val = item[index].rating;
2031 case AUDIO_SVC_PLAYLIST_ITEM_THUMBNAIL_PATH:
2033 char **val = va_arg((var_args), char **);
2034 int *size = va_arg((var_args), int *);
2035 if (strlen(item[index].thumbnail_path) == 0) {
2036 audio_svc_debug("thumb path is NULL");
2039 *val = item[index].thumbnail_path;
2041 strlen(item[index].thumbnail_path);
2046 case AUDIO_SVC_PLAYLIST_ITEM_TITLE:
2048 char **val = va_arg((var_args), char **);
2049 int *size = va_arg((var_args), int *);
2050 if (strlen(item[index].title) == 0) {
2051 audio_svc_debug("title is NULL");
2054 *val = item[index].title;
2055 *size = strlen(item[index].title);
2060 case AUDIO_SVC_PLAYLIST_ITEM_ARTIST:
2062 char **val = va_arg((var_args), char **);
2063 int *size = va_arg((var_args), int *);
2064 if (strlen(item[index].artist) == 0) {
2065 audio_svc_debug("artist is NULL");
2068 *val = item[index].artist;
2069 *size = strlen(item[index].artist);
2074 case AUDIO_SVC_PLAYLIST_ITEM_PLAY_ORDER:
2076 int *val = va_arg((var_args), int *);
2077 *val = item[index].play_order;
2082 audio_svc_error("Invalid arguments");
2083 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2087 if (ret != AUDIO_SVC_ERROR_NONE) {
2088 audio_svc_error("error occured");
2093 field_name = va_arg(var_args, int);
2100 int audio_svc_playlist_item_get(AudioHandleType *record, int index, AudioHandleType **item)
2102 audio_svc_playlist_item_s *item_arr = (audio_svc_playlist_item_s *) record;
2105 audio_svc_error("Invalid arguments");
2106 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2109 *item = (AudioHandleType *) &(item_arr[index]);
2111 return AUDIO_SVC_ERROR_NONE;
2114 int audio_svc_item_new(AudioHandleType **record)
2118 audio_svc_debug("count is [%d]", count);
2119 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *) malloc(count * sizeof(audio_svc_audio_item_s));
2121 return AUDIO_SVC_ERROR_OUT_OF_MEMORY;
2123 memset(item, 0, count * sizeof(audio_svc_audio_item_s));
2125 *record = (AudioHandleType *) item;
2127 return AUDIO_SVC_ERROR_NONE;
2130 int audio_svc_item_free(AudioHandleType *record)
2132 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *) record;
2135 audio_svc_error("Invalid arguments");
2136 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2138 audio_svc_debug_func();
2141 return AUDIO_SVC_ERROR_NONE;
2144 int audio_svc_item_get_val(AudioHandleType *record,
2145 audio_svc_track_data_type_e first_field_name, ...)
2147 int ret = AUDIO_SVC_ERROR_NONE;
2150 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *) record;
2152 audio_svc_debug_func();
2154 audio_svc_error("Invalid arguments");
2155 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2158 if (first_field_name == -1) {
2159 audio_svc_error("Invalid arguments");
2160 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2163 field_name = first_field_name;
2164 va_start(var_args, first_field_name);
2166 while (field_name >= 0) {
2167 audio_svc_debug("field name = %d", field_name);
2168 switch (field_name) {
2169 case AUDIO_SVC_TRACK_DATA_STORAGE:
2171 int *val = va_arg((var_args), int *);
2172 *val = item->storage_type;
2175 case AUDIO_SVC_TRACK_DATA_AUDIO_ID:
2177 char **val = va_arg((var_args), char **);
2178 int *size = va_arg((var_args), int *);
2179 if (strlen(item->audio_uuid) == 0) {
2180 audio_svc_error("audio_id is NULL");
2182 ret = AUDIO_SVC_ERROR_DB_NO_RECORD;
2184 *size = strlen(item->audio_uuid);
2185 *val = item->audio_uuid;
2189 case AUDIO_SVC_TRACK_DATA_PLAYED_COUNT:
2191 int *val = va_arg((var_args), int *);
2192 *val = item->played_count;
2195 case AUDIO_SVC_TRACK_DATA_PLAYED_TIME:
2197 int *val = va_arg((var_args), int *);
2198 *val = item->time_played;
2201 case AUDIO_SVC_TRACK_DATA_ADDED_TIME:
2203 int *val = va_arg((var_args), int *);
2204 *val = item->time_added;
2207 case AUDIO_SVC_TRACK_DATA_RATING:
2209 int *val = va_arg((var_args), int *);
2210 *val = item->rating;
2213 case AUDIO_SVC_TRACK_DATA_CATEGORY:
2215 int *val = va_arg((var_args), int *);
2216 *val = item->category;
2219 case AUDIO_SVC_TRACK_DATA_PATHNAME:
2221 char **val = va_arg((var_args), char **);
2222 int *size = va_arg((var_args), int *);
2223 if (strlen(item->pathname) == 0) {
2224 audio_svc_error("pah is NULL");
2226 ret = AUDIO_SVC_ERROR_DB_NO_RECORD;
2228 *size = strlen(item->pathname);
2229 *val = item->pathname;
2233 case AUDIO_SVC_TRACK_DATA_THUMBNAIL_PATH:
2235 char **val = va_arg((var_args), char **);
2236 int *size = va_arg((var_args), int *);
2237 if (strlen(item->thumbname) == 0) {
2238 audio_svc_debug("thumbname is NULL");
2241 *size = strlen(item->thumbname);
2242 *val = item->thumbname;
2246 case AUDIO_SVC_TRACK_DATA_TITLE:
2248 char **val = va_arg((var_args), char **);
2249 int *size = va_arg((var_args), int *);
2250 if (strlen(item->audio.title) == 0) {
2251 audio_svc_debug("title is NULL");
2254 *val = item->audio.title;
2255 *size = strlen(item->audio.title);
2256 audio_svc_debug("title = [%s][%d]",
2261 case AUDIO_SVC_TRACK_DATA_ARTIST:
2263 char **val = va_arg((var_args), char **);
2264 int *size = va_arg((var_args), int *);
2265 if (strlen(item->audio.artist) == 0) {
2266 audio_svc_debug("artist is NULL");
2269 *val = item->audio.artist;
2270 *size = strlen(item->audio.artist);
2274 case AUDIO_SVC_TRACK_DATA_ALBUM:
2276 char **val = va_arg((var_args), char **);
2277 int *size = va_arg((var_args), int *);
2278 if (strlen(item->audio.album) == 0) {
2279 audio_svc_debug("album is NULL");
2282 *val = item->audio.album;
2283 *size = strlen(item->audio.album);
2284 audio_svc_debug("album = %s", *val);
2288 case AUDIO_SVC_TRACK_DATA_GENRE:
2290 char **val = va_arg((var_args), char **);
2291 int *size = va_arg((var_args), int *);
2292 if (strlen(item->audio.genre) == 0) {
2293 audio_svc_debug("genre is NULL");
2296 *val = item->audio.genre;
2297 *size = strlen(item->audio.genre);
2301 case AUDIO_SVC_TRACK_DATA_AUTHOR:
2303 char **val = va_arg((var_args), char **);
2304 int *size = va_arg((var_args), int *);
2305 if (strlen(item->audio.author) == 0) {
2306 audio_svc_debug("author is NULL");
2309 *val = item->audio.author;
2310 *size = strlen(item->audio.author);
2314 case AUDIO_SVC_TRACK_DATA_COPYRIGHT:
2316 char **val = va_arg((var_args), char **);
2317 int *size = va_arg((var_args), int *);
2318 if (strlen(item->audio.copyright) == 0) {
2319 audio_svc_debug("copyright is NULL");
2322 *val = item->audio.copyright;
2323 *size = strlen(item->audio.copyright);
2327 case AUDIO_SVC_TRACK_DATA_DESCRIPTION:
2329 char **val = va_arg((var_args), char **);
2330 int *size = va_arg((var_args), int *);
2331 if (strlen(item->audio.description) == 0) {
2332 audio_svc_debug("description is NULL");
2335 *val = item->audio.description;
2336 *size = strlen(item->audio.description);
2340 case AUDIO_SVC_TRACK_DATA_FORMAT:
2342 char **val = va_arg((var_args), char **);
2343 int *size = va_arg((var_args), int *);
2344 if (strlen(item->audio.format) == 0) {
2345 audio_svc_debug("format is NULL");
2348 *val = item->audio.format;
2349 *size = strlen(item->audio.format);
2353 case AUDIO_SVC_TRACK_DATA_DURATION:
2355 int *val = va_arg((var_args), int *);
2356 *val = item->audio.duration;
2360 case AUDIO_SVC_TRACK_DATA_BITRATE:
2362 int *val = va_arg((var_args), int *);
2363 *val = item->audio.bitrate;
2366 case AUDIO_SVC_TRACK_DATA_YEAR:
2368 char **val = va_arg((var_args), char **);
2369 int *size = va_arg((var_args), int *);
2370 if (strlen(item->audio.year) == 0) {
2371 audio_svc_debug("year is NULL");
2374 *val = item->audio.year;
2375 *size = strlen(item->audio.year);
2379 case AUDIO_SVC_TRACK_DATA_TRACK_NUM:
2381 int *val = va_arg((var_args), int *);
2382 *val = item->audio.track;
2385 case AUDIO_SVC_TRACK_DATA_FAVOURATE:
2387 int *val = va_arg((var_args), int *);
2388 *val = item->favourate;
2393 audio_svc_error("Invalid arguments");
2394 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2398 if (ret != AUDIO_SVC_ERROR_NONE) {
2399 audio_svc_error("error occured");
2404 field_name = va_arg(var_args, int);
2408 return AUDIO_SVC_ERROR_NONE;
2411 int audio_svc_search_item_new(AudioHandleType **record, int count)
2413 audio_svc_debug("count is [%d]", count);
2414 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *) malloc(count * sizeof(audio_svc_audio_item_s));
2417 return AUDIO_SVC_ERROR_OUT_OF_MEMORY;
2420 memset(item, 0, count * sizeof(audio_svc_audio_item_s));
2422 *record = (AudioHandleType *) item;
2424 return AUDIO_SVC_ERROR_NONE;
2427 int audio_svc_search_item_get(AudioHandleType *record, int index, AudioHandleType **item)
2429 audio_svc_audio_item_s *item_arr = (audio_svc_audio_item_s *) record;
2432 audio_svc_error("Invalid arguments");
2433 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2436 *item = (AudioHandleType *) &(item_arr[index]);
2437 if (*item == NULL) {
2438 audio_svc_error("Index is invalid");
2439 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2442 return AUDIO_SVC_ERROR_NONE;
2445 int audio_svc_search_item_free(AudioHandleType *record)
2447 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *) record;
2450 audio_svc_error("Invalid arguments");
2451 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2453 audio_svc_debug_func();
2456 return AUDIO_SVC_ERROR_NONE;
2459 int audio_svc_update_item_metadata(MediaSvcHandle *handle, const char *audio_id,
2460 audio_svc_track_data_type_e first_field_name,
2463 int ret = AUDIO_SVC_ERROR_NONE;
2465 int field_name = -1;
2466 sqlite3 * db_handle = (sqlite3 *)handle;
2468 if(db_handle == NULL) {
2469 audio_svc_error("Handle is NULL");
2470 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2473 if (!STRING_VALID(audio_id)) {
2474 audio_svc_error("invalid audio_id");
2475 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2478 if (first_field_name == -1) {
2479 audio_svc_error("Invalid arguments");
2480 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2483 field_name = first_field_name;
2484 va_start(var_args, first_field_name);
2486 while (field_name >= 0) {
2487 audio_svc_debug("field name = %d", field_name);
2488 switch (field_name) {
2489 case AUDIO_SVC_TRACK_DATA_PLAYED_COUNT:
2491 int val = va_arg((var_args), int);
2493 audio_svc_error("play count should be positive value");
2494 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2496 ret = _audio_svc_update_playcount_in_music_record(db_handle, audio_id, val);
2500 case AUDIO_SVC_TRACK_DATA_PLAYED_TIME:
2502 int val = va_arg((var_args), int);
2504 audio_svc_error("play time should be positive value");
2505 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2507 ret = _audio_svc_update_playtime_in_music_record(db_handle, audio_id, val);
2511 case AUDIO_SVC_TRACK_DATA_ADDED_TIME:
2513 int val = va_arg((var_args), int);
2515 audio_svc_error("added time should be positive value");
2516 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2518 ret = _audio_svc_update_addtime_in_music_record(db_handle, audio_id, val);
2522 case AUDIO_SVC_TRACK_DATA_RATING:
2524 int val = va_arg((var_args), int);
2525 if (val < AUDIO_SVC_RATING_NONE
2526 || val > AUDIO_SVC_RATING_5) {
2527 audio_svc_error("rating value should be between 0 and 5");
2528 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2530 ret = _audio_svc_update_rating_in_music_record(db_handle, audio_id, val);
2534 case AUDIO_SVC_TRACK_DATA_TITLE:
2536 char *val = va_arg((var_args), char *);
2537 int size = va_arg((var_args), int);
2539 /* title can not be NULL by UX */
2541 audio_svc_error("title can not be NULL");
2542 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2544 AUDIO_SVC_METADATA_LEN_MAX - 1) {
2545 audio_svc_error("text size should be shorter than AUDIO_SVC_METADATA_LEN_MAX");
2546 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2548 ret = _audio_svc_update_title_in_music_record(db_handle, audio_id, val);
2552 case AUDIO_SVC_TRACK_DATA_ARTIST:
2554 char *val = va_arg((var_args), char *);
2555 int size = va_arg((var_args), int);
2556 if (size > AUDIO_SVC_METADATA_LEN_MAX - 1) {
2557 audio_svc_error("text size should be shorter than AUDIO_SVC_METADATA_LEN_MAX");
2558 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2561 val = AUDIO_SVC_TAG_UNKNOWN;
2563 ret =_audio_svc_update_artist_in_music_record(db_handle, audio_id, val);
2567 case AUDIO_SVC_TRACK_DATA_ALBUM:
2569 char *val = va_arg((var_args), char *);
2570 int size = va_arg((var_args), int);
2571 if (size > AUDIO_SVC_METADATA_LEN_MAX - 1) {
2572 audio_svc_error("text size should be shorter than AUDIO_SVC_METADATA_LEN_MAX");
2573 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2576 val = AUDIO_SVC_TAG_UNKNOWN;
2578 ret = _audio_svc_update_album_in_music_record(db_handle, audio_id, val);
2582 case AUDIO_SVC_TRACK_DATA_GENRE:
2584 char *val = va_arg((var_args), char *);
2585 int size = va_arg((var_args), int);
2586 if (size > AUDIO_SVC_METADATA_LEN_MAX - 1) {
2587 audio_svc_error("text size should be shorter than AUDIO_SVC_METADATA_LEN_MAX");
2588 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2591 val = AUDIO_SVC_TAG_UNKNOWN;
2593 ret = _audio_svc_update_genre_in_music_record(db_handle, audio_id, val);
2597 case AUDIO_SVC_TRACK_DATA_AUTHOR:
2599 char *val = va_arg((var_args), char *);
2600 int size = va_arg((var_args), int);
2601 if (size > AUDIO_SVC_METADATA_LEN_MAX - 1) {
2602 audio_svc_error("text size should be shorter than AUDIO_SVC_METADATA_LEN_MAX");
2603 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2606 val = AUDIO_SVC_TAG_UNKNOWN;
2608 ret = _audio_svc_update_author_in_music_record(db_handle, audio_id, val);
2612 case AUDIO_SVC_TRACK_DATA_DESCRIPTION:
2614 char *val = va_arg((var_args), char *);
2615 int size = va_arg((var_args), int);
2616 if (size > AUDIO_SVC_METADATA_LEN_MAX - 1) {
2617 audio_svc_error("text size should be shorter than AUDIO_SVC_METADATA_LEN_MAX");
2618 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2620 ret = _audio_svc_update_description_in_music_record(db_handle, audio_id, val);
2624 case AUDIO_SVC_TRACK_DATA_YEAR:
2626 int val = va_arg((var_args), int);
2628 audio_svc_error("year should be positive value");
2629 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2631 ret = _audio_svc_update_year_in_music_record(db_handle, audio_id, val);
2635 case AUDIO_SVC_TRACK_DATA_TRACK_NUM:
2637 int val = va_arg((var_args), int);
2639 audio_svc_error("track number should be positive value");
2640 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2642 ret = _audio_svc_update_track_num_in_music_record(db_handle, audio_id, val);
2646 case AUDIO_SVC_TRACK_DATA_ALBUM_RATING:
2648 int val = va_arg((var_args), int);
2649 if (val < AUDIO_SVC_RATING_NONE
2650 || val > AUDIO_SVC_RATING_5) {
2651 audio_svc_error("rating value should be between 0 and 5");
2652 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2654 ret = _audio_svc_update_album_rating_in_music_record(db_handle, audio_id, val);
2660 audio_svc_error("Invalid arguments");
2661 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2665 if (ret != AUDIO_SVC_ERROR_NONE) {
2666 audio_svc_error("invalid parameter");
2671 field_name = va_arg(var_args, int);
2675 return AUDIO_SVC_ERROR_NONE;
2678 int audio_svc_check_item_exist(MediaSvcHandle *handle, const char *path)
2680 sqlite3 * db_handle = (sqlite3 *)handle;
2682 if(db_handle == NULL) {
2683 audio_svc_error("Handle is NULL");
2684 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2687 if (!STRING_VALID(path)) {
2688 audio_svc_error("path is NULL");
2689 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2692 if (_audio_svc_count_record_with_path(db_handle, path) > 0) {
2693 audio_svc_debug("item is exist in database");
2694 return AUDIO_SVC_ERROR_NONE;
2696 audio_svc_debug("item is not exist in database");
2697 return AUDIO_SVC_ERROR_DB_NO_RECORD;
2702 int audio_svc_list_by_search(MediaSvcHandle *handle, AudioHandleType *record,
2703 audio_svc_search_order_e order_field,
2706 audio_svc_serch_field_e first_field_name,
2709 int ret = AUDIO_SVC_ERROR_NONE;
2711 int field_name = -1;
2713 char query_where[AUDIO_SVC_QUERY_SIZE] = { 0 };
2714 char search_str[AUDIO_SVC_METADATA_LEN_MAX] = { 0 };
2715 char *condition_str = NULL;
2716 char *escaped_search_str = NULL;
2718 audio_svc_audio_item_s *item = (audio_svc_audio_item_s *)record;
2719 sqlite3 * db_handle = (sqlite3 *)handle;
2721 if(db_handle == NULL) {
2722 audio_svc_error("Handle is NULL");
2723 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2727 audio_svc_error("Invalid arguments");
2728 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2731 if (offset < 0 || count <= 0) {
2732 audio_svc_error("Invalid arguments");
2733 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2736 if (order_field < AUDIO_SVC_ORDER_BY_TITLE_DESC ||
2737 order_field > AUDIO_SVC_ORDER_BY_ADDED_TIME_ASC) {
2738 audio_svc_error("Invalid arguments");
2739 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2742 if (first_field_name < AUDIO_SVC_SEARCH_TITLE ||
2743 first_field_name > AUDIO_SVC_SEARCH_AUTHOR) {
2744 audio_svc_error("Invalid arguments");
2745 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2748 memset(query_where, 0x00, sizeof(query_where));
2749 snprintf(query_where, sizeof(query_where), "valid=1 and ( 0 ");
2751 field_name = first_field_name;
2752 va_start(var_args, first_field_name);
2754 while (field_name >= 0) {
2755 audio_svc_debug("field name = %d", field_name);
2756 memset(search_str, 0x00, sizeof(search_str));
2758 switch (field_name) {
2759 case AUDIO_SVC_SEARCH_TITLE:
2761 char *val = va_arg((var_args), char *);
2762 int size = va_arg((var_args), int);
2765 audio_svc_error("title is NULL");
2766 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2768 _strncpy_safe(search_str, val,
2770 sizeof(search_str)));
2773 escaped_search_str = _media_svc_escape_str((char *)search_str, strlen(search_str));
2774 if (escaped_search_str == NULL) {
2775 audio_svc_error("Failed to escape");
2776 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2779 condition_str = sqlite3_mprintf(" or title like '%%%q%%' ESCAPE('#') ", escaped_search_str);
2780 SAFE_FREE(escaped_search_str);
2783 g_strlcat(query_where, condition_str,
2784 sizeof(query_where));
2785 if (len >= sizeof(query_where)) {
2786 sqlite3_free(condition_str);
2787 audio_svc_error("strlcat returns failure ( %d )", len);
2788 return AUDIO_SVC_ERROR_INTERNAL;
2790 sqlite3_free(condition_str);
2794 case AUDIO_SVC_SEARCH_ARTIST:
2796 char *val = va_arg((var_args), char *);
2797 int size = va_arg((var_args), int);
2800 audio_svc_error("artist is NULL");
2801 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2803 _strncpy_safe(search_str, val,
2805 sizeof(search_str)));
2808 escaped_search_str = _media_svc_escape_str((char *)search_str, strlen(search_str));
2809 if (escaped_search_str == NULL) {
2810 audio_svc_error("Failed to escape");
2811 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2814 condition_str = sqlite3_mprintf(" or artist like '%%%q%%' ESCAPE('#') ", escaped_search_str);
2815 SAFE_FREE(escaped_search_str);
2818 g_strlcat(query_where, condition_str,
2819 sizeof(query_where));
2820 if (len >= sizeof(query_where)) {
2821 sqlite3_free(condition_str);
2822 audio_svc_error("strlcat returns failure ( %d )", len);
2823 return AUDIO_SVC_ERROR_INTERNAL;
2825 sqlite3_free(condition_str);
2829 case AUDIO_SVC_SEARCH_ALBUM:
2831 char *val = va_arg((var_args), char *);
2832 int size = va_arg((var_args), int);
2835 audio_svc_error("album is NULL");
2836 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2838 _strncpy_safe(search_str, val,
2840 sizeof(search_str)));
2843 escaped_search_str = _media_svc_escape_str((char *)search_str, strlen(search_str));
2844 if (escaped_search_str == NULL) {
2845 audio_svc_error("Failed to escape");
2846 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2849 condition_str = sqlite3_mprintf(" or album like '%%%q%%' ESCAPE('#') ", escaped_search_str);
2850 SAFE_FREE(escaped_search_str);
2853 g_strlcat(query_where, condition_str,
2854 sizeof(query_where));
2855 if (len >= sizeof(query_where)) {
2856 sqlite3_free(condition_str);
2857 audio_svc_error("strlcat returns failure ( %d )", len);
2858 return AUDIO_SVC_ERROR_INTERNAL;
2860 sqlite3_free(condition_str);
2864 case AUDIO_SVC_SEARCH_GENRE:
2866 char *val = va_arg((var_args), char *);
2867 int size = va_arg((var_args), int);
2870 audio_svc_error("genre is NULL");
2871 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2873 _strncpy_safe(search_str, val,
2875 sizeof(search_str)));
2878 escaped_search_str = _media_svc_escape_str((char *)search_str, strlen(search_str));
2879 if (escaped_search_str == NULL) {
2880 audio_svc_error("Failed to escape");
2881 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2884 condition_str = sqlite3_mprintf(" or genre like '%%%q%%' ESCAPE('#') ", escaped_search_str);
2885 SAFE_FREE(escaped_search_str);
2888 g_strlcat(query_where, condition_str,
2889 sizeof(query_where));
2890 if (len >= sizeof(query_where)) {
2891 audio_svc_error("strlcat returns failure ( %d )", len);
2892 return AUDIO_SVC_ERROR_INTERNAL;
2897 case AUDIO_SVC_SEARCH_AUTHOR:
2899 char *val = va_arg((var_args), char *);
2900 int size = va_arg((var_args), int);
2903 audio_svc_error("author is NULL");
2904 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2906 _strncpy_safe(search_str, val,
2908 sizeof(search_str)));
2911 escaped_search_str = _media_svc_escape_str((char *)search_str, strlen(search_str));
2912 if (escaped_search_str == NULL) {
2913 audio_svc_error("Failed to escape");
2914 return AUDIO_SVC_ERROR_INVALID_PARAMETER;
2917 condition_str = sqlite3_mprintf(" or author like '%%%q%%' ESCAPE('#') ", escaped_search_str);
2918 SAFE_FREE(escaped_search_str);
2921 g_strlcat(query_where, condition_str,
2922 sizeof(query_where));
2923 if (len >= sizeof(query_where)) {
2924 sqlite3_free(condition_str);
2925 audio_svc_error("strlcat returns failure ( %d )", len);
2926 return AUDIO_SVC_ERROR_INTERNAL;
2928 sqlite3_free(condition_str);
2934 audio_svc_error("Invalid arguments");
2935 ret = AUDIO_SVC_ERROR_INVALID_PARAMETER;
2940 if (ret != AUDIO_SVC_ERROR_NONE) {
2941 audio_svc_error("invalid parameter");
2946 field_name = va_arg(var_args, int);
2950 len = g_strlcat(query_where, ") ", sizeof(query_where));
2951 if (len >= sizeof(query_where)) {
2952 audio_svc_error("strlcat returns failure ( %d )", len);
2953 return AUDIO_SVC_ERROR_INTERNAL;
2956 return _audio_svc_list_search(db_handle, item, query_where, order_field, offset, count);