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;
26 GDBusConnection* connection_obj = NULL;
28 GDBusErrorEntry bm_svc_errors[] = {
29 {BATTERY_MONITOR_ERROR_NONE, BATTERY_MONITOR_SVC_ERROR_PREFIX".NoError"},
30 {BATTERY_MONITOR_ERROR_OUT_OF_MEMORY, BATTERY_MONITOR_SVC_ERROR_PREFIX".OutOfMemory"},
31 {BATTERY_MONITOR_ERROR_INVALID_PARAMETER, BATTERY_MONITOR_SVC_ERROR_PREFIX".InvalidParameter"},
32 {BATTERY_MONITOR_ERROR_DUPLICATED, BATTERY_MONITOR_SVC_ERROR_PREFIX".Duplicated"},
33 {BATTERY_MONITOR_ERROR_NO_DATA, BATTERY_MONITOR_SVC_ERROR_PREFIX".NoData"},
34 {BATTERY_MONITOR_ERROR_NOT_INITIALIZED, BATTERY_MONITOR_SVC_ERROR_PREFIX".NotInitialized"},
35 {BATTERY_MONITOR_ERROR_RECORD_NOT_FOUND, BATTERY_MONITOR_SVC_ERROR_PREFIX".RecordNotFound"},
36 {BATTERY_MONITOR_ERROR_DB_FAILED, BATTERY_MONITOR_SVC_ERROR_PREFIX".DBFailed"},
37 {BATTERY_MONITOR_ERROR_DB_NOT_OPENED, BATTERY_MONITOR_SVC_ERROR_PREFIX".DBNotOpened"},
38 {BATTERY_MONITOR_ERROR_QUERY_SYNTAX_ERROR, BATTERY_MONITOR_SVC_ERROR_PREFIX".QuerySynTaxError"},
39 {BATTERY_MONITOR_ERROR_ITERATOR_END, BATTERY_MONITOR_SVC_ERROR_PREFIX".IteratorEnd"},
40 {BATTERY_MONITOR_ERROR_NOTI_FAILED, BATTERY_MONITOR_SVC_ERROR_PREFIX".NotiFalied"},
41 {BATTERY_MONITOR_ERROR_PERMISSION_DENIED, BATTERY_MONITOR_SVC_ERROR_PREFIX".PermissionDenied"},
42 {BATTERY_MONITOR_ERROR_NULL_POINTER, BATTERY_MONITOR_SVC_ERROR_PREFIX".NullPointer"},
43 {BATTERY_MONITOR_ERROR_INTERNAL, BATTERY_MONITOR_SVC_ERROR_PREFIX".Internal"},
44 {BATTERY_MONITOR_ERROR_PLUGIN_ADD, BATTERY_MONITOR_SVC_ERROR_PREFIX".PluginAdd"},
45 {BATTERY_MONITOR_ERROR_PLUGIN_AVAILABLE, BATTERY_MONITOR_SVC_ERROR_PREFIX".PluginAvailable"},
46 {BATTERY_MONITOR_ERROR_NOT_SUPPORTED, BATTERY_MONITOR_SVC_ERROR_PREFIX".NotSupported"},
47 {BATTERY_MONITOR_ERROR_DATABASE_BUSY, BATTERY_MONITOR_SVC_ERROR_PREFIX".DatabaseBusy"},
50 static guint bm_get_client_pid(GDBusMethodInvocation* invoc)
52 const char *name = NULL;
53 name = g_dbus_method_invocation_get_sender(invoc);
55 _ERR("g_dbus_method_invocation_get_sender failed");
59 _INFO("sender=[%s]", name);
65 _INFO("calling GetConnectionUnixProcessID");
67 GDBusConnection* conn = g_dbus_method_invocation_get_connection(invoc);
68 _ret = g_dbus_connection_call_sync(conn,
69 FREE_DESKTOP_BUS_NAME,
70 FREE_DESKTOP_OBJECT_PATH,
71 FREE_DESKTOP_INTERFACE_NAME,
72 FREE_DESKTOP_METHOD_NAME,
73 g_variant_new("(s)", name),
75 G_DBUS_CALL_FLAGS_NONE,
81 g_variant_get(_ret, "(u)", &pid);
82 g_variant_unref(_ret);
85 _INFO("process Id = [%u]", pid);
89 GQuark bm_error_quark(void)
91 static volatile gsize quark_volatile = 0;
93 g_dbus_error_register_error_domain(BATTERY_MONITOR_SVC_ERROR_DOMAIN, &quark_volatile,
94 bm_svc_errors, G_N_ELEMENTS(bm_svc_errors));
96 return (GQuark)quark_volatile;
99 static int bm_check_privilege_by_cynara(const char *client, const char *session, const char *user,
100 const char *privilege)
103 char err_buf[128] = {0,};
105 ret = cynara_check(p_cynara, client, session, user, privilege);
107 case CYNARA_API_ACCESS_ALLOWED:
108 _DBG("cynara_check success");
109 return BATTERY_MONITOR_ERROR_NONE;
110 case CYNARA_API_ACCESS_DENIED:
111 _ERR("cynara_check permission deined, privilege=%s, error = CYNARA_API_ACCESS_DENIED",
113 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
115 cynara_strerror(ret, err_buf, sizeof(err_buf));
116 _ERR("cynara_check error : %s, privilege=%s, ret = %d", err_buf, privilege, ret);
117 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
121 static int bm_get_information_for_cynara_check(GDBusMethodInvocation *invocation, char **client,
122 char **user, char **session)
124 GDBusConnection *gdbus_conn = NULL;
128 //get GDBusConnection
129 gdbus_conn = g_dbus_method_invocation_get_connection(invocation);
130 if (gdbus_conn == NULL) {
131 _ERR("g_dbus_method_invocation_get_connection failed");
135 //get sender(unique_name)
136 sender = (char*) g_dbus_method_invocation_get_sender(invocation);
137 if (sender == NULL) {
138 _ERR("g_dbus_method_invocation_get_sender failed");
142 ret = cynara_creds_gdbus_get_user(gdbus_conn, sender, USER_METHOD_DEFAULT, user);
143 if (ret != CYNARA_API_SUCCESS) {
144 _ERR("cynara_creds_gdbus_get_user failed, ret = %d", ret);
148 ret = cynara_creds_gdbus_get_client(gdbus_conn, sender, CLIENT_METHOD_DEFAULT, client);
149 if (ret != CYNARA_API_SUCCESS) {
150 _ERR("cynara_creds_gdbus_get_client failed, ret = %d", ret);
154 guint pid = bm_get_client_pid(invocation);
155 _INFO("client Id = [%u]", pid);
157 *session = cynara_session_from_pid(pid);
158 if (*session == NULL) {
159 _ERR("cynara_session_from_pid failed");
163 return BATTERY_MONITOR_ERROR_NONE;
166 static int bm_check_privilege(GDBusMethodInvocation *invocation, const char* privilege)
170 char *session = NULL;
173 ret = bm_get_information_for_cynara_check(invocation, &client, &user, &session);
174 if (ret != BATTERY_MONITOR_ERROR_NONE) {
175 _ERR("__get_information_for_cynara_check failed");
180 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
183 ret = bm_check_privilege_by_cynara(client, session, user, privilege);
184 if (ret != BATTERY_MONITOR_ERROR_NONE) {
185 _ERR("__check_privilege_by_cynara failed, ret = %d", ret);
190 return BATTERY_MONITOR_ERROR_PERMISSION_DENIED;
197 return BATTERY_MONITOR_ERROR_NONE;
200 int bm_check_privilege_battery(GDBusMethodInvocation *invocation)
202 return bm_check_privilege(invocation, BATTERY_MONITOR_PRIVILEGE);
205 int initialize_cynara(void)
209 _INFO("initializing cyanara for battery-monitor");
211 int ret_val = CYNARA_API_SUCCESS;
213 ret_val = cynara_initialize(&p_cynara, NULL);
215 BM_RETURN_VAL((ret_val == CYNARA_API_SUCCESS), {}, \
216 BATTERY_MONITOR_ERROR_NOT_INITIALIZED, "cynara initialization failure");
218 ret_val = BATTERY_MONITOR_ERROR_NONE;
224 void deinitialize_cynara(void)
228 _INFO("de-initializing cyanara");
230 cynara_finish(p_cynara);
236 int bm_calc_individual_consumption(int resource_val, int total_consumption)
238 _DBG("resource consumption - [%d], total consumption - [%d]", \
239 resource_val, total_consumption);
241 if (resource_val == 0) {
242 _DBG("no consumption");
246 return (((long)resource_val*100)/total_consumption);
249 double bm_calc_individual_mah_consumption(int resource_val, double mah_c)
251 if (resource_val == 0) {
252 _DBG("no consumption");
256 _DBG("resource consumption - [%d]", resource_val);
257 return ((double)resource_val/mah_c);
260 GVariant* bm_marshal_serialized_data(const bm_total_consumption_h data)
264 const bm_total_consumption_h in_data = data;
265 GVariantBuilder builder;
267 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
269 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_BLE_DATA_ID,
270 g_variant_new_int32(in_data->ble_val));
272 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_WIFI_DATA_ID,
273 g_variant_new_int32(in_data->wifi_val));
275 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_CPU_DATA_ID,
276 g_variant_new_int32(in_data->cpu_val));
278 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_DP_DATA_ID,
279 g_variant_new_int32(in_data->dp_val));
281 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_DN_DATA_ID,
282 g_variant_new_int32(in_data->dn_val));
283 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
284 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_GPS_DATA_ID,
285 g_variant_new_int32(in_data->gps_val));
286 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
287 g_variant_builder_add(&builder, "{sv}", BATTERY_MONITOR_BATTERY_DATA_ID,
288 g_variant_new_int32(in_data->bat_val));
291 return g_variant_builder_end(&builder);
294 const char *bm_get_resource_id_string(gint resource_id)
298 switch (resource_id) {
299 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_BLE, BATTERY_MONITOR_BLE_DATA_ID)
300 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_WIFI, BATTERY_MONITOR_WIFI_DATA_ID)
301 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_CPU, BATTERY_MONITOR_CPU_DATA_ID)
302 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_DISPLAY, BATTERY_MONITOR_DP_DATA_ID)
303 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_DEVICE_NETWORK, BATTERY_MONITOR_DN_DATA_ID)
304 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_ID_GPS_SENSOR, BATTERY_MONITOR_GPS_DATA_ID)
305 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
306 BM_RESOURCE_ID_TO_STR(BM_PLUGIN_CONST_BATTERY, BATTERY_MONITOR_BATTERY_DATA_ID)
307 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
311 return "UNKNOWN RESOURCE-ID";
315 int bm_set_dbus_connection_obj(GDBusConnection* conn)
317 BM_CHECK_INPUT_PARAM(conn);
319 connection_obj = conn;
321 return BATTERY_MONITOR_ERROR_NONE;
324 GDBusConnection* bm_get_dbus_connection_obj(void)
326 if (connection_obj == NULL) {
327 _ERR("connection object not available");
331 return connection_obj;
334 void bm_data_free(gpointer data)
339 _ERR("data handle is null");
343 _DBG("delete - app_id(%s)", (char *)data);
351 void bm_atm_free(gpointer data)
356 _ERR("data handle is null");
366 void bm_appid_usage_free(appid_usage_s *data)
371 _ERR("data handle is null");
375 BM_FREE(data->AppId);
382 void bm_resourceid_usage_free(resourceid_usage_s *data)
387 _ERR("data handle is null");
391 BM_FREE(data->ResourceId);
398 long int bm_get_log_time(int bias)
407 ret = (curr_time - bias);
413 void bm_set_free_atm_st2_list(GSList *atm_list)
418 _WARN("atm-list is empty");
422 GSList *atm_list_iterator = NULL;
424 for (atm_list_iterator = atm_list; atm_list_iterator;
425 atm_list_iterator = atm_list_iterator->next) {
427 app_time_map_st2 *atm_node = (app_time_map_st2 *)atm_list_iterator->data;
428 if (atm_node != NULL && atm_node->app_id)
429 BM_FREE(atm_node->app_id);
433 g_slist_free_full(atm_list, free);
439 void bm_set_free_atm_st1_list(GSList *atm_list)
444 _WARN("atm-list is empty");
448 GSList *atm_list_iterator = NULL;
450 for (atm_list_iterator = atm_list; atm_list_iterator;
451 atm_list_iterator = atm_list_iterator->next) {
453 app_time_map_st1 *atm_node = (app_time_map_st1 *)atm_list_iterator->data;
454 if (atm_node != NULL && atm_node->app_id)
455 BM_FREE(atm_node->app_id);
459 g_slist_free_full(atm_list, free);
465 void bm_set_free_ble_data_handle(bm_bluetooth_st **bt_handle)
470 _ERR("data-handle not available");
474 bm_bluetooth_st *handle = *bt_handle;
476 GSList *atm_list = NULL, *data_list_iterator = NULL;
478 _DBG("inside data_handle");
480 if (!handle->bt_data_list) {
481 _ERR("data-list is null");
485 _DBG("inside data_list");
487 /* iterating over data-list */
488 for (data_list_iterator = handle->bt_data_list; data_list_iterator;
489 data_list_iterator = data_list_iterator->next) {
491 atm_list = ((bm_bluetooth_st *)data_list_iterator->data)->atm_list;
495 bm_set_free_atm_st2_list(atm_list);
498 _DBG("after atm_list free");
501 g_slist_free_full(handle->bt_data_list, free);
503 _DBG("after data_list free");
505 /* free data-handle */
512 void bm_set_free_wifi_data_handle(bm_wifi_st **wifi_handle)
516 if (!(*wifi_handle)) {
517 _ERR("data-handle not available");
521 bm_wifi_st *handle = *wifi_handle;
523 GSList *atm_list = NULL, *data_list_iterator = NULL;
525 _DBG("inside data_handle");
527 if (!handle->wifi_data_list) {
528 _ERR("data-list is null");
532 _DBG("inside data_list");
534 /* iterating over data-list */
535 for (data_list_iterator = handle->wifi_data_list; data_list_iterator;
536 data_list_iterator = data_list_iterator->next) {
538 atm_list = ((bm_wifi_st *)data_list_iterator->data)->atm_list;
542 bm_set_free_atm_st2_list(atm_list);
545 _DBG("after atm_list free");
548 g_slist_free_full(handle->wifi_data_list, free);
550 _DBG("after data_list free");
552 /* free data-handle */
560 void bm_set_free_cpu_data_handle(bm_cpu_st **cpu_handle)
564 if (!(*cpu_handle)) {
565 _ERR("data-handle not available");
569 bm_cpu_st *handle = *cpu_handle;
571 GSList *atm_list = NULL, *data_list_iterator = NULL;
573 _DBG("inside data_handle");
575 if (!handle->cpu_data_list) {
576 _ERR("data-list is null");
580 _DBG("inside data_list");
582 /* iterating over data-list */
583 for (data_list_iterator = handle->cpu_data_list; data_list_iterator;
584 data_list_iterator = data_list_iterator->next) {
586 atm_list = ((bm_cpu_st *)data_list_iterator->data)->atm_list;
590 bm_set_free_atm_st1_list(atm_list);
593 _DBG("after atm_list free");
596 g_slist_free_full(handle->cpu_data_list, free);
598 _DBG("after data_list free");
600 /* free data-handle */
607 void bm_set_free_display_data_handle(bm_display_st **display_handle)
611 if (!(*display_handle)) {
612 _ERR("data-handle not available");
616 bm_display_st *handle = *display_handle;
618 GSList *atm_list = NULL;
619 GSList *data_list_iterator = NULL;
621 _DBG("inside data_handle");
623 if (!handle->display_list) {
624 _ERR("data-list is null");
628 _DBG("inside data_list");
630 /* iterating over data-list */
631 for (data_list_iterator = handle->display_list; data_list_iterator;
632 data_list_iterator = data_list_iterator->next) {
634 atm_list = ((bm_display_st *)data_list_iterator->data)->atm_list;
638 bm_set_free_atm_st1_list(atm_list);
641 _DBG("after atm_list free");
644 g_slist_free_full(handle->display_list, free);
646 _DBG("after data_list free");
648 /* free data-handle */
655 void bm_set_free_device_network_data_handle(bm_device_network_st **dn_handle)
660 _ERR("data-handle not available");
664 bm_device_network_st *handle = *dn_handle;
666 GSList *atm_list = NULL, *data_list_iterator = NULL;
668 _DBG("inside data_handle");
670 if (!handle->dn_data_list) {
671 _ERR("data-list is null");
675 _DBG("inside data_list");
677 /* iterating over data-list */
678 for (data_list_iterator = handle->dn_data_list; data_list_iterator;
679 data_list_iterator = data_list_iterator->next) {
681 atm_list = ((bm_device_network_st *)data_list_iterator->data)->atm_list;
685 bm_set_free_atm_st2_list(atm_list);
688 _DBG("after atm_list free");
691 g_slist_free_full(handle->dn_data_list, free);
693 _DBG("after data_list free");
695 /* free data-handle */
702 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
703 void bm_set_free_gps_sensor_data_handle(bm_gps_st **gps_handle)
707 if (!(*gps_handle)) {
708 _ERR("data-handle not available");
712 bm_gps_st *handle = *gps_handle;
714 GSList *atm_list = NULL, *data_list_iterator = NULL;
716 _DBG("inside data_handle");
718 if (!handle->gps_data_list) {
719 _ERR("data-list is null");
723 _DBG("inside data_list");
725 /* iterating over data-list */
726 for (data_list_iterator = handle->gps_data_list; data_list_iterator;
727 data_list_iterator = data_list_iterator->next) {
729 atm_list = ((bm_gps_st *)data_list_iterator->data)->atm_list;
733 bm_set_free_atm_st1_list(atm_list);
736 _DBG("after atm_list free");
739 g_slist_free_full(handle->gps_data_list, free);
741 _DBG("after data_list free");
743 /* free data-handle */
749 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
751 void bm_set_free_data_handles(bm_feature_data_h* data_hdl)
755 bm_set_free_ble_data_handle(&((*data_hdl)->bm_ble_handle));
756 bm_set_free_wifi_data_handle(&((*data_hdl)->bm_wifi_handle));
757 bm_set_free_cpu_data_handle(&((*data_hdl)->bm_cpu_handle));
758 bm_set_free_display_data_handle(&((*data_hdl)->bm_display_handle));
759 bm_set_free_device_network_data_handle(&((*data_hdl)->bm_dn_handle));
760 #ifdef DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN
761 bm_set_free_gps_sensor_data_handle(&((*data_hdl)->bm_gps_handle));
762 #endif /* DISABLE_FEATURE_DATA_FROM_GPS_PLUGIN */
770 void bm_set_free_gslist_appid_map(GSList *list)
777 for (iter = list; iter != NULL; iter = g_slist_next(iter)) {
778 appid_map_s *amap_data = (appid_map_s *)iter->data;
779 BM_FREE(amap_data->AppId);