43ab55df1199fa29ee77e5e6320dd82e6a1ff03e
[platform/core/api/media-content.git] / src / media_content.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_content.h>
19 #include <media_info_private.h>
20 #include <media_util_private.h>
21
22 #include <unicode/uscript.h>
23 #include <unicode/uloc.h>
24 #include <unicode/ucol.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <dirent.h>
28 #include <fcntl.h>
29
30
31 static attribute_h g_attr_handle = NULL;
32 static attribute_h g_alias_attr_handle = NULL;
33 static MediaSvcHandle *db_handle = NULL;
34 static int ref_count = 0;
35 static GMutex db_mutex;
36
37 static __thread media_noti_cb_s *g_noti_info = NULL;
38
39 static int __media_content_create_attr_handle(void);
40 static int __media_content_create_alias_attr_handle(void);
41 static int __media_content_create_attribute_handle(void);
42 static int __media_content_destroy_attribute_handle(void);
43
44
45 static int __media_content_create_attr_handle(void)
46 {
47         int ret = MEDIA_CONTENT_ERROR_NONE;
48
49         ret = _media_filter_attribute_create(&g_attr_handle);
50         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
51
52         /* Media Info */
53         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ID, DB_FIELD_MEDIA_ID);
54         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
55
56         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_PATH, DB_FIELD_MEDIA_PATH);
57         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
58
59         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_DISPLAY_NAME, DB_FIELD_MEDIA_DISPLAY_NAME);
60         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
61
62         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_TYPE, DB_FIELD_MEDIA_TYPE);
63         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
64
65         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_MIME_TYPE, DB_FIELD_MEDIA_MIME_TYPE);
66         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
67
68         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_SIZE, DB_FIELD_MEDIA_SIZE);
69         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
70
71         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ADDED_TIME, DB_FIELD_MEDIA_ADDED_TIME);
72         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
73
74         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_MODIFIED_TIME, DB_FIELD_MEDIA_MODIFIED_TIME);
75         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
76
77         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_TIMELINE, DB_FIELD_MEDIA_TIMELINE);
78         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
79
80         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_THUMBNAIL_PATH, DB_FIELD_MEDIA_THUMBNAIL_PATH);
81         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
82
83         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_TITLE, DB_FIELD_MEDIA_TITLE);
84         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
85
86         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALBUM, DB_FIELD_MEDIA_ALBUM);
87         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
88
89         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ARTIST, DB_FIELD_MEDIA_ARTIST);
90         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
91
92         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALBUM_ARTIST, DB_FIELD_MEDIA_ALBUM_ARTIST);
93         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
94
95         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_GENRE, DB_FIELD_MEDIA_GENRE);
96         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
97
98         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_COMPOSER, DB_FIELD_MEDIA_COMPOSER);
99         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
100
101         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_YEAR, DB_FIELD_MEDIA_YEAR);
102         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
103
104         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_RECORDED_DATE, DB_FIELD_MEDIA_RECORDED_DATE);
105         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
106
107         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_COPYRIGHT, DB_FIELD_MEDIA_COPYRIGHT);
108         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
109
110         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_TRACK_NUM, DB_FIELD_MEDIA_TRACK_NUM);
111         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
112
113         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_DESCRIPTION, DB_FIELD_MEDIA_DESCRIPTION);
114         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
115
116         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_BITRATE, DB_FIELD_MEDIA_BITRATE);
117         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
118
119         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_BITPERSAMPLE, DB_FIELD_MEDIA_BITPERSAMPLE);
120         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
121
122         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_SAMPLERATE, DB_FIELD_MEDIA_SAMPLERATE);
123         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
124
125         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_CHANNEL, DB_FIELD_MEDIA_CHANNEL);
126         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
127
128         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_DURATION, DB_FIELD_MEDIA_DURATION);
129         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
130
131         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_LONGITUDE, DB_FIELD_MEDIA_LONGITUDE);
132         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
133
134         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_LATITUDE, DB_FIELD_MEDIA_LATITUDE);
135         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
136
137         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALTITUDE, DB_FIELD_MEDIA_ALTITUDE);
138         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
139
140         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_WIDTH, DB_FIELD_MEDIA_WIDTH);
141         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
142
143         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_HEIGHT, DB_FIELD_MEDIA_HEIGHT);
144         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
145
146         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_DATETAKEN, DB_FIELD_MEDIA_DATETAKEN);
147         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
148
149         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ORIENTATION, DB_FIELD_MEDIA_ORIENTATION);
150         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
151
152         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_BURST_ID, DB_FIELD_MEDIA_BURST_ID);
153         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
154
155         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_PLAYED_COUNT, DB_FIELD_MEDIA_PLAYED_COUNT);
156         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
157
158         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_LAST_PLAYED_TIME, DB_FIELD_MEDIA_LAST_PLAYED_TIME);
159         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
160
161         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_LAST_PLAYED_POSITION, DB_FIELD_MEDIA_LAST_PLAYED_POSITION);
162         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
163
164         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_RATING, DB_FIELD_MEDIA_RATING);
165         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
166
167         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_FAVOURITE, DB_FIELD_MEDIA_FAVOURITE);
168         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
169
170         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_AUTHOR, DB_FIELD_MEDIA_AUTHOR);
171         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
172
173         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_PROVIDER, DB_FIELD_MEDIA_PROVIDER);
174         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
175
176         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_CONTENT_NAME, DB_FIELD_MEDIA_CONTENT_NAME);
177         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
178
179         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_CATEGORY, DB_FIELD_MEDIA_CATEGORY);
180         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
181
182         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_LOCATION_TAG, DB_FIELD_MEDIA_LOCATION_TAG);
183         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
184
185         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_AGE_RATING, DB_FIELD_MEDIA_AGE_RATING);
186         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
187
188         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_KEYWORD, DB_FIELD_MEDIA_KEYWORD);
189         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
190
191         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_WEATHER, DB_FIELD_MEDIA_WEATHER);
192         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
193
194         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_IS_DRM, DB_FIELD_MEDIA_IS_DRM);
195         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
196
197         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_STORAGE_TYPE, DB_FIELD_MEDIA_STORAGE_TYPE);
198         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
199
200         /* Pinyin*/
201         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_FILE_NAME_PINYIN,  DB_FIELD_MEDIA_FILE_NAME_PINYIN);
202         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
203
204         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_TITLE_PINYIN,  DB_FIELD_MEDIA_TITLE_PINYIN);
205         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
206
207         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALBUM_PINYIN,  DB_FIELD_MEDIA_ALBUM_PINYIN);
208         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
209
210         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ARTIST_PINYIN,  DB_FIELD_MEDIA_ARTIST_PINYIN);
211         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
212
213         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_ALBUM_ARTIST_PINYIN,  DB_FIELD_MEDIA_ALBUM_ARTIST_PINYIN);
214         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
215
216         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_GENRE_PINYIN,  DB_FIELD_MEDIA_GENRE_PINYIN);
217         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
218
219         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_COMPOSER_PINYIN,  DB_FIELD_MEDIA_COMPOSER_PINYIN);
220         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
221
222         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_COPYRIGHT_PINYIN,  DB_FIELD_MEDIA_COPYRIGHT_PINYIN);
223         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
224
225         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_DESCRIPTION_PINYIN,  DB_FIELD_MEDIA_DESCRIPTION_PINYIN);
226         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
227
228         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_AUTHOR_PINYIN,  DB_FIELD_MEDIA_AUTHOR_PINYIN);
229         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
230
231         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_PROVIDER_PINYIN,  DB_FIELD_MEDIA_PROVIDER_PINYIN);
232         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
233
234         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_CONTENT_NAME_PINYIN,  DB_FIELD_MEDIA_CONTENT_NAME_PINYIN);
235         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
236
237         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_CATEGORY_PINYIN,  DB_FIELD_MEDIA_CATEGORY_PINYIN);
238         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
239
240         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_LOCATION_TAG_PINYIN,  DB_FIELD_MEDIA_LOCATION_TAG_PINYIN);
241         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
242
243         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_AGE_RATING_PINYIN,  DB_FIELD_MEDIA_AGE_RATING_PINYIN);
244         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
245
246         ret = _media_filter_attribute_add(g_attr_handle, MEDIA_KEYWORD_PINYIN,  DB_FIELD_MEDIA_KEYWORD_PINYIN);
247         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
248
249         /* Playlist*/
250         ret = _media_filter_attribute_add(g_attr_handle, PLAYLIST_NAME, DB_FIELD_PLAYLIST_NAME);
251         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
252
253         ret = _media_filter_attribute_add(g_attr_handle, PLAYLIST_MEMBER_ORDER, DB_FIELD_PLAYLIST_MEMBER_ORDER);
254         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
255
256         /* Playlist View */
257         ret = _media_filter_attribute_add(g_attr_handle, PLAYLIST_MEDIA_COUNT, DB_FIELD_PLAYLIST_MEDIA_COUNT);
258         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
259
260         /* Tag*/
261         ret = _media_filter_attribute_add(g_attr_handle, TAG_NAME, DB_FIELD_TAG_NAME);
262         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
263
264         /* Tag View */
265         ret = _media_filter_attribute_add(g_attr_handle, TAG_MEDIA_COUNT, DB_FIELD_TAG_MEDIA_COUNT);
266         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
267
268         /* Bookmark*/
269         ret = _media_filter_attribute_add(g_attr_handle, BOOKMARK_MARKED_TIME, DB_FIELD_BOOKMARK_MARKED_TIME);
270         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
271
272         return ret;
273 }
274
275 static int __media_content_create_alias_attr_handle(void)
276 {
277         int ret = MEDIA_CONTENT_ERROR_NONE;
278
279         ret = _media_filter_attribute_create(&g_alias_attr_handle);
280         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
281
282         /* Media Info */
283         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ID, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ID);
284         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
285
286         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_PATH, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_PATH);
287         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
288
289         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_DISPLAY_NAME, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_DISPLAY_NAME);
290         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
291
292         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_TYPE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_TYPE);
293         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
294
295         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_MIME_TYPE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_MIME_TYPE);
296         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
297
298         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_SIZE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_SIZE);
299         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
300
301         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ADDED_TIME, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ADDED_TIME);
302         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
303
304         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_MODIFIED_TIME, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_MODIFIED_TIME);
305         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
306
307         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_TIMELINE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_TIMELINE);
308         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
309
310         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_THUMBNAIL_PATH, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_THUMBNAIL_PATH);
311         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
312
313         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_TITLE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_TITLE);
314         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
315
316         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALBUM, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALBUM);
317         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
318
319         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ARTIST, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ARTIST);
320         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
321
322         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALBUM_ARTIST, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALBUM_ARTIST);
323         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
324
325         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_GENRE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_GENRE);
326         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
327
328         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_COMPOSER, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_COMPOSER);
329         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
330
331         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_YEAR, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_YEAR);
332         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
333
334         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_RECORDED_DATE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_RECORDED_DATE);
335         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
336
337         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_COPYRIGHT, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_COPYRIGHT);
338         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
339
340         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_TRACK_NUM, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_TRACK_NUM);
341         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
342
343         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_DESCRIPTION, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_DESCRIPTION);
344         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
345
346         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_BITRATE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_BITRATE);
347         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
348
349         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_BITPERSAMPLE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_BITPERSAMPLE);
350         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
351
352         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_SAMPLERATE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_SAMPLERATE);
353         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
354
355         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_CHANNEL, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_CHANNEL);
356         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
357
358         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_DURATION, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_DURATION);
359         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
360
361         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_LONGITUDE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_LONGITUDE);
362         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
363
364         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_LATITUDE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_LATITUDE);
365         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
366
367         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALTITUDE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALTITUDE);
368         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
369
370         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_WIDTH, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_WIDTH);
371         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
372
373         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_HEIGHT, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_HEIGHT);
374         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
375
376         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_DATETAKEN, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_DATETAKEN);
377         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
378
379         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ORIENTATION, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ORIENTATION);
380         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
381
382         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_BURST_ID, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_BURST_ID);
383         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
384
385         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_PLAYED_COUNT, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_PLAYED_COUNT);
386         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
387
388         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_LAST_PLAYED_TIME, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_LAST_PLAYED_TIME);
389         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
390
391         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_LAST_PLAYED_POSITION, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_LAST_PLAYED_POSITION);
392         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
393
394         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_RATING, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_RATING);
395         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
396
397         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_FAVOURITE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_FAVOURITE);
398         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
399
400         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_AUTHOR, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_AUTHOR);
401         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
402
403         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_PROVIDER, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_PROVIDER);
404         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
405
406         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_CONTENT_NAME, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_CONTENT_NAME);
407         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
408
409         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_CATEGORY, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_CATEGORY);
410         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
411
412         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_LOCATION_TAG, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_LOCATION_TAG);
413         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
414
415         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_AGE_RATING, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_AGE_RATING);
416         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
417
418         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_KEYWORD, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_KEYWORD);
419         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
420
421         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_WEATHER, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_WEATHER);
422         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
423
424         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_IS_DRM, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_IS_DRM);
425         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
426
427         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_STORAGE_TYPE, DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_STORAGE_TYPE);
428         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
429
430         /* Pinyin*/
431         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_FILE_NAME_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_FILE_NAME_PINYIN);
432         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
433
434         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_TITLE_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_TITLE_PINYIN);
435         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
436
437         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALBUM_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALBUM_PINYIN);
438         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
439
440         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ARTIST_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ARTIST_PINYIN);
441         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
442
443         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_ALBUM_ARTIST_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_ALBUM_ARTIST_PINYIN);
444         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
445
446         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_GENRE_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_GENRE_PINYIN);
447         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
448
449         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_COMPOSER_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_COMPOSER_PINYIN);
450         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
451
452         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_COPYRIGHT_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_COPYRIGHT_PINYIN);
453         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
454
455         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_DESCRIPTION_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_DESCRIPTION_PINYIN);
456         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
457
458         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_AUTHOR_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_AUTHOR_PINYIN);
459         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
460
461         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_PROVIDER_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_PROVIDER_PINYIN);
462         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
463
464         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_CONTENT_NAME_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_CONTENT_NAME_PINYIN);
465         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
466
467         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_CATEGORY_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_CATEGORY_PINYIN);
468         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
469
470         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_LOCATION_TAG_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_LOCATION_TAG_PINYIN);
471         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
472
473         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_AGE_RATING_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_AGE_RATING_PINYIN);
474         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
475
476         ret = _media_filter_attribute_add(g_alias_attr_handle, MEDIA_KEYWORD_PINYIN,  DB_TABLE_ALIAS_MEDIA"."DB_FIELD_MEDIA_KEYWORD_PINYIN);
477         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
478
479         /* Folder */
480         ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_ID, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_ID);
481         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
482
483         ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_PATH, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_PATH);
484         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
485
486         ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_NAME, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_NAME);
487         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
488
489         ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_MODIFIED_TIME, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_MODIFIED_TIME);
490         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
491
492         ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_STORAGE_TYPE, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_STORAGE_TYPE);
493         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
494
495         ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_NAME_PINYIN, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_NAME_PINYIN);
496         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
497
498         ret = _media_filter_attribute_add(g_alias_attr_handle, FOLDER_ORDER, DB_TABLE_ALIAS_FOLDER"."DB_FIELD_FOLDER_ORDER);
499         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
500
501         /* Playlist*/
502         ret = _media_filter_attribute_add(g_alias_attr_handle, PLAYLIST_NAME, DB_TABLE_ALIAS_PLAYLIST"."DB_FIELD_PLAYLIST_NAME);
503         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
504
505         ret = _media_filter_attribute_add(g_alias_attr_handle, PLAYLIST_MEMBER_ORDER, DB_TABLE_ALIAS_PLAYLIST_MAP"."DB_FIELD_PLAYLIST_MEMBER_ORDER);
506         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
507
508         /* Tag*/
509         ret = _media_filter_attribute_add(g_alias_attr_handle, TAG_NAME, DB_TABLE_ALIAS_TAG"."DB_FIELD_TAG_NAME);
510         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
511
512         /* Bookmark*/
513         ret = _media_filter_attribute_add(g_alias_attr_handle, BOOKMARK_MARKED_TIME, DB_TABLE_ALIAS_BOOKMARK"."DB_FIELD_BOOKMARK_MARKED_TIME);
514         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
515
516         return ret;
517 }
518
519 static int __media_content_create_attribute_handle(void)
520 {
521         int ret = MEDIA_CONTENT_ERROR_NONE;
522
523         ret = __media_content_create_attr_handle();
524         media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
525
526         ret = __media_content_create_alias_attr_handle();
527         if(ret != MEDIA_CONTENT_ERROR_NONE)
528                 _media_filter_attribute_destory(g_attr_handle);
529
530         return ret;
531 }
532
533 static int __media_content_destroy_attribute_handle(void)
534 {
535         int ret = MEDIA_CONTENT_ERROR_NONE;
536
537         ret = _media_filter_attribute_destory(g_attr_handle);
538         ret = _media_filter_attribute_destory(g_alias_attr_handle);
539
540         g_attr_handle = NULL;
541         g_alias_attr_handle = NULL;
542
543         return ret;
544 }
545
546 attribute_h _content_get_attirbute_handle(void)
547 {
548         return g_attr_handle;
549 }
550
551 attribute_h _content_get_alias_attirbute_handle(void)
552 {
553         return g_alias_attr_handle;
554 }
555
556 MediaSvcHandle* _content_get_db_handle(void)
557 {
558         return db_handle;
559 }
560
561 int _content_query_prepare(sqlite3_stmt **stmt, char *select_query, char *condition_query, char *option_query)
562 {
563         int len = 0;
564         int err = MEDIA_CONTENT_ERROR_NONE;
565         char query[MAX_QUERY_SIZE];
566         memset(query, '\0', sizeof(query));
567
568         if(db_handle == NULL)
569         {
570                 media_content_error("DB_FAILED(0x%08x) database is not connected", MEDIA_CONTENT_ERROR_DB_FAILED);
571                 return MEDIA_CONTENT_ERROR_DB_FAILED;
572         }
573
574         if(STRING_VALID(select_query))
575         {
576                 if(!STRING_VALID(condition_query))
577                 {
578                         condition_query = " ";
579                 }
580
581                 if(!STRING_VALID(option_query))
582                 {
583                         option_query = " ";
584                 }
585
586                 //query = sqlite3_mprintf("%s %s %s", select_query, condition_query, option_query);
587                 len = snprintf(query, sizeof(query), "%s %s %s", select_query, condition_query, option_query);
588                 if (len > 0 && len < MAX_QUERY_SIZE) {
589                         query[len] = '\0';
590                 } else if (len >= MAX_QUERY_SIZE) {
591                         query[MAX_QUERY_SIZE -1] = '\0';
592                 } else {
593                         media_content_error("snprintf failed");
594                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
595                 }
596
597                 media_content_sec_debug("Query : [%s]", query);
598
599                 err = sqlite3_prepare_v2((sqlite3*)db_handle, query, strlen(query), stmt, NULL);
600                 if(err != SQLITE_OK)
601                 {
602                         media_content_error("DB_FAILED(0x%08x) fail to sqlite3_prepare(), %s", MEDIA_CONTENT_ERROR_DB_FAILED, sqlite3_errmsg((sqlite3*)db_handle));
603
604                         if (err == SQLITE_BUSY) {
605                                 media_content_error(" BUSY ERROR");
606                                 return MEDIA_CONTENT_ERROR_DB_BUSY;
607                         } else if (err == SQLITE_PERM) {
608                                 media_content_error("PERMISSION EROR");
609                                 return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
610                         } else {
611                                 media_content_error("OTHER ERROR");
612                                 return MEDIA_CONTENT_ERROR_DB_FAILED;
613                         }
614                 }
615         }
616         else
617         {
618                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
619                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
620         }
621
622         return MEDIA_CONTENT_ERROR_NONE;
623 }
624
625 int _content_error_capi(int type, int content_error)
626 {
627         if(content_error != MEDIA_CONTENT_ERROR_NONE)
628         {
629                 media_content_error("[type : %d] content_error : %d ", type, content_error);
630         }
631
632         /*Error None*/
633         if(content_error == MS_MEDIA_ERR_NONE)
634                 return MEDIA_CONTENT_ERROR_NONE;
635
636         /* Internal operation error*/
637         else if((content_error == MS_MEDIA_ERR_INVALID_PARAMETER) ||
638                 (content_error == MS_MEDIA_ERR_INVALID_PATH) ||
639                 (content_error == MS_MEDIA_ERR_THUMB_DUPLICATED_REQUEST))
640                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
641
642         else if(content_error == MS_MEDIA_ERR_OUT_OF_MEMORY)
643                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
644
645         /* DB operation error*/
646         else if(content_error == MS_MEDIA_ERR_DB_BUSY_FAIL)
647                 return MEDIA_CONTENT_ERROR_DB_BUSY;
648
649         else if((content_error <= MS_MEDIA_ERR_DB_CONNECT_FAIL) && (content_error >= MS_MEDIA_ERR_DB_INTERNAL))
650                 return MEDIA_CONTENT_ERROR_DB_FAILED;
651
652         /* IPC operation error*/
653         else if((content_error <= MS_MEDIA_ERR_SOCKET_CONN) && (content_error >= MS_MEDIA_ERR_SOCKET_INTERNAL))
654                 return MEDIA_CONTENT_ERROR_NETWORK;
655
656         /* MEDIA SERVER error*/
657         else if(content_error == MS_MEDIA_ERR_PERMISSION_DENIED)
658                 return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
659
660         /* Thumbnail error*/
661         else if(content_error == MS_MEDIA_ERR_THUMB_TOO_BIG)
662                         return MEDIA_CONTENT_ERROR_UNSUPPORTED_CONTENT;
663
664         /*ETC*/
665         return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
666 }
667
668 int _content_query_sql(char *query_str)
669 {
670         int ret = MEDIA_CONTENT_ERROR_NONE;
671
672         //DB will be updated by Media Server.
673         ret = media_svc_request_update_db(query_str,tzplatform_getuid(TZ_USER_NAME));
674
675         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
676 }
677
678 int media_content_connect(void)
679 {
680         int ret = MEDIA_CONTENT_ERROR_NONE;
681
682         if (g_mutex_trylock(&db_mutex)) {
683                 media_content_info("ref count : %d", ref_count);
684
685                 if(ref_count == 0)
686                 {
687                         if(db_handle == NULL)
688                         {
689                                 ret = __media_content_create_attribute_handle();
690                                 if(ret == MEDIA_CONTENT_ERROR_NONE) {
691                                         ret = media_svc_connect(&db_handle,tzplatform_getuid(TZ_USER_NAME));
692                                         ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
693                                         if(ret == MEDIA_CONTENT_ERROR_NONE) {
694                                                 ref_count++;
695                                                 //__media_content_create_collate();
696                                         } else {
697                                                 __media_content_destroy_attribute_handle();
698                                         }
699                                 } else {
700                                         media_content_error("Internal DB Connection Error");
701                                 }
702                         } else {
703                                 media_content_error("Wrong DB Connection status");
704                                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
705                         }
706                 } else {
707                         if(db_handle != NULL) {
708                                 ref_count++;
709                         } else {
710                                 media_content_error("Wrong DB Handle status");
711                                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
712                         }
713                 }
714
715                 media_content_info("ref count changed to: %d", ref_count);
716                 g_mutex_unlock(&db_mutex);
717         } else {
718                 media_content_error("mutex is NULL");
719                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
720         }
721
722         return ret;
723 }
724
725 int media_content_disconnect(void)
726 {
727         int ret = MEDIA_CONTENT_ERROR_NONE;
728
729         if (g_mutex_trylock(&db_mutex)) {
730                 media_content_debug("ref count : %d", ref_count);
731                 if(ref_count > 0)
732                 {
733                         if(db_handle != NULL) {
734                                 ref_count--;
735                         } else {
736                                 media_content_error("Wrong DB Handle status");
737                                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
738                         }
739                 }
740                 else
741                 {
742                         media_content_error("DB_FAILED(0x%08x) database is not connected", MEDIA_CONTENT_ERROR_DB_FAILED);
743                         g_mutex_unlock(&db_mutex);
744                         return MEDIA_CONTENT_ERROR_DB_FAILED;
745                 }
746
747                 if(ref_count == 0)
748                 {
749                         if(db_handle != NULL)
750                         {
751                                 ret = media_svc_disconnect(db_handle);
752                                 ret = _content_error_capi(MEDIA_CONTENT_TYPE, ret);
753                                 if(ret == MEDIA_CONTENT_ERROR_NONE) {
754                                         ret = __media_content_destroy_attribute_handle();
755                                         db_handle = NULL;
756                                 } else {
757                                         media_content_error("database disconnect fail");
758                                         ref_count++;
759                                 }
760                         } else {
761                                 media_content_error("Wrong DB Handle status");
762                                 ret = MEDIA_CONTENT_ERROR_DB_FAILED;
763                         }
764
765                         g_mutex_unlock(&db_mutex);
766
767                         media_content_info("ref count changed to: %d", ref_count);
768
769                         return ret;
770                 }
771
772                 g_mutex_unlock(&db_mutex);
773         } else {
774                 media_content_error("mutex is NULL");
775                 ret = MEDIA_CONTENT_ERROR_INVALID_OPERATION;
776         }
777
778         media_content_info("ref count changed to: %d", ref_count);
779
780         return ret;
781 }
782
783 int media_content_scan_file(const char *path)
784 {
785         int ret = MEDIA_CONTENT_ERROR_NONE;
786         bool ignore_dir = FALSE;
787         char *folder_path = NULL;
788         int check_file = MEDIA_CONTENT_ERROR_NONE;
789
790         if (!STRING_VALID(path)) {
791                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
792                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
793         }
794
795         media_content_sec_debug("Path : %s", path);
796
797         check_file = _media_util_check_file(path);
798         if (check_file == MEDIA_CONTENT_ERROR_NONE) {
799                 /* This means this path has to be inserted or refreshed */
800                 folder_path = g_path_get_dirname(path);
801                 ret = _media_util_check_ignore_dir(folder_path, &ignore_dir);
802                 SAFE_FREE(folder_path);
803
804                 if(ignore_dir) {
805                         media_content_error("Invalid folder path");
806                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
807                 }
808
809                 media_svc_storage_type_e storage_type;
810
811                 ret = media_svc_get_storage_type(path, &storage_type, tzplatform_getuid(TZ_USER_NAME));
812                 if(ret != MS_MEDIA_ERR_NONE) {
813                         media_content_sec_error("media_svc_get_storage_type failed : %d (%s)", ret, path);
814                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
815                 }
816
817                 ret = media_svc_check_item_exist_by_path(_content_get_db_handle(), path);
818                 if (ret == MS_MEDIA_ERR_NONE) {
819                         /* Refresh */
820                         ret = media_svc_refresh_item(_content_get_db_handle(), storage_type, "media", path,tzplatform_getuid(TZ_USER_NAME));
821                         if(ret != MS_MEDIA_ERR_NONE) {
822                                 media_content_error("media_svc_refresh_item failed : %d", ret);
823                                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
824                         }
825
826                 } else if (ret == MS_MEDIA_ERR_DB_NO_RECORD) {
827                         /* Insert */
828                         ret = media_svc_insert_item_immediately(_content_get_db_handle(), storage_type, path,tzplatform_getuid(TZ_USER_NAME));
829                         if(ret != MS_MEDIA_ERR_NONE) {
830                                 if (ret == MS_MEDIA_ERR_DB_CONSTRAINT_FAIL) {
831                                         media_content_sec_error("This item is already inserted. This may be normal operation because other process already did this (%s)", path);
832                                         ret = MEDIA_CONTENT_ERROR_NONE;
833                                 } else {
834                                         media_content_sec_error("media_svc_insert_item_immediately failed : %d (%s)", ret, path);
835                                 }
836
837                                 return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
838                         }
839                 } else {
840                         media_content_error("media_svc_check_item_exist_by_path failed : %d", ret);
841                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
842                 }
843         } else if (check_file == MEDIA_CONTENT_ERROR_PERMISSION_DENIED) {
844                 media_content_error("You have no permission for this file %d", ret);
845                 return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
846         } else {
847                 /* This means this path has to be deleted */
848                 media_content_debug("This path doesn't exists in file system... So now start to delete it from DB");
849                 ret = media_svc_delete_item_by_path(_content_get_db_handle(), "media", path, tzplatform_getuid(TZ_USER_NAME));
850                 if(ret != MS_MEDIA_ERR_NONE) {
851                         media_content_error("media_svc_delete_item_by_path failed : %d", ret);
852                         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
853                 }
854         }
855
856         return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
857 }
858
859 void _media_content_scan_cb(media_request_result_s* result, void *user_data)
860 {
861         int err = -1;
862         media_content_scan_cb_data *cb_data = user_data;
863
864         err = result->result;
865
866         if (cb_data && cb_data->callback) {
867                 media_content_debug("User callback is being called now");
868                 cb_data->callback(err, cb_data->user_data);
869         }
870
871         SAFE_FREE(cb_data);
872
873         return;
874 }
875
876 static int __media_content_check_dir(const char *path)
877 {
878         DIR *dp = NULL;
879
880         dp = opendir(path);
881         if (dp == NULL) {
882                 media_content_sec_error("path [%s]", path);
883                 media_content_stderror("open dir fail");
884                 if (errno == EACCES || errno == EPERM) {
885                         return MEDIA_CONTENT_ERROR_PERMISSION_DENIED;
886                 } else {
887                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
888                 }
889         }
890
891         closedir(dp);
892
893         return MEDIA_CONTENT_ERROR_NONE;
894 }
895
896
897 int media_content_scan_folder(const char *path, bool is_recursive, media_scan_completed_cb callback, void *user_data)
898 {
899         int ret = MEDIA_CONTENT_ERROR_NONE;
900         bool ignore_dir = FALSE;
901
902         if (!STRING_VALID(path)) {
903                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
904                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
905         }
906
907         ret = _media_util_check_ignore_dir(path, &ignore_dir);
908         if(ignore_dir) {
909                 media_content_error("Invalid folder path");
910                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
911         }
912
913         ret = __media_content_check_dir(path);
914         if (ret == MEDIA_CONTENT_ERROR_PERMISSION_DENIED) {
915                 return ret;
916         }
917
918         media_content_scan_cb_data *cb_data = NULL;
919         cb_data = (media_content_scan_cb_data *)malloc(sizeof(media_content_scan_cb_data));
920         if (cb_data == NULL) {
921                 media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
922                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
923         }
924
925         cb_data->callback = callback;
926         cb_data->user_data = user_data;
927
928         ret = media_directory_scanning_async(path, is_recursive, _media_content_scan_cb, cb_data, tzplatform_getuid(TZ_USER_NAME));
929         if(ret != MS_MEDIA_ERR_NONE) {
930                 media_content_error("media_directory_scanning_async failed : %d", ret);
931         }
932
933         return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
934 }
935
936 int media_content_cancel_scan_folder(const char *path)
937 {
938         int ret = MEDIA_CONTENT_ERROR_NONE;
939
940         //ret = media_directory_scanning_cancel(path);
941         if(ret != MS_MEDIA_ERR_NONE) {
942                 media_content_error("media_directory_scanning_async failed : %d", ret);
943         }
944
945         return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
946 }
947
948 void _media_content_db_update_noti_cb(
949                                                         int pid,
950                                                         media_item_type_e item,
951                                                         media_item_update_type_e update_type,
952                                                         char* path,
953                                                         char* uuid,
954                                                         media_type_e content_type,
955                                                         char *mime_type,
956                                                         void *user_data)
957 {
958         int error_value = MEDIA_CONTENT_ERROR_NONE;
959
960         media_noti_cb_s *_noti_info = (media_noti_cb_s *)user_data;
961
962         if(_noti_info != NULL)
963         {
964                 if (_noti_info->update_noti_cb)
965                         _noti_info->update_noti_cb(error_value, pid, item, update_type, content_type, uuid, path, mime_type, _noti_info->user_data);
966         }
967
968         return;
969 }
970
971 int media_content_set_db_updated_cb(media_content_db_update_cb callback, void *user_data)
972 {
973         int ret = MEDIA_CONTENT_ERROR_NONE;
974
975         if (callback == NULL) {
976                 media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
977                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
978         }
979
980         if (g_noti_info != NULL) {
981                 media_content_error("Noti callback is alreay set");
982                 return MEDIA_CONTENT_ERROR_INVALID_OPERATION;
983         }
984
985         g_noti_info = (media_noti_cb_s*)calloc(1, sizeof(media_noti_cb_s));
986         if (g_noti_info == NULL) {
987                 media_content_error("Failed to create noti info");
988                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
989         }
990
991         g_noti_info->update_noti_cb = callback;
992         g_noti_info->user_data = user_data;
993
994         ret = media_db_update_subscribe(_media_content_db_update_noti_cb, (void *)g_noti_info);
995
996         return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
997 }
998
999 int media_content_unset_db_updated_cb(void)
1000 {
1001         int ret = MEDIA_CONTENT_ERROR_NONE;
1002
1003         SAFE_FREE(g_noti_info);
1004         ret = media_db_update_unsubscribe();
1005
1006         return _content_error_capi(MEDIA_REGISTER_TYPE, ret);
1007 }