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