2 * Copyright (c) 2019 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.
18 #include <cynara-client.h>
19 #include <cynara-session.h>
20 #include <cynara-creds-gdbus.h>
23 #include "bm_common.h"
25 static cynara *p_cynara;
27 GDBusErrorEntry bm_svc_errors[] = {
28 {BATTERY_MONITOR_ERROR_NONE, BATTERY_MONITOR_SVC_ERROR_PREFIX".NoError"},
29 {BATTERY_MONITOR_ERROR_OUT_OF_MEMORY, BATTERY_MONITOR_SVC_ERROR_PREFIX".OutOfMemory"},
30 {BATTERY_MONITOR_ERROR_INVALID_PARAMETER, BATTERY_MONITOR_SVC_ERROR_PREFIX".InvalidParameter"},
31 {BATTERY_MONITOR_ERROR_DUPLICATED, BATTERY_MONITOR_SVC_ERROR_PREFIX".Duplicated"},
32 {BATTERY_MONITOR_ERROR_NO_DATA, BATTERY_MONITOR_SVC_ERROR_PREFIX".NoData"},
33 {BATTERY_MONITOR_ERROR_NOT_INITIALIZED, BATTERY_MONITOR_SVC_ERROR_PREFIX".NotInitialized"},
34 {BATTERY_MONITOR_ERROR_RECORD_NOT_FOUND, BATTERY_MONITOR_SVC_ERROR_PREFIX".RecordNotFound"},
35 {BATTERY_MONITOR_ERROR_DB_FAILED, BATTERY_MONITOR_SVC_ERROR_PREFIX".DBFailed"},
36 {BATTERY_MONITOR_ERROR_DB_NOT_OPENED, BATTERY_MONITOR_SVC_ERROR_PREFIX".DBNotOpened"},
37 {BATTERY_MONITOR_ERROR_QUERY_SYNTAX_ERROR, BATTERY_MONITOR_SVC_ERROR_PREFIX".QuerySynTaxError"},
38 {BATTERY_MONITOR_ERROR_ITERATOR_END, BATTERY_MONITOR_SVC_ERROR_PREFIX".IteratorEnd"},
39 {BATTERY_MONITOR_ERROR_NOTI_FAILED, BATTERY_MONITOR_SVC_ERROR_PREFIX".NotiFalied"},
40 {BATTERY_MONITOR_ERROR_PERMISSION_DENIED, BATTERY_MONITOR_SVC_ERROR_PREFIX".PermissionDenied"},
41 {BATTERY_MONITOR_ERROR_NULL_POINTER, BATTERY_MONITOR_SVC_ERROR_PREFIX".NullPointer"},
42 {BATTERY_MONITOR_ERROR_INTERNAL, BATTERY_MONITOR_SVC_ERROR_PREFIX".Internal"},
43 {BATTERY_MONITOR_ERROR_PLUGIN_ADD, BATTERY_MONITOR_SVC_ERROR_PREFIX".PluginAdd"},
44 {BATTERY_MONITOR_ERROR_PLUGIN_AVAILABLE, BATTERY_MONITOR_SVC_ERROR_PREFIX".PluginAvailable"},
45 {BATTERY_MONITOR_ERROR_NOT_SUPPORTED, BATTERY_MONITOR_SVC_ERROR_PREFIX".NotSupported"},
46 {BATTERY_MONITOR_ERROR_DATABASE_BUSY, BATTERY_MONITOR_SVC_ERROR_PREFIX".DatabaseBusy"},
49 static guint bm_get_client_pid(GDBusMethodInvocation* invoc)
51 const char *name = NULL;
52 name = g_dbus_method_invocation_get_sender(invoc);
54 _ERR("g_dbus_method_invocation_get_sender failed");
58 _INFO("sender=[%s]", name);
64 _INFO("calling GetConnectionUnixProcessID");
66 GDBusConnection* conn = g_dbus_method_invocation_get_connection(invoc);
67 _ret = g_dbus_connection_call_sync(conn,
68 FREE_DESKTOP_BUS_NAME,
69 FREE_DESKTOP_OBJECT_PATH,
70 FREE_DESKTOP_INTERFACE_NAME,
71 FREE_DESKTOP_METHOD_NAME,
72 g_variant_new("(s)", name),
74 G_DBUS_CALL_FLAGS_NONE,
80 g_variant_get(_ret, "(u)", &pid);
81 g_variant_unref(_ret);
84 _INFO("process Id = [%u]", pid);
88 GQuark bm_error_quark(void)
90 static volatile gsize quark_volatile = 0;
92 g_dbus_error_register_error_domain(BATTERY_MONITOR_SVC_ERROR_DOMAIN, &quark_volatile,
93 bm_svc_errors, G_N_ELEMENTS(bm_svc_errors));
95 return (GQuark)quark_volatile;
98 static int bm_check_privilege_by_cynara(const char *client, const char *session, const char *user,
99 const char *privilege)
102 char err_buf[128] = {0,};
104 ret = cynara_check(p_cynara, client, session, user, privilege);
106 case CYNARA_API_ACCESS_ALLOWED:
107 _DBG("cynara_check success");
108 return BATTERY_MONITOR_ERROR_NONE;
109 case CYNARA_API_ACCESS_DENIED:
110 _ERR("cynara_check permission deined, privilege=%s, error = CYNARA_API_ACCESS_DENIED",
112 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
114 cynara_strerror(ret, err_buf, sizeof(err_buf));
115 _ERR("cynara_check error : %s, privilege=%s, ret = %d", err_buf, privilege, ret);
116 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
120 static int bm_get_information_for_cynara_check(GDBusMethodInvocation *invocation, char **client,
121 char **user, char **session)
123 GDBusConnection *gdbus_conn = NULL;
127 //get GDBusConnection
128 gdbus_conn = g_dbus_method_invocation_get_connection(invocation);
129 if (gdbus_conn == NULL) {
130 _ERR("g_dbus_method_invocation_get_connection failed");
134 //get sender(unique_name)
135 sender = (char*) g_dbus_method_invocation_get_sender(invocation);
136 if (sender == NULL) {
137 _ERR("g_dbus_method_invocation_get_sender failed");
141 ret = cynara_creds_gdbus_get_user(gdbus_conn, sender, USER_METHOD_DEFAULT, user);
142 if (ret != CYNARA_API_SUCCESS) {
143 _ERR("cynara_creds_gdbus_get_user failed, ret = %d", ret);
147 ret = cynara_creds_gdbus_get_client(gdbus_conn, sender, CLIENT_METHOD_DEFAULT, client);
148 if (ret != CYNARA_API_SUCCESS) {
149 _ERR("cynara_creds_gdbus_get_client failed, ret = %d", ret);
153 guint pid = bm_get_client_pid(invocation);
154 _INFO("client Id = [%u]", pid);
156 *session = cynara_session_from_pid(pid);
157 if (*session == NULL) {
158 _ERR("cynara_session_from_pid failed");
162 return BATTERY_MONITOR_ERROR_NONE;
165 static int bm_check_privilege(GDBusMethodInvocation *invocation, const char* privilege)
169 char *session = NULL;
172 ret = bm_get_information_for_cynara_check(invocation, &client, &user, &session);
173 if (ret != BATTERY_MONITOR_ERROR_NONE) {
174 _ERR("__get_information_for_cynara_check failed");
179 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
182 ret = bm_check_privilege_by_cynara(client, session, user, privilege);
183 if (ret != BATTERY_MONITOR_ERROR_NONE) {
184 _ERR("__check_privilege_by_cynara failed, ret = %d", ret);
189 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
196 return BATTERY_MONITOR_ERROR_NONE;
199 int bm_check_privilege_battery(GDBusMethodInvocation *invocation)
201 return bm_check_privilege(invocation, BATTERY_MONITOR_PRIVILEGE);
204 int initialize_cynara(void)
208 _INFO("initializing cyanara for battery-monitor");
210 int ret_val = CYNARA_API_SUCCESS;
212 ret_val = cynara_initialize(&p_cynara, NULL);
214 BM_RETURN_VAL((ret_val == CYNARA_API_SUCCESS), {}, \
215 BATTERY_MONITOR_ERROR_NOT_INITIALIZED, "cynara initialization failure");
217 ret_val = BATTERY_MONITOR_ERROR_NONE;
223 void deinitialize_cynara(void)
227 _INFO("de-initializing cyanara");
229 cynara_finish(p_cynara);
235 int bm_calc_individual_consumption(int resource_val, int total_consumption)
237 _DBG("resource consumption - [%d], total consumption - [%d]", \
238 resource_val, total_consumption);
240 if (resource_val == 0) {
241 _DBG("no consumption");
245 return (((long)resource_val*100)/total_consumption);
248 double bm_calc_individual_mah_consumption(int resource_val, double mah_c)
250 if (resource_val == 0) {
251 _DBG("no consumption");
255 _DBG("resource consumption - [%d]", resource_val);
256 return ((double)resource_val/mah_c);
259 GVariant* bm_marshal_serialized_data(const bm_total_consumption_h data)
263 const bm_total_consumption_h in_data = data;
264 GVariantBuilder builder;
266 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
268 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_BLE_DATA_ID,
269 g_variant_new_int32(in_data->ble_val));
271 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_WIFI_DATA_ID,
272 g_variant_new_int32(in_data->wifi_val));
274 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_CPU_DATA_ID,
275 g_variant_new_int32(in_data->cpu_val));
277 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_DP_DATA_ID,
278 g_variant_new_int32(in_data->dp_val));
280 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_DN_DATA_ID,
281 g_variant_new_int32(in_data->dn_val));
282 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
283 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_GPS_DATA_ID,
284 g_variant_new_int32(in_data->gps_val));
285 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
286 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_BATTERY_DATA_ID,
287 g_variant_new_int32(in_data->bat_val));
290 return g_variant_builder_end(&builder);
293 const char *bm_get_resource_id_string(gint resource_id)
297 switch (resource_id) {
298 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_BLE, BATTERY_MONITOR_BLE_DATA_ID)
299 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_WIFI, BATTERY_MONITOR_WIFI_DATA_ID)
300 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_CPU, BATTERY_MONITOR_CPU_DATA_ID)
301 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_DISPLAY, BATTERY_MONITOR_DP_DATA_ID)
302 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_DEVICE_NETWORK, BATTERY_MONITOR_DN_DATA_ID)
303 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_GPS_SENSOR, BATTERY_MONITOR_GPS_DATA_ID)
304 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
305 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_CONST_BATTERY, BATTERY_MONITOR_BATTERY_DATA_ID)
306 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
310 return "UNKNOWN RESOURCE-ID";
314 void bm_data_free(gpointer data)
319 _ERR("data handle is null");
323 _DBG("delete - app_id(%s)", (char *)data);
331 void bm_atm_free(gpointer data)
336 _ERR("data handle is null");
346 void bm_appid_usage_free(appid_usage_s *data)
351 _ERR("data handle is null");
355 BM_FREE(data->AppId);
362 void bm_resourceid_usage_free(resourceid_usage_s *data)
367 _ERR("data handle is null");
371 BM_FREE(data->ResourceId);
378 long int bm_get_log_time(int bias)
387 ret = (curr_time - bias);
393 void bm_set_free_atm_st2_list(GSList *atm_list)
398 _WARN("atm-list is empty");
402 GSList *atm_list_iterator = NULL;
404 for (atm_list_iterator = atm_list; atm_list_iterator;
405 atm_list_iterator = atm_list_iterator->next) {
407 app_time_map_st2 *atm_node = (app_time_map_st2 *)atm_list_iterator->data;
408 if (atm_node != NULL && atm_node->app_id)
409 BM_FREE(atm_node->app_id);
413 g_slist_free_full(atm_list, free);
419 void bm_set_free_atm_st1_list(GSList *atm_list)
424 _WARN("atm-list is empty");
428 GSList *atm_list_iterator = NULL;
430 for (atm_list_iterator = atm_list; atm_list_iterator;
431 atm_list_iterator = atm_list_iterator->next) {
433 app_time_map_st1 *atm_node = (app_time_map_st1 *)atm_list_iterator->data;
434 if (atm_node != NULL && atm_node->app_id)
435 BM_FREE(atm_node->app_id);
439 g_slist_free_full(atm_list, free);
445 void bm_set_free_ble_data_handle(bm_bluetooth_st **bt_handle)
450 _ERR("data-handle not available");
454 bm_bluetooth_st *handle = *bt_handle;
456 GSList *atm_list = NULL, *data_list_iterator = NULL;
458 _DBG("inside data_handle");
460 if (!handle->bt_data_list) {
461 _ERR("data-list is null");
465 _DBG("inside data_list");
467 /* iterating over data-list */
468 for (data_list_iterator = handle->bt_data_list; data_list_iterator;
469 data_list_iterator = data_list_iterator->next) {
471 atm_list = ((bm_bluetooth_st *)data_list_iterator->data)->atm_list;
475 bm_set_free_atm_st2_list(atm_list);
478 _DBG("after atm_list free");
481 g_slist_free_full(handle->bt_data_list, free);
483 _DBG("after data_list free");
485 /* free data-handle */
492 void bm_set_free_wifi_data_handle(bm_wifi_st **wifi_handle)
496 if (!(*wifi_handle)) {
497 _ERR("data-handle not available");
501 bm_wifi_st *handle = *wifi_handle;
503 GSList *atm_list = NULL, *data_list_iterator = NULL;
505 _DBG("inside data_handle");
507 if (!handle->wifi_data_list) {
508 _ERR("data-list is null");
512 _DBG("inside data_list");
514 /* iterating over data-list */
515 for (data_list_iterator = handle->wifi_data_list; data_list_iterator;
516 data_list_iterator = data_list_iterator->next) {
518 atm_list = ((bm_wifi_st *)data_list_iterator->data)->atm_list;
522 bm_set_free_atm_st2_list(atm_list);
525 _DBG("after atm_list free");
528 g_slist_free_full(handle->wifi_data_list, free);
530 _DBG("after data_list free");
532 /* free data-handle */
540 void bm_set_free_cpu_data_handle(bm_cpu_st **cpu_handle)
544 if (!(*cpu_handle)) {
545 _ERR("data-handle not available");
549 bm_cpu_st *handle = *cpu_handle;
551 GSList *atm_list = NULL, *data_list_iterator = NULL;
553 _DBG("inside data_handle");
555 if (!handle->cpu_data_list) {
556 _ERR("data-list is null");
560 _DBG("inside data_list");
562 /* iterating over data-list */
563 for (data_list_iterator = handle->cpu_data_list; data_list_iterator;
564 data_list_iterator = data_list_iterator->next) {
566 atm_list = ((bm_cpu_st *)data_list_iterator->data)->atm_list;
570 bm_set_free_atm_st1_list(atm_list);
573 _DBG("after atm_list free");
576 g_slist_free_full(handle->cpu_data_list, free);
578 _DBG("after data_list free");
580 /* free data-handle */
587 void bm_set_free_display_data_handle(bm_display_st **display_handle)
591 if (!(*display_handle)) {
592 _ERR("data-handle not available");
596 bm_display_st *handle = *display_handle;
598 GSList *atm_list = NULL;
599 GSList *data_list_iterator = NULL;
601 _DBG("inside data_handle");
603 if (!handle->display_list) {
604 _ERR("data-list is null");
608 _DBG("inside data_list");
610 /* iterating over data-list */
611 for (data_list_iterator = handle->display_list; data_list_iterator;
612 data_list_iterator = data_list_iterator->next) {
614 atm_list = ((bm_display_st *)data_list_iterator->data)->atm_list;
618 bm_set_free_atm_st1_list(atm_list);
621 _DBG("after atm_list free");
624 g_slist_free_full(handle->display_list, free);
626 _DBG("after data_list free");
628 /* free data-handle */
635 void bm_set_free_device_network_data_handle(bm_device_network_st **dn_handle)
640 _ERR("data-handle not available");
644 bm_device_network_st *handle = *dn_handle;
646 GSList *atm_list = NULL, *data_list_iterator = NULL;
648 _DBG("inside data_handle");
650 if (!handle->dn_data_list) {
651 _ERR("data-list is null");
655 _DBG("inside data_list");
657 /* iterating over data-list */
658 for (data_list_iterator = handle->dn_data_list; data_list_iterator;
659 data_list_iterator = data_list_iterator->next) {
661 atm_list = ((bm_device_network_st *)data_list_iterator->data)->atm_list;
665 bm_set_free_atm_st2_list(atm_list);
668 _DBG("after atm_list free");
671 g_slist_free_full(handle->dn_data_list, free);
673 _DBG("after data_list free");
675 /* free data-handle */
682 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
683 void bm_set_free_gps_sensor_data_handle(bm_gps_st **gps_handle)
687 if (!(*gps_handle)) {
688 _ERR("data-handle not available");
692 bm_gps_st *handle = *gps_handle;
694 GSList *atm_list = NULL, *data_list_iterator = NULL;
696 _DBG("inside data_handle");
698 if (!handle->gps_data_list) {
699 _ERR("data-list is null");
703 _DBG("inside data_list");
705 /* iterating over data-list */
706 for (data_list_iterator = handle->gps_data_list; data_list_iterator;
707 data_list_iterator = data_list_iterator->next) {
709 atm_list = ((bm_gps_st *)data_list_iterator->data)->atm_list;
713 bm_set_free_atm_st1_list(atm_list);
716 _DBG("after atm_list free");
719 g_slist_free_full(handle->gps_data_list, free);
721 _DBG("after data_list free");
723 /* free data-handle */
729 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
731 void bm_set_free_data_handles(bm_feature_data_h* data_hdl)
735 bm_set_free_ble_data_handle(&((*data_hdl)->bm_ble_handle));
736 bm_set_free_wifi_data_handle(&((*data_hdl)->bm_wifi_handle));
737 bm_set_free_cpu_data_handle(&((*data_hdl)->bm_cpu_handle));
738 bm_set_free_display_data_handle(&((*data_hdl)->bm_display_handle));
739 bm_set_free_device_network_data_handle(&((*data_hdl)->bm_dn_handle));
740 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
741 bm_set_free_gps_sensor_data_handle(&((*data_hdl)->bm_gps_handle));
742 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
750 void bm_set_free_gslist_appid_map(GSList *list)
757 for (iter = list; iter != NULL; iter = g_slist_next(iter)) {
758 appid_map_s *amap_data = (appid_map_s *)iter->data;
759 BM_FREE(amap_data->AppId);