[gbinder-radio] Implement support for AIDL IRadioIms. JB#61702
This commit is contained in:
123
include/radio_ims_types.h
Normal file
123
include/radio_ims_types.h
Normal file
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (C) 2024 Jollyboys Ltd
|
||||
*
|
||||
* You may use this file under the terms of the BSD license as follows:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the names of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation
|
||||
* are those of the authors and should not be interpreted as representing
|
||||
* any official policies, either expressed or implied.
|
||||
*/
|
||||
|
||||
#ifndef RADIO_IMS_TYPES_H
|
||||
#define RADIO_IMS_TYPES_H
|
||||
|
||||
#include <gbinder_types.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define RADIO_IMS_INTERFACE_MAX (RADIO_IMS_INTERFACE_COUNT - 1)
|
||||
|
||||
#define RADIO_IMS_INSTANCE "default"
|
||||
#define RADIO_IMS_IFACE_PREFIX "android.hardware.radio.ims."
|
||||
#define RADIO_IMS_IFACE "IRadioIms"
|
||||
#define RADIO_IMS_RESPONSE_IFACE "IRadioImsResponse"
|
||||
#define RADIO_IMS_INDICATION_IFACE "IRadioImsIndication"
|
||||
#define RADIO_IMS RADIO_IMS_IFACE_PREFIX RADIO_IMS_IFACE
|
||||
#define RADIO_IMS_FQNAME RADIO_IMS "/" RADIO_IMS_INSTANCE
|
||||
#define RADIO_IMS_RESPONSE RADIO_IMS_IFACE_PREFIX RADIO_IMS_RESPONSE_IFACE
|
||||
#define RADIO_IMS_INDICATION RADIO_IMS_IFACE_PREFIX RADIO_IMS_INDICATION_IFACE
|
||||
|
||||
/* Transaction codes */
|
||||
|
||||
/* c(req,resp,Name,CALL_NAME) */
|
||||
#define RADIO_IMS_CALL_1(c) \
|
||||
c(1,1,setSrvccCallInfo,SET_SRVCC_CALL_INFO) \
|
||||
c(2,2,updateImsRegistrationInfo,UPDATE_IMS_REGISTRATION_INFO) \
|
||||
c(3,3,startImsTraffic,START_IMS_TRAFFIC) \
|
||||
c(4,4,stopImsTraffic,STOP_IMS_TRAFFIC) \
|
||||
c(5,5,triggerEpsFallback,TRIGGER_EPS_FALLBACK) \
|
||||
c(7,6,sendAnbrQuery,SEND_ANBR_QUERY) \
|
||||
c(8,7,updateImsCallStatus,UPDATE_IMS_CALL_STATUS) \
|
||||
|
||||
/* i(code,Name,IND_NAME) */
|
||||
#define RADIO_IMS_IND_1(i) \
|
||||
i(1,onConnectionSetupFailure,ON_CONNECTION_SETUP_FAILURE) \
|
||||
i(2,notifyAnbr,NOTIFY_ANBR) \
|
||||
i(3,triggerImsDeregistration,TRIGGER_IMS_DEREGISTRATION) \
|
||||
|
||||
typedef enum radio_ims_req {
|
||||
RADIO_IMS_REQ_ANY = 0,
|
||||
RADIO_IMS_REQ_NONE = 0,
|
||||
#define RADIO_IMS_REQ_(req,resp,Name,NAME) RADIO_IMS_REQ_##NAME = req,
|
||||
|
||||
/* android.hardware.radio.ims.IRadioIms v1 */
|
||||
RADIO_IMS_CALL_1(RADIO_IMS_REQ_)
|
||||
RADIO_IMS_REQ_SET_RESPONSE_FUNCTIONS = 6, /* setResponseFunctions */
|
||||
RADIO_IMS_1_REQ_LAST = RADIO_IMS_REQ_UPDATE_IMS_CALL_STATUS,
|
||||
|
||||
#undef RADIO_IMS_REQ_
|
||||
} RADIO_IMS_REQ;
|
||||
G_STATIC_ASSERT(sizeof(RADIO_IMS_REQ) == 4);
|
||||
|
||||
typedef enum radio_ims_resp {
|
||||
RADIO_IMS_RESP_ANY = 0,
|
||||
RADIO_IMS_RESP_NONE = 0,
|
||||
#define RADIO_IMS_RESP_(req,resp,Name,NAME) RADIO_IMS_RESP_##NAME = resp,
|
||||
|
||||
/* android.hardware.radio.ims.IRadioImsResponse v1 */
|
||||
RADIO_IMS_CALL_1(RADIO_IMS_RESP_)
|
||||
RADIO_IMS_1_RESP_LAST = RADIO_IMS_RESP_UPDATE_IMS_CALL_STATUS,
|
||||
|
||||
#undef RADIO_IMS_RESP_
|
||||
} RADIO_IMS_RESP;
|
||||
G_STATIC_ASSERT(sizeof(RADIO_IMS_RESP) == 4);
|
||||
|
||||
typedef enum radio_ims_ind {
|
||||
RADIO_IMS_IND_ANY = 0,
|
||||
RADIO_IMS_IND_NONE = 0,
|
||||
#define RADIO_IMS_IND_(code,Name,NAME) RADIO_IMS_IND_##NAME = code,
|
||||
|
||||
/* android.hardware.radio.ims.IRadioImsIndication v1 */
|
||||
RADIO_IMS_IND_1(RADIO_IMS_IND_)
|
||||
RADIO_IMS_1_IND_LAST = RADIO_IMS_IND_TRIGGER_IMS_DEREGISTRATION,
|
||||
|
||||
#undef RADIO_IMS_IND_
|
||||
} RADIO_IMS_IND;
|
||||
G_STATIC_ASSERT(sizeof(RADIO_IMS_IND) == 4);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* RADIO_IMS_TYPES_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* mode: C
|
||||
* c-basic-offset: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
#include <radio_types.h>
|
||||
#include <radio_data_types.h>
|
||||
#include <radio_ims_types.h>
|
||||
#include <radio_messaging_types.h>
|
||||
#include <radio_modem_types.h>
|
||||
#include <radio_network_types.h>
|
||||
|
||||
@@ -69,7 +69,7 @@ typedef enum radio_interface {
|
||||
typedef enum radio_aidl_interface {
|
||||
RADIO_AIDL_INTERFACE_NONE = -1,
|
||||
RADIO_DATA_INTERFACE,
|
||||
// RADIO_IMS_INTERFACE,
|
||||
RADIO_IMS_INTERFACE,
|
||||
RADIO_MESSAGING_INTERFACE,
|
||||
RADIO_MODEM_INTERFACE,
|
||||
RADIO_NETWORK_INTERFACE,
|
||||
|
||||
@@ -185,6 +185,7 @@ G_STATIC_ASSERT(G_N_ELEMENTS(radio_interfaces) == RADIO_INTERFACE_COUNT);
|
||||
|
||||
static const GBinderClientIfaceInfo radio_aidl_iface_info[] = {
|
||||
{RADIO_DATA, RADIO_DATA_1_REQ_LAST},
|
||||
{RADIO_IMS, RADIO_IMS_1_REQ_LAST},
|
||||
{RADIO_MESSAGING, RADIO_MESSAGING_1_REQ_LAST},
|
||||
{RADIO_MODEM, RADIO_MODEM_1_REQ_LAST},
|
||||
{RADIO_NETWORK, RADIO_NETWORK_1_REQ_LAST},
|
||||
@@ -202,6 +203,16 @@ static const char* const radio_data_response_ifaces[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char* const radio_ims_indication_ifaces[] = {
|
||||
RADIO_IMS_INDICATION,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char* const radio_ims_response_ifaces[] = {
|
||||
RADIO_IMS_RESPONSE,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char* const radio_messaging_indication_ifaces[] = {
|
||||
RADIO_MESSAGING_INDICATION,
|
||||
NULL
|
||||
@@ -261,6 +272,14 @@ static const RadioInterfaceDesc radio_aidl_interfaces[] = {
|
||||
radio_data_response_ifaces,
|
||||
RADIO_DATA_REQ_SET_RESPONSE_FUNCTIONS,
|
||||
},
|
||||
{
|
||||
RADIO_INTERFACE_NONE,
|
||||
RADIO_IMS_INTERFACE,
|
||||
RADIO_IMS,
|
||||
radio_ims_indication_ifaces,
|
||||
radio_ims_response_ifaces,
|
||||
RADIO_IMS_REQ_SET_RESPONSE_FUNCTIONS,
|
||||
},
|
||||
{
|
||||
RADIO_INTERFACE_NONE,
|
||||
RADIO_MESSAGING_INTERFACE,
|
||||
@@ -408,6 +427,7 @@ radio_instance_indication(
|
||||
|
||||
if (gutil_strv_contains((const GStrV*)radio_indication_ifaces, iface)
|
||||
|| gutil_strv_contains((const GStrV*)radio_data_indication_ifaces, iface)
|
||||
|| gutil_strv_contains((const GStrV*)radio_ims_indication_ifaces, iface)
|
||||
|| gutil_strv_contains((const GStrV*)radio_messaging_indication_ifaces, iface)
|
||||
|| gutil_strv_contains((const GStrV*)radio_modem_indication_ifaces, iface)
|
||||
|| gutil_strv_contains((const GStrV*)radio_network_indication_ifaces, iface)
|
||||
@@ -521,6 +541,13 @@ radio_instance_response(
|
||||
info = gbinder_reader_read_parcelable(&reader, &out_size);
|
||||
GASSERT(out_size >= sizeof(RadioResponseInfo));
|
||||
}
|
||||
} else if (gutil_strv_contains((const GStrV*)radio_ims_response_ifaces, iface)) {
|
||||
{
|
||||
/* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
|
||||
gsize out_size;
|
||||
info = gbinder_reader_read_parcelable(&reader, &out_size);
|
||||
GASSERT(out_size >= sizeof(RadioResponseInfo));
|
||||
}
|
||||
} else if (gutil_strv_contains((const GStrV*)radio_messaging_response_ifaces, iface)) {
|
||||
if (code == RADIO_MESSAGING_RESP_ACKNOWLEDGE_REQUEST) {
|
||||
gbinder_reader_read_int32(&reader, &ack_serial);
|
||||
|
||||
@@ -101,6 +101,16 @@ radio_req_name2(
|
||||
case RADIO_DATA_REQ_ANY:
|
||||
break;
|
||||
}
|
||||
} else if (instance->interface_aidl == RADIO_IMS_INTERFACE) {
|
||||
switch ((RADIO_IMS_REQ)req) {
|
||||
#define RADIO_IMS_REQ_(req,resp,Name,NAME) \
|
||||
case RADIO_IMS_REQ_##NAME: return #Name;
|
||||
RADIO_IMS_CALL_1(RADIO_IMS_REQ_)
|
||||
#undef RADIO_IMS_REQ_
|
||||
case RADIO_IMS_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions";
|
||||
case RADIO_IMS_REQ_ANY:
|
||||
break;
|
||||
}
|
||||
} else if (instance->interface_aidl == RADIO_MESSAGING_INTERFACE) {
|
||||
switch ((RADIO_MESSAGING_REQ)req) {
|
||||
#define RADIO_MESSAGING_REQ_(req,resp,Name,NAME) \
|
||||
@@ -227,6 +237,15 @@ radio_resp_name2(
|
||||
case RADIO_DATA_RESP_ANY:
|
||||
break;
|
||||
}
|
||||
} else if (instance->interface_aidl == RADIO_IMS_INTERFACE) {
|
||||
switch ((RADIO_IMS_RESP)resp) {
|
||||
#define RADIO_IMS_RESP_(req,resp,Name,NAME) \
|
||||
case RADIO_IMS_RESP_##NAME: return #Name "Response";
|
||||
RADIO_IMS_CALL_1(RADIO_IMS_RESP_)
|
||||
#undef RADIO_IMS_RESP_
|
||||
case RADIO_IMS_RESP_ANY:
|
||||
break;
|
||||
}
|
||||
} else if (instance->interface_aidl == RADIO_MESSAGING_INTERFACE) {
|
||||
switch ((RADIO_MESSAGING_RESP)resp) {
|
||||
case RADIO_MESSAGING_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
|
||||
@@ -316,6 +335,15 @@ radio_ind_name2(
|
||||
case RADIO_DATA_IND_ANY:
|
||||
break;
|
||||
}
|
||||
} else if (instance->interface_aidl == RADIO_IMS_INTERFACE) {
|
||||
switch ((RADIO_IMS_IND)ind) {
|
||||
#define RADIO_IMS_IND_(code,Name,NAME) \
|
||||
case RADIO_IMS_IND_##NAME: return #Name;
|
||||
RADIO_IMS_IND_1(RADIO_IMS_IND_)
|
||||
#undef RADIO_IMS_IND_
|
||||
case RADIO_IMS_IND_ANY:
|
||||
break;
|
||||
}
|
||||
} else if (instance->interface_aidl == RADIO_MESSAGING_INTERFACE) {
|
||||
switch ((RADIO_MESSAGING_IND)ind) {
|
||||
#define RADIO_MESSAGING_IND_(code,Name,NAME) \
|
||||
|
||||
Reference in New Issue
Block a user