2 * Copyright (c) 2013 - 2016 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.
27 #include <sys/socket.h>
29 #include <appsvc/appsvc.h>
32 #include <bundle_internal.h>
33 #include <pkgmgr-info.h>
35 #include "data-control-map.h"
36 #include "data-control-internal.h"
37 #include "data-control-bulk.h"
45 GList *request_info_list;
46 datacontrol_map_response_cb *map_response_cb;
49 static void *datacontrol_map_tree_root = NULL;
50 static GHashTable *__socket_pair_hash = NULL;
52 static void __map_call_cb(const char *provider_id, int request_id, datacontrol_request_type type,
53 const char *data_id, bool provider_result, const char *error, char **result_value_list, int result_value_count,
54 data_control_bulk_result_data_h bulk_results, void *data)
56 LOGI("__map_call_cb, dataID: %s", data_id);
58 datacontrol_map_response_cb *callback = NULL;
60 map_response_cb_s *map_dc = NULL;
61 map_dc = (map_response_cb_s *)data;
62 callback = map_dc->map_response_cb;
64 LOGE("no listener set");
68 datacontrol_h provider;
69 datacontrol_map_create(&provider);
71 datacontrol_map_set_provider_id(provider, provider_id);
72 datacontrol_map_set_data_id(provider, data_id);
75 case DATACONTROL_TYPE_MAP_BULK_ADD:
77 if (callback != NULL && callback->bulk_add != NULL)
78 callback->bulk_add(request_id, provider, bulk_results, provider_result, error, map_dc->user_data);
80 LOGI("No registered callback function");
83 case DATACONTROL_TYPE_MAP_GET:
85 if (callback != NULL && callback->get != NULL)
86 callback->get(request_id, provider, result_value_list, result_value_count, provider_result, error, map_dc->user_data);
88 LOGI("No registered callback function");
91 case DATACONTROL_TYPE_MAP_SET:
93 if (callback != NULL && callback->set != NULL)
94 callback->set(request_id, provider, provider_result, error, map_dc->user_data);
96 LOGI("No registered callback function");
99 case DATACONTROL_TYPE_MAP_ADD:
101 if (callback != NULL && callback->add != NULL)
102 callback->add(request_id, provider, provider_result, error, map_dc->user_data);
104 LOGI("No registered callback function");
107 case DATACONTROL_TYPE_MAP_REMOVE:
108 LOGI("REMOVE VALUE");
109 if (callback != NULL && callback->remove != NULL)
110 callback->remove(request_id, provider, provider_result, error, map_dc->user_data);
112 LOGI("No registered callback function");
119 datacontrol_map_destroy(provider);
122 static void __map_instance_free(void *datacontrol_map_instance)
124 map_response_cb_s *dc = (map_response_cb_s *)datacontrol_map_instance;
126 free(dc->provider_id);
129 free(dc->access_info);
130 free(datacontrol_map_instance);
136 static int __map_instance_compare(const void *l_datacontrol_map_instance, const void *r_datacontrol_map_instance)
138 map_response_cb_s *dc_left = (map_response_cb_s *)l_datacontrol_map_instance;
139 map_response_cb_s *dc_right = (map_response_cb_s *)r_datacontrol_map_instance;
140 return strcmp(dc_left->provider_id, dc_right->provider_id);
143 static char **__map_get_value_list(int fd, int *value_count)
145 char **value_list = NULL;
152 if (_read_socket(fd, (char *)&count, sizeof(count), &nb)) {
153 LOGE("datacontrol_recv_map_get_value_list : ...from %d: fail to read\n", fd);
157 if (count < 0 || count > MAX_VALUE_COUNT) {
158 LOGE("invalid count %d", count);
162 value_list = (char **)calloc(count, sizeof(char *));
163 if (value_list == NULL) {
164 LOGE("Failed to create value list");
168 for (i = 0; i < count; i++) {
169 if (_read_socket(fd, (char *)&nbytes, sizeof(nbytes), &nb)) {
170 LOGE("datacontrol_recv_map_get_value_list : ...from %d: fail to read\n", fd);
173 if (nbytes < 0 || nbytes > MAX_REQUEST_ARGUMENT_SIZE) {
174 LOGE("invalid nbytes %d", nbytes);
178 LOGI("nbytes : %d %d" , nbytes , nb);
179 value_list[i] = (char *)calloc(nbytes + 1, sizeof(char));
181 if (_read_socket(fd, value_list[i], nbytes, &nb)) {
182 LOGE("datacontrol_recv_map_get_value_list : ...from %d: fail to read\n", fd);
185 LOGI("value_list[i] : %s %d" , value_list[i] , nb);
187 *value_count = count;
191 /* LCOV_EXCL_START */
194 for (j = 0; j < i; j++) {
195 if (value_list[j] != NULL)
205 static void __remove_map_request_info(int request_id, map_response_cb_s *map_dc)
208 datacontrol_consumer_request_info temp_request_info;
209 datacontrol_consumer_request_info *data;
211 temp_request_info.request_id = request_id;
212 GList *list = g_list_find_custom(map_dc->request_info_list, &temp_request_info,
213 (GCompareFunc)_consumer_request_compare_cb);
215 data = (datacontrol_consumer_request_info *)list->data;
216 map_dc->request_info_list = g_list_remove(map_dc->request_info_list, list->data);
221 static int __map_handle_cb(int fd, bundle *b, int request_type, int request_id, appsvc_result_val res, void *data)
224 const char **result_list = NULL;
225 const char *provider_id = NULL;
226 const char *data_id = NULL;
227 const char *error_message = NULL;
228 int result_list_len = 0;
229 int provider_result = 0;
232 char **value_list = NULL;
233 const char *p = NULL;
234 data_control_bulk_result_data_h bulk_results = NULL;
236 LOGI("__map_handle_cb, request_type: %d", request_type);
239 LOGE("the bundle returned from datacontrol-provider-service is null");
240 return DATACONTROL_ERROR_INVALID_PARAMETER;
244 result_list = bundle_get_str_array(b, OSP_K_ARG, &result_list_len);
246 LOGE("Invalid Bundle: arguement list is null");
247 return DATACONTROL_ERROR_INVALID_PARAMETER;
250 p = result_list[0]; /* result list[0] = provider_result */
252 LOGE("Invalid Bundle: provider_result is null");
253 return DATACONTROL_ERROR_INVALID_PARAMETER;
256 LOGI("Provider result: %s", p);
258 provider_result = atoi(p);
260 error_message = result_list[1]; /* result list[1] = error */
261 if (!error_message) {
262 LOGE("Invalid Bundle: error_message is null");
263 return DATACONTROL_ERROR_INVALID_PARAMETER;
266 LOGI("Error message: %s", error_message);
268 provider_id = bundle_get_val(b, OSP_K_DATACONTROL_PROVIDER);
270 LOGE("Invalid Bundle: provider_id is null");
271 return DATACONTROL_ERROR_INVALID_PARAMETER;
274 data_id = bundle_get_val(b, OSP_K_DATACONTROL_DATA);
276 LOGE("Invalid Bundle: data_id is null");
277 return DATACONTROL_ERROR_INVALID_PARAMETER;
280 LOGI("Provider ID: %s, Data ID: %s, Operation type: %d", provider_id, data_id, request_type);
282 switch (request_type) {
283 case DATACONTROL_TYPE_MAP_BULK_ADD:
284 LOGI("BULK ADD RESPONSE");
285 if (provider_result) {
286 if (_recv_bulk_process(fd, &bulk_results)
287 != DATACONTROL_ERROR_NONE)
288 return DATACONTROL_ERROR_IO_ERROR;
291 case DATACONTROL_TYPE_MAP_GET:
292 LOGI("GET RESPONSE");
293 if (provider_result) {
294 value_list = __map_get_value_list(fd, &value_count);
296 if (value_list == NULL && value_count != 0) {
297 LOGE("Invalid data: value_list is null");
298 return DATACONTROL_ERROR_INVALID_PARAMETER;
302 case DATACONTROL_TYPE_MAP_SET:
303 case DATACONTROL_TYPE_MAP_ADD:
304 case DATACONTROL_TYPE_MAP_REMOVE:
305 LOGI("SET or ADD or REMOVE RESPONSE");
311 if (request_type >= DATACONTROL_TYPE_MAP_GET && request_type <= DATACONTROL_TYPE_MAP_BULK_ADD) {
312 __map_call_cb(provider_id, request_id, request_type, data_id, provider_result,
313 error_message, value_list, value_count, bulk_results, data);
314 ret = DATACONTROL_ERROR_NONE;
316 ret = DATACONTROL_ERROR_INVALID_PARAMETER;
320 datacontrol_bulk_result_data_destroy(bulk_results);
323 for (i = 0; i < value_count; i++) {
324 if (value_list[i] != NULL)
333 static gboolean __recv_map_message(GIOChannel *channel,
340 int request_type = 0;
341 const char *request_code = NULL;
342 const char *p = NULL;
345 gint fd = g_io_channel_unix_get_fd(channel);
346 map_response_cb_s *map_dc;
348 datacontrol_consumer_request_info *request_info;
350 LOGI("__recv_map_message: ...from %d:%s%s%s%s\n", fd,
351 (cond & G_IO_ERR) ? " ERR" : "",
352 (cond & G_IO_HUP) ? " HUP" : "",
353 (cond & G_IO_IN) ? " IN" : "",
354 (cond & G_IO_PRI) ? " PRI" : "");
356 if (cond & (G_IO_ERR | G_IO_HUP))
359 if (cond & G_IO_IN) {
360 if (_read_socket(fd, (char *)&nbytes, sizeof(nbytes), &nb)) {
361 LOGE("Fail to read nbytes from socket");
364 LOGI("nbytes : %d", nbytes);
367 LOGE("__recv_map_message: ...from %d: socket closed\n", fd);
371 LOGI("__recv_map_message: ...from %d: %d bytes\n", fd, nbytes);
372 if (nbytes > 0 && nbytes < MAX_REQUEST_ARGUMENT_SIZE) {
373 buf = (char *) calloc(nbytes + 1, sizeof(char));
375 LOGE("Malloc failed!!");
378 if (_read_socket(fd, buf, nbytes, &nb)) {
379 LOGE("Fail to read buf from socket");
384 LOGE("__recv_map_message: ...from %d: socket closed\n", fd);
388 kb = bundle_decode_raw((bundle_raw *)buf, nbytes);
390 LOGE("__recv_map_message: Unable to decode the bundle\n");
394 LOGI("__recv_map_message: ...from %d: OK\n", fd);
395 LOGI("__recv_map_message: ...caller appid %s: OK\n", bundle_get_val(kb, AUL_K_CALLER_APPID));
397 p = bundle_get_val(kb, OSP_K_REQUEST_ID);
399 LOGE("Invalid Bundle: request_id is null");
402 request_id = atoi(p);
404 LOGI("Request ID: %d", request_id);
407 request_code = bundle_get_val(kb, OSP_K_DATACONTROL_REQUEST_TYPE);
409 LOGE("Invalid Bundle: data-control request type is null");
412 request_type = atoi(request_code);
414 if (__map_handle_cb(fd, kb, request_type, request_id, 0, data) != DATACONTROL_ERROR_NONE)
417 LOGE("error: listener information is null");
420 __remove_map_request_info(request_id, data);
430 /* LCOV_EXCL_START */
436 if (((map_response_cb_s *)data) != NULL) {
437 map_dc = (map_response_cb_s *)data;
438 g_hash_table_remove(__socket_pair_hash, map_dc->provider_id);
440 itr = g_list_first(map_dc->request_info_list);
441 while (itr != NULL) {
442 request_info = (datacontrol_consumer_request_info *)itr->data;
443 __map_call_cb(map_dc->provider_id, request_info->request_id, request_info->type, map_dc->data_id, false,
444 "provider IO Error", NULL, 0, NULL, data);
445 itr = g_list_next(itr);
447 if (map_dc->request_info_list) {
448 LOGI("free map request_info_list");
449 g_list_free_full(map_dc->request_info_list, free);
450 map_dc->request_info_list = NULL;
457 static int __map_request_provider(datacontrol_h provider, datacontrol_request_type type, bundle *request_data, void *extra_data, int request_id)
461 int ret = DATACONTROL_ERROR_NONE;
462 void *map_dc_returned = NULL;
463 char caller_app_id[255];
464 char datacontrol_request_operation[MAX_LEN_DATACONTROL_REQ_TYPE] = {0, };
465 char req_id[32] = {0,};
467 const int TRY_COUNT = 2;
468 const struct timespec TRY_SLEEP_TIME = { 0, 1000 * 1000 * 1000 };
471 LOGI("Map Data control request, type: %d, request id: %d", type, request_id);
473 if (type < DATACONTROL_TYPE_MAP_GET || type > DATACONTROL_TYPE_MAP_BULK_ADD) {
474 LOGE("Invalid request type: %d", (int)type);
475 return DATACONTROL_ERROR_INVALID_PARAMETER;
478 if (__socket_pair_hash == NULL)
479 __socket_pair_hash = g_hash_table_new_full(g_str_hash, g_str_equal, free, _socket_info_free);
481 if (!datacontrol_map_tree_root) {
482 LOGE("The listener tree is empty");
483 return DATACONTROL_ERROR_INVALID_PARAMETER;
486 map_response_cb_s *map_dc_temp = (map_response_cb_s *)calloc(1, sizeof(map_response_cb_s));
488 LOGE("Failed to create map datacontrol");
489 return DATACONTROL_ERROR_OUT_OF_MEMORY;
492 map_dc_temp->provider_id = strdup(provider->provider_id);
493 if (!map_dc_temp->provider_id) {
494 LOGE("Failed to assign provider id to map data control: %d", errno);
496 return DATACONTROL_ERROR_OUT_OF_MEMORY;
499 map_dc_temp->data_id = strdup(provider->data_id);
500 if (!map_dc_temp->data_id) {
501 LOGE("Failed to assign data id to map data control: %d", errno);
502 free(map_dc_temp->provider_id);
504 return DATACONTROL_ERROR_OUT_OF_MEMORY;
507 map_dc_temp->app_id = NULL;
508 map_dc_temp->access_info = NULL;
509 map_dc_temp->user_data = NULL;
510 map_dc_temp->map_response_cb = NULL;
512 map_dc_returned = tfind(map_dc_temp, &datacontrol_map_tree_root, __map_instance_compare);
514 __map_instance_free(map_dc_temp);
516 if (!map_dc_returned) {
517 LOGE("Finding the map datacontrol in the listener tree is failed.");
518 return DATACONTROL_ERROR_INVALID_PARAMETER;
521 map_response_cb_s *map_dc = *(map_response_cb_s **)map_dc_returned;
522 app_id = map_dc->app_id;
523 datacontrol_consumer_request_info *request_info = (datacontrol_consumer_request_info *)calloc(sizeof(datacontrol_consumer_request_info), 1);
524 request_info->request_id = request_id;
525 request_info->type = type;
526 map_dc->request_info_list = g_list_append(map_dc->request_info_list, request_info);
529 LOGI("Map datacontrol appid: %s", map_dc->app_id);
531 pid_t pid = getpid();
532 if (aul_app_get_appid_bypid(pid, caller_app_id, sizeof(caller_app_id)) != 0) {
533 LOGE("Failed to get appid by pid(%d).", pid);
534 return DATACONTROL_ERROR_INVALID_PARAMETER;
537 send_data = bundle_dup(request_data);
538 if (send_data == NULL) {
539 LOGE("fail to alloc result_data");
540 return DATACONTROL_ERROR_OUT_OF_MEMORY;
543 bundle_add_str(send_data, OSP_K_DATACONTROL_PROTOCOL_VERSION, OSP_V_VERSION_2_1_0_3);
544 bundle_add_str(send_data, AUL_K_CALLER_APPID, caller_app_id);
546 snprintf(datacontrol_request_operation, MAX_LEN_DATACONTROL_REQ_TYPE, "%d", (int)(type));
547 bundle_add_str(send_data, OSP_K_DATACONTROL_REQUEST_TYPE, datacontrol_request_operation);
549 snprintf(req_id, 32, "%d", request_id);
550 bundle_add_str(send_data, OSP_K_REQUEST_ID, req_id);
552 LOGI("caller_id %s, app_id %s", caller_app_id, app_id);
555 datacontrol_socket_info *socket_info = g_hash_table_lookup(__socket_pair_hash, provider->provider_id);
556 if (socket_info == NULL) {
557 ret = _request_appsvc_run(caller_app_id, app_id);
558 if (ret != DATACONTROL_ERROR_NONE) {
559 bundle_free(send_data);
563 socket_info = _add_watch_on_socket_info(caller_app_id, app_id, "consumer", __recv_map_message, data);
564 if (socket_info == NULL) {
565 bundle_free(send_data);
566 return DATACONTROL_ERROR_IO_ERROR;
569 g_hash_table_insert(__socket_pair_hash, strdup(provider->provider_id), socket_info);
572 LOGI("send data from consumer !!!");
573 ret = _datacontrol_send_async(socket_info->socket_fd, send_data, extra_data, type, NULL);
574 if (ret != DATACONTROL_ERROR_NONE)
575 g_hash_table_remove(__socket_pair_hash, provider->provider_id);
579 nanosleep(&TRY_SLEEP_TIME, 0);
580 } while (ret != DATACONTROL_ERROR_NONE && count < TRY_COUNT);
582 bundle_free(send_data);
586 int datacontrol_map_create(datacontrol_h *provider)
588 struct datacontrol_s *request;
590 if (provider == NULL)
591 return DATACONTROL_ERROR_INVALID_PARAMETER;
593 request = malloc(sizeof(struct datacontrol_s));
595 return DATACONTROL_ERROR_OUT_OF_MEMORY;
597 request->provider_id = NULL;
598 request->data_id = NULL;
605 int datacontrol_map_destroy(datacontrol_h provider)
607 if (provider == NULL)
608 return DATACONTROL_ERROR_INVALID_PARAMETER;
610 if (provider->provider_id != NULL)
611 free(provider->provider_id);
613 if (provider->data_id != NULL)
614 free(provider->data_id);
621 int datacontrol_map_set_provider_id(datacontrol_h provider, const char *provider_id)
623 if (provider == NULL || provider_id == NULL)
624 return DATACONTROL_ERROR_INVALID_PARAMETER;
626 if (provider->provider_id != NULL)
627 free(provider->provider_id);
629 provider->provider_id = strdup(provider_id);
630 if (provider->provider_id == NULL)
631 return DATACONTROL_ERROR_OUT_OF_MEMORY;
636 int datacontrol_map_get_provider_id(datacontrol_h provider, char **provider_id)
638 if (provider == NULL || provider_id == NULL)
639 return DATACONTROL_ERROR_INVALID_PARAMETER;
641 if (provider->provider_id != NULL) {
642 *provider_id = strdup(provider->provider_id);
643 if (*provider_id == NULL)
644 return DATACONTROL_ERROR_OUT_OF_MEMORY;
653 int datacontrol_map_set_data_id(datacontrol_h provider, const char *data_id)
655 if (provider == NULL || data_id == NULL)
656 return DATACONTROL_ERROR_INVALID_PARAMETER;
658 if (provider->data_id != NULL)
659 free(provider->data_id);
661 provider->data_id = strdup(data_id);
662 if (provider->data_id == NULL)
663 return DATACONTROL_ERROR_OUT_OF_MEMORY;
668 int datacontrol_map_get_data_id(datacontrol_h provider, char **data_id)
670 if (provider == NULL || data_id == NULL)
671 return DATACONTROL_ERROR_INVALID_PARAMETER;
673 if (provider->data_id != NULL) {
674 *data_id = strdup(provider->data_id);
675 if (*data_id == NULL)
676 return DATACONTROL_ERROR_OUT_OF_MEMORY;
685 bool datacontrol_map_cb_is_registered(char *provider_id)
687 map_response_cb_s map_dc_temp;
688 map_dc_temp.provider_id = provider_id;
690 if (tfind(&map_dc_temp, &datacontrol_map_tree_root, __map_instance_compare) != NULL)
695 int datacontrol_map_register_response_cb(datacontrol_h provider, datacontrol_map_response_cb *callback, void *user_data)
700 void *map_dc_returned = NULL;
702 ret = pkgmgrinfo_appinfo_usr_get_datacontrol_info(provider->provider_id, "Map", getuid(), &app_id, &access);
703 if (ret != PMINFO_R_OK) {
704 LOGE("unable to get map data control information: %d", ret);
705 return DATACONTROL_ERROR_IO_ERROR;
708 LOGI("data control provider appid = %s", app_id);
710 map_response_cb_s *map_dc_temp = (map_response_cb_s *)calloc(1, sizeof(map_response_cb_s));
712 LOGE("unable to create a temporary map data control");
713 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
717 map_dc_temp->provider_id = strdup(provider->provider_id);
718 if (!map_dc_temp->provider_id) {
719 LOGE("unable to assign provider_id to map data control: %d", errno);
720 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
724 map_dc_temp->data_id = strdup(provider->data_id);
725 if (!map_dc_temp->data_id) {
726 LOGE("unable to assign data_id to map data control: %d", errno);
727 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
731 map_dc_temp->app_id = app_id;
732 map_dc_temp->access_info = access;
733 map_dc_temp->user_data = user_data;
734 map_dc_temp->map_response_cb = callback;
736 map_dc_returned = tsearch(map_dc_temp, &datacontrol_map_tree_root, __map_instance_compare);
738 map_response_cb_s *map_dc = *(map_response_cb_s **)map_dc_returned;
739 if (map_dc != map_dc_temp) {
740 map_dc->map_response_cb = callback;
741 map_dc->user_data = user_data;
742 LOGI("the data control is already set");
743 __map_instance_free(map_dc_temp);
746 return DATACONTROL_ERROR_NONE;
748 /* LCOV_EXCL_START */
755 if (map_dc_temp->provider_id)
756 free(map_dc_temp->provider_id);
757 if (map_dc_temp->data_id)
758 free(map_dc_temp->data_id);
766 int datacontrol_map_unregister_response_cb(datacontrol_h provider)
768 int ret = DATACONTROL_ERROR_NONE;
769 map_response_cb_s *map_dc_temp = (map_response_cb_s *)calloc(1, sizeof(map_response_cb_s));
770 void *map_dc_returned = NULL;
772 g_hash_table_remove(__socket_pair_hash, provider->provider_id);
775 LOGE("unable to create a temporary map data control");
776 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
780 map_dc_temp->provider_id = strdup(provider->provider_id);
781 if (!map_dc_temp->provider_id) {
782 LOGE("unable to assign provider_id to map data control: %d", errno);
783 ret = DATACONTROL_ERROR_OUT_OF_MEMORY;
787 map_dc_returned = tdelete(map_dc_temp, &datacontrol_map_tree_root, __map_instance_compare);
788 if (map_dc_returned == NULL) {
789 LOGE("invalid parameter");
790 ret = DATACONTROL_ERROR_INVALID_PARAMETER;
794 /* LCOV_EXCL_START */
797 if (map_dc_temp->provider_id)
798 free(map_dc_temp->provider_id);
806 int datacontrol_map_get(datacontrol_h provider, const char *key, int *request_id)
808 return datacontrol_map_get_with_page(provider, key, request_id, 1, 20);
811 int datacontrol_map_get_with_page(datacontrol_h provider, const char *key, int *request_id, int page_number, int count_per_page)
813 unsigned int arg_size;
815 const char *arg_list[4];
816 char page_no_str[32];
817 char count_per_page_str[32];
820 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || key == NULL) {
821 LOGE("Invalid parameter");
822 return DATACONTROL_ERROR_INVALID_PARAMETER;
825 LOGI("Gets the value list from provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
827 arg_size = (strlen(provider->data_id) + strlen(key)) * sizeof(wchar_t);
828 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
829 LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
830 return DATACONTROL_ERROR_MAX_EXCEEDED;
833 bundle *b = bundle_create();
835 LOGE("unable to create bundle: %d", errno);
836 return DATACONTROL_ERROR_INVALID_PARAMETER;
839 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
840 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
842 arg_list[0] = provider->data_id;
845 ret = snprintf(page_no_str, sizeof(page_no_str), "%d", page_number);
847 LOGE("unable to convert page no to string: %d", errno);
849 return DATACONTROL_ERROR_OUT_OF_MEMORY;
852 ret = snprintf(count_per_page_str, sizeof(count_per_page_str), "%d", count_per_page);
854 LOGE("unable to convert count per page no to string: %d", errno);
856 return DATACONTROL_ERROR_OUT_OF_MEMORY;
859 arg_list[2] = page_no_str;
860 arg_list[3] = count_per_page_str;
862 bundle_add_str_array(b, OSP_K_ARG, arg_list, 4);
864 /* Set the request id */
865 reqId = _datacontrol_create_request_id();
868 ret = __map_request_provider(provider, DATACONTROL_TYPE_MAP_GET, b, NULL, reqId);
874 int datacontrol_map_set(datacontrol_h provider, const char *key, const char *old_value, const char *new_value, int *request_id)
876 unsigned int arg_size;
878 const char *arg_list[4];
882 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || key == NULL || old_value == NULL || new_value == NULL) {
883 LOGE("Invalid parameter");
884 return DATACONTROL_ERROR_INVALID_PARAMETER;
887 LOGI("Sets the old value to new value in provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
889 arg_size = (strlen(provider->data_id) + strlen(key) + strlen(old_value) + strlen(new_value)) * sizeof(wchar_t);
890 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
891 LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
892 return DATACONTROL_ERROR_MAX_EXCEEDED;
897 LOGE("unable to create bundle: %d", errno);
898 return DATACONTROL_ERROR_OUT_OF_MEMORY;
901 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
902 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
904 arg_list[0] = provider->data_id;
906 arg_list[2] = old_value;
907 arg_list[3] = new_value;
909 bundle_add_str_array(b, OSP_K_ARG, arg_list, 4);
911 /* Set the request id */
912 reqId = _datacontrol_create_request_id();
915 ret = __map_request_provider(provider, DATACONTROL_TYPE_MAP_SET, b, NULL, reqId);
921 int datacontrol_map_add_bulk_data(datacontrol_h provider, data_control_bulk_data_h bulk_data_h, int *request_id)
923 long long arg_size = 0;
926 const char *arg_list[3];
931 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL) {
932 LOGE("Invalid parameter");
933 return DATACONTROL_ERROR_INVALID_PARAMETER;
936 LOGI("Adds the value in provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
937 datacontrol_bulk_data_get_count(bulk_data_h, &count);
938 for (i = 0; i < count; i++) {
939 datacontrol_bulk_data_get_data(bulk_data_h, i, &data);
940 bundle_foreach(data, _bundle_foreach_check_arg_size_cb, &arg_size);
943 arg_size += (strlen(provider->data_id) + strlen(provider->provider_id)) * sizeof(char);
944 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
945 LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
946 return DATACONTROL_ERROR_MAX_EXCEEDED;
951 LOGE("unable to create bundle: %d", errno);
952 return DATACONTROL_ERROR_OUT_OF_MEMORY;
955 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
956 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
958 arg_list[0] = provider->data_id;
960 bundle_add_str_array(b, OSP_K_ARG, arg_list, 1);
961 *request_id = _datacontrol_create_request_id();
963 ret = __map_request_provider(provider, DATACONTROL_TYPE_MAP_BULK_ADD, b, bulk_data_h, *request_id);
970 int datacontrol_map_add(datacontrol_h provider, const char *key, const char *value, int *request_id)
972 unsigned int arg_size;
974 const char *arg_list[3];
978 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || key == NULL || value == NULL) {
979 LOGE("Invalid parameter");
980 return DATACONTROL_ERROR_INVALID_PARAMETER;
983 LOGI("Adds the value in provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
985 arg_size = (strlen(provider->data_id) + strlen(key) + strlen(value)) * sizeof(wchar_t);
986 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
987 LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
988 return DATACONTROL_ERROR_MAX_EXCEEDED;
993 LOGE("unable to create bundle: %d", errno);
994 return DATACONTROL_ERROR_OUT_OF_MEMORY;
997 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
998 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
1000 arg_list[0] = provider->data_id;
1002 arg_list[2] = value;
1004 bundle_add_str_array(b, OSP_K_ARG, arg_list, 3);
1006 /* Set the request id */
1007 reqId = _datacontrol_create_request_id();
1008 *request_id = reqId;
1010 ret = __map_request_provider(provider, DATACONTROL_TYPE_MAP_ADD, b, NULL, reqId);
1016 int datacontrol_map_remove(datacontrol_h provider, const char *key, const char *value, int *request_id)
1018 unsigned int arg_size;
1020 const char *arg_list[3];
1024 if (provider == NULL || provider->provider_id == NULL || provider->data_id == NULL || key == NULL || value == NULL) {
1025 LOGE("Invalid parameter");
1026 return DATACONTROL_ERROR_INVALID_PARAMETER;
1029 LOGI("Removes the value in provider_id: %s, data_id: %s", provider->provider_id, provider->data_id);
1031 arg_size = (strlen(provider->data_id) + strlen(key) + strlen(value)) * sizeof(wchar_t);
1032 if (arg_size > MAX_REQUEST_ARGUMENT_SIZE) {
1033 LOGE("The size of sending argument (%u) exceeds the maximum limit.", arg_size);
1034 return DATACONTROL_ERROR_MAX_EXCEEDED;
1037 b = bundle_create();
1039 LOGE("unable to create bundle: %d", errno);
1040 return DATACONTROL_ERROR_OUT_OF_MEMORY;
1043 bundle_add_str(b, OSP_K_DATACONTROL_PROVIDER, provider->provider_id);
1044 bundle_add_str(b, OSP_K_DATACONTROL_DATA, provider->data_id);
1046 arg_list[0] = provider->data_id;
1048 arg_list[2] = value;
1050 bundle_add_str_array(b, OSP_K_ARG, arg_list, 3);
1052 /* Set the request id */
1053 reqId = _datacontrol_create_request_id();
1054 *request_id = reqId;
1056 ret = __map_request_provider(provider, DATACONTROL_TYPE_MAP_REMOVE, b, NULL, reqId);