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