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