bool _service_is_telephony_ready_cb(LSHandle *handle, LSMessage *message, void *user_data) { struct telephony_service *service = user_data; jvalue_ref reply_obj = NULL; jvalue_ref extended_obj = NULL; bool subscribed = false; reply_obj = jobject_create(); extended_obj = jobject_create(); subscribed = luna_service_check_for_subscription_and_process(handle, message); jobject_put(reply_obj, J_CSTR_TO_JVAL("returnValue"), jboolean_create(true)); jobject_put(reply_obj, J_CSTR_TO_JVAL("errorCode"), jnumber_create_i32(0)); jobject_put(reply_obj, J_CSTR_TO_JVAL("errorText"), jstring_create("success")); jobject_put(extended_obj, J_CSTR_TO_JVAL("radioConnected"), jboolean_create(service->initialized)); jobject_put(extended_obj, J_CSTR_TO_JVAL("power"), jboolean_create(service->powered)); jobject_put(extended_obj, J_CSTR_TO_JVAL("ready"), jboolean_create(service->initialized)); jobject_put(extended_obj, J_CSTR_TO_JVAL("networkRegistered"), jboolean_create(service->network_registered)); jobject_put(extended_obj, J_CSTR_TO_JVAL("dataRegistered"), jboolean_create(service->data_registered)); /* FIXME check in which situations the three fields below are set and updated */ jobject_put(extended_obj, J_CSTR_TO_JVAL("emergency"), jboolean_create(false)); jobject_put(extended_obj, J_CSTR_TO_JVAL("security"), jboolean_create(false)); jobject_put(extended_obj, J_CSTR_TO_JVAL("securityLocked"), jboolean_create(false)); jobject_put(reply_obj, J_CSTR_TO_JVAL("extended"), extended_obj); jobject_put(reply_obj, J_CSTR_TO_JVAL("subscribed"), jboolean_create(subscribed)); if(!luna_service_message_validate_and_send(handle, message, reply_obj)) luna_service_message_reply_error_internal(handle, message); j_release(&reply_obj); return true; }
/** * @brief Subscribe for a specific group of events * * JSON format: * {"events":"<type>"} **/ bool _service_subscribe_cb(LSHandle *handle, LSMessage *message, void *user_data) { jvalue_ref parsed_obj = NULL; jvalue_ref events_obj = NULL; jvalue_ref reply_obj = NULL; bool result = false; LSError lserror; const char *payload; bool subscribed = false; payload = LSMessageGetPayload(message); parsed_obj = luna_service_message_parse_and_validate(payload); if (jis_null(parsed_obj)) { luna_service_message_reply_error_bad_json(handle, message); goto cleanup; } if (!jobject_get_exists(parsed_obj, J_CSTR_TO_BUF("events"), &events_obj)) { luna_service_message_reply_error_invalid_params(handle, message); goto cleanup; } if (jstring_equal2(events_obj, J_CSTR_TO_BUF("network"))) { result = LSSubscriptionAdd(handle, "/networkStatusQuery", message, &lserror); if (!result) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); luna_service_message_reply_error_internal(handle, message); goto cleanup; } subscribed = true; } else if (jstring_equal2(events_obj, J_CSTR_TO_BUF("signal"))) { result = LSSubscriptionAdd(handle, "/signalStrengthQuery", message, &lserror); if (!result) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); luna_service_message_reply_error_internal(handle, message); goto cleanup; } subscribed = true; } reply_obj = jobject_create(); jobject_put(reply_obj, J_CSTR_TO_JVAL("returnValue"), jboolean_create(true)); jobject_put(reply_obj, J_CSTR_TO_JVAL("errorCode"), jnumber_create_i32(0)); jobject_put(reply_obj, J_CSTR_TO_JVAL("errorText"), jstring_create("success")); jobject_put(reply_obj, J_CSTR_TO_JVAL("subscribed"), jboolean_create(subscribed)); if (!luna_service_message_validate_and_send(handle, message, reply_obj)) { luna_service_message_reply_error_internal(handle, message); goto cleanup; } cleanup: j_release(&parsed_obj); return true; }
bool _LSSubscriptionGetJson(LSHandle *sh, jvalue_ref *ret_obj, LSError *lserror) { _Catalog *catalog = sh->catalog; const char *key = NULL; _SubList *sub_list = NULL; GHashTableIter iter; jvalue_ref true_obj = NULL; jvalue_ref array = NULL; jvalue_ref cur_obj = NULL; jvalue_ref sub_array = NULL; jvalue_ref key_name = NULL; jvalue_ref message_obj = NULL; jvalue_ref sub_array_item = NULL; jvalue_ref unique_name_obj = NULL; jvalue_ref service_name_obj = NULL; *ret_obj = jobject_create(); if (*ret_obj == NULL) goto error; true_obj = jboolean_create(true); if (true_obj == NULL) goto error; array = jarray_create(NULL); if (array == NULL) goto error; /* returnValue: true, * subscriptions: [ * { key: key_name, subscribers: [{unique_name: , service_name: }, ...] }, * ... * ] */ _CatalogLock(catalog); g_hash_table_iter_init(&iter, catalog->subscription_lists); while (g_hash_table_iter_next(&iter, (gpointer)&key, (gpointer)&sub_list)) { cur_obj = jobject_create(); if (cur_obj == NULL) goto error; sub_array = jarray_create(NULL); if (sub_array == NULL) goto error; key_name = jstring_create_copy(j_cstr_to_buffer(key)); if (key_name == NULL) goto error; /* iterate over SubList */ int i = 0; const char *token = NULL; const int len = _SubListLen(sub_list); for (i = 0; i < len; i++) { token = _SubListGet(sub_list, i); if (token) { _Subscription *sub = g_hash_table_lookup(catalog->token_map, token); if (!sub) continue; LSMessage *msg = sub->message; const char *unique_name = LSMessageGetSender(msg); const char *service_name = LSMessageGetSenderServiceName(msg); const char *message_body = LSMessageGetPayload(msg); /* create subscribers item and add to sub_array */ sub_array_item = jobject_create(); if (sub_array_item == NULL) goto error; unique_name_obj = unique_name ? jstring_create_copy(j_cstr_to_buffer(unique_name)) : jstring_empty(); if (unique_name_obj == NULL) goto error; service_name_obj = service_name ? jstring_create_copy(j_cstr_to_buffer(service_name)) : jstring_empty(); if (service_name_obj == NULL) goto error; message_obj = message_body ? jstring_create_copy(j_cstr_to_buffer(message_body)) : jstring_empty(); if (message_obj == NULL) goto error; jobject_put(sub_array_item, J_CSTR_TO_JVAL("unique_name"), unique_name_obj); jobject_put(sub_array_item, J_CSTR_TO_JVAL("service_name"), service_name_obj); jobject_put(sub_array_item, J_CSTR_TO_JVAL("subscription_message"), message_obj); jarray_append(sub_array, sub_array_item); sub_array_item = NULL; unique_name_obj = NULL; service_name_obj = NULL; message_obj = NULL; } } jobject_put(cur_obj, J_CSTR_TO_JVAL("key"), key_name); jobject_put(cur_obj, J_CSTR_TO_JVAL("subscribers"), sub_array); jarray_append(array, cur_obj); key_name = NULL; cur_obj = NULL; sub_array = NULL; } jobject_put(*ret_obj, J_CSTR_TO_JVAL("returnValue"), true_obj); jobject_put(*ret_obj, J_CSTR_TO_JVAL("subscriptions"), array); _CatalogUnlock(catalog); return true; error: _CatalogUnlock(catalog); j_release(ret_obj); j_release(&true_obj); j_release(&array); j_release(&cur_obj); j_release(&sub_array); j_release(&key_name); j_release(&sub_array_item); j_release(&unique_name_obj); j_release(&service_name_obj); return false; }