@@ -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"
@@ -112,8 +113,10 @@
*==========================================================================*/
#define ril_binder_radio_write_hidl_string_data(writer,ptr,field,index) \
- ril_binder_radio_write_string_with_parent(writer, &ptr->field, index, \
- (guint8*)(&ptr->field) - (guint8*)ptr)
+ ril_binder_radio_write_hidl_string_data2(writer,ptr,field,index,0)
+#define ril_binder_radio_write_hidl_string_data2(writer,ptr,field,index,off) \
+ ril_binder_radio_write_string_with_parent(writer, &ptr->field, index, \
+ (off) + ((guint8*)(&ptr->field) - (guint8*)ptr))
static
inline
@@ -137,17 +140,31 @@
static
void
ril_binder_radio_write_data_profile_strings(
- GBinderWriter* writer,
+ GBinderWriter* w,
const RadioDataProfile* dp,
- guint pi)
+ guint idx,
+ guint i)
{
- /* Write the string data in the right order*/
- ril_binder_radio_write_hidl_string_data(writer, dp, apn, pi);
- ril_binder_radio_write_hidl_string_data(writer, dp, protocol, pi);
- ril_binder_radio_write_hidl_string_data(writer, dp, roamingProtocol, pi);
- ril_binder_radio_write_hidl_string_data(writer, dp, user, pi);
- ril_binder_radio_write_hidl_string_data(writer, dp, password, pi);
- ril_binder_radio_write_hidl_string_data(writer, dp, mvnoMatchData, pi);
+ const guint off = sizeof(*dp) * i;
+
+ /* Write the string data in the right order */
+ ril_binder_radio_write_hidl_string_data2(w, dp, apn, idx, off);
+ ril_binder_radio_write_hidl_string_data2(w, dp, protocol, idx, off);
+ ril_binder_radio_write_hidl_string_data2(w, dp, roamingProtocol, idx, off);
+ ril_binder_radio_write_hidl_string_data2(w, dp, user, idx, off);
+ ril_binder_radio_write_hidl_string_data2(w, dp, password, idx, off);
+ ril_binder_radio_write_hidl_string_data2(w, dp, mvnoMatchData, idx, off);
+}
+
+inline
+static
+void
+ril_binder_radio_write_single_data_profile(
+ GBinderWriter* writer,
+ const RadioDataProfile* dp)
+{
+ ril_binder_radio_write_data_profile_strings(writer, dp,
+ gbinder_writer_append_buffer_object(writer, dp, sizeof(*dp)), 0);
}
static
@@ -504,7 +521,8 @@
{
gboolean ok = FALSE;
GRilIoParser parser;
- gint32 count, tech, auth;
+ gint32 count, tech, auth, profile_id;
+ char* profile_str = NULL;
char* tech_str = NULL;
char* apn = NULL;
char* user = NULL;
@@ -516,7 +534,8 @@
if (grilio_parser_get_int32(&parser, &count) && count == 7 &&
(tech_str = grilio_parser_get_utf8(&parser)) != NULL &&
gutil_parse_int(tech_str, 10, &tech) &&
- grilio_parser_skip_string(&parser) &&
+ (profile_str = grilio_parser_get_utf8(&parser)) != NULL &&
+ gutil_parse_int(profile_str, 10, &profile_id) &&
(apn = grilio_parser_get_utf8(&parser)) != NULL &&
(user = grilio_parser_get_utf8(&parser)) != NULL &&
(password = grilio_parser_get_utf8(&parser)) != NULL &&
@@ -524,7 +543,6 @@
gutil_parse_int(auth_str, 10, &auth) &&
(proto = grilio_parser_get_utf8(&parser)) != NULL) {
GBinderWriter writer;
- guint parent;
RadioDataProfile* profile;
/* ril.h has this to say about the radio tech parameter:
@@ -548,14 +566,17 @@
ril_binder_radio_take_string(out, &profile->password, password);
ril_binder_radio_take_string(out, &profile->mvnoMatchData, NULL);
profile->roamingProtocol = profile->protocol;
+ profile->profileId = profile_id;
profile->authType = auth;
+ profile->enabled = TRUE;
+ profile->supportedApnTypesBitmap =
+ (profile_id == RADIO_DATA_PROFILE_DEFAULT) ?
+ RADIO_APN_TYPE_DEFAULT : RADIO_APN_TYPE_MMS;
/* Write the parcel */
gbinder_writer_append_int32(&writer, grilio_request_serial(in));
gbinder_writer_append_int32(&writer, tech); /* radioTechnology */
- parent = gbinder_writer_append_buffer_object(&writer,
- profile, sizeof(*profile)); /* dataProfileInfo */
- ril_binder_radio_write_data_profile_strings(&writer, profile, parent);
+ ril_binder_radio_write_single_data_profile(&writer, profile);
gbinder_writer_append_bool(&writer, FALSE); /* modemCognitive */
/* TODO: provide the actual roaming status? */
gbinder_writer_append_bool(&writer, TRUE); /* roamingAllowed */
@@ -568,6 +589,7 @@
g_free(proto);
}
+ g_free(profile_str);
g_free(tech_str);
g_free(auth_str);
return ok;
@@ -870,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
@@ -993,7 +1075,6 @@
grilio_parser_get_nullable_utf8(&parser, &password)) {
RadioDataProfile* profile;
GBinderWriter writer;
- guint parent;
/* Initialize the writer and the data to be written */
gbinder_local_request_init_writer(out, &writer);
@@ -1005,17 +1086,18 @@
ril_binder_radio_take_string(out, &profile->mvnoMatchData, NULL);
profile->roamingProtocol = profile->protocol;
profile->authType = auth;
+ profile->supportedApnTypesBitmap = RADIO_APN_TYPE_IA;
+ profile->enabled = TRUE;
|