initial upload for tizen 2.0 beta
[apps/home/gallery.git] / ug / ug-gallery-efl / src / ge-data.c
1 /*\r
2   * Copyright 2012  Samsung Electronics Co., Ltd\r
3   *\r
4   * Licensed under the Flora License, Version 1.0 (the "License");\r
5   * you may not use this file except in compliance with the License.\r
6   * You may obtain a copy of the License at\r
7   *\r
8   *     http://www.tizenopensource.org/license\r
9   *\r
10   * Unless required by applicable law or agreed to in writing, software\r
11   * distributed under the License is distributed on an "AS IS" BASIS,\r
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13   * See the License for the specific language governing permissions and\r
14   * limitations under the License.\r
15   */\r
16 \r
17 #include "ge-data.h"\r
18 #include "ge-debug.h"\r
19 #include "ge-util.h"\r
20 #include "ge-drm.h"\r
21 #include "ge-strings.h"\r
22 \r
23 static int ge_all_count = 0;\r
24 static Eina_List* ge_db_item_list = NULL;\r
25 static Eina_List* ge_item_selected_list = NULL;\r
26 \r
27 #define ALBUM_ALL_LEN 4\r
28 #define GE_DB_FILE_LEN_MAX 1024\r
29 \r
30 /*\r
31 *  create a gitem\r
32 */\r
33 static ge_item* __ge_data_calloc_geitem(void)\r
34 {\r
35         ge_item* gitem = (ge_item*)calloc(1, sizeof(ge_item));\r
36         GE_CHECK_NULL(gitem);\r
37         return gitem;\r
38 }\r
39 \r
40 /*\r
41 *   destroy a ge_item\r
42 */\r
43 static int __ge_data_free_geitem(ge_item* gitem)\r
44 {\r
45         if(gitem) {\r
46                 if(gitem->item) {\r
47                         _ge_data_type_free_geitem((void **)&(gitem->item));\r
48                         gitem->item = NULL;\r
49                 }\r
50 \r
51                 if(gitem->_reserved) {\r
52                         free(gitem->_reserved);\r
53                         gitem->_reserved = NULL;\r
54                 }\r
55 \r
56                 free(gitem);\r
57         }\r
58         return 0;\r
59 }\r
60 \r
61 static int __ge_data_free_mtype_items_list(Eina_List **elist)\r
62 {\r
63         void *current = NULL;\r
64 \r
65         if (elist && *elist) {\r
66                 ge_dbg("Clear Mitems list.");\r
67                 EINA_LIST_FREE(*elist, current) {\r
68                         if (current) {\r
69                                 _ge_data_type_free_geitem((void **)&current);\r
70                                 current = NULL;\r
71                         }\r
72                 }\r
73 \r
74                 *elist = NULL;\r
75         }\r
76 \r
77         return 0;\r
78 }\r
79 \r
80 static int __ge_data_free_items_list(void)\r
81 {\r
82         ge_item* current = NULL;\r
83 \r
84         if (ge_db_item_list) {\r
85                 ge_dbg("Clear items list.");\r
86                 EINA_LIST_FREE(ge_db_item_list, current) {\r
87                         __ge_data_free_geitem(current);\r
88                         current = NULL;\r
89                 }\r
90         }\r
91         ge_db_item_list = NULL;\r
92         ge_all_count = 0;\r
93         return 0;\r
94 }\r
95 \r
96 static int __ge_data_free_cluster(ge_cluster* gcluster)\r
97 {\r
98         GE_CHECK_VAL(gcluster, -1);\r
99         if(gcluster->cluster) {\r
100                 _ge_data_type_free_geitem((void **)&(gcluster->cluster));\r
101                 gcluster->cluster = NULL;\r
102         }\r
103 \r
104         if(gcluster->_reserved) {\r
105                 free(gcluster->_reserved);\r
106                 gcluster->_reserved = NULL;\r
107         }\r
108         free(gcluster);\r
109 \r
110         return 0;\r
111 }\r
112 \r
113 static int __ge_data_free_clusters_list(ge_ugdata* ugd)\r
114 {\r
115         GE_CHECK_VAL(ugd, -1);\r
116         ge_cluster* current = NULL;\r
117         Eina_List* tmp_list = NULL;\r
118 \r
119         _ge_set_current_album(NULL);\r
120 \r
121         if(ugd->cluster_list) {\r
122                 if(ugd->cluster_list->clist) {\r
123                         ge_dbg("Clear clusters list.");\r
124                         tmp_list = ugd->cluster_list->clist;\r
125                         EINA_LIST_FREE(tmp_list, current) {\r
126                                 if(current)\r
127                                         __ge_data_free_cluster(current);\r
128 \r
129                                 current = NULL;\r
130                         }\r
131                         ugd->cluster_list->clist = NULL;\r
132                 }\r
133 \r
134                 free(ugd->cluster_list);\r
135                 ugd->cluster_list = NULL;\r
136         }\r
137 \r
138         return 0;\r
139 }\r
140 \r
141 static ge_cluster_list* __ge_data_calloc_clusters_list(void)\r
142 {\r
143         ge_cluster_list* clus_list = (ge_cluster_list*)calloc(1,\r
144                                                               sizeof(ge_cluster_list));\r
145         GE_CHECK_NULL(clus_list);\r
146         return clus_list;\r
147 }\r
148 \r
149 static ge_cluster* __ge_data_calloc_cluster(void)\r
150 {\r
151         ge_cluster* gcluster = (ge_cluster*)calloc(1, sizeof(ge_cluster));\r
152         GE_CHECK_NULL(gcluster);\r
153         return gcluster;\r
154 }\r
155 \r
156 /* Create 'All' album */\r
157 static ge_cluster* __ge_data_new_cluster_all(ge_ugdata* ugd, int count)\r
158 {\r
159         GE_CHECK_NULL(ugd);\r
160         ge_cluster* gcluster = __ge_data_calloc_cluster();\r
161         GE_CHECK_NULL(gcluster);\r
162 \r
163         /* Pass -1 to get a mcluster from libmedia-info, not a real record in DB */\r
164         ge_album_s *cluster = NULL;\r
165         _ge_data_type_new_album(&cluster);\r
166         if(cluster == NULL) {\r
167                 free(gcluster);\r
168                 gcluster = NULL;\r
169                 return NULL;\r
170         }\r
171 \r
172         cluster->uuid = strdup(GE_ALBUM_ALL_ID);\r
173         cluster->display_name = strdup(GE_ALBUM_ALL_NAME);\r
174         cluster->count = count;\r
175         cluster->type = GE_PHONE;\r
176         gcluster->cluster = cluster;\r
177         gcluster->ugd = ugd;\r
178         gcluster->index = 0;\r
179 \r
180         return gcluster;\r
181 }\r
182 \r
183 /* Case 1: Carema shot[0], All[1], ...; Case 2: All[0], ... */\r
184 static int __ge_data_get_clusters_list(ge_ugdata* ugd)\r
185 {\r
186         GE_CHECK_VAL(ugd, -1);\r
187         int length = 0;\r
188         int local_item_cnt = 0;\r
189         Eina_List *item_list = NULL;\r
190         ge_album_s *f_data = NULL;\r
191         ge_cluster *default_album = NULL;\r
192         ge_cluster* gcluster = NULL;\r
193         int medias_cnt = 0;\r
194         int err = -1;\r
195         ge_filter_s filter;\r
196 \r
197         /* Get real albums */\r
198         memset(&filter, 0x00, sizeof(ge_filter_s));\r
199         g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
200         filter.collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;\r
201         filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
202         g_strlcpy(filter.sort_keyword, FOLDER_NAME, KEYWORD_LENGTH);\r
203         filter.offset = GE_GET_ALL_RECORDS;\r
204         filter.count = GE_GET_ALL_RECORDS;\r
205         filter.with_meta = false;\r
206 \r
207         err = _ge_local_data_get_album_list(&filter, &item_list);\r
208         if(err != 0) {\r
209                 ge_dbgW("No record");\r
210                 if (item_list)\r
211                         __ge_data_free_mtype_items_list(&item_list);\r
212                 return err;\r
213         }\r
214 \r
215         Eina_List* clist = ugd->cluster_list->clist;\r
216 \r
217         EINA_LIST_FREE(item_list, f_data) {\r
218                 if (f_data == NULL || f_data->uuid == NULL) {\r
219                         /* Invalid data, next one */\r
220                         ge_dbgE("Invalid ge_album_s!");\r
221                         continue;\r
222                 }\r
223                 ge_dbg("Cluster ID: %s.", f_data->uuid);\r
224 \r
225                 /* only image is valid in setas mode. */\r
226                 if (ugd->file_type_mode == GE_File_Select_Type_Image ||\r
227                     ugd->file_type_mode == GE_File_Select_Type_Video) {\r
228                         memset(&filter,0x00,sizeof(ge_filter_s));\r
229                         if(ugd->file_type_mode == GE_File_Select_Type_Image)\r
230                                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE,\r
231                                           CONDITION_LENGTH);\r
232                         else\r
233                                 g_strlcpy(filter.cond, GE_CONDITION_VIDEO,\r
234                                           CONDITION_LENGTH);\r
235                         filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
236                         g_strlcpy(filter.sort_keyword, MEDIA_DISPLAY_NAME,\r
237                                   KEYWORD_LENGTH);\r
238                         filter.offset = GE_GET_ALL_RECORDS;\r
239                         filter.count = GE_GET_ALL_RECORDS;\r
240                         filter.with_meta = false;\r
241 \r
242                         err = _ge_local_data_get_media_count(f_data->uuid,\r
243                                                              &filter,\r
244                                                              &medias_cnt);\r
245                         if(err == 0) {\r
246                                 f_data->count = medias_cnt;\r
247                         } else {\r
248                                 f_data->count = 0;\r
249                                 ge_dbgW("minfo_get_cluster_cnt[err:%d]", err);\r
250                         }\r
251                 }\r
252 \r
253                 if(f_data->count == 0) {\r
254                         ge_dbgW("local album is empty, skipping it.");\r
255                         _ge_data_type_free_geitem((void **)&f_data);\r
256                         continue;\r
257                 } else {\r
258                         local_item_cnt += f_data->count;\r
259                 }\r
260 \r
261                 gcluster = __ge_data_calloc_cluster();\r
262                 if(gcluster == NULL) {\r
263                         ge_dbgE("__ge_data_calloc_cluster failed!");\r
264                         _ge_data_type_free_geitem((void **)&f_data);\r
265                         continue;\r
266                 }\r
267 \r
268                 gcluster->cluster = f_data;\r
269                 gcluster->ugd = ugd;\r
270                 length += f_data->count;\r
271 \r
272                 if (_ge_data_is_default_album(GE_ALBUM_MY_NAME, f_data)) {\r
273                         /**\r
274                         * Default album: Camera Shot\r
275                         * Now Camera Shot is located in Phone.\r
276                         * If user can determine the location of default album,\r
277                         * here we should get the path and check it's in Phone or MMC.\r
278                         */\r
279                         default_album = gcluster;\r
280                         clist = eina_list_prepend(clist, gcluster);\r
281                 } else {\r
282                         clist = eina_list_append(clist, gcluster);\r
283                 }\r
284                 ugd->cluster_list->clist = clist;\r
285         }\r
286         ge_dbg("Get local clusters list Done[%d]!", local_item_cnt);\r
287         if(local_item_cnt) {\r
288                 /* Create "All" album if any file exists */\r
289                 gcluster = __ge_data_new_cluster_all(ugd, local_item_cnt);\r
290                 GE_CHECK_VAL(gcluster, -1);\r
291 \r
292                 if(default_album)\r
293                         clist = eina_list_append_relative(clist, gcluster,\r
294                                                           default_album);\r
295                 else\r
296                         clist= eina_list_prepend(clist, gcluster);\r
297 \r
298                 ugd->cluster_list->clist = clist;\r
299                 ge_dbg("Cluster All added!");\r
300         }\r
301 \r
302         return length;\r
303 }\r
304 \r
305 static int __ge_data_get_selected_item_id_list(Eina_List **sel_id_list)\r
306 {\r
307         GE_CHECK_VAL(sel_id_list, -1);\r
308         GE_CHECK_VAL(ge_item_selected_list, -1);\r
309         ge_item *gitem = NULL;\r
310         char *item_id = NULL;\r
311 \r
312         /* Save ID of selected items */\r
313         EINA_LIST_FREE(ge_item_selected_list, gitem) {\r
314                 if (gitem && gitem->item && gitem->item->uuid) {\r
315                         item_id = strdup(gitem->item->uuid);\r
316                         //ge_dbg("Append item ID: %s", item_id);\r
317                         *sel_id_list = eina_list_append(*sel_id_list,\r
318                                                         (void *)item_id);\r
319                 }\r
320         }\r
321 \r
322         _ge_data_selected_list_finalize();\r
323         return 0;\r
324 }\r
325 \r
326 /* Free list of selected IDs */\r
327 static int __ge_data_free_selected_id_list(Eina_List **sel_id_list)\r
328 {\r
329         GE_CHECK_VAL(sel_id_list, -1);\r
330         if (*sel_id_list == NULL) {\r
331                 ge_dbg("sel_id_list is empty!");\r
332                 return -1;\r
333         }\r
334 \r
335         void *p_id = NULL;\r
336         EINA_LIST_FREE(*sel_id_list, p_id) {\r
337                 if (p_id == NULL) {\r
338                         ge_dbgE("Invalid p_id!");\r
339                         continue;\r
340                 }\r
341                 free(p_id);\r
342                 p_id = NULL;\r
343         }\r
344         *sel_id_list = NULL;\r
345         return 0;\r
346 }\r
347 \r
348 /* Check ID is in the list or not */\r
349 static bool __ge_data_check_selected_id(Eina_List **sel_id_list, const char *id)\r
350 {\r
351         GE_CHECK_FALSE(sel_id_list);\r
352         GE_CHECK_FALSE(id);\r
353         Eina_List *tmp_elist = NULL;\r
354         void *p_id = NULL;\r
355 \r
356         if (eina_list_count(*sel_id_list) == 0) {\r
357                 ge_dbgE("sel_id_list is empty!");\r
358                 return false;\r
359         }\r
360 \r
361         EINA_LIST_FOREACH(*sel_id_list, tmp_elist, p_id) {\r
362                 if (p_id == NULL) {\r
363                         ge_dbgE("Invalid p_id!");\r
364                         continue;\r
365                 }\r
366                 if (g_strcmp0(id, p_id)) {\r
367                         p_id = NULL;\r
368                         continue;\r
369                 }\r
370 \r
371                 *sel_id_list = eina_list_remove(*sel_id_list, p_id);\r
372                 free(p_id);\r
373                 p_id = NULL;\r
374                 return true;\r
375         }\r
376         return false;\r
377 }\r
378 \r
379 int _ge_data_update_items_cnt(ge_ugdata* ugd, ge_cluster *album)\r
380 {\r
381         GE_CHECK_VAL(album, -1);\r
382         GE_CHECK_VAL(album->cluster, -1);\r
383         GE_CHECK_VAL(album->cluster->uuid, -1);\r
384         GE_CHECK_VAL(ugd, -1);\r
385         int err = -1;\r
386         int item_count = 0;\r
387 \r
388         ge_filter_s filter;\r
389         memset(&filter, 0x00, sizeof(ge_filter_s));\r
390         filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
391         g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
392         filter.collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;\r
393         filter.offset = GE_GET_ALL_RECORDS;\r
394         filter.count = GE_GET_ALL_RECORDS;\r
395         g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
396         filter.with_meta = false;\r
397 \r
398         if(ugd->file_type_mode == GE_File_Select_Type_Image)\r
399                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
400         else if(ugd->file_type_mode == GE_File_Select_Type_Video)\r
401                 g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
402         if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
403                 /* Local album */\r
404                 err = _ge_local_data_get_media_count(album->cluster->uuid,\r
405                                                      &filter,\r
406                                                      &item_count);\r
407         } else {\r
408                 /* "All albums" album */\r
409                 ge_dbg("all media count");\r
410                 err = _ge_local_data_get_all_media_count(&filter, &item_count);\r
411         }\r
412         if(err < 0) {\r
413                 ge_dbgE("Get item count failed(%d)!", err);\r
414                 return -1;\r
415         }\r
416 \r
417         ge_dbg("cluster media count : old=%d, new=%d", album->cluster->count,\r
418                item_count);\r
419         album->cluster->count = item_count;\r
420 \r
421         return 0;\r
422 }\r
423 \r
424 int _ge_data_get_clusters_list(ge_ugdata* ugd)\r
425 {\r
426         GE_CHECK_VAL(ugd, -1);\r
427         int n_entire_items = 0;\r
428 \r
429         __ge_data_free_clusters_list(ugd);\r
430 \r
431         ugd->cluster_list = __ge_data_calloc_clusters_list();\r
432         GE_CHECK_VAL(ugd->cluster_list, -1);\r
433 \r
434         n_entire_items = __ge_data_get_clusters_list(ugd);\r
435         ge_dbg("Total media items count:%d", n_entire_items);\r
436         /* if error code is returned, negative value is possible */\r
437         if(n_entire_items <= 0)\r
438                 return -1;\r
439 \r
440         return 0;\r
441 }\r
442 \r
443 /* Clear items list */\r
444 int _ge_data_free_items_list(void)\r
445 {\r
446         return __ge_data_free_items_list();\r
447 }\r
448 \r
449 int _ge_data_get_items_list(ge_ugdata* ugd, ge_cluster *album, int start_pos,\r
450                             int end_pos)\r
451 {\r
452         GE_CHECK_VAL(album, -1);\r
453         GE_CHECK_VAL(album->cluster, -1);\r
454         GE_CHECK_VAL(album->cluster->uuid, -1);\r
455         GE_CHECK_VAL(ugd, -1);\r
456         Eina_List* itemlist = NULL;\r
457         int err = -1;\r
458         ge_filter_s filter;\r
459 \r
460         memset(&filter, 0, sizeof(ge_filter_s));\r
461         ge_dbg("--start_pos[%d], end_pos[%d]--", start_pos, end_pos);\r
462         if(ugd->file_type_mode == GE_File_Select_Type_Image) {\r
463                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
464         } else if (ugd->file_type_mode == GE_File_Select_Type_Video) {\r
465                 g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
466         } else {\r
467                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO,\r
468                           CONDITION_LENGTH);\r
469         }\r
470 \r
471         filter.collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;\r
472         filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
473         g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
474         filter.offset = start_pos;\r
475         filter.count = end_pos - start_pos + 1;\r
476         filter.with_meta = true;\r
477 \r
478         if (start_pos == (GE_FIRST_VIEW_END_POS+1) &&\r
479             end_pos == GE_GET_UNTIL_LAST_RECORD) {\r
480                 /* Keep medias_elist and medias_cnt unchanged */\r
481                 ge_dbg("Gridview append idler; Keep ge_db_item_list unchanged.");\r
482         } else {\r
483                 /*Clear item list before new one got */\r
484                 __ge_data_free_items_list();\r
485         }\r
486 \r
487         if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
488                 /* real album */\r
489                 ge_dbg("--Real album--");\r
490                 err = _ge_local_data_get_album_media_list(album->cluster->uuid,\r
491                                                   &filter, &itemlist);\r
492         } else {\r
493                 /* add "All" album */\r
494                 ge_dbg("--Album All--");\r
495                 err = _ge_local_data_get_all_albums_media_list(&filter,\r
496                                                                &itemlist);\r
497         }\r
498 \r
499         if((err == 0) && (itemlist != NULL)) {\r
500                 ge_media_s *item = NULL;\r
501                 ge_item* gitem = NULL;\r
502                 EINA_LIST_FREE(itemlist, item)\r
503                 {\r
504                         if (item == NULL || item->uuid == NULL) {\r
505                                 ge_dbgE("Invalid item!");\r
506                                 continue;\r
507                         }\r
508 \r
509                         gitem = __ge_data_calloc_geitem();\r
510                         if(gitem == NULL) {\r
511                                 ge_dbgE("__ge_data_calloc_geitem() failed");\r
512                                 _ge_data_type_free_geitem((void **)&item);\r
513                                 continue;\r
514                         }\r
515 \r
516                         gitem->item = item;\r
517                         gitem->ugd = ugd;\r
518                         ge_db_item_list = eina_list_append(ge_db_item_list,\r
519                                                            gitem);\r
520                         item = NULL;\r
521                         gitem = NULL;\r
522                 }\r
523 \r
524                 ge_all_count = eina_list_count(ge_db_item_list);\r
525         } else {\r
526                 /* Free Mitems */\r
527                 if (itemlist)\r
528                         __ge_data_free_mtype_items_list(&itemlist);\r
529 \r
530                 if (start_pos == (GE_FIRST_VIEW_END_POS+1) &&\r
531                     end_pos == GE_GET_UNTIL_LAST_RECORD) {\r
532                         /* Keep medias_elist and medias_cnt unchanged */\r
533                         ge_all_count = eina_list_count(ge_db_item_list);\r
534                         ge_dbg("Gridview append idler.");\r
535                 } else {\r
536                         ge_all_count = 0;\r
537                 }\r
538         }\r
539         ge_dbg("DB all count : %d, ge_db_item_list=%p", ge_all_count,\r
540                ge_db_item_list);\r
541 \r
542         return err;\r
543 }\r
544 \r
545 /* Update items list, especially used in thumbnails edit view */\r
546 int _ge_data_update_items_list(ge_ugdata* ugd, ge_cluster *album)\r
547 {\r
548         GE_CHECK_VAL(album, -1);\r
549         GE_CHECK_VAL(album->cluster, -1);\r
550         GE_CHECK_VAL(album->cluster->uuid, -1);\r
551         GE_CHECK_VAL(ugd, -1);\r
552         Eina_List* itemlist = NULL;\r
553         int err = -1;\r
554         ge_dbg("Update content of %s", album->cluster->display_name);\r
555         int view_mode = _ge_get_view_mode();\r
556         Eina_List *sel_id_list = NULL;\r
557 \r
558         if (view_mode == GE_ThumbnailEdit_Mode &&\r
559             ugd->file_select_mode != GE_File_Select_One) {\r
560                 ge_dbg("Edit view for multiple selection.");\r
561                 /* Get ID list of selected items */\r
562                 __ge_data_get_selected_item_id_list(&sel_id_list);\r
563         }\r
564         ge_filter_s filter;\r
565         memset(&filter, 0x00, sizeof(ge_filter_s));\r
566 \r
567         if(ugd->file_type_mode == GE_File_Select_Type_Image) {\r
568                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
569         } else if (ugd->file_type_mode == GE_File_Select_Type_Video) {\r
570                 g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
571         } else {\r
572                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO,\r
573                           CONDITION_LENGTH);\r
574         }\r
575 \r
576         filter.collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;\r
577         filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
578         g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
579         filter.offset = GE_GET_ALL_RECORDS;\r
580         filter.count = GE_GET_ALL_RECORDS;\r
581         filter.with_meta = true;\r
582 \r
583         /*Clear item list before new one got */\r
584         __ge_data_free_items_list();\r
585 \r
586         if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
587                 err = _ge_local_data_get_album_media_list(album->cluster->uuid,\r
588                                                           &filter, &itemlist);\r
589         } else {\r
590                 err = _ge_local_data_get_all_albums_media_list(&filter,\r
591                                                                &itemlist);\r
592         }\r
593 \r
594         if ((err != 0) || (itemlist == NULL)) {\r
595                 ge_dbgE("(err != 0) || (itemlist == NULL)");\r
596                 /* Free Mitems */\r
597                 if (itemlist)\r
598                         __ge_data_free_mtype_items_list(&itemlist);\r
599                 ge_all_count = 0;\r
600                 return err;\r
601         }\r
602 \r
603         bool b_selected = false;\r
604         ge_media_s *item = NULL;\r
605         ge_item* gitem = NULL;\r
606         EINA_LIST_FREE(itemlist, item) {\r
607                 if (item == NULL || item->uuid == NULL) {\r
608                         ge_dbgE("Invalid item!");\r
609                         continue;\r
610                 }\r
611                 gitem = __ge_data_calloc_geitem();\r
612                 if(gitem == NULL) {\r
613                         ge_dbgE("__ge_data_calloc_geitem() failed");\r
614                         _ge_data_type_free_geitem((void **)&item);\r
615                         continue;\r
616                 }\r
617 \r
618                 gitem->item = item;\r
619                 gitem->ugd = ugd;\r
620                 ge_db_item_list = eina_list_append(ge_db_item_list, gitem);\r
621 \r
622                 if (sel_id_list) {\r
623                         b_selected = __ge_data_check_selected_id(&sel_id_list,\r
624                                                               item->uuid);\r
625                         if (b_selected) {\r
626                                 b_selected = false;\r
627                                 /* Set checkbox state */\r
628                                 gitem->checked = true;\r
629                                 /* Append gitem to selected list */\r
630                                 _ge_data_selected_list_append(gitem);\r
631                         }\r
632                 }\r
633 \r
634                 item = NULL;\r
635                 gitem = NULL;\r
636         }\r
637 \r
638         /* Clear list of selected ID */\r
639         if (sel_id_list)\r
640                 __ge_data_free_selected_id_list(&sel_id_list);\r
641 \r
642         ge_all_count = eina_list_count(ge_db_item_list);\r
643         ge_dbg("DB all count : %d, ge_db_item_list=%p", ge_all_count,\r
644                ge_db_item_list);\r
645 \r
646         return err;\r
647 }\r
648 \r
649 int _ge_data_get_first_several_items(ge_ugdata* ugd, ge_cluster *album,\r
650                                      ge_item* items[], int *item_count,\r
651                                      media_content_order_e sort_type)\r
652 {\r
653         GE_CHECK_VAL(item_count, -1);\r
654         GE_CHECK_VAL(items, -1);\r
655         GE_CHECK_VAL(album, -1);\r
656         GE_CHECK_VAL(album->cluster, -1);\r
657         GE_CHECK_VAL(album->cluster->uuid, -1);\r
658         GE_CHECK_VAL(ugd, -1);\r
659 \r
660         Eina_List *item_list = NULL;\r
661         int result_cnt = 0;\r
662         ge_media_s *item = NULL;\r
663         ge_item* gitem = NULL;\r
664         int err = -1;\r
665 \r
666         if (*item_count <= 0) {\r
667                 ge_dbgE("*item_count <= 0");\r
668                 return -1;\r
669         }\r
670 \r
671         ge_filter_s filter;\r
672         memset(&filter, 0x00, sizeof(ge_filter_s));\r
673 \r
674         if (ugd->file_type_mode == GE_File_Select_Type_Image) {\r
675                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
676         } else if (ugd->file_type_mode == GE_File_Select_Type_Video) {\r
677                 g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
678         } else {\r
679                 g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO,\r
680                           CONDITION_LENGTH);\r
681         }\r
682 \r
683         filter.collate_type = MEDIA_CONTENT_COLLATE_DEFAULT;\r
684         filter.sort_type = sort_type;\r
685         g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
686         filter.offset = 0;\r
687         filter.count = *item_count;\r
688         filter.with_meta = false;\r
689 \r
690         if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
691                 /*real album */\r
692                 err = _ge_local_data_get_album_media_list(album->cluster->uuid,\r
693                                                           &filter,\r
694                                                           &item_list);\r
695                 if (err != 0 || item_list == NULL) {\r
696                         ge_dbgE("Get albums media list failed[%d]!", err);\r
697                         goto DB_FAILED;\r
698                 }\r
699         } else {\r
700                 //add "All" album\r
701                 err = _ge_local_data_get_all_albums_media_list(&filter,\r
702                                                                &item_list);\r
703                 if (err != 0 || item_list == NULL) {\r
704                         ge_dbgE("Get all albums media list failed[%d]!", err);\r
705                         goto DB_FAILED;\r
706                 }\r
707         }\r
708 \r
709         EINA_LIST_FREE(item_list, item) {\r
710                 if (item == NULL) {\r
711                         ge_dbgE("Invalid ge_meida_s!");\r
712                         continue;\r
713                 }\r
714                 result_cnt++;\r
715                 if(result_cnt <= *item_count) {\r
716                         gitem = NULL;\r
717                         gitem = __ge_data_calloc_geitem();\r
718                         if (gitem == NULL) {\r
719                                 ge_dbgE("__ge_data_calloc_geitem failed!");\r
720                                 _ge_data_type_free_geitem((void **)&item);\r
721                                 result_cnt--;\r
722                                 continue;\r
723                         }\r
724                         gitem->item = item;\r
725                         items[result_cnt-1] = gitem;\r
726                 } else {\r
727                         _ge_data_type_free_geitem((void **)&item);\r
728                 }\r
729                 item = NULL;\r
730         }\r
731 \r
732         if(*item_count > result_cnt)\r
733                 *item_count = result_cnt;\r
734 \r
735         ge_dbg("First %d items of [%s]", *item_count,\r
736                album->cluster->display_name);\r
737         return *item_count;\r
738 \r
739  DB_FAILED:\r
740         *item_count = 0;\r
741         /* Free Mitems */\r
742         if (item_list)\r
743                 __ge_data_free_mtype_items_list(&item_list);\r
744         return -1;\r
745 }\r
746 \r
747 int _ge_data_del_media_id(ge_ugdata* ugd, const char *media_id)\r
748 {\r
749         GE_CHECK_VAL(media_id, -1);\r
750         int ret = media_info_delete_from_db(media_id);\r
751         if(ret != 0) {\r
752                 ge_dbgE("Delete media failed[%d]!", ret);\r
753                 return -1;\r
754         }\r
755 \r
756         return 0;\r
757 }\r
758 \r
759 int _ge_data_item_list_remove(ge_item* gitem)\r
760 {\r
761         GE_CHECK_VAL(gitem, -1);\r
762         GE_CHECK_VAL(gitem->item, -1);\r
763         GE_CHECK_VAL(gitem->item->uuid, -1);\r
764         ge_item* current = NULL;\r
765         Eina_List* l = NULL;\r
766 \r
767         EINA_LIST_FOREACH(ge_db_item_list, l, current) {\r
768 \r
769                 if (current == NULL || current->item == NULL ||\r
770                     current->item->uuid == NULL) {\r
771                         ge_dbgE("Invalid gitem!");\r
772                         continue;\r
773                 }\r
774                 if (!g_strcmp0(current->item->uuid, gitem->item->uuid)) {\r
775                         ge_db_item_list = eina_list_remove(ge_db_item_list,\r
776                                                            current);\r
777                         ge_all_count--;\r
778                         __ge_data_free_geitem(current);\r
779                         current = NULL;\r
780                         break;\r
781                 }\r
782         }\r
783         return 0;\r
784 }\r
785 \r
786 int _ge_data_destroy_item(ge_item * gitem)\r
787 {\r
788         GE_CHECK_VAL(gitem, -1);\r
789 \r
790         __ge_data_free_geitem(gitem);\r
791         return 0;\r
792 }\r
793 \r
794 int _ge_data_get_item_by_index(ge_item** gitem, int idx)\r
795 {\r
796         GE_CHECK_VAL(gitem, -1);\r
797 \r
798         if (idx > ge_all_count) {\r
799             ge_dbgW("Get item(%d)failed!", idx);\r
800                 *gitem = NULL;\r
801                 return -1;\r
802         }\r
803 \r
804         *gitem = eina_list_nth(ge_db_item_list, idx -1);\r
805         return 0;\r
806 }\r
807 \r
808 int _ge_data_get_count_all(void)\r
809 {\r
810         return ge_all_count;\r
811 }\r
812 \r
813 int _ge_data_get_selected_item_by_index(ge_item** gitem, int idx)\r
814 {\r
815         GE_CHECK_VAL(gitem, -1);\r
816 \r
817         if (idx > _ge_data_selected_list_count()) {\r
818                 ge_dbgW("Get selected item(%d)failed!", idx);\r
819                 *gitem = NULL;\r
820                 return -1;\r
821         }\r
822 \r
823         *gitem = eina_list_nth(ge_item_selected_list, idx -1);\r
824         return 0;\r
825 }\r
826 \r
827 int _ge_data_selected_list_count(void)\r
828 {\r
829         return eina_list_count(ge_item_selected_list);\r
830 }\r
831 \r
832 Eina_List* _ge_data_get_selected_list(void)\r
833 {\r
834         return ge_item_selected_list;\r
835 }\r
836 \r
837 int _ge_data_selected_list_append(ge_item* gitem)\r
838 {\r
839         GE_CHECK_VAL(gitem, -1);\r
840 \r
841         ge_item_selected_list = eina_list_append(ge_item_selected_list, gitem);\r
842         return 0;\r
843 }\r
844 \r
845 int _ge_data_selected_list_remove(ge_item* gitem)\r
846 {\r
847         GE_CHECK_VAL(gitem, -1);\r
848         GE_CHECK_VAL(gitem->item, -1);\r
849         GE_CHECK_VAL(gitem->item->uuid, -1);\r
850         ge_item* current = NULL;\r
851         Eina_List* l = NULL;\r
852 \r
853         EINA_LIST_FOREACH(ge_item_selected_list, l, current) {\r
854                 if(current == NULL || current->item == NULL ||\r
855                    current->item->uuid == NULL) {\r
856                         ge_dbgE("Invald gitem!");\r
857                         continue;\r
858                 }\r
859                 if(!g_strcmp0(current->item->uuid, gitem->item->uuid)) {\r
860                         ge_item_selected_list = eina_list_remove(ge_item_selected_list,\r
861                                                                  current);\r
862                         break;\r
863                 }\r
864         }\r
865         return 0;\r
866 }\r
867 \r
868 int _ge_data_selected_list_finalize(void)\r
869 {\r
870         ge_item* gitem = NULL;\r
871 \r
872         EINA_LIST_FREE(ge_item_selected_list, gitem) {\r
873                 if(gitem)\r
874                         gitem->checked = false;\r
875         }\r
876 \r
877         ge_item_selected_list = NULL;\r
878         return 0;\r
879 }\r
880 \r
881 /*\r
882 *   Check it's default album[Camera shot] or not\r
883 */\r
884 bool _ge_data_is_default_album(const char *match_folder, ge_album_s *album)\r
885 {\r
886         GE_CHECK_FALSE(album);\r
887         GE_CHECK_FALSE(album->display_name);\r
888         GE_CHECK_FALSE(match_folder);\r
889         int ret = -1;\r
890 \r
891         /* Name is 'Camera shot' and folder locates in Phone */\r
892         ret = g_strcmp0(album->display_name, match_folder);\r
893         if (ret == 0 && album->type == GE_PHONE) {\r
894                 ge_dbg("Full path: %s", album->path);\r
895                 /* Get parent directory */\r
896                 char *parent_path = ecore_file_dir_get(album->path);\r
897                 GE_CHECK_FALSE(parent_path);\r
898                 ge_dbg("Parent path: %s", parent_path);\r
899 \r
900                 /* Parent directory is same as Phone root path, it's default folder */\r
901                 ret = g_strcmp0(parent_path, GE_ROOT_PATH_PHONE);\r
902                 GE_IF_FREE_MEM(parent_path)\r
903 \r
904                 if (ret == 0) {\r
905                         ge_dbgW("Default folder!");\r
906                         return true;\r
907                 }\r
908         }\r
909 \r
910         return false;\r
911 }\r
912 \r
913 bool _ge_data_is_root_path(const char *path)\r
914 {\r
915         GE_CHECK_FALSE(path);\r
916 \r
917         if(!g_strcmp0(GE_ROOT_PATH_PHONE, path) ||\r
918            !g_strcmp0(GE_ROOT_PATH_MMC, path)) {\r
919                 ge_dbg("Root path: %s", path);\r
920                 return true;\r
921         }\r
922 \r
923         return false;\r
924 }\r
925 \r
926 int _ge_data_init(ge_ugdata* ugd)\r
927 {\r
928         ge_dbg("Connect to DB!");\r
929         GE_CHECK_VAL(ugd, -1);\r
930         int err = _ge_local_data_connect();\r
931         if (err != 0) {\r
932                 ge_dbgE("Local connection failed[%d]!", err);\r
933                 return -1;\r
934         }\r
935 \r
936         return 0;\r
937 }\r
938 \r
939 int _ge_data_finalize(ge_ugdata* ugd)\r
940 {\r
941         ge_dbg("Free memory and disconnect with DB!");\r
942         GE_CHECK_VAL(ugd, -1);\r
943         __ge_data_free_clusters_list(ugd);\r
944         __ge_data_free_items_list();\r
945 \r
946         int err = _ge_local_data_disconnect();\r
947         if (err != 0) {\r
948                 ge_dbgE("Local disconnection failed[%d]!", err);\r
949                 return -1;\r
950         }\r
951 \r
952         return 0;\r
953 }\r
954 \r