2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <json-glib/json-glib.h>
25 #include <app-content.h>
26 #include <gum/gum-user.h>
27 #include <gum/gum-user-service.h>
28 #include <gum/common/gum-user-types.h>
29 #include <Elementary.h>
30 #include <cynara-client.h>
36 #include "ClientBus.h"
40 #define SECTION_USER "user"
41 #define SECTION_UBAR_ITEMS "ubar.items"
42 #define SECTION_ITEMS "items"
44 #define ATTR_NAME "name"
45 #define ATTR_ICON "icon"
46 #define ATTR_ICON_FOCUS "icon_focus"
47 #define ATTR_BUS_NAME "bus_name"
48 #define ATTR_OBJECT_PATH "object_path"
49 #define ATTR_APP "app"
50 #define ATTR_COLOR "color"
51 #define ATTR_RED "red"
52 #define ATTR_GREEN "green"
53 #define ATTR_BLUE "blue"
54 #define ATTR_CONTENTS "contents"
55 #define ATTR_NOCTNT_TITLE "noctnt_title"
56 #define ATTR_NOCTNT_DESC "noctnt_desc"
57 #define ATTR_CONTENT_COLUMN "content_column"
62 #define MULTIPLIER 1024
72 Eina_List *client_buslist;
79 CAppContentHistory *pAppContentHistory;
80 CAppContentFavorite *pAppContentFavorite;
81 CAppContentPin *pAppContentPin;
83 void (*update_cb)(void *data, bool focus);
87 memset(this, 0, sizeof(SEngine));
91 static int _is_member_exist(JsonReader *reader, const char *member_name)
97 cnt = json_reader_count_members(reader);
102 members = json_reader_list_members(reader);
109 for (i = 0; i < cnt; i++) {
110 if (!strcmp(member_name, members[i])) {
121 static inline const char *_read_attr(JsonReader *reader, const char *attr)
125 if (!reader || !attr)
128 if (!_is_member_exist(reader, attr)) {
129 _ERR("There is no %s attribute", attr);
133 json_reader_read_member(reader, attr);
134 val = json_reader_get_string_value(reader);
135 json_reader_end_member(reader);
140 static inline gint64 _read_attr_int(JsonReader *reader, const char *attr)
144 if (!reader || !attr)
147 if (!_is_member_exist(reader, attr)) {
148 _ERR("There is no %s attribute", attr);
152 json_reader_read_member(reader, attr);
153 val = json_reader_get_int_value(reader);
154 json_reader_end_member(reader);
159 static JsonReader *_get_reader(JsonParser *parser)
163 return json_reader_new(json_parser_get_root(parser));
167 void CEngine::_unload_config_user(void)
170 free(m->user.thumb_bg);
174 bool _read_color(JsonReader *reader, gint64 *r, gint64 *g, gint64 *b)
179 if (!_is_member_exist(reader, ATTR_COLOR)) {
180 _ERR("There is no "ATTR_COLOR" attribute");
188 json_reader_read_member(reader, ATTR_COLOR);
189 *r = _read_attr_int(reader, ATTR_RED);
190 *g = _read_attr_int(reader, ATTR_GREEN);
191 *b = _read_attr_int(reader, ATTR_BLUE);
192 json_reader_end_member(reader);
197 static void _string_to_uppercase(char *str)
200 *(str++) = toupper(*str);
203 static char *_get_unique_id(const char *object_path, char *uuid)
205 struct timezone timezone;
206 struct timeval timeval;
211 unsigned char ct[SIZE_4];
217 gettimeofday(&timeval, &timezone);
219 u1.t = (unsigned int)timeval.tv_usec;
221 len = strlen(object_path);
223 for (i = 0; i < len; i++)
224 u2.t = u2.t + MULTIPLIER * (unsigned int)object_path[i];
226 snprintf(uuid, SIZE_32, "%02x%02x.%02x%02x.%02x%02x.%02x%02x",
227 (unsigned char)u2.ct[3], (unsigned char)u2.ct[2],
228 (unsigned char)u2.ct[1], (unsigned char)u2.ct[0],
229 (unsigned char)u1.ct[3], (unsigned char)u1.ct[2],
230 (unsigned char)u1.ct[1], (unsigned char)u1.ct[0]);
232 _string_to_uppercase(uuid);
237 CEngineBarItem *CEngineBarItem::Alloc(JsonReader *reader, int idx)
240 const char *name, *icon, *icon_focus, *app, *in;
241 const char *object_path, *bus_name;
242 const char *noctnt_title, *noctnt_desc;
247 _CHECK(json_reader_read_element(reader, idx));
248 _CHECK(it = new CEngineBarItem);
249 _CHECK(name = _read_attr(reader, ATTR_NAME));
250 _CHECK(icon = _read_attr(reader, ATTR_ICON));
251 _CHECK(icon_focus = _read_attr(reader, ATTR_ICON_FOCUS));
252 _CHECK(bus_name = _read_attr(reader, ATTR_BUS_NAME));
253 _CHECK(object_path = _read_attr(reader, ATTR_OBJECT_PATH));
254 _CHECK(in = _read_attr(reader, ATTR_IN));
262 _CHECK_FAIL{ delete it; }
263 _CHECK_FAIL{ json_reader_end_element(reader); }
264 } _CREATE_END_AND_CATCH{ return NULL; }
266 app = _read_attr(reader, ATTR_APP);
267 noctnt_title = _read_attr(reader, ATTR_NOCTNT_TITLE);
268 noctnt_desc = _read_attr(reader, ATTR_NOCTNT_DESC);
269 column = _read_attr_int(reader, ATTR_CONTENT_COLUMN);
273 _read_color(reader, &r, &g, &b);
274 json_reader_end_element(reader);
277 it->SetStr(VSTR_NAME, name); // it->SetName(name);
278 it->SetStr(VSTR_ICON, icon); // it->SetIcon(icon);
279 it->SetStr(VSTR_ICON_FOCUS, icon_focus);// it->SetIconFocus(icon_focus);
280 it->SetStr(VSTR_OBJECT_PATH, object_path);// it->SetObjectPath(object_path);
281 it->SetStr(VSTR_BUS_NAME, bus_name);// it->SetBusName(bus_name);
282 it->SetStr(VSTR_SVC_ID, _get_unique_id(object_path, uuid));// it->SetSvcId(id);
283 it->SetStr(VSTR_IN, in);// it->SetIn(in);
284 it->SetStr(VSTR_APP, app);// it->SetApp(app);
285 it->SetStr(VSTR_NOCTNT_TITLE, noctnt_title);// it->SetNoctntTitle(noctnt_title);
286 it->SetStr(VSTR_NOCTNT_DESC, noctnt_desc);// it->SetNoctntDesc(noctnt_desc);
287 it->SetColor(r, g, b);
288 it->SetInt(VINT_COLUMN, column);
293 bool CEngine::_load_bar_items(JsonReader *reader)
301 if (!_is_member_exist(reader, SECTION_ITEMS)) {
302 _ERR("There is no "SECTION_ITEMS" field");
305 json_reader_read_member(reader, SECTION_ITEMS);
306 if (!json_reader_is_array(reader)) {
307 _ERR(SECTION_ITEMS" is not array");
311 cnt = json_reader_count_elements(reader);
312 for (i = 0; i < cnt; i++) {
313 it = CEngineBarItem::Alloc(reader, i);
318 m->hbar_its = eina_list_append(m->hbar_its, it);
320 /* send unique id to each content provider */
321 cbus = new CClientBus;
323 _ERR(" Unable to allocate memory for client bus");
327 it->Str(CEngineBarItem::VSTR_BUS_NAME),
328 it->Str(CEngineBarItem::VSTR_OBJECT_PATH),
329 it->Str(CEngineBarItem::VSTR_SVC_ID)
331 if (!cbus->FlagCreate()) {
332 _ERR(" Unable to init client bus ");
337 m->client_buslist = eina_list_append(m->client_buslist,
340 json_reader_end_member(reader);
345 json_reader_end_member(reader);
350 void CEngine::_unload_bar_items(void)
356 _ERR("Invalid argument");
360 EINA_LIST_FREE(m->hbar_its, obj) {
361 it = (CEngineBarItem *)obj;
367 void CEngine::_unload_ubar_items(void)
373 _ERR("Invalid argument");
377 EINA_LIST_FREE(m->ubar_its, obj) {
378 it = (CEngineUBarItem *)obj;
384 static JsonParser *_get_parser(const char *config)
391 parser = json_parser_new();
393 _ERR("json parser new failed");
397 r = json_parser_load_from_file(parser, config, NULL);
399 _ERR("parser load from file failed");
400 g_object_unref(parser);
407 bool CEngine::m_LoadItemConfig(void)
413 _CHECK(parser = _get_parser(DEF_CONFIG));
414 _CHECK(reader = _get_reader(parser));
415 _CHECK(_load_bar_items(reader));
417 _CHECK_FAIL{ /* _load_bar_items(reader) */ }
418 _CHECK_FAIL{ g_object_unref(reader); }
419 _CHECK_FAIL{ g_object_unref(parser); }
420 } _CREATE_END_AND_CATCH{ return false; }
422 g_object_unref(reader);
423 g_object_unref(parser);
428 CEngineUBarItem *CEngineUBarItem::Alloc(CEngine *eng, const char *name, const char *icon)
434 it = new CEngineUBarItem(eng);
436 _ERR("calloc failed");
440 if (!icon || strlen(icon) == 0)
441 icon = DEF_USER_THUMB;
443 it->SetStr(VSTR_NAME, name);
444 it->SetStr(VSTR_THUMB, icon);
449 static gchar **_append_string(gchar **src_strv, const gchar *string)
456 len = g_strv_length(src_strv);
462 dest_strv = (gchar **)g_malloc0 (sizeof (gchar *) * (len + 2));
464 while (src_strv[ind]) {
465 dest_strv[ind] = g_strdup (src_strv[ind]);
470 dest_strv[ind++] = g_strdup (string);
471 dest_strv[ind] = NULL;
476 int CEngine::_load_login_user(uid_t uid)
479 const char *icon, *name;
480 struct passwd *passwd;
482 user = gum_user_get_sync(uid, FALSE);
484 _ERR("failed to get login user");
485 passwd = getpwuid(uid);
486 m->user.name = strdup(passwd->pw_name ? passwd->pw_name : DEF_USER_NAME);
487 m->user.thumb = strdup(DEF_USER_THUMB);
493 g_object_get(G_OBJECT(user), GUM_ATTR_NAME, &name,
494 GUM_ATTR_ICON, &icon, NULL);
496 if (!icon || strlen(icon) == 0)
497 icon = DEF_USER_THUMB;
499 m->user.name = strdup(name);
500 m->user.thumb = strdup(icon);
502 g_object_unref(user);
507 bool CEngine::m_LoadUser(void)
511 GumUserService *service;
516 const char *icon, *name;
520 r = _load_login_user(user_uid);
522 _ERR("failed to load login user");
526 if (GetPrivilege()) {
527 it = CEngineUBarItem::Alloc(this, DEF_ADD_NAME, DEF_ADD_THUMB);
529 m->ubar_its = eina_list_append(m->ubar_its, it);
533 service = gum_user_service_create_sync(FALSE);
535 _ERR("failed to create service");
539 strv = _append_string(NULL, "normal");
540 list = gum_user_service_get_user_list_sync(service,
541 (const gchar *const *)strv);
545 g_object_unref(service);
546 _ERR("failed to get user list");
550 for (i = 0; i < (int)g_list_length(list); i++) {
551 user = (GumUser *)g_list_nth_data(list, i);
555 g_object_get(G_OBJECT(user), GUM_ATTR_UID, &uid,
556 GUM_ATTR_NAME, &name,
557 GUM_ATTR_ICON, &icon, NULL);
561 it = CEngineUBarItem::Alloc(this, name, icon);
563 m->ubar_its = eina_list_append(m->ubar_its, it);
566 gum_user_service_list_free(list);
567 g_object_unref(service);
572 void CEngine::m_UnloadConfig(void)
574 _unload_config_user();
576 _unload_ubar_items();
579 void CEngine::sm_CbBusReady(CBaseBus *bus, void *data)
581 bus->SendSignal(BUS_SIGNAL_REFRESH);
584 void CEngine::sm_CbBusEnd(CBaseBus *bus, void *data)
588 static int _add_dbar_item(CEngineBarItem *hit,
589 CEngineDBarItem::EStyle style,
590 const char *name, CBus::SContent bus_ctnt[],
591 int ctnt_cnt, CBus::EActionOp action,
592 const char *actor, const char *args)
594 CEngineDBarItem *dit;
595 CEngineDBarItemContent *ctnt;
599 _ERR("Invalid argument");
603 dit = new CEngineDBarItem(hit);
605 _ERR("calloc failed");
609 dit->SetStr(CEngineDBarItem::VSTR_NAME, name ? name : "No Information");
611 if (ctnt_cnt > BUS_DATA_ALBUM_CONTENT_MAX)
612 ctnt_cnt = BUS_DATA_ALBUM_CONTENT_MAX;
615 for (i = 0; i < ctnt_cnt; i++) {
616 ctnt = CEngineDBarItemContent::Alloc(&bus_ctnt[i]);
619 dit->AddContent(ctnt);
623 hit->SetCtntId(hit->CtntId() + 1);
624 dit->SetInt(CEngineDBarItem::VINT_CONTENT_ID, hit->CtntId()); //dit->SetCtntId(hit->CtntId());//dit->ctnt_id = hit->ctnt_id++;
625 dit->SetInt(CEngineDBarItem::VINT_STYLE, style); // SetStyle(style);// dit->style = style;
626 dit->SetInt(CEngineDBarItem::VINT_ACTION, action); // dit->SetAction(action);// dit->action = action;
627 dit->SetStr(CEngineDBarItem::VSTR_ACTOR, actor); // dit->SetActor(actor);// if (actor)dit->actor = strdup(actor);
628 dit->SetStr(CEngineDBarItem::VSTR_ARGS, args); // dit->SetArgs(args);// if (args) dit->args = strdup(args);
630 hit->AddItem(dit);//hit->dbar_its = eina_list_append(hit->dbar_its, dit);
631 hit->InvokeUpdateCallback();
633 return dit->Int(CEngineDBarItem::VINT_CONTENT_ID);// dit->CtntId();
636 static int _del_dbar_item(CEngineBarItem *hit, int ctnt_id)
641 return hit->RemoveDBar(ctnt_id) ? 0 : -1;
644 static int _del_dbar_item_all(CEngineBarItem *hit)
649 hit->RemoveAllDBar();
650 hit->InvokeUpdateCallback();
655 bool CEngine::sm_CbAddLabel(CBus::SLabel *lbl, void *data)
657 CEngine *root = (CEngine*)data;
660 ret = root->m_OnAddLabel(lbl);
664 bool CEngine::m_OnAddLabel(CBus::SLabel *lbl)
671 _ERR("Invalid argument");
675 EINA_LIST_FOREACH(m->hbar_its, l, obj) {
676 hit = (CEngineBarItem *)obj;
677 if (strcmp(hit->Str(CEngineBarItem::VSTR_SVC_ID), lbl->svcid))
680 return _add_dbar_item(hit, CEngineDBarItem::STYLE_LABEL,
682 CBus::ACTION_OP_LAUNCH_NONE,
689 bool CEngine::sm_CbAddAlbum(CBus::SAlbum *album, CBus::SAction *act, void *data)
691 CEngine *root = (CEngine*)data;
695 ret = root->m_OnAddAlbum(album, act);
700 bool CEngine::m_OnAddAlbum(CBus::SAlbum *album, CBus::SAction *act)
706 if (!album || !act) {
707 _ERR("Invalid argument");
711 EINA_LIST_FOREACH(m->hbar_its, l, obj) {
712 hit = (CEngineBarItem *)obj;
713 if (strcmp(hit->Str(CEngineBarItem::VSTR_SVC_ID), album->svcid))
716 return _add_dbar_item(hit, CEngineDBarItem::STYLE_ALBUM,
717 album->title, album->contents,
727 bool CEngine::sm_CbAddContent(CBus::SContent *content, CBus::SAction *act, void *data)
729 CEngine *root = (CEngine*)data;
733 ret = root->m_OnAddContent(content, act);
738 bool CEngine::m_OnAddContent(CBus::SContent *content, CBus::SAction *act)
744 if (!content || !act) {
745 _ERR("Invalid argument");
749 EINA_LIST_FOREACH(m->hbar_its, l, obj) {
750 hit = (CEngineBarItem *)obj;
751 if (strcmp(hit->Str(CEngineBarItem::VSTR_SVC_ID), content->svcid))
754 return _add_dbar_item(hit, CEngineDBarItem::STYLE_CONTENT,
755 content->title, content, 1,
764 bool CEngine::sm_CbAddContents(Eina_List *list, void *data)
766 CEngine *root = (CEngine*)data;
770 return root->m_OnAddContents(list);
775 bool CEngine::m_OnAddContents(Eina_List *list)
777 CBus::SContent *content;
783 _ERR("Invalid argument");
787 EINA_LIST_FOREACH(list, l, obj) {
788 content = (CBus::SContent *)obj;
792 EINA_LIST_FOREACH(m->hbar_its, ll, obj) {
793 hit = (CEngineBarItem *)obj;
794 if (!strcmp(hit->Str(CEngineBarItem::VSTR_SVC_ID), content->svcid)) {
795 _add_dbar_item(hit, CEngineDBarItem::STYLE_CONTENT,
796 content->title, content, 1,
797 content->action, content->actor, content->args);
805 static void _get_item_bg_and_icon(enum CBus::EPinType type, const char *icon,
809 case CBus::PIN_TYPE_PACKAGE:
810 it->SetColor(ITEM_PACKAGE_BG_R, ITEM_PACKAGE_BG_G, ITEM_PACKAGE_BG_B);
812 it->SetStr(CEngineBarItem::VSTR_ICON, icon);
813 it->SetStr(CEngineBarItem::VSTR_ICON_FOCUS, icon);
815 it->SetStr(CEngineBarItem::VSTR_ICON, DEF_PIN_ITEM_DEFAULT_ICON);
816 it->SetStr(CEngineBarItem::VSTR_ICON_FOCUS, DEF_PIN_ITEM_DEFAULT_ICON_FOCUS);
818 it->SetType(CAppContentFavorite::TYPE_APPS);
821 it->SetColor(ITEM_DEFAULT_BG_R, ITEM_DEFAULT_BG_G, ITEM_DEFAULT_BG_B);
822 it->SetStr(CEngineBarItem::VSTR_ICON, DEF_PIN_ITEM_DEFAULT_ICON);
823 it->SetStr(CEngineBarItem::VSTR_ICON_FOCUS, DEF_PIN_ITEM_DEFAULT_ICON_FOCUS);
828 CEngineBarItem *CEngineBarItem::Alloc(const char *title, CBus::EPinType type,
829 const char *icon, const char *svcid,
830 CBus::EActionOp action, const char *actor,
831 const char *args, const char *pinid)
835 if (!title || !svcid || type > CBus::PIN_TYPE_MAX || !pinid)
838 it = new CEngineBarItem;
840 _ERR("calloc failed");
844 it->SetInt(CEngineBarItem::VINT_IS_PINNED, EINA_TRUE);
845 it->SetCtntId(it->CtntId() + 1);
847 it->SetStr(CEngineBarItem::VSTR_NAME, title);
848 it->SetStr(CEngineBarItem::VSTR_SVC_ID, svcid);
849 it->SetStr(CEngineBarItem::VSTR_IN, "custombar");
850 it->SetStr(CEngineBarItem::VSTR_PIN_ID, pinid);
852 _get_item_bg_and_icon(type, icon, it);
854 if (action == CBus::ACTION_OP_LAUNCH_APP)
855 it->SetStr(CEngineBarItem::VSTR_APP, actor);// SetApp(actor);
857 it->SetStr(CEngineBarItem::VSTR_ARGS, args);// SetArgs(args);
862 void CEngine::_update_pin_list(void)
872 m->pAppContentPin->SetQuery(CAppContent::TYPE_ALL);
873 m->pAppContentPin->BeginQuery();
875 while (m->pAppContentPin->MoveNext()) {
876 size = m->pAppContentPin->ContentIdSize();
877 szContentId = new char[size];
878 m->pAppContentPin->GetContentId(szContentId, size);
880 EINA_LIST_FOREACH(m->pin_its, l, obj) {
881 hit = (CEngineBarItem *)obj;
882 if (!strcmp(hit->Str(CEngineBarItem::VSTR_PIN_ID), szContentId))
883 m->hbar_its = eina_list_append(m->hbar_its, hit);
888 m->pAppContentPin->EndQuery();
890 m->is_full = EINA_TRUE;
893 int CEngine::_del_pin_item(Eina_Bool free)
902 EINA_LIST_FOREACH(m->hbar_its, l, obj) {
903 hit = (CEngineBarItem *)obj;
904 if (!hit->Int(CEngineBarItem::VINT_IS_PINNED))
907 m->hbar_its = eina_list_remove_list(m->hbar_its, l);
915 bool CEngine::sm_CbAddPin(CBus::SPin *pin, CBus::SAction *act, void *data)
917 CEngine *root = (CEngine*)data;
921 ret = root->m_OnAddPin(pin, act);
926 bool CEngine::m_OnAddPin(CBus::SPin *pin, CBus::SAction *act)
935 _ERR("Invalid argument");
939 r = _del_pin_item(EINA_TRUE);
941 _ERR("failed to delete pin item in hbar list");
946 EINA_LIST_FOREACH(m->pin_its, l, obj) {
947 hit = (CEngineBarItem *)obj;
948 m->pin_its = eina_list_remove_list(m->pin_its, l);
950 m->is_full = EINA_FALSE;
953 hit = CEngineBarItem::Alloc(pin->title, pin->type, pin->icon, pin->svcid,
954 act->action, act->actor, act->args, pin->pinid);
958 m->pin_its = eina_list_append(m->pin_its, hit);
959 cnt = eina_list_count(m->pin_its);
961 if (_get_pin_count() != cnt)
962 return hit->CtntId();
966 InvokeUpdateCallback();
968 return hit->CtntId();
971 bool CEngine::sm_CbDelContent(const char *svcid, int ctnt_id, void *data)
973 CEngine *root = (CEngine*)data;
977 ret = root->m_OnDelContent(svcid, ctnt_id);
982 bool CEngine::m_OnDelContent(const char *svcid, int ctnt_id)
988 if (!svcid || ctnt_id < 0) {
989 _ERR("Invalid argument");
993 EINA_LIST_FOREACH(m->hbar_its, l, obj) {
994 hit = (CEngineBarItem *)obj;
995 if (strcmp(hit->Str(CEngineBarItem::VSTR_SVC_ID), svcid))
997 return _del_dbar_item(hit, ctnt_id);
1003 bool CEngine::sm_CbDelAll(const char *svcid, bool reload, void *data)
1005 CEngine *root = (CEngine*)data;
1009 ret = root->m_OnDelAll(svcid, reload);
1014 bool CEngine::m_OnDelAll(const char *svcid, bool reload)
1016 CEngineBarItem *hit;
1021 _ERR("Invalid argument");
1026 _del_pin_item(EINA_TRUE);
1028 InvokeUpdateCallback();
1032 EINA_LIST_FOREACH(m->hbar_its, l, obj) {
1033 hit = (CEngineBarItem *)obj;
1034 if (strcmp(hit->Str(CEngineBarItem::VSTR_SVC_ID), svcid))
1036 return _del_dbar_item_all(hit);
1042 bool CEngine::Create(void)
1047 cb.cbReady = sm_CbBusReady;
1048 cb.cbEnd = sm_CbBusEnd;
1050 cb.cbAddLabel = sm_CbAddLabel;
1051 cb.cbAddAlbum = sm_CbAddAlbum;
1052 cb.cbAddContent = sm_CbAddContent;
1053 cb.cbAddContents = sm_CbAddContents;
1054 cb.cbAddPin = sm_CbAddPin;
1056 cb.cbDelContent = sm_CbDelContent;
1057 cb.cbDelAll = sm_CbDelAll;
1061 _CHECK(m = new SEngine);
1062 _CHECK(m_LoadUser());
1063 _CHECK(m_LoadItemConfig());
1064 _CHECK(m->bus = new CBus);
1065 _CHECK(m->bus->Create(&cb));
1066 _CHECK(m->pAppContentFavorite = new CAppContentFavorite);
1067 _CHECK(m->pAppContentFavorite->Create(NULL));
1068 _CHECK(m->pAppContentHistory = new CAppContentHistory);
1069 _CHECK(m->pAppContentHistory->Create(NULL));
1070 _CHECK(m->pAppContentPin = new CAppContentPin);
1071 _CHECK(m->pAppContentPin->Create(NULL));
1074 _CHECK_FAIL{ m->pAppContentPin->Destroy(); }
1075 _CHECK_FAIL{ delete m->pAppContentPin; }
1076 _CHECK_FAIL{ m->pAppContentHistory->Destroy(); }
1077 _CHECK_FAIL{ delete m->pAppContentHistory; }
1078 _CHECK_FAIL{ m->pAppContentFavorite->Destroy(); }
1079 _CHECK_FAIL{ delete m->pAppContentFavorite; }
1080 _CHECK_FAIL{ m->bus->Destroy(); }
1081 _CHECK_FAIL{ delete m->bus; }
1082 _CHECK_FAIL{ m_UnloadConfig(); }
1083 _CHECK_FAIL{ /* m_LOadUser */ }
1084 _CHECK_FAIL{ delete m; m = NULL; }
1085 } _CREATE_END_AND_CATCH{ return false; }
1090 void CEngine::Destroy(void)
1097 m->pAppContentPin->Destroy();
1098 delete m->pAppContentPin;
1100 m->pAppContentFavorite->Destroy();
1101 delete m->pAppContentFavorite;
1103 m->pAppContentHistory->Destroy();
1104 delete m->pAppContentHistory;
1109 EINA_LIST_FREE(m->client_buslist, obj) {
1110 cbus = (CClientBus *)obj;
1119 bool CEngine::GetUserInfo(const char **name, const char **thumb_bg, const char **thumb)
1124 *name = m->user.name;
1126 *thumb_bg = m->user.thumb_bg;
1128 *thumb = m->user.thumb;
1133 const Eina_List *CEngine::BarItemsList(void)
1140 void CEngine::SetUpdateCallback(void (*update_cb)(void *data, bool focus), void *data)
1144 m->update_cb = update_cb;
1145 m->update_cb_data = data;
1148 void CEngine::InvokeUpdateCallback(void)
1153 m->update_cb(m->update_cb_data, true);
1156 bool CEngine::GetPrivilege(void)
1164 r = cynara_initialize(&p_cynara, NULL);
1165 if (r != CYNARA_API_SUCCESS || !p_cynara) {
1166 _ERR("failed to initialize cynara");
1170 r = cynara_check(p_cynara, "User", "", m->user.name,
1171 "user_label.write");
1172 if (r != CYNARA_API_ACCESS_ALLOWED) {
1173 _ERR("cyana denied, %d", r);
1177 cynara_finish(p_cynara);
1182 bool CEngine::Delete(CEngineUBarItem *it, const char *password)
1189 CEngineUBarItem *_it;
1192 if (!it || !password) {
1193 _ERR("Invalid argument");
1197 user = gum_user_get_by_name_sync(it->Str(CEngineUBarItem::VSTR_NAME), FALSE);
1199 _ERR("failed to get user");
1203 r = gum_user_delete_sync(user, FALSE);
1205 _ERR("failed to delete user");
1206 g_object_unref(user);
1210 EINA_LIST_FOREACH(m->ubar_its, l, obj) {
1211 _it = (CEngineUBarItem *)obj;
1212 if (strcmp(_it->Str(CEngineUBarItem::VSTR_NAME), it->Str(CEngineUBarItem::VSTR_NAME)))
1215 m->ubar_its = eina_list_remove_list(m->ubar_its, l);
1219 g_object_unref(user);
1224 const Eina_List *CEngine::UBarItemsList(void)
1232 bool CEngine::DelAllHistory(void)
1236 if (!m->pAppContentHistory->RemoveAll()) {
1237 _ERR("failed to remove all history");
1245 bool CEngine::DelHistory(CAppContent::EType type, const char *id)
1252 if (!m->pAppContentHistory->Remove(type, id)) {
1253 _ERR("failed to remove history");
1261 bool CEngine::AddHistory(CAppContent::EType type, const char *id)
1268 if (!m->pAppContentHistory->Add(type, id)) {
1269 _ERR("failed to add history");
1277 bool CEngine::DelPin(CEngineBarItem *it)
1282 CEngineBarItem *hit;
1288 if (!m->pAppContentPin->Remove(it->Type(), it->Str(CEngineBarItem::VSTR_PIN_ID))) {
1289 _ERR("failed to unset pin item");
1293 if (_get_pin_count() != 0)
1296 EINA_LIST_FOREACH(m->hbar_its, l, obj) {
1297 hit = (CEngineBarItem *)obj;
1298 if (!hit->Str(CEngineBarItem::VSTR_PIN_ID))
1301 if (!strcmp(hit->Str(CEngineBarItem::VSTR_PIN_ID), it->Str(CEngineBarItem::VSTR_PIN_ID))) {
1302 m->hbar_its = eina_list_remove_list(m->hbar_its, l);
1311 void CEngine::AddUBar(CEngineUBarItem *it)
1315 m->ubar_its = eina_list_append(m->ubar_its, it);
1318 bool CEngine::Swap(CEngineBarItem *it1, CEngineBarItem *it2)
1323 if (!it1->Str(CEngineBarItem::VSTR_PIN_ID) || !it2->Str(CEngineBarItem::VSTR_PIN_ID)) {
1324 _ERR("No pin item");
1328 if (!m->pAppContentPin->Swap(it1->Type(), (char *)it1->Str(CEngineBarItem::VSTR_PIN_ID),
1329 it2->Type(), (char *)it2->Str(CEngineBarItem::VSTR_PIN_ID))) {
1330 _ERR("failed to swap content");
1334 _del_pin_item(EINA_FALSE);
1341 int CEngine::_get_pin_count(void)
1347 m->pAppContentPin->SetQuery(CAppContent::TYPE_ALL);
1348 m->pAppContentPin->BeginQuery();
1350 while (m->pAppContentPin->MoveNext())
1353 m->pAppContentPin->EndQuery();