@@ -36,6 +36,7 @@
#include <ofono/ril-constants.h>
#include <ofono/log.h>
+#include "grilio_channel.h"
#include "grilio_encode.h"
#include "grilio_parser.h"
#include "grilio_request.h"
@@ -891,6 +892,66 @@
/**
* @param int32_t Serial number of request.
+ * @param DeviceStateType The updated device state type.
+ * @param bool The updated state.
+ */
+static
+void
+ril_binder_radio_device_state_req(
+ GBinderLocalRequest* req,
+ guint32 serial,
+ RADIO_DEVICE_STATE type,
+ gboolean state)
+{
+ GBinderWriter writer;
+
+ gbinder_local_request_init_writer(req, &writer);
+ gbinder_writer_append_int32(&writer, serial);
+ gbinder_writer_append_int32(&writer, type);
+ gbinder_writer_append_bool(&writer, state);
+}
+
+static
+gboolean
+ril_binder_radio_map_screen_state_to_device_state(
+ GRilIoRequest* in,
+ GBinderLocalRequest* out)
+{
+ GRilIoParser parser;
+ gint32 count, value;
+
+ ril_binder_radio_init_parser(&parser, in);
+ if (grilio_parser_get_int32(&parser, &count) && count == 1 &&
+ grilio_parser_get_int32(&parser, &value)) {
+ ril_binder_radio_device_state_req(out, grilio_request_serial(in),
+ RADIO_DEVICE_STATE_POWER_SAVE_MODE, !value);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static
+gboolean
+ril_binder_radio_encode_device_state(
+ GRilIoRequest* in,
+ GBinderLocalRequest* out)
+{
+ GRilIoParser parser;
+ gint32 count, type, state;
+
+ ril_binder_radio_init_parser(&parser, in);
+ if (grilio_parser_get_int32(&parser, &count) && count == 2 &&
+ grilio_parser_get_int32(&parser, &type) &&
+ grilio_parser_get_int32(&parser, &state)) {
+ ril_binder_radio_device_state_req(out, grilio_request_serial(in),
+ type, state);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * @param int32_t Serial number of request.
* @param configInfo Setting of GSM/WCDMA Cell broadcast config
*/
static
@@ -2530,11 +2591,17 @@
"getPreferredNetworkType"
},{
RIL_REQUEST_SCREEN_STATE, /* deprecated on 2017-01-10 */
- RADIO_REQ_SET_LOCATION_UPDATES,
- RADIO_RESP_SET_LOCATION_UPDATES,
- ril_binder_radio_encode_bool,
+ RADIO_REQ_SEND_DEVICE_STATE,
+ /*
+ * No resp_tx here, the one for RIL_REQUEST_SEND_DEVICE_STATE
+ * will be used to handle the response. Both SCREEN_STATE and
+ * SEND_DEVICE_STATE responses carry no payload and therefore
+ * are processed identically. It's still a bit of a hack though :/
+ */
+ RADIO_RESP_NONE,
+ ril_binder_radio_map_screen_state_to_device_state,
NULL,
- "setLocationUpdates"
+ "sendDeviceState"
},{
RIL_REQUEST_SET_LOCATION_UPDATES,
RADIO_REQ_SET_LOCATION_UPDATES,
@@ -2627,6 +2694,20 @@
NULL,
"setDataProfile"
},{
+ RIL_REQUEST_SEND_DEVICE_STATE,
+ RADIO_REQ_SEND_DEVICE_STATE,
+ RADIO_RESP_SEND_DEVICE_STATE,
+ ril_binder_radio_encode_device_state,
+ NULL,
+ "sendDeviceState"
+ },{
+ RIL_REQUEST_SET_UNSOLICITED_RESPONSE_FILTER,
+ RADIO_REQ_SET_INDICATION_FILTER,
+ RADIO_RESP_SET_INDICATION_FILTER,
+ ril_binder_radio_encode_ints,
+ NULL,
+ "setIndicationFilter"
+ },{
RIL_RESPONSE_ACKNOWLEDGEMENT,
RADIO_REQ_RESPONSE_ACKNOWLEDGEMENT,
RADIO_RESP_NONE,
@@ -2918,6 +2999,18 @@
grilio_transport_signal_disconnected(transport);
}
+static
+void
+ril_binder_radio_enabled_changed(
+ GRilIoChannel* channel,
+ void* user_data)
+{
+ RilBinderRadio* self = RIL_BINDER_RADIO(user_data);
+
+ DBG_(self, "%sabled", channel->enabled ? "en" : "dis");
+ radio_instance_set_enabled(self->radio, channel->enabled);
+}
+
/*==========================================================================*
* Methods
*==========================================================================*/
@@ -3039,6 +3132,32 @@
}
}
+static
+void
+ril_binder_radio_set_channel(
+ GRilIoTransport* transport,
+ GRilIoChannel* channel)
+{
+ GRilIoTransportClass* klass = GRILIO_TRANSPORT_CLASS(PARENT_CLASS);
+ RilBinderRadio* self = RIL_BINDER_RADIO(transport);
+
+ if (channel) {
+ /*
+ * N.B. There's no need to remove this handler (and therefore keep
+ * its id) because set_channel(NULL) will be invoked from channel's
+ * finalize method when all signal connections have already been
+ * killed and this id would no longer be valid anyway.
+ */
+ grilio_channel_add_enabled_changed_handler(channel,
+ ril_binder_radio_enabled_changed, self);
+ klass->set_channel(transport, channel);
+ radio_instance_set_enabled(self->radio, channel->enabled);
+ } else {
+ radio_instance_set_enabled(self->radio, FALSE);
+ klass->set_channel(transport, NULL);
+ }
+}
+
/*==========================================================================*
* API
*==========================================================================*/
@@ -3290,11 +3409,12 @@
ril_binder_radio_class_init(
RilBinderRadioClass* klass)
{
- GRilIoTransportClass* parent = &klass->parent;
+ GRilIoTransportClass* transport = GRILIO_TRANSPORT_CLASS(klass);
- parent->ril_version_offset = 100;
- parent->send = ril_binder_radio_send;
- parent->shutdown = ril_binder_radio_shutdown;
+ transport->ril_version_offset = 100;
+ transport->send = ril_binder_radio_send;
+ transport->shutdown = ril_binder_radio_shutdown;
+ transport->set_channel = ril_binder_radio_set_channel;
klass->handle_response = ril_binder_radio_handle_response;
klass->handle_indication = ril_binder_radio_handle_indication;
g_type_class_add_private(klass, sizeof(RilBinderRadioPriv));
|