Merge pull request #28 from mer-hybris/aidl
Add support for AIDL interfaces
This commit is contained in:
		@@ -74,6 +74,10 @@ RADIO_INTERFACE
 | 
				
			|||||||
radio_client_interface(
 | 
					radio_client_interface(
 | 
				
			||||||
    RadioClient* client);
 | 
					    RadioClient* client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RADIO_AIDL_INTERFACE
 | 
				
			||||||
 | 
					radio_client_aidl_interface(
 | 
				
			||||||
 | 
					    RadioClient* client); /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char*
 | 
					const char*
 | 
				
			||||||
radio_client_slot(
 | 
					radio_client_slot(
 | 
				
			||||||
    RadioClient* client);
 | 
					    RadioClient* client);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,7 @@
 | 
				
			|||||||
/* This API exists since 1.4.6 */
 | 
					/* This API exists since 1.4.6 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <radio_config_types.h>
 | 
					#include <radio_config_types.h>
 | 
				
			||||||
 | 
					#include <radio_config_aidl_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -83,6 +84,12 @@ radio_config_new_with_version(
 | 
				
			|||||||
    RADIO_CONFIG_INTERFACE max_version)
 | 
					    RADIO_CONFIG_INTERFACE max_version)
 | 
				
			||||||
    G_GNUC_WARN_UNUSED_RESULT;
 | 
					    G_GNUC_WARN_UNUSED_RESULT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RadioConfig*
 | 
				
			||||||
 | 
					radio_config_new_with_version_and_interface_type(
 | 
				
			||||||
 | 
					    RADIO_CONFIG_INTERFACE max_version,
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE interface_type)
 | 
				
			||||||
 | 
					    G_GNUC_WARN_UNUSED_RESULT; /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RadioConfig*
 | 
					RadioConfig*
 | 
				
			||||||
radio_config_ref(
 | 
					radio_config_ref(
 | 
				
			||||||
    RadioConfig* config);
 | 
					    RadioConfig* config);
 | 
				
			||||||
@@ -95,6 +102,10 @@ gboolean
 | 
				
			|||||||
radio_config_dead(
 | 
					radio_config_dead(
 | 
				
			||||||
    RadioConfig* config);
 | 
					    RadioConfig* config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RADIO_INTERFACE_TYPE
 | 
				
			||||||
 | 
					radio_config_interface_type(
 | 
				
			||||||
 | 
					    RadioConfig* self); /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RADIO_CONFIG_INTERFACE
 | 
					RADIO_CONFIG_INTERFACE
 | 
				
			||||||
radio_config_interface(
 | 
					radio_config_interface(
 | 
				
			||||||
    RadioConfig* config);
 | 
					    RadioConfig* config);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										161
									
								
								include/radio_config_aidl_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								include/radio_config_aidl_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,161 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_CONFIG_AIDL_TYPES_H
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <radio_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_config_aidl_interface {
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INTERFACE_NONE = -1,
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INTERFACE_1,
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INTERFACE_COUNT
 | 
				
			||||||
 | 
					} RADIO_CONFIG_AIDL_INTERFACE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_INTERFACE_MAX (RADIO_CONFIG_AIDL_INTERFACE_COUNT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_INSTANCE         "default"
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_IFACE_PREFIX     "android.hardware.radio.config."
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_IFACE            "IRadioConfig"
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_RESPONSE_IFACE   "IRadioConfigResponse"
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_INDICATION_IFACE "IRadioConfigIndication"
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL                  RADIO_CONFIG_AIDL_IFACE_PREFIX RADIO_CONFIG_AIDL_IFACE
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_FQNAME           RADIO_CONFIG_AIDL "/" RADIO_CONFIG_AIDL_INSTANCE
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_RESPONSE         RADIO_CONFIG_AIDL_IFACE_PREFIX RADIO_CONFIG_AIDL_RESPONSE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_INDICATION       RADIO_CONFIG_AIDL_IFACE_PREFIX RADIO_CONFIG_AIDL_INDICATION_IFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Types defined in android.hardware.radio.config package */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* PhoneCapability */
 | 
				
			||||||
 | 
					typedef struct radio_aidl_phone_capability {
 | 
				
			||||||
 | 
					    guint8 maxActiveData RADIO_ALIGNED(4);
 | 
				
			||||||
 | 
					    guint8 maxActiveInternetData RADIO_ALIGNED(4);
 | 
				
			||||||
 | 
					    guint8 isInternetLingeringSupported RADIO_ALIGNED(4);
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					        guint32 length;
 | 
				
			||||||
 | 
					        guint8 data[];
 | 
				
			||||||
 | 
					    } logicalModemList;
 | 
				
			||||||
 | 
					} RadioAidlPhoneCapability;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SimPortInfo */
 | 
				
			||||||
 | 
					typedef struct radio_aidl_sim_port_info {
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					        guint32 length;
 | 
				
			||||||
 | 
					        gchar data[];
 | 
				
			||||||
 | 
					    } iccId;
 | 
				
			||||||
 | 
					    gint32 logicalSlotId;
 | 
				
			||||||
 | 
					    gboolean portActive;
 | 
				
			||||||
 | 
					} RadioAidlSimPortInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SimSlotStatus */
 | 
				
			||||||
 | 
					typedef struct radio_aidl_sim_slot_status {
 | 
				
			||||||
 | 
					    RADIO_CARD_STATE cardState;
 | 
				
			||||||
 | 
					    GString* atr;
 | 
				
			||||||
 | 
					    GString* eid;
 | 
				
			||||||
 | 
					    struct {
 | 
				
			||||||
 | 
					        guint32 length;
 | 
				
			||||||
 | 
					        RadioAidlSimPortInfo data[];
 | 
				
			||||||
 | 
					    } portInfo;
 | 
				
			||||||
 | 
					} RadioAidlSimSlotStatus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transaction codes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* c(req,resp,Name,CALL_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_CALL_1(c) \
 | 
				
			||||||
 | 
					    c(1,1,getHalDeviceCapabilities,GET_HAL_DEVICE_CAPABILITIES) \
 | 
				
			||||||
 | 
					    c(2,2,getNumOfLiveModems,GET_NUM_OF_LIVE_MODEMS) \
 | 
				
			||||||
 | 
					    c(3,3,getPhoneCapability,GET_PHONE_CAPABILITY) \
 | 
				
			||||||
 | 
					    c(4,4,getSimSlotsStatus,GET_SIM_SLOTS_STATUS) \
 | 
				
			||||||
 | 
					    c(5,5,setNumOfLiveModems,SET_NUM_OF_LIVE_MODEMS) \
 | 
				
			||||||
 | 
					    c(6,6,setPreferredDataModem,SET_PREFERRED_DATA_MODEM) \
 | 
				
			||||||
 | 
					    c(8,7,setSimSlotsMapping,SET_SIM_SLOTS_MAPPING) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* i(code,Name,IND_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_IND_1(i) \
 | 
				
			||||||
 | 
					    i(1,simSlotsStatusChanged,SIM_SLOTS_STATUS_CHANGED) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_aidl_config_req {
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_REQ_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_REQ_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_REQ_(req,resp,Name,NAME) RADIO_CONFIG_AIDL_REQ_##NAME = req,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.config.IRadioConfig v1 */
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_REQ_SET_RESPONSE_FUNCTIONS = 7, /* setResponseFunctions */
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_CALL_1(RADIO_CONFIG_AIDL_REQ_)
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_1_REQ_LAST = RADIO_CONFIG_AIDL_REQ_SET_SIM_SLOTS_MAPPING,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_CONFIG_AIDL_REQ_
 | 
				
			||||||
 | 
					} RADIO_CONFIG_AIDL_REQ;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_CONFIG_AIDL_REQ) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_aidl_config_resp {
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_RESP_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_RESP_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_RESP_(req,resp,Name,NAME) RADIO_CONFIG_AIDL_RESP_##NAME = resp,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.config.IRadioConfigResponse v1 */
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_CALL_1(RADIO_CONFIG_AIDL_RESP_)
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_1_RESP_LAST = RADIO_CONFIG_AIDL_RESP_SET_SIM_SLOTS_MAPPING,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_CONFIG_AIDL_RESP_
 | 
				
			||||||
 | 
					} RADIO_CONFIG_AIDL_RESP;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_CONFIG_AIDL_RESP) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_aidl_config_ind {
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_IND_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_IND_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_IND_(code,Name,NAME) RADIO_CONFIG_AIDL_IND_##NAME = code,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.config.IRadioConfigIndication v1 */
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_IND_1(RADIO_CONFIG_AIDL_IND_)
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_1_IND_LAST = RADIO_CONFIG_AIDL_IND_SIM_SLOTS_STATUS_CHANGED,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_CONFIG_AIDL_IND_
 | 
				
			||||||
 | 
					} RADIO_CONFIG_AIDL_IND;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_CONFIG_AIDL_IND) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* RADIO_CONFIG_AIDL_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										134
									
								
								include/radio_data_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								include/radio_data_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,134 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_DATA_TYPES_H
 | 
				
			||||||
 | 
					#define RADIO_DATA_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gbinder_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_DATA_INTERFACE_MAX (RADIO_DATA_INTERFACE_COUNT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_DATA_INSTANCE         "default"
 | 
				
			||||||
 | 
					#define RADIO_DATA_IFACE_PREFIX     "android.hardware.radio.data."
 | 
				
			||||||
 | 
					#define RADIO_DATA_IFACE            "IRadioData"
 | 
				
			||||||
 | 
					#define RADIO_DATA_RESPONSE_IFACE   "IRadioDataResponse"
 | 
				
			||||||
 | 
					#define RADIO_DATA_INDICATION_IFACE "IRadioDataIndication"
 | 
				
			||||||
 | 
					#define RADIO_DATA                  RADIO_DATA_IFACE_PREFIX RADIO_DATA_IFACE
 | 
				
			||||||
 | 
					#define RADIO_DATA_FQNAME           RADIO_DATA "/" RADIO_DATA_INSTANCE
 | 
				
			||||||
 | 
					#define RADIO_DATA_RESPONSE         RADIO_DATA_IFACE_PREFIX RADIO_DATA_RESPONSE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_DATA_INDICATION       RADIO_DATA_IFACE_PREFIX RADIO_DATA_INDICATION_IFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transaction codes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* c(req,resp,Name,CALL_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_DATA_CALL_1(c) \
 | 
				
			||||||
 | 
					    c(1,2,allocatePduSessionId,ALLOCATE_PDU_SESSION_ID) \
 | 
				
			||||||
 | 
					    c(2,3,cancelHandover,CANCEL_HANDOVER) \
 | 
				
			||||||
 | 
					    c(3,4,deactivateDataCall,DEACTIVATE_DATA_CALL) \
 | 
				
			||||||
 | 
					    c(4,5,getDataCallList,GET_DATA_CALL_LIST) \
 | 
				
			||||||
 | 
					    c(5,6,getSlicingConfig,GET_SLICING_CONFIG) \
 | 
				
			||||||
 | 
					    c(6,7,releasePduSessionId,RELEASE_PDU_SESSION_ID) \
 | 
				
			||||||
 | 
					    c(8,8,setDataAllowed,SET_DATA_ALLOWED) \
 | 
				
			||||||
 | 
					    c(9,9,setDataProfile,SET_DATA_PROFILE) \
 | 
				
			||||||
 | 
					    c(10,10,setDataThrottling,SET_DATA_THROTTLING) \
 | 
				
			||||||
 | 
					    c(11,11,setInitialAttachApn,SET_INITIAL_ATTACH_APN) \
 | 
				
			||||||
 | 
					    c(13,12,setupDataCall,SETUP_DATA_CALL) \
 | 
				
			||||||
 | 
					    c(14,13,startHandover,START_HANDOVER) \
 | 
				
			||||||
 | 
					    c(15,14,startKeepalive,START_KEEPALIVE) \
 | 
				
			||||||
 | 
					    c(16,15,stopKeepalive,STOP_KEEPALIVE) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* i(code,Name,IND_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_DATA_IND_1(i) \
 | 
				
			||||||
 | 
					    i(1,dataCallListChanged,DATA_CALL_LIST_CHANGED) \
 | 
				
			||||||
 | 
					    i(2,keepaliveStatus,KEEPALIVE_STATUS) \
 | 
				
			||||||
 | 
					    i(3,pcoData,PCO_DATA) \
 | 
				
			||||||
 | 
					    i(4,unthrottleApn,UNTHROTTLE_APN) \
 | 
				
			||||||
 | 
					    i(5,slicingConfigChanged,SLICING_CONFIG_CHANGED) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_data_req {
 | 
				
			||||||
 | 
					    RADIO_DATA_REQ_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_DATA_REQ_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_DATA_REQ_(req,resp,Name,NAME) RADIO_DATA_REQ_##NAME = req,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.data.IRadioData v1 */
 | 
				
			||||||
 | 
					    RADIO_DATA_CALL_1(RADIO_DATA_REQ_)
 | 
				
			||||||
 | 
					    RADIO_DATA_REQ_RESPONSE_ACKNOWLEDGEMENT = 7, /* responseAcknowledgement */
 | 
				
			||||||
 | 
					    RADIO_DATA_REQ_SET_RESPONSE_FUNCTIONS = 12, /* setResponseFunctions */
 | 
				
			||||||
 | 
					    RADIO_DATA_1_REQ_LAST = RADIO_DATA_REQ_STOP_KEEPALIVE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_DATA_REQ_
 | 
				
			||||||
 | 
					} RADIO_DATA_REQ;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_DATA_REQ) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_data_resp {
 | 
				
			||||||
 | 
					    RADIO_DATA_RESP_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_DATA_RESP_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_DATA_RESP_(req,resp,Name,NAME) RADIO_DATA_RESP_##NAME = resp,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.data.IRadioDataResponse v1 */
 | 
				
			||||||
 | 
					    RADIO_DATA_CALL_1(RADIO_DATA_RESP_)
 | 
				
			||||||
 | 
					    RADIO_DATA_RESP_ACKNOWLEDGE_REQUEST = 1, /* acknowledgeRequest */
 | 
				
			||||||
 | 
					    RADIO_DATA_1_RESP_LAST = RADIO_DATA_RESP_STOP_KEEPALIVE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_DATA_RESP_
 | 
				
			||||||
 | 
					} RADIO_DATA_RESP;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_DATA_RESP) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_data_ind {
 | 
				
			||||||
 | 
					    RADIO_DATA_IND_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_DATA_IND_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_DATA_IND_(code,Name,NAME) RADIO_DATA_IND_##NAME = code,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.data.IRadioDataIndication v1 */
 | 
				
			||||||
 | 
					    RADIO_DATA_IND_1(RADIO_DATA_IND_)
 | 
				
			||||||
 | 
					    RADIO_DATA_1_IND_LAST = RADIO_DATA_IND_SLICING_CONFIG_CHANGED,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_DATA_IND_
 | 
				
			||||||
 | 
					} RADIO_DATA_IND;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_DATA_IND) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* RADIO_DATA_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										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:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
@@ -38,6 +38,13 @@
 | 
				
			|||||||
#define RADIO_INSTANCE_H
 | 
					#define RADIO_INSTANCE_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <radio_types.h>
 | 
					#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>
 | 
				
			||||||
 | 
					#include <radio_sim_types.h>
 | 
				
			||||||
 | 
					#include <radio_voice_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <glib-object.h>
 | 
					#include <glib-object.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,6 +67,9 @@ struct radio_instance {
 | 
				
			|||||||
    RADIO_INTERFACE version;
 | 
					    RADIO_INTERFACE version;
 | 
				
			||||||
    /* Since 1.4.3 */
 | 
					    /* Since 1.4.3 */
 | 
				
			||||||
    gboolean connected; /* rilConnected received */
 | 
					    gboolean connected; /* rilConnected received */
 | 
				
			||||||
 | 
					    /* Since 1.6.0 */
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE interface_type;
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE interface_aidl;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* These were introduced in 1.4.3 and then renamed in 1.4.6 */
 | 
					/* These were introduced in 1.4.3 and then renamed in 1.4.6 */
 | 
				
			||||||
@@ -156,6 +166,15 @@ radio_instance_new_with_modem_slot_and_version(
 | 
				
			|||||||
    int slot_index,
 | 
					    int slot_index,
 | 
				
			||||||
    RADIO_INTERFACE version); /* Since 1.2.1 */
 | 
					    RADIO_INTERFACE version); /* Since 1.2.1 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RadioInstance*
 | 
				
			||||||
 | 
					radio_instance_new_with_modem_slot_version_and_interface(
 | 
				
			||||||
 | 
					    const char* dev,
 | 
				
			||||||
 | 
					    const char* name,
 | 
				
			||||||
 | 
					    const char* modem,
 | 
				
			||||||
 | 
					    int slot,
 | 
				
			||||||
 | 
					    RADIO_INTERFACE version,
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE aidl_interface); /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RadioInstance*
 | 
					RadioInstance*
 | 
				
			||||||
radio_instance_get(
 | 
					radio_instance_get(
 | 
				
			||||||
    const char* dev,
 | 
					    const char* dev,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										143
									
								
								include/radio_messaging_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								include/radio_messaging_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,143 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_MESSAGING_TYPES_H
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gbinder_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_INTERFACE_MAX (RADIO_MESSAGING_INTERFACE_COUNT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_INSTANCE         "default"
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_IFACE_PREFIX     "android.hardware.radio.messaging."
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_IFACE            "IRadioMessaging"
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_RESPONSE_IFACE   "IRadioMessagingResponse"
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_INDICATION_IFACE "IRadioMessagingIndication"
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING                  RADIO_MESSAGING_IFACE_PREFIX RADIO_MESSAGING_IFACE
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_FQNAME           RADIO_MESSAGING "/" RADIO_MESSAGING_INSTANCE
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_RESPONSE         RADIO_MESSAGING_IFACE_PREFIX RADIO_MESSAGING_RESPONSE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_INDICATION       RADIO_MESSAGING_IFACE_PREFIX RADIO_MESSAGING_INDICATION_IFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transaction codes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* c(req,resp,Name,CALL_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_CALL_1(c) \
 | 
				
			||||||
 | 
					    c(1,1,acknowledgeIncomingGsmSmsWithPdu,ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU) \
 | 
				
			||||||
 | 
					    c(2,2,acknowledgeLastIncomingCdmaSms,ACKNOWLEDGE_LAST_INCOMING_CDMA_SMS) \
 | 
				
			||||||
 | 
					    c(3,3,acknowledgeLastIncomingGsmSms,ACKNOWLEDGE_LAST_INCOMING_GSM_SMS) \
 | 
				
			||||||
 | 
					    c(4,5,deleteSmsOnRuim,DELETE_SMS_ON_RUIM) \
 | 
				
			||||||
 | 
					    c(5,6,deleteSmsOnSim,DELETE_SMS_ON_SIM) \
 | 
				
			||||||
 | 
					    c(6,7,getCdmaBroadcastConfig,GET_CDMA_BROADCAST_CONFIG) \
 | 
				
			||||||
 | 
					    c(7,8,getGsmBroadcastConfig,GET_GSM_BROADCAST_CONFIG) \
 | 
				
			||||||
 | 
					    c(8,9,getSmscAddress,GET_SMSC_ADDRESS) \
 | 
				
			||||||
 | 
					    c(9,10,reportSmsMemoryStatus,REPORT_SMS_MEMORY_STATUS) \
 | 
				
			||||||
 | 
					    c(11,12,sendCdmaSms,SEND_CDMA_SMS) \
 | 
				
			||||||
 | 
					    c(12,11,sendCdmaSmsExpectMore,SEND_CDMA_SMS_EXPECT_MORE) \
 | 
				
			||||||
 | 
					    c(13,13,sendImsSms,SEND_IMS_SMS) \
 | 
				
			||||||
 | 
					    c(14,15,sendSms,SEND_SMS) \
 | 
				
			||||||
 | 
					    c(15,14,sendSmsExpectMore,SEND_SMS_EXPECT_MORE) \
 | 
				
			||||||
 | 
					    c(16,16,setCdmaBroadcastActivation,SET_CDMA_BROADCAST_ACTIVATION) \
 | 
				
			||||||
 | 
					    c(17,17,setCdmaBroadcastConfig,SET_CDMA_BROADCAST_CONFIG) \
 | 
				
			||||||
 | 
					    c(18,18,setGsmBroadcastActivation,SET_GSM_BROADCAST_ACTIVATION) \
 | 
				
			||||||
 | 
					    c(19,19,setGsmBroadcastConfig,SET_GSM_BROADCAST_CONFIG) \
 | 
				
			||||||
 | 
					    c(21,20,setSmscAddress,SET_SMSC_ADDRESS) \
 | 
				
			||||||
 | 
					    c(22,21,writeSmsToRuim,WRITE_SMS_TO_RUIM) \
 | 
				
			||||||
 | 
					    c(23,22,writeSmsToSim,WRITE_SMS_TO_SIM) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* i(code,Name,IND_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_IND_1(i) \
 | 
				
			||||||
 | 
					    i(1,cdmaNewSms,CDMA_NEW_SMS) \
 | 
				
			||||||
 | 
					    i(2,cdmaRuimSmsStorageFull,CDMA_RUIM_SMS_STORAGE_FULL) \
 | 
				
			||||||
 | 
					    i(3,newBroadcastSms,NEW_BROADCAST_SMS) \
 | 
				
			||||||
 | 
					    i(4,newSms,NEW_SMS) \
 | 
				
			||||||
 | 
					    i(5,newSmsOnSim,NEW_SMS_ON_SIM) \
 | 
				
			||||||
 | 
					    i(6,newSmsStatusReport,NEW_SMS_STATUS_REPORT) \
 | 
				
			||||||
 | 
					    i(7,simSmsStorageFull,SIM_SMS_STORAGE_FULL) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_messaging_req {
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_REQ_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_REQ_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_REQ_(req,resp,Name,NAME) RADIO_MESSAGING_REQ_##NAME = req,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.messaging.IRadioMessaging v1 */
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_CALL_1(RADIO_MESSAGING_REQ_)
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_REQ_RESPONSE_ACKNOWLEDGEMENT = 10, /* responseAcknowledgement */
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_REQ_SET_RESPONSE_FUNCTIONS = 20, /* setResponseFunctions */
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_1_REQ_LAST = RADIO_MESSAGING_REQ_WRITE_SMS_TO_SIM,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_MESSAGING_REQ_
 | 
				
			||||||
 | 
					} RADIO_MESSAGING_REQ;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_MESSAGING_REQ) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_messaging_resp {
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_RESP_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_RESP_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_RESP_(req,resp,Name,NAME) RADIO_MESSAGING_RESP_##NAME = resp,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.messaging.IRadioMessagingResponse v1 */
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_CALL_1(RADIO_MESSAGING_RESP_)
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_RESP_ACKNOWLEDGE_REQUEST = 4, /* acknowledgeRequest */
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_1_RESP_LAST = RADIO_MESSAGING_RESP_WRITE_SMS_TO_SIM,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_MESSAGING_RESP_
 | 
				
			||||||
 | 
					} RADIO_MESSAGING_RESP;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_MESSAGING_RESP) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_messaging_ind {
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_IND_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_IND_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_IND_(code,Name,NAME) RADIO_MESSAGING_IND_##NAME = code,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.messaging.IRadioMessagingIndication v1 */
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_IND_1(RADIO_MESSAGING_IND_)
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_1_IND_LAST = RADIO_MESSAGING_IND_SIM_SMS_STORAGE_FULL,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_MESSAGING_IND_
 | 
				
			||||||
 | 
					} RADIO_MESSAGING_IND;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_MESSAGING_IND) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* RADIO_MESSAGING_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										135
									
								
								include/radio_modem_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								include/radio_modem_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,135 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_MODEM_TYPES_H
 | 
				
			||||||
 | 
					#define RADIO_MODEM_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gbinder_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_MODEM_INTERFACE_MAX (RADIO_MODEM_INTERFACE_COUNT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_MODEM_INSTANCE         "default"
 | 
				
			||||||
 | 
					#define RADIO_MODEM_IFACE_PREFIX     "android.hardware.radio.modem."
 | 
				
			||||||
 | 
					#define RADIO_MODEM_IFACE            "IRadioModem"
 | 
				
			||||||
 | 
					#define RADIO_MODEM_RESPONSE_IFACE   "IRadioModemResponse"
 | 
				
			||||||
 | 
					#define RADIO_MODEM_INDICATION_IFACE "IRadioModemIndication"
 | 
				
			||||||
 | 
					#define RADIO_MODEM                  RADIO_MODEM_IFACE_PREFIX RADIO_MODEM_IFACE
 | 
				
			||||||
 | 
					#define RADIO_MODEM_FQNAME           RADIO_MODEM "/" RADIO_MODEM_INSTANCE
 | 
				
			||||||
 | 
					#define RADIO_MODEM_RESPONSE         RADIO_MODEM_IFACE_PREFIX RADIO_MODEM_RESPONSE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_MODEM_INDICATION       RADIO_MODEM_IFACE_PREFIX RADIO_MODEM_INDICATION_IFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transaction codes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* c(req,resp,Name,CALL_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_MODEM_CALL_1(c) \
 | 
				
			||||||
 | 
					    c(1,2,enableModem,ENABLE_MODEM) \
 | 
				
			||||||
 | 
					    c(2,3,getBasebandVersion,GET_BASEBAND_VERSION) \
 | 
				
			||||||
 | 
					    c(3,4,getDeviceIdentity,GET_DEVICE_IDENTITY) \
 | 
				
			||||||
 | 
					    c(4,5,getHardwareConfig,GET_HARDWARE_CONFIG) \
 | 
				
			||||||
 | 
					    c(5,6,getModemActivityInfo,GET_MODEM_ACTIVITY_INFO) \
 | 
				
			||||||
 | 
					    c(6,7,getModemStackStatus,GET_MODEM_STACK_STATUS) \
 | 
				
			||||||
 | 
					    c(7,8,getRadioCapability,GET_RADIO_CAPABILITY) \
 | 
				
			||||||
 | 
					    c(8,9,nvReadItem,NV_READ_ITEM) \
 | 
				
			||||||
 | 
					    c(9,10,nvResetConfig,NV_RESET_CONFIG) \
 | 
				
			||||||
 | 
					    c(10,11,nvWriteCdmaPrl,NV_WRITE_CDMA_PRL) \
 | 
				
			||||||
 | 
					    c(11,12,nvWriteItem,NV_WRITE_ITEM) \
 | 
				
			||||||
 | 
					    c(12,13,requestShutdown,REQUEST_SHUTDOWN) \
 | 
				
			||||||
 | 
					    c(14,14,sendDeviceState,SEND_DEVICE_STATE) \
 | 
				
			||||||
 | 
					    c(15,15,setRadioCapability,SET_RADIO_CAPABILITY) \
 | 
				
			||||||
 | 
					    c(16,16,setRadioPower,SET_RADIO_POWER) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* i(code,Name,IND_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_MODEM_IND_1(i) \
 | 
				
			||||||
 | 
					    i(1,hardwareConfigChanged,HARDWARE_CONFIG_CHANGED) \
 | 
				
			||||||
 | 
					    i(2,modemReset,MODEM_RESET) \
 | 
				
			||||||
 | 
					    i(3,radioCapabilityIndication,RADIO_CAPABILITY_INDICATION) \
 | 
				
			||||||
 | 
					    i(4,radioStateChanged,RADIO_STATE_CHANGED) \
 | 
				
			||||||
 | 
					    i(5,rilConnected,RIL_CONNECTED) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_modem_req {
 | 
				
			||||||
 | 
					    RADIO_MODEM_REQ_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_MODEM_REQ_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_MODEM_REQ_(req,resp,Name,NAME) RADIO_MODEM_REQ_##NAME = req,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.modem.IRadioModem v1 */
 | 
				
			||||||
 | 
					    RADIO_MODEM_CALL_1(RADIO_MODEM_REQ_)
 | 
				
			||||||
 | 
					    RADIO_MODEM_REQ_RESPONSE_ACKNOWLEDGEMENT = 13, /* responseAcknowledgement */
 | 
				
			||||||
 | 
					    RADIO_MODEM_REQ_SET_RESPONSE_FUNCTIONS = 17, /* setResponseFunctions */
 | 
				
			||||||
 | 
					    RADIO_MODEM_1_REQ_LAST = RADIO_MODEM_REQ_SET_RESPONSE_FUNCTIONS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_MODEM_REQ_
 | 
				
			||||||
 | 
					} RADIO_MODEM_REQ;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_MODEM_REQ) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_modem_resp {
 | 
				
			||||||
 | 
					    RADIO_MODEM_RESP_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_MODEM_RESP_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_MODEM_RESP_(req,resp,Name,NAME) RADIO_MODEM_RESP_##NAME = resp,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.modem.IRadioModemResponse v1 */
 | 
				
			||||||
 | 
					    RADIO_MODEM_CALL_1(RADIO_MODEM_RESP_)
 | 
				
			||||||
 | 
					    RADIO_MODEM_RESP_ACKNOWLEDGE_REQUEST = 1, /* acknowledgeRequest */
 | 
				
			||||||
 | 
					    RADIO_MODEM_1_RESP_LAST = RADIO_MODEM_RESP_SET_RADIO_POWER,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_MODEM_RESP_
 | 
				
			||||||
 | 
					} RADIO_MODEM_RESP;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_MODEM_RESP) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_modem_ind {
 | 
				
			||||||
 | 
					    RADIO_MODEM_IND_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_MODEM_IND_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_MODEM_IND_(code,Name,NAME) RADIO_MODEM_IND_##NAME = code,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.modem.IRadioModemIndication v1 */
 | 
				
			||||||
 | 
					    RADIO_MODEM_IND_1(RADIO_MODEM_IND_)
 | 
				
			||||||
 | 
					    RADIO_MODEM_1_IND_LAST = RADIO_MODEM_IND_RIL_CONNECTED,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_MODEM_IND_
 | 
				
			||||||
 | 
					} RADIO_MODEM_IND;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_MODEM_IND) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* RADIO_MODEM_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										163
									
								
								include/radio_network_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								include/radio_network_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,163 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_NETWORK_TYPES_H
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gbinder_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_INTERFACE_MAX (RADIO_NETWORK_INTERFACE_COUNT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_INSTANCE         "default"
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_IFACE_PREFIX     "android.hardware.radio.network."
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_IFACE            "IRadioNetwork"
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_RESPONSE_IFACE   "IRadioNetworkResponse"
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_INDICATION_IFACE "IRadioNetworkIndication"
 | 
				
			||||||
 | 
					#define RADIO_NETWORK                  RADIO_NETWORK_IFACE_PREFIX RADIO_NETWORK_IFACE
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_FQNAME           RADIO_NETWORK "/" RADIO_NETWORK_INSTANCE
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_RESPONSE         RADIO_NETWORK_IFACE_PREFIX RADIO_NETWORK_RESPONSE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_INDICATION       RADIO_NETWORK_IFACE_PREFIX RADIO_NETWORK_INDICATION_IFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transaction codes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* c(req,resp,Name,CALL_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_CALL_1(c) \
 | 
				
			||||||
 | 
					    c(1,2,getAllowedNetworkTypesBitmap,GET_ALLOWED_NETWORK_TYPES_BITMAP) \
 | 
				
			||||||
 | 
					    c(2,3,getAvailableBandModes,GET_AVAILABLE_BAND_MODES) \
 | 
				
			||||||
 | 
					    c(3,4,getAvailableNetworks,GET_AVAILABLE_NETWORKS) \
 | 
				
			||||||
 | 
					    c(4,5,getBarringInfo,GET_BARRING_INFO) \
 | 
				
			||||||
 | 
					    c(5,6,getCdmaRoamingPreference,GET_CDMA_ROAMING_PREFERENCE) \
 | 
				
			||||||
 | 
					    c(6,7,getCellInfoList,GET_CELL_INFO_LIST) \
 | 
				
			||||||
 | 
					    c(7,8,getDataRegistrationState,GET_DATA_REGISTRATION_STATE) \
 | 
				
			||||||
 | 
					    c(8,9,getImsRegistrationState,GET_IMS_REGISTRATION_STATE) \
 | 
				
			||||||
 | 
					    c(9,10,getNetworkSelectionMode,GET_NETWORK_SELECTION_MODE) \
 | 
				
			||||||
 | 
					    c(10,11,getOperator,GET_OPERATOR) \
 | 
				
			||||||
 | 
					    c(11,12,getSignalStrength,GET_SIGNAL_STRENGTH) \
 | 
				
			||||||
 | 
					    c(12,13,getSystemSelectionChannels,GET_SYSTEM_SELECTION_CHANNELS) \
 | 
				
			||||||
 | 
					    c(13,14,getVoiceRadioTechnology,GET_VOICE_RADIO_TECHNOLOGY) \
 | 
				
			||||||
 | 
					    c(14,15,getVoiceRegistrationState,GET_VOICE_REGISTRATION_STATE) \
 | 
				
			||||||
 | 
					    c(15,16,isNrDualConnectivityEnabled,IS_NR_DUAL_CONNECTIVITY_ENABLED) \
 | 
				
			||||||
 | 
					    c(17,17,setAllowedNetworkTypesBitmap,SET_ALLOWED_NETWORK_TYPES_BITMAP) \
 | 
				
			||||||
 | 
					    c(18,18,setBandMode,SET_BAND_MODE) \
 | 
				
			||||||
 | 
					    c(19,19,setBarringPassword,SET_BARRING_PASSWORD) \
 | 
				
			||||||
 | 
					    c(20,20,setCdmaRoamingPreference,SET_CDMA_ROAMING_PREFERENCE) \
 | 
				
			||||||
 | 
					    c(21,21,setCellInfoListRate,SET_CELL_INFO_LIST_RATE) \
 | 
				
			||||||
 | 
					    c(22,22,setIndicationFilter,SET_INDICATION_FILTER) \
 | 
				
			||||||
 | 
					    c(23,23,setLinkCapacityReportingCriteria,SET_LINK_CAPACITY_REPORTING_CRITERIA) \
 | 
				
			||||||
 | 
					    c(24,24,setLocationUpdates,SET_LOCATION_UPDATES) \
 | 
				
			||||||
 | 
					    c(25,25,setNetworkSelectionModeAutomatic,SET_NETWORK_SELECTION_MODE_AUTOMATIC) \
 | 
				
			||||||
 | 
					    c(26,26,setNetworkSelectionModeManual,SET_NETWORK_SELECTION_MODE_MANUAL) \
 | 
				
			||||||
 | 
					    c(27,27,setNrDualConnectivityState,SET_NR_DUAL_CONNECTIVITY_STATE) \
 | 
				
			||||||
 | 
					    c(29,28,setSignalStrengthReportingCriteria,SET_SIGNAL_STRENGTH_REPORTING_CRITERIA) \
 | 
				
			||||||
 | 
					    c(30,29,setSuppServiceNotifications,SET_SUPP_SERVICE_NOTIFICATIONS) \
 | 
				
			||||||
 | 
					    c(31,30,setSystemSelectionChannels,SET_SYSTEM_SELECTION_CHANNELS) \
 | 
				
			||||||
 | 
					    c(32,31,startNetworkScan,START_NETWORK_SCAN) \
 | 
				
			||||||
 | 
					    c(33,32,stopNetworkScan,STOP_NETWORK_SCAN) \
 | 
				
			||||||
 | 
					    c(34,33,supplyNetworkDepersonalization,SUPPLY_NETWORK_DEPERSONALIZATION) \
 | 
				
			||||||
 | 
					    c(35,34,setUsageSetting,SET_USAGE_SETTING) \
 | 
				
			||||||
 | 
					    c(36,35,getUsageSetting,GET_USAGE_SETTING) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* i(code,Name,IND_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_IND_1(i) \
 | 
				
			||||||
 | 
					    i(1,barringInfoChanged,BARRING_INFO_CHANGED) \
 | 
				
			||||||
 | 
					    i(2,cdmaPrlChanged,CDMA_PRL_CHANGED) \
 | 
				
			||||||
 | 
					    i(3,cellInfoList,CELL_INFO_LIST) \
 | 
				
			||||||
 | 
					    i(4,currentLinkCapacityEstimate,CURRENT_LINK_CAPACITY_ESTIMATE) \
 | 
				
			||||||
 | 
					    i(5,currentPhysicalChannelConfigs,CURRENT_PHYSICAL_CHANNEL_CONFIGS) \
 | 
				
			||||||
 | 
					    i(6,currentSignalStrength,CURRENT_SIGNAL_STRENGTH) \
 | 
				
			||||||
 | 
					    i(7,imsNetworkStateChanged,IMS_NETWORK_STATE_CHANGED) \
 | 
				
			||||||
 | 
					    i(8,networkScanResult,NETWORK_SCAN_RESULT) \
 | 
				
			||||||
 | 
					    i(9,networkStateChanged,NETWORK_STATE_CHANGED) \
 | 
				
			||||||
 | 
					    i(10,nitzTimeReceived,NITZ_TIME_RECEIVED) \
 | 
				
			||||||
 | 
					    i(11,registrationFailed,REGISTRATION_FAILED) \
 | 
				
			||||||
 | 
					    i(12,restrictedStateChanged,RESTRICTED_STATE_CHANGED) \
 | 
				
			||||||
 | 
					    i(13,suppSvcNotify,SUPP_SVC_NOTIFY) \
 | 
				
			||||||
 | 
					    i(14,voiceRadioTechChanged,VOICE_RADIO_TECH_CHANGED) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_network_req {
 | 
				
			||||||
 | 
					    RADIO_NETWORK_REQ_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_NETWORK_REQ_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_REQ_(req,resp,Name,NAME) RADIO_NETWORK_REQ_##NAME = req,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.network.IRadioNetwork v1 */
 | 
				
			||||||
 | 
					    RADIO_NETWORK_CALL_1(RADIO_NETWORK_REQ_)
 | 
				
			||||||
 | 
					    RADIO_NETWORK_REQ_RESPONSE_ACKNOWLEDGEMENT = 16, /* responseAcknowledgement */
 | 
				
			||||||
 | 
					    RADIO_NETWORK_REQ_SET_RESPONSE_FUNCTIONS = 28, /* setResponseFunctions */
 | 
				
			||||||
 | 
					    RADIO_NETWORK_1_REQ_LAST = RADIO_NETWORK_REQ_GET_USAGE_SETTING,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_NETWORK_REQ_
 | 
				
			||||||
 | 
					} RADIO_NETWORK_REQ;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_NETWORK_REQ) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_network_resp {
 | 
				
			||||||
 | 
					    RADIO_NETWORK_RESP_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_NETWORK_RESP_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_RESP_(req,resp,Name,NAME) RADIO_NETWORK_RESP_##NAME = resp,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.network.IRadioNetworkResponse v1 */
 | 
				
			||||||
 | 
					    RADIO_NETWORK_CALL_1(RADIO_NETWORK_RESP_)
 | 
				
			||||||
 | 
					    RADIO_NETWORK_RESP_ACKNOWLEDGE_REQUEST = 1, /* acknowledgeRequest */
 | 
				
			||||||
 | 
					    RADIO_NETWORK_1_RESP_LAST = RADIO_NETWORK_RESP_GET_USAGE_SETTING,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_NETWORK_RESP_
 | 
				
			||||||
 | 
					} RADIO_NETWORK_RESP;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_NETWORK_RESP) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_network_ind {
 | 
				
			||||||
 | 
					    RADIO_NETWORK_IND_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_NETWORK_IND_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_IND_(code,Name,NAME) RADIO_NETWORK_IND_##NAME = code,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.network.IRadioNetworkIndication v1 */
 | 
				
			||||||
 | 
					    RADIO_NETWORK_IND_1(RADIO_NETWORK_IND_)
 | 
				
			||||||
 | 
					    RADIO_NETWORK_1_IND_LAST = RADIO_NETWORK_IND_VOICE_RADIO_TECH_CHANGED,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_NETWORK_IND_
 | 
				
			||||||
 | 
					} RADIO_NETWORK_IND;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_NETWORK_IND) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* RADIO_NETWORK_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
							
								
								
									
										160
									
								
								include/radio_sim_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								include/radio_sim_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_SIM_TYPES_H
 | 
				
			||||||
 | 
					#define RADIO_SIM_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gbinder_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_SIM_INTERFACE_MAX (RADIO_SIM_INTERFACE_COUNT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_SIM_INSTANCE         "default"
 | 
				
			||||||
 | 
					#define RADIO_SIM_IFACE_PREFIX     "android.hardware.radio.sim."
 | 
				
			||||||
 | 
					#define RADIO_SIM_IFACE            "IRadioSim"
 | 
				
			||||||
 | 
					#define RADIO_SIM_RESPONSE_IFACE   "IRadioSimResponse"
 | 
				
			||||||
 | 
					#define RADIO_SIM_INDICATION_IFACE "IRadioSimIndication"
 | 
				
			||||||
 | 
					#define RADIO_SIM                  RADIO_SIM_IFACE_PREFIX RADIO_SIM_IFACE
 | 
				
			||||||
 | 
					#define RADIO_SIM_FQNAME           RADIO_SIM "/" RADIO_SIM_INSTANCE
 | 
				
			||||||
 | 
					#define RADIO_SIM_RESPONSE         RADIO_SIM_IFACE_PREFIX RADIO_SIM_RESPONSE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_SIM_INDICATION       RADIO_SIM_IFACE_PREFIX RADIO_SIM_INDICATION_IFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transaction codes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* c(req,resp,Name,CALL_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_SIM_CALL_1(c) \
 | 
				
			||||||
 | 
					    c(1,2,areUiccApplicationsEnabled,ARE_UICC_APPLICATIONS_ENABLED) \
 | 
				
			||||||
 | 
					    c(2,3,changeIccPin2ForApp,CHANGE_ICC_PIN2_FOR_APP) \
 | 
				
			||||||
 | 
					    c(3,4,changeIccPinForApp,CHANGE_ICC_PIN_FOR_APP) \
 | 
				
			||||||
 | 
					    c(4,5,enableUiccApplications,ENABLE_UICC_APPLICATIONS) \
 | 
				
			||||||
 | 
					    c(5,6,getAllowedCarriers,GET_ALLOWED_CARRIERS) \
 | 
				
			||||||
 | 
					    c(6,7,getCdmaSubscription,GET_CDMA_SUBSCRIPTION) \
 | 
				
			||||||
 | 
					    c(7,8,getCdmaSubscriptionSource,GET_CDMA_SUBSCRIPTION_SOURCE) \
 | 
				
			||||||
 | 
					    c(8,9,getFacilityLockForApp,GET_FACILITY_LOCK_FOR_APP) \
 | 
				
			||||||
 | 
					    c(9,10,getIccCardStatus,GET_ICC_CARD_STATUS) \
 | 
				
			||||||
 | 
					    c(10,11,getImsiForApp,GET_IMSI_FOR_APP) \
 | 
				
			||||||
 | 
					    c(11,12,getSimPhonebookCapacity,GET_SIM_PHONEBOOK_CAPACITY) \
 | 
				
			||||||
 | 
					    c(12,13,getSimPhonebookRecords,GET_SIM_PHONEBOOK_RECORDS) \
 | 
				
			||||||
 | 
					    c(13,14,iccCloseLogicalChannel,ICC_CLOSE_LOGICAL_CHANNEL) \
 | 
				
			||||||
 | 
					    c(14,15,iccIoForApp,ICC_IO_FOR_APP) \
 | 
				
			||||||
 | 
					    c(15,16,iccOpenLogicalChannel,ICC_OPEN_LOGICAL_CHANNEL) \
 | 
				
			||||||
 | 
					    c(16,17,iccTransmitApduBasicChannel,ICC_TRANSMIT_APDU_BASIC_CHANNEL) \
 | 
				
			||||||
 | 
					    c(17,18,iccTransmitApduLogicalChannel,ICC_TRANSMIT_APDU_LOGICAL_CHANNEL) \
 | 
				
			||||||
 | 
					    c(18,19,reportStkServiceIsRunning,REPORT_STK_SERVICE_IS_RUNNING) \
 | 
				
			||||||
 | 
					    c(19,20,requestIccSimAuthentication,REQUEST_ICC_SIM_AUTHENTICATION) \
 | 
				
			||||||
 | 
					    c(21,21,sendEnvelope,SEND_ENVELOPE) \
 | 
				
			||||||
 | 
					    c(22,22,sendEnvelopeWithStatus,SEND_ENVELOPE_WITH_STATUS) \
 | 
				
			||||||
 | 
					    c(23,23,sendTerminalResponseToSim,SEND_TERMINAL_RESPONSE_TO_SIM) \
 | 
				
			||||||
 | 
					    c(24,24,setAllowedCarriers,SET_ALLOWED_CARRIERS) \
 | 
				
			||||||
 | 
					    c(25,25,setCarrierInfoForImsiEncryption,SET_CARRIER_INFO_FOR_IMSI_ENCRYPTION) \
 | 
				
			||||||
 | 
					    c(26,26,setCdmaSubscriptionSource,SET_CDMA_SUBSCRIPTION_SOURCE) \
 | 
				
			||||||
 | 
					    c(27,27,setFacilityLockForApp,SET_FACILITY_LOCK_FOR_APP) \
 | 
				
			||||||
 | 
					    c(29,28,setSimCardPower,SET_SIM_CARD_POWER) \
 | 
				
			||||||
 | 
					    c(30,29,setUiccSubscription,SET_UICC_SUBSCRIPTION) \
 | 
				
			||||||
 | 
					    c(31,30,supplyIccPin2ForApp,SUPPLY_ICC_PIN2_FOR_APP) \
 | 
				
			||||||
 | 
					    c(32,31,supplyIccPinForApp,SUPPLY_ICC_PIN_FOR_APP) \
 | 
				
			||||||
 | 
					    c(33,32,supplyIccPuk2ForApp,SUPPLY_ICC_PUK2_FOR_APP) \
 | 
				
			||||||
 | 
					    c(34,33,supplyIccPukForApp,SUPPLY_ICC_PUK_FOR_APP) \
 | 
				
			||||||
 | 
					    c(35,34,supplySimDepersonalization,SUPPLY_SIM_DEPERSONALIZATION) \
 | 
				
			||||||
 | 
					    c(36,35,updateSimPhonebookRecords,UPDATE_SIM_PHONEBOOK_RECORDS) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* i(code,Name,IND_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_SIM_IND_1(i) \
 | 
				
			||||||
 | 
					    i(1,carrierInfoForImsiEncryption,CARRIER_INFO_FOR_IMSI_ENCRYPTION) \
 | 
				
			||||||
 | 
					    i(2,cdmaSubscriptionSourceChanged,CDMA_SUBSCRIPTION_SOURCE_CHANGED) \
 | 
				
			||||||
 | 
					    i(3,simPhonebookChanged,SIM_PHONEBOOK_CHANGED) \
 | 
				
			||||||
 | 
					    i(4,simPhonebookRecordsReceived,SIM_PHONEBOOK_RECORDS_RECEIVED) \
 | 
				
			||||||
 | 
					    i(5,simRefresh,SIM_REFRESH) \
 | 
				
			||||||
 | 
					    i(6,simStatusChanged,SIM_STATUS_CHANGED) \
 | 
				
			||||||
 | 
					    i(7,stkEventNotify,STK_EVENT_NOTIFY) \
 | 
				
			||||||
 | 
					    i(8,stkProactiveCommand,STK_PROACTIVE_COMMAND) \
 | 
				
			||||||
 | 
					    i(9,stkSessionEnd,STK_SESSION_END) \
 | 
				
			||||||
 | 
					    i(10,subscriptionStatusChanged,SUBSCRIPTION_STATUS_CHANGED) \
 | 
				
			||||||
 | 
					    i(11,uiccApplicationsEnablementChanged,UICC_APPLICATIONS_ENABLEMENT_CHANGED) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_sim_req {
 | 
				
			||||||
 | 
					    RADIO_SIM_REQ_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_SIM_REQ_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_SIM_REQ_(req,resp,Name,NAME) RADIO_SIM_REQ_##NAME = req,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.sim.IRadioSim v1 */
 | 
				
			||||||
 | 
					    RADIO_SIM_CALL_1(RADIO_SIM_REQ_)
 | 
				
			||||||
 | 
					    RADIO_SIM_REQ_RESPONSE_ACKNOWLEDGEMENT = 20, /* responseAcknowledgement */
 | 
				
			||||||
 | 
					    RADIO_SIM_REQ_SET_RESPONSE_FUNCTIONS = 28, /* setResponseFunctions */
 | 
				
			||||||
 | 
					    RADIO_SIM_1_REQ_LAST = RADIO_SIM_REQ_UPDATE_SIM_PHONEBOOK_RECORDS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_SIM_REQ_
 | 
				
			||||||
 | 
					} RADIO_SIM_REQ;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_SIM_REQ) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_sim_resp {
 | 
				
			||||||
 | 
					    RADIO_SIM_RESP_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_SIM_RESP_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_SIM_RESP_(req,resp,Name,NAME) RADIO_SIM_RESP_##NAME = resp,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.sim.IRadioSimResponse v1 */
 | 
				
			||||||
 | 
					    RADIO_SIM_CALL_1(RADIO_SIM_RESP_)
 | 
				
			||||||
 | 
					    RADIO_SIM_RESP_ACKNOWLEDGE_REQUEST = 1, /* acknowledgeRequest */
 | 
				
			||||||
 | 
					    RADIO_SIM_1_RESP_LAST = RADIO_SIM_RESP_UPDATE_SIM_PHONEBOOK_RECORDS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_SIM_RESP_
 | 
				
			||||||
 | 
					} RADIO_SIM_RESP;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_SIM_RESP) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_sim_ind {
 | 
				
			||||||
 | 
					    RADIO_SIM_IND_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_SIM_IND_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_SIM_IND_(code,Name,NAME) RADIO_SIM_IND_##NAME = code,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.sim.IRadioSimIndication v1 */
 | 
				
			||||||
 | 
					    RADIO_SIM_IND_1(RADIO_SIM_IND_)
 | 
				
			||||||
 | 
					    RADIO_SIM_1_IND_LAST = RADIO_SIM_IND_UICC_APPLICATIONS_ENABLEMENT_CHANGED,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_SIM_IND_
 | 
				
			||||||
 | 
					} RADIO_SIM_IND;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_SIM_IND) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* RADIO_SIM_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
@@ -66,6 +66,24 @@ typedef enum radio_interface {
 | 
				
			|||||||
    RADIO_INTERFACE_COUNT
 | 
					    RADIO_INTERFACE_COUNT
 | 
				
			||||||
} RADIO_INTERFACE; /* Since 1.2.0 */
 | 
					} RADIO_INTERFACE; /* Since 1.2.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_aidl_interface {
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE_NONE = -1,
 | 
				
			||||||
 | 
					    RADIO_DATA_INTERFACE,
 | 
				
			||||||
 | 
					    RADIO_IMS_INTERFACE,
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_INTERFACE,
 | 
				
			||||||
 | 
					    RADIO_MODEM_INTERFACE,
 | 
				
			||||||
 | 
					    RADIO_NETWORK_INTERFACE,
 | 
				
			||||||
 | 
					    RADIO_SIM_INTERFACE,
 | 
				
			||||||
 | 
					    RADIO_VOICE_INTERFACE,
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE_COUNT
 | 
				
			||||||
 | 
					} RADIO_AIDL_INTERFACE; /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_interface_type {
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE_NONE,
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE_HIDL,
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE_AIDL,
 | 
				
			||||||
 | 
					} RADIO_INTERFACE_TYPE; /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum radio_observer_priority {
 | 
					typedef enum radio_observer_priority {
 | 
				
			||||||
    RADIO_OBSERVER_PRIORITY_LOWEST,
 | 
					    RADIO_OBSERVER_PRIORITY_LOWEST,
 | 
				
			||||||
    RADIO_OBSERVER_PRIORITY_DEFAULT = 2,
 | 
					    RADIO_OBSERVER_PRIORITY_DEFAULT = 2,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,14 +45,29 @@ const char*
 | 
				
			|||||||
radio_req_name(
 | 
					radio_req_name(
 | 
				
			||||||
    RADIO_REQ req);
 | 
					    RADIO_REQ req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					radio_req_name2(
 | 
				
			||||||
 | 
					    RadioInstance* instance,
 | 
				
			||||||
 | 
					    RADIO_REQ req); /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char*
 | 
					const char*
 | 
				
			||||||
radio_resp_name(
 | 
					radio_resp_name(
 | 
				
			||||||
    RADIO_RESP resp);
 | 
					    RADIO_RESP resp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					radio_resp_name2(
 | 
				
			||||||
 | 
					    RadioInstance* instance,
 | 
				
			||||||
 | 
					    RADIO_RESP resp); /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char*
 | 
					const char*
 | 
				
			||||||
radio_ind_name(
 | 
					radio_ind_name(
 | 
				
			||||||
    RADIO_IND ind);
 | 
					    RADIO_IND ind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					radio_ind_name2(
 | 
				
			||||||
 | 
					    RadioInstance* instance,
 | 
				
			||||||
 | 
					    RADIO_IND ind); /* Since 1.6.0 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RADIO_RESP
 | 
					RADIO_RESP
 | 
				
			||||||
radio_req_resp(
 | 
					radio_req_resp(
 | 
				
			||||||
    RADIO_REQ req)
 | 
					    RADIO_REQ req)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										168
									
								
								include/radio_voice_types.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								include/radio_voice_types.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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_VOICE_TYPES_H
 | 
				
			||||||
 | 
					#define RADIO_VOICE_TYPES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gbinder_types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_VOICE_INTERFACE_MAX (RADIO_VOICE_INTERFACE_COUNT - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RADIO_VOICE_INSTANCE         "default"
 | 
				
			||||||
 | 
					#define RADIO_VOICE_IFACE_PREFIX     "android.hardware.radio.voice."
 | 
				
			||||||
 | 
					#define RADIO_VOICE_IFACE            "IRadioVoice"
 | 
				
			||||||
 | 
					#define RADIO_VOICE_RESPONSE_IFACE   "IRadioVoiceResponse"
 | 
				
			||||||
 | 
					#define RADIO_VOICE_INDICATION_IFACE "IRadioVoiceIndication"
 | 
				
			||||||
 | 
					#define RADIO_VOICE                  RADIO_VOICE_IFACE_PREFIX RADIO_VOICE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_VOICE_FQNAME           RADIO_VOICE "/" RADIO_VOICE_INSTANCE
 | 
				
			||||||
 | 
					#define RADIO_VOICE_RESPONSE         RADIO_VOICE_IFACE_PREFIX RADIO_VOICE_RESPONSE_IFACE
 | 
				
			||||||
 | 
					#define RADIO_VOICE_INDICATION       RADIO_VOICE_IFACE_PREFIX RADIO_VOICE_INDICATION_IFACE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transaction codes */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* c(req,resp,Name,CALL_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_VOICE_CALL_1(c) \
 | 
				
			||||||
 | 
					    c(1,1,acceptCall,ACCEPT_CALL) \
 | 
				
			||||||
 | 
					    c(2,3,cancelPendingUssd,CANCEL_PENDING_USSD) \
 | 
				
			||||||
 | 
					    c(3,4,conference,CONFERENCE) \
 | 
				
			||||||
 | 
					    c(4,5,dial,DIAL) \
 | 
				
			||||||
 | 
					    c(5,6,emergencyDial,EMERGENCY_DIAL) \
 | 
				
			||||||
 | 
					    c(6,7,exitEmergencyCallbackMode,EXIT_EMERGENCY_CALLBACK_MODE) \
 | 
				
			||||||
 | 
					    c(7,8,explicitCallTransfer,EXPLICIT_CALL_TRANSFER) \
 | 
				
			||||||
 | 
					    c(8,9,getCallForwardStatus,GET_CALL_FORWARD_STATUS) \
 | 
				
			||||||
 | 
					    c(9,10,getCallWaiting,GET_CALL_WAITING) \
 | 
				
			||||||
 | 
					    c(10,11,getClip,GET_CLIP) \
 | 
				
			||||||
 | 
					    c(11,12,getClir,GET_CLIR) \
 | 
				
			||||||
 | 
					    c(12,13,getCurrentCalls,GET_CURRENT_CALLS) \
 | 
				
			||||||
 | 
					    c(13,14,getLastCallFailCause,GET_LAST_CALL_FAIL_CAUSE) \
 | 
				
			||||||
 | 
					    c(14,15,getMute,GET_MUTE) \
 | 
				
			||||||
 | 
					    c(15,16,getPreferredVoicePrivacy,GET_PREFERRED_VOICE_PRIVACY) \
 | 
				
			||||||
 | 
					    c(16,17,getTtyMode,GET_TTY_MODE) \
 | 
				
			||||||
 | 
					    c(17,18,handleStkCallSetupRequestFromSim,HANDLE_STK_CALL_SETUP_REQUEST_FROM_SIM) \
 | 
				
			||||||
 | 
					    c(19,20,hangupForegroundResumeBackground,HANGUP_FOREGROUND_RESUME_BACKGROUND) \
 | 
				
			||||||
 | 
					    c(20,21,hangupWaitingOrBackground,HANGUP_WAITING_OR_BACKGROUND) \
 | 
				
			||||||
 | 
					    c(21,22,isVoNrEnabled,IS_VO_NR_ENABLED) \
 | 
				
			||||||
 | 
					    c(22,23,rejectCall,REJECT_CALL) \
 | 
				
			||||||
 | 
					    c(24,24,sendBurstDtmf,SEND_BURST_DTMF) \
 | 
				
			||||||
 | 
					    c(25,25,sendCdmaFeatureCode,SEND_CDMA_FEATURE_CODE) \
 | 
				
			||||||
 | 
					    c(26,26,sendDtmf,SEND_DTMF) \
 | 
				
			||||||
 | 
					    c(27,27,sendUssd,SEND_USSD) \
 | 
				
			||||||
 | 
					    c(28,28,separateConnection,SEPARATE_CONNECTION) \
 | 
				
			||||||
 | 
					    c(29,29,setCallForward,SET_CALL_FORWARD) \
 | 
				
			||||||
 | 
					    c(30,30,setCallWaiting,SET_CALL_WAITING) \
 | 
				
			||||||
 | 
					    c(31,31,setClir,SET_CLIR) \
 | 
				
			||||||
 | 
					    c(32,32,setMute,SET_MUTE) \
 | 
				
			||||||
 | 
					    c(33,33,setPreferredVoicePrivacy,SET_PREFERRED_VOICE_PRIVACY) \
 | 
				
			||||||
 | 
					    c(35,34,setTtyMode,SET_TTY_MODE) \
 | 
				
			||||||
 | 
					    c(36,35,setVoNrEnabled,SET_VO_NR_ENABLED) \
 | 
				
			||||||
 | 
					    c(37,36,startDtmf,START_DTMF) \
 | 
				
			||||||
 | 
					    c(38,37,stopDtmf,STOP_DTMF) \
 | 
				
			||||||
 | 
					    c(39,38,switchWaitingOrHoldingAndActive,SWITCH_WAITING_OR_HOLDING_AND_ACTIVE) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* i(code,Name,IND_NAME) */
 | 
				
			||||||
 | 
					#define RADIO_VOICE_IND_1(i) \
 | 
				
			||||||
 | 
					    i(1,callRing,CALL_RING) \
 | 
				
			||||||
 | 
					    i(2,callStateChanged,CALL_STATE_CHANGED) \
 | 
				
			||||||
 | 
					    i(3,cdmaCallWaiting,CDMA_CALL_WAITING) \
 | 
				
			||||||
 | 
					    i(4,cdmaInfoRec,CDMA_INFO_REC) \
 | 
				
			||||||
 | 
					    i(5,cdmaOtaProvisionStatus,CDMA_OTA_PROVISION_STATUS) \
 | 
				
			||||||
 | 
					    i(6,currentEmergencyNumberList,CURRENT_EMERGENCY_NUMBER_LIST) \
 | 
				
			||||||
 | 
					    i(7,enterEmergencyCallbackMode,ENTER_EMERGENCY_CALLBACK_MODE) \
 | 
				
			||||||
 | 
					    i(8,exitEmergencyCallbackMode,EXIT_EMERGENCY_CALLBACK_MODE) \
 | 
				
			||||||
 | 
					    i(9,indicateRingbackTone,INDICATE_RINGBACK_TONE) \
 | 
				
			||||||
 | 
					    i(10,onSupplementaryServiceIndication,ON_SUPPLEMENTARY_SERVICE_INDICATION) \
 | 
				
			||||||
 | 
					    i(11,onUssd,ON_USSD) \
 | 
				
			||||||
 | 
					    i(12,resendIncallMute,RESEND_INCALL_MUTE) \
 | 
				
			||||||
 | 
					    i(13,srvccStateNotify,SRVCC_STATE_NOTIFY) \
 | 
				
			||||||
 | 
					    i(14,stkCallControlAlphaNotify,STK_CALL_CONTROL_ALPHA_NOTIFY) \
 | 
				
			||||||
 | 
					    i(15,stkCallSetup,STK_CALL_SETUP) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_voice_req {
 | 
				
			||||||
 | 
					    RADIO_VOICE_REQ_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_VOICE_REQ_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_VOICE_REQ_(req,resp,Name,NAME) RADIO_VOICE_REQ_##NAME = req,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.voice.IRadioVoice v1 */
 | 
				
			||||||
 | 
					    RADIO_VOICE_CALL_1(RADIO_VOICE_REQ_)
 | 
				
			||||||
 | 
					    RADIO_VOICE_REQ_HANGUP = 18, /* hangup */
 | 
				
			||||||
 | 
					    RADIO_VOICE_REQ_RESPONSE_ACKNOWLEDGEMENT = 23, /* responseAcknowledgement */
 | 
				
			||||||
 | 
					    RADIO_VOICE_REQ_SET_RESPONSE_FUNCTIONS = 34, /* setResponseFunctions */
 | 
				
			||||||
 | 
					    RADIO_VOICE_1_REQ_LAST = RADIO_VOICE_REQ_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_VOICE_REQ_
 | 
				
			||||||
 | 
					} RADIO_VOICE_REQ;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_VOICE_REQ) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_voice_resp {
 | 
				
			||||||
 | 
					    RADIO_VOICE_RESP_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_VOICE_RESP_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_VOICE_RESP_(req,resp,Name,NAME) RADIO_VOICE_RESP_##NAME = resp,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.voice.IRadioVoiceResponse v1 */
 | 
				
			||||||
 | 
					    RADIO_VOICE_CALL_1(RADIO_VOICE_RESP_)
 | 
				
			||||||
 | 
					    RADIO_VOICE_RESP_ACKNOWLEDGE_REQUEST = 2, /* acknowledgeRequest */
 | 
				
			||||||
 | 
					    RADIO_VOICE_RESP_HANGUP_CONNECTION_RESPONSE = 19, /* hangupConnectionResponse */
 | 
				
			||||||
 | 
					    RADIO_VOICE_1_RESP_LAST = RADIO_VOICE_RESP_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_VOICE_RESP_
 | 
				
			||||||
 | 
					} RADIO_VOICE_RESP;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_VOICE_RESP) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_voice_ind {
 | 
				
			||||||
 | 
					    RADIO_VOICE_IND_ANY = 0,
 | 
				
			||||||
 | 
					    RADIO_VOICE_IND_NONE = 0,
 | 
				
			||||||
 | 
					#define RADIO_VOICE_IND_(code,Name,NAME) RADIO_VOICE_IND_##NAME = code,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* android.hardware.radio.voice.IRadioVoiceIndication v1 */
 | 
				
			||||||
 | 
					    RADIO_VOICE_IND_1(RADIO_VOICE_IND_)
 | 
				
			||||||
 | 
					    RADIO_VOICE_1_IND_LAST = RADIO_VOICE_IND_STK_CALL_SETUP,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef RADIO_VOICE_IND_
 | 
				
			||||||
 | 
					} RADIO_VOICE_IND;
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(sizeof(RADIO_VOICE_IND) == 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* RADIO_VOICE_TYPES_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Local Variables:
 | 
				
			||||||
 | 
					 * mode: C
 | 
				
			||||||
 | 
					 * c-basic-offset: 4
 | 
				
			||||||
 | 
					 * indent-tabs-mode: nil
 | 
				
			||||||
 | 
					 * End:
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
@@ -180,7 +180,7 @@ radio_client_handle_resp(
 | 
				
			|||||||
    gpointer user_data)
 | 
					    gpointer user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!radio_base_handle_resp(RADIO_BASE(user_data), code, info, reader)) {
 | 
					    if (!radio_base_handle_resp(RADIO_BASE(user_data), code, info, reader)) {
 | 
				
			||||||
        const char* name = radio_resp_name(code);
 | 
					        const char* name = radio_resp_name2(instance, code);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Most likely this is a response to a cancelled request */
 | 
					        /* Most likely this is a response to a cancelled request */
 | 
				
			||||||
        GDEBUG("Ignoring IRadio response [%08x] %u %s", info->serial, code,
 | 
					        GDEBUG("Ignoring IRadio response [%08x] %u %s", info->serial, code,
 | 
				
			||||||
@@ -281,6 +281,13 @@ radio_client_interface(
 | 
				
			|||||||
    return G_LIKELY(self) ? self->instance->version : RADIO_INTERFACE_NONE;
 | 
					    return G_LIKELY(self) ? self->instance->version : RADIO_INTERFACE_NONE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RADIO_AIDL_INTERFACE
 | 
				
			||||||
 | 
					radio_client_aidl_interface(
 | 
				
			||||||
 | 
					    RadioClient* self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return G_LIKELY(self) ? self->instance->interface_aidl : RADIO_AIDL_INTERFACE_NONE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
radio_client_set_default_timeout(
 | 
					radio_client_set_default_timeout(
 | 
				
			||||||
    RadioClient* self,
 | 
					    RadioClient* self,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,6 +56,7 @@ typedef struct radio_config {
 | 
				
			|||||||
    GBinderRemoteObject* remote;
 | 
					    GBinderRemoteObject* remote;
 | 
				
			||||||
    GBinderLocalObject* response;
 | 
					    GBinderLocalObject* response;
 | 
				
			||||||
    GBinderLocalObject* indication;
 | 
					    GBinderLocalObject* indication;
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE interface_type;
 | 
				
			||||||
    RADIO_CONFIG_INTERFACE version;
 | 
					    RADIO_CONFIG_INTERFACE version;
 | 
				
			||||||
    GHashTable* req_quarks;
 | 
					    GHashTable* req_quarks;
 | 
				
			||||||
    GHashTable* resp_quarks;
 | 
					    GHashTable* resp_quarks;
 | 
				
			||||||
@@ -121,6 +122,12 @@ static const GBinderClientIfaceInfo radio_config_iface_info[] = {
 | 
				
			|||||||
G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_iface_info) ==
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_iface_info) ==
 | 
				
			||||||
    RADIO_CONFIG_INTERFACE_COUNT);
 | 
					    RADIO_CONFIG_INTERFACE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const GBinderClientIfaceInfo radio_config_aidl_iface_info[] = {
 | 
				
			||||||
 | 
					    {RADIO_CONFIG_AIDL, RADIO_CONFIG_1_1_REQ_LAST }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_aidl_iface_info) ==
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INTERFACE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char* const radio_config_indication_ifaces[] = {
 | 
					static const char* const radio_config_indication_ifaces[] = {
 | 
				
			||||||
    RADIO_CONFIG_INDICATION_1_2,
 | 
					    RADIO_CONFIG_INDICATION_1_2,
 | 
				
			||||||
    RADIO_CONFIG_INDICATION_1_1,
 | 
					    RADIO_CONFIG_INDICATION_1_1,
 | 
				
			||||||
@@ -130,6 +137,13 @@ static const char* const radio_config_indication_ifaces[] = {
 | 
				
			|||||||
G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_indication_ifaces) ==
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_indication_ifaces) ==
 | 
				
			||||||
    RADIO_CONFIG_INTERFACE_COUNT + 1);
 | 
					    RADIO_CONFIG_INTERFACE_COUNT + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_config_aidl_indication_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INDICATION,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_aidl_indication_ifaces) ==
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INTERFACE_COUNT + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char* const radio_config_response_ifaces[] = {
 | 
					static const char* const radio_config_response_ifaces[] = {
 | 
				
			||||||
    RADIO_CONFIG_RESPONSE_1_2,
 | 
					    RADIO_CONFIG_RESPONSE_1_2,
 | 
				
			||||||
    RADIO_CONFIG_RESPONSE_1_1,
 | 
					    RADIO_CONFIG_RESPONSE_1_1,
 | 
				
			||||||
@@ -139,7 +153,15 @@ static const char* const radio_config_response_ifaces[] = {
 | 
				
			|||||||
G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_response_ifaces) ==
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_response_ifaces) ==
 | 
				
			||||||
    RADIO_CONFIG_INTERFACE_COUNT + 1);
 | 
					    RADIO_CONFIG_INTERFACE_COUNT + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_config_aidl_response_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_RESPONSE,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_aidl_response_ifaces) ==
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INTERFACE_COUNT + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct radio_config_interface_desc {
 | 
					typedef struct radio_config_interface_desc {
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE interface_type;
 | 
				
			||||||
    RADIO_CONFIG_INTERFACE version;
 | 
					    RADIO_CONFIG_INTERFACE version;
 | 
				
			||||||
    const char* fqname;
 | 
					    const char* fqname;
 | 
				
			||||||
    const char* radio_iface;
 | 
					    const char* radio_iface;
 | 
				
			||||||
@@ -150,6 +172,7 @@ typedef struct radio_config_interface_desc {
 | 
				
			|||||||
#define RADIO_CONFIG_INTERFACE_INDEX(x) (RADIO_CONFIG_INTERFACE_COUNT - x - 1)
 | 
					#define RADIO_CONFIG_INTERFACE_INDEX(x) (RADIO_CONFIG_INTERFACE_COUNT - x - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RADIO_CONFIG_INTERFACE_DESC(v) \
 | 
					#define RADIO_CONFIG_INTERFACE_DESC(v) \
 | 
				
			||||||
 | 
					        RADIO_INTERFACE_TYPE_HIDL, \
 | 
				
			||||||
        RADIO_CONFIG_INTERFACE_##v, \
 | 
					        RADIO_CONFIG_INTERFACE_##v, \
 | 
				
			||||||
        RADIO_CONFIG_##v##_FQNAME, \
 | 
					        RADIO_CONFIG_##v##_FQNAME, \
 | 
				
			||||||
        RADIO_CONFIG_##v, \
 | 
					        RADIO_CONFIG_##v, \
 | 
				
			||||||
@@ -166,9 +189,24 @@ static const RadioConfigInterfaceDesc radio_config_interfaces[] = {
 | 
				
			|||||||
G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_interfaces) ==
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_interfaces) ==
 | 
				
			||||||
    RADIO_CONFIG_INTERFACE_COUNT);
 | 
					    RADIO_CONFIG_INTERFACE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const RadioConfigInterfaceDesc radio_config_aidl_interfaces[] = {
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RADIO_INTERFACE_TYPE_AIDL,
 | 
				
			||||||
 | 
					        RADIO_CONFIG_AIDL_INTERFACE_1,
 | 
				
			||||||
 | 
					        RADIO_CONFIG_AIDL_FQNAME,
 | 
				
			||||||
 | 
					        RADIO_CONFIG_AIDL,
 | 
				
			||||||
 | 
					        radio_config_aidl_indication_ifaces,
 | 
				
			||||||
 | 
					        radio_config_aidl_response_ifaces,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_aidl_interfaces) ==
 | 
				
			||||||
 | 
					    RADIO_CONFIG_AIDL_INTERFACE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Must have a separate instance for each interface version */
 | 
					/* Must have a separate instance for each interface version */
 | 
				
			||||||
static RadioConfig* radio_config_instance[RADIO_CONFIG_INTERFACE_COUNT] =
 | 
					static RadioConfig* radio_config_instance[RADIO_CONFIG_INTERFACE_COUNT] =
 | 
				
			||||||
    { NULL };
 | 
					    { NULL };
 | 
				
			||||||
 | 
					static RadioConfig* radio_config_aidl_instance[RADIO_CONFIG_AIDL_INTERFACE_COUNT] =
 | 
				
			||||||
 | 
					    { NULL };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct radio_config_call {
 | 
					typedef struct radio_config_call {
 | 
				
			||||||
    RadioRequest* req;
 | 
					    RadioRequest* req;
 | 
				
			||||||
@@ -205,18 +243,31 @@ radio_config_call_complete(
 | 
				
			|||||||
static
 | 
					static
 | 
				
			||||||
const char*
 | 
					const char*
 | 
				
			||||||
radio_config_known_req_name(
 | 
					radio_config_known_req_name(
 | 
				
			||||||
 | 
					    RadioConfig* self,
 | 
				
			||||||
    RADIO_CONFIG_REQ req)
 | 
					    RADIO_CONFIG_REQ req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (req) {
 | 
					    if (!G_LIKELY(self) || self->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
    case RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions";
 | 
					        switch (req) {
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions";
 | 
				
			||||||
#define RADIO_CONFIG_REQ_(req,resp,Name,NAME) \
 | 
					#define RADIO_CONFIG_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
    case RADIO_CONFIG_REQ_##NAME: return #Name;
 | 
					        case RADIO_CONFIG_REQ_##NAME: return #Name;
 | 
				
			||||||
    RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_REQ_)
 | 
					        RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_REQ_)
 | 
				
			||||||
    RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_REQ_)
 | 
					        RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_REQ_)
 | 
				
			||||||
    /* 1.2 defines no new requests */
 | 
					        /* 1.2 defines no new requests */
 | 
				
			||||||
#undef RADIO_CONFIG_REQ_
 | 
					#undef RADIO_CONFIG_REQ_
 | 
				
			||||||
    case RADIO_CONFIG_REQ_ANY:
 | 
					        case RADIO_CONFIG_REQ_ANY:
 | 
				
			||||||
        break;
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (self->interface_type == RADIO_INTERFACE_TYPE_AIDL) {
 | 
				
			||||||
 | 
					        switch ((RADIO_CONFIG_AIDL_REQ)req) {
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_AIDL_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions";
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_AIDL_REQ_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_CONFIG_AIDL_CALL_1(RADIO_CONFIG_AIDL_REQ_)
 | 
				
			||||||
 | 
					#undef RADIO_CONFIG_AIDL_REQ_
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_AIDL_REQ_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -224,18 +275,30 @@ radio_config_known_req_name(
 | 
				
			|||||||
static
 | 
					static
 | 
				
			||||||
const char*
 | 
					const char*
 | 
				
			||||||
radio_config_known_resp_name(
 | 
					radio_config_known_resp_name(
 | 
				
			||||||
 | 
					    RadioConfig* self,
 | 
				
			||||||
    RADIO_CONFIG_RESP resp)
 | 
					    RADIO_CONFIG_RESP resp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (resp) {
 | 
					    if (!G_LIKELY(self) || self->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					        switch (resp) {
 | 
				
			||||||
#define RADIO_CONFIG_RESP_(req,resp,Name,NAME) \
 | 
					#define RADIO_CONFIG_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
    case RADIO_CONFIG_RESP_##NAME: return #Name "Response";
 | 
					        case RADIO_CONFIG_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
    RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_RESP_)
 | 
					        RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_RESP_)
 | 
				
			||||||
    RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_RESP_)
 | 
					        RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_RESP_)
 | 
				
			||||||
#undef RADIO_CONFIG_RESP_
 | 
					#undef RADIO_CONFIG_RESP_
 | 
				
			||||||
    case RADIO_CONFIG_RESP_GET_SIM_SLOTS_STATUS_1_2:
 | 
					        case RADIO_CONFIG_RESP_GET_SIM_SLOTS_STATUS_1_2:
 | 
				
			||||||
        return "getSimSlotsStatusResponse_1_2";
 | 
					            return "getSimSlotsStatusResponse_1_2";
 | 
				
			||||||
    case RADIO_CONFIG_RESP_ANY:
 | 
					        case RADIO_CONFIG_RESP_ANY:
 | 
				
			||||||
        break;
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (self->interface_type == RADIO_INTERFACE_TYPE_AIDL) {
 | 
				
			||||||
 | 
					        switch ((RADIO_CONFIG_AIDL_RESP)resp) {
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_AIDL_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
 | 
					        RADIO_CONFIG_AIDL_CALL_1(RADIO_CONFIG_AIDL_RESP_)
 | 
				
			||||||
 | 
					#undef RADIO_CONFIG_AIDL_RESP_
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_AIDL_RESP_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -243,17 +306,29 @@ radio_config_known_resp_name(
 | 
				
			|||||||
static
 | 
					static
 | 
				
			||||||
const char*
 | 
					const char*
 | 
				
			||||||
radio_config_known_ind_name(
 | 
					radio_config_known_ind_name(
 | 
				
			||||||
 | 
					    RadioConfig* self,
 | 
				
			||||||
    RADIO_CONFIG_IND ind)
 | 
					    RADIO_CONFIG_IND ind)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (ind) {
 | 
					    if (!G_LIKELY(self) || self->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					        switch (ind) {
 | 
				
			||||||
#define RADIO_CONFIG_IND_(code,Name,NAME) \
 | 
					#define RADIO_CONFIG_IND_(code,Name,NAME) \
 | 
				
			||||||
    case RADIO_CONFIG_IND_##NAME: return #Name;
 | 
					        case RADIO_CONFIG_IND_##NAME: return #Name;
 | 
				
			||||||
    RADIO_CONFIG_IND_1_0(RADIO_CONFIG_IND_)
 | 
					        RADIO_CONFIG_IND_1_0(RADIO_CONFIG_IND_)
 | 
				
			||||||
    /* 1.1 defines no new indications */
 | 
					        /* 1.1 defines no new indications */
 | 
				
			||||||
    RADIO_CONFIG_IND_1_2(RADIO_CONFIG_IND_)
 | 
					        RADIO_CONFIG_IND_1_2(RADIO_CONFIG_IND_)
 | 
				
			||||||
#undef RADIO_CONFIG_IND_
 | 
					#undef RADIO_CONFIG_IND_
 | 
				
			||||||
    case RADIO_CONFIG_IND_ANY:
 | 
					        case RADIO_CONFIG_IND_ANY:
 | 
				
			||||||
        break;
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (self->interface_type == RADIO_INTERFACE_TYPE_AIDL) {
 | 
				
			||||||
 | 
					        switch ((RADIO_CONFIG_AIDL_IND)ind) {
 | 
				
			||||||
 | 
					#define RADIO_CONFIG_AIDL_IND_(code,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_AIDL_IND_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_CONFIG_AIDL_IND_1(RADIO_CONFIG_AIDL_IND_)
 | 
				
			||||||
 | 
					#undef RADIO_CONFIG_AIDL_IND_
 | 
				
			||||||
 | 
					        case RADIO_CONFIG_AIDL_IND_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -271,7 +346,7 @@ radio_config_req_quark(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        q = GPOINTER_TO_UINT(g_hash_table_lookup(self->req_quarks, key));
 | 
					        q = GPOINTER_TO_UINT(g_hash_table_lookup(self->req_quarks, key));
 | 
				
			||||||
        if (!q) {
 | 
					        if (!q) {
 | 
				
			||||||
            const char* known = radio_config_known_req_name(req);
 | 
					            const char* known = radio_config_known_req_name(self, req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (known) {
 | 
					            if (known) {
 | 
				
			||||||
                q = g_quark_from_static_string(known);
 | 
					                q = g_quark_from_static_string(known);
 | 
				
			||||||
@@ -297,7 +372,7 @@ radio_config_resp_quark(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        q = GPOINTER_TO_UINT(g_hash_table_lookup(self->resp_quarks, key));
 | 
					        q = GPOINTER_TO_UINT(g_hash_table_lookup(self->resp_quarks, key));
 | 
				
			||||||
        if (!q) {
 | 
					        if (!q) {
 | 
				
			||||||
            const char* known = radio_config_known_resp_name(resp);
 | 
					            const char* known = radio_config_known_resp_name(self, resp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (known) {
 | 
					            if (known) {
 | 
				
			||||||
                q = g_quark_from_static_string(known);
 | 
					                q = g_quark_from_static_string(known);
 | 
				
			||||||
@@ -323,7 +398,7 @@ radio_config_ind_quark(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        q = GPOINTER_TO_UINT(g_hash_table_lookup(self->ind_quarks, key));
 | 
					        q = GPOINTER_TO_UINT(g_hash_table_lookup(self->ind_quarks, key));
 | 
				
			||||||
        if (!q) {
 | 
					        if (!q) {
 | 
				
			||||||
            const char* known = radio_config_known_ind_name(ind);
 | 
					            const char* known = radio_config_known_ind_name(self, ind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (known) {
 | 
					            if (known) {
 | 
				
			||||||
                q = g_quark_from_static_string(known);
 | 
					                q = g_quark_from_static_string(known);
 | 
				
			||||||
@@ -393,53 +468,64 @@ radio_config_response(
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    RadioConfig* self = THIS(user_data);
 | 
					    RadioConfig* self = THIS(user_data);
 | 
				
			||||||
    const char* iface = gbinder_remote_request_interface(req);
 | 
					    const char* iface = gbinder_remote_request_interface(req);
 | 
				
			||||||
 | 
					    const RadioResponseInfo* info = NULL;
 | 
				
			||||||
 | 
					    GBinderReader args;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gbinder_remote_request_init_reader(req, &args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gutil_strv_contains((GStrV*)radio_config_response_ifaces, iface)) {
 | 
					    if (gutil_strv_contains((GStrV*)radio_config_response_ifaces, iface)) {
 | 
				
			||||||
        GBinderReader args;
 | 
					 | 
				
			||||||
        const RadioResponseInfo* info;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /* All responses must be one-way and have RadioResponseInfo */
 | 
					        /* All responses must be one-way and have RadioResponseInfo */
 | 
				
			||||||
        gbinder_remote_request_init_reader(req, &args);
 | 
					 | 
				
			||||||
        info = gbinder_reader_read_hidl_struct(&args, RadioResponseInfo);
 | 
					        info = gbinder_reader_read_hidl_struct(&args, RadioResponseInfo);
 | 
				
			||||||
        GASSERT(flags & GBINDER_TX_FLAG_ONEWAY);
 | 
					    } else if (gutil_strv_contains((GStrV*)radio_config_aidl_response_ifaces, iface)) {
 | 
				
			||||||
        if (info) {
 | 
					        /* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
 | 
				
			||||||
            int p = RADIO_OBSERVER_PRIORITY_HIGHEST;
 | 
					        gsize out_size;
 | 
				
			||||||
            const GQuark quark = radio_config_resp_quark(self, code);
 | 
					        info = gbinder_reader_read_parcelable(&args, &out_size);
 | 
				
			||||||
            const guint* signals = radio_config_signals +
 | 
					        GASSERT(out_size == sizeof(RadioResponseInfo));
 | 
				
			||||||
                SIGNAL_OBSERVE_RESPONSE_0;
 | 
					    } else {
 | 
				
			||||||
 | 
					        GDEBUG("radio_config_response called on unknown interface %s", iface);
 | 
				
			||||||
            radio_config_ref(self);
 | 
					        return NULL;
 | 
				
			||||||
 | 
					 | 
				
			||||||
            /* High-priority observers get notified first */
 | 
					 | 
				
			||||||
            for (; p > RADIO_OBSERVER_PRIORITY_DEFAULT; p--) {
 | 
					 | 
				
			||||||
                const int i = RADIO_OBSERVER_PRIORITY_INDEX(p);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (signals[i]) {
 | 
					 | 
				
			||||||
                    g_signal_emit(self, signals[i], quark, code, info, &args);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            /* Then the response is actually processed */
 | 
					 | 
				
			||||||
            if (!radio_base_handle_resp(&self->base, code, info, &args)) {
 | 
					 | 
				
			||||||
                const char* name = radio_config_known_resp_name(code);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                /* Most likely this is a response to a cancelled request */
 | 
					 | 
				
			||||||
                GDEBUG("Ignoring IRadioConfig response [%08x] %u %s",
 | 
					 | 
				
			||||||
                    info->serial, code, name ? name : "");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            /* Followed by the remaining observers in their priority order */
 | 
					 | 
				
			||||||
            for (; p >= RADIO_OBSERVER_PRIORITY_LOWEST; p--) {
 | 
					 | 
				
			||||||
                const int i = RADIO_OBSERVER_PRIORITY_INDEX(p);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (signals[i]) {
 | 
					 | 
				
			||||||
                    g_signal_emit(self, signals[i], quark, code, info, &args);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            radio_config_unref(self);
 | 
					 | 
				
			||||||
            *status = GBINDER_STATUS_OK;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GASSERT(flags & GBINDER_TX_FLAG_ONEWAY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (info) {
 | 
				
			||||||
 | 
					        int p = RADIO_OBSERVER_PRIORITY_HIGHEST;
 | 
				
			||||||
 | 
					        const GQuark quark = radio_config_resp_quark(self, code);
 | 
				
			||||||
 | 
					        const guint* signals = radio_config_signals +
 | 
				
			||||||
 | 
					            SIGNAL_OBSERVE_RESPONSE_0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        radio_config_ref(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* High-priority observers get notified first */
 | 
				
			||||||
 | 
					        for (; p > RADIO_OBSERVER_PRIORITY_DEFAULT; p--) {
 | 
				
			||||||
 | 
					            const int i = RADIO_OBSERVER_PRIORITY_INDEX(p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (signals[i]) {
 | 
				
			||||||
 | 
					                g_signal_emit(self, signals[i], quark, code, info, &args);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Then the response is actually processed */
 | 
				
			||||||
 | 
					        if (!radio_base_handle_resp(&self->base, code, info, &args)) {
 | 
				
			||||||
 | 
					            const char* name = radio_config_known_resp_name(self, code);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Most likely this is a response to a cancelled request */
 | 
				
			||||||
 | 
					            GDEBUG("Ignoring IRadioConfig response [%08x] %u %s",
 | 
				
			||||||
 | 
					                info->serial, code, name ? name : "");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Followed by the remaining observers in their priority order */
 | 
				
			||||||
 | 
					        for (; p >= RADIO_OBSERVER_PRIORITY_LOWEST; p--) {
 | 
				
			||||||
 | 
					            const int i = RADIO_OBSERVER_PRIORITY_INDEX(p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (signals[i]) {
 | 
				
			||||||
 | 
					                g_signal_emit(self, signals[i], quark, code, info, &args);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        radio_config_unref(self);
 | 
				
			||||||
 | 
					        *status = GBINDER_STATUS_OK;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -509,12 +595,12 @@ radio_config_create(
 | 
				
			|||||||
    GBinderLocalRequest* req;
 | 
					    GBinderLocalRequest* req;
 | 
				
			||||||
    GBinderWriter writer;
 | 
					    GBinderWriter writer;
 | 
				
			||||||
    int status;
 | 
					    int status;
 | 
				
			||||||
 | 
					    guint req_code = RADIO_CONFIG_REQ_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    radio_base_initialize(&self->base);
 | 
					    radio_base_initialize(&self->base);
 | 
				
			||||||
 | 
					    self->interface_type = desc->interface_type;
 | 
				
			||||||
    self->version = desc->version;
 | 
					    self->version = desc->version;
 | 
				
			||||||
    self->remote = gbinder_remote_object_ref(remote);
 | 
					    self->remote = gbinder_remote_object_ref(remote);
 | 
				
			||||||
    self->client = gbinder_client_new2(remote, radio_config_iface_info,
 | 
					 | 
				
			||||||
        G_N_ELEMENTS(radio_config_iface_info));
 | 
					 | 
				
			||||||
    self->indication = gbinder_servicemanager_new_local_object2(sm,
 | 
					    self->indication = gbinder_servicemanager_new_local_object2(sm,
 | 
				
			||||||
        desc->ind_ifaces, radio_config_indication, self);
 | 
					        desc->ind_ifaces, radio_config_indication, self);
 | 
				
			||||||
    self->response = gbinder_servicemanager_new_local_object2(sm,
 | 
					    self->response = gbinder_servicemanager_new_local_object2(sm,
 | 
				
			||||||
@@ -522,14 +608,28 @@ radio_config_create(
 | 
				
			|||||||
    self->death_id = gbinder_remote_object_add_death_handler(remote,
 | 
					    self->death_id = gbinder_remote_object_add_death_handler(remote,
 | 
				
			||||||
        radio_config_died, self);
 | 
					        radio_config_died, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (self->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					        self->client = gbinder_client_new2(remote, radio_config_iface_info,
 | 
				
			||||||
 | 
					            G_N_ELEMENTS(radio_config_iface_info));
 | 
				
			||||||
 | 
					        req_code = RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS;
 | 
				
			||||||
 | 
					    } else if (self->interface_type == RADIO_INTERFACE_TYPE_AIDL) {
 | 
				
			||||||
 | 
					        self->client = gbinder_client_new2(remote, radio_config_aidl_iface_info,
 | 
				
			||||||
 | 
					            G_N_ELEMENTS(radio_config_aidl_iface_info));
 | 
				
			||||||
 | 
					        req_code = RADIO_CONFIG_AIDL_REQ_SET_RESPONSE_FUNCTIONS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        gbinder_local_object_set_stability(self->indication, GBINDER_STABILITY_VINTF);
 | 
				
			||||||
 | 
					        gbinder_local_object_set_stability(self->response, GBINDER_STABILITY_VINTF);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    GASSERT(self->client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* IRadioConfig::setResponseFunctions */
 | 
					    /* IRadioConfig::setResponseFunctions */
 | 
				
			||||||
    req = gbinder_client_new_request2(self->client,
 | 
					    req = gbinder_client_new_request2(self->client,
 | 
				
			||||||
        RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS);
 | 
					        req_code);
 | 
				
			||||||
    gbinder_local_request_init_writer(req, &writer);
 | 
					    gbinder_local_request_init_writer(req, &writer);
 | 
				
			||||||
    gbinder_writer_append_local_object(&writer, self->response);
 | 
					    gbinder_writer_append_local_object(&writer, self->response);
 | 
				
			||||||
    gbinder_writer_append_local_object(&writer, self->indication);
 | 
					    gbinder_writer_append_local_object(&writer, self->indication);
 | 
				
			||||||
    gbinder_remote_reply_unref(gbinder_client_transact_sync_reply(self->client,
 | 
					    gbinder_remote_reply_unref(gbinder_client_transact_sync_reply(self->client,
 | 
				
			||||||
        RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS, req, &status));
 | 
					        req_code, req, &status));
 | 
				
			||||||
    GVERBOSE_("IRadioConfig::setResponseFunctions status %d", status);
 | 
					    GVERBOSE_("IRadioConfig::setResponseFunctions status %d", status);
 | 
				
			||||||
    gbinder_local_request_unref(req);
 | 
					    gbinder_local_request_unref(req);
 | 
				
			||||||
    return self;
 | 
					    return self;
 | 
				
			||||||
@@ -550,20 +650,51 @@ RadioConfig*
 | 
				
			|||||||
radio_config_new_with_version(
 | 
					radio_config_new_with_version(
 | 
				
			||||||
    RADIO_CONFIG_INTERFACE max_version)
 | 
					    RADIO_CONFIG_INTERFACE max_version)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* Validate the requested version to avoid out-of-bounds access */
 | 
					    return radio_config_new_with_version_and_interface_type(max_version,
 | 
				
			||||||
    if (max_version < RADIO_CONFIG_INTERFACE_1_0) {
 | 
					        RADIO_INTERFACE_TYPE_HIDL);
 | 
				
			||||||
        max_version = RADIO_CONFIG_INTERFACE_1_0;
 | 
					}
 | 
				
			||||||
    } else if (max_version > RADIO_CONFIG_INTERFACE_MAX) {
 | 
					
 | 
				
			||||||
        max_version = RADIO_CONFIG_INTERFACE_MAX;
 | 
					RadioConfig*
 | 
				
			||||||
 | 
					radio_config_new_with_version_and_interface_type(
 | 
				
			||||||
 | 
					    RADIO_CONFIG_INTERFACE max_version,
 | 
				
			||||||
 | 
					    RADIO_INTERFACE_TYPE interface_type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    static RadioConfig** instances = NULL;
 | 
				
			||||||
 | 
					    const RadioConfigInterfaceDesc* interfaces = NULL;
 | 
				
			||||||
 | 
					    gsize num_interfaces = 0;
 | 
				
			||||||
 | 
					    const char* binder_device = GBINDER_DEFAULT_HWBINDER;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					        /* Validate the requested version to avoid out-of-bounds access */
 | 
				
			||||||
 | 
					        if (max_version < RADIO_CONFIG_INTERFACE_1_0) {
 | 
				
			||||||
 | 
					            max_version = RADIO_CONFIG_INTERFACE_1_0;
 | 
				
			||||||
 | 
					        } else if (max_version > RADIO_CONFIG_INTERFACE_MAX) {
 | 
				
			||||||
 | 
					            max_version = RADIO_CONFIG_INTERFACE_MAX;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        instances = radio_config_instance;
 | 
				
			||||||
 | 
					        interfaces = radio_config_interfaces;
 | 
				
			||||||
 | 
					        num_interfaces = G_N_ELEMENTS(radio_config_interfaces);
 | 
				
			||||||
 | 
					    } else if (interface_type == RADIO_INTERFACE_TYPE_AIDL) {
 | 
				
			||||||
 | 
					        /* Only RADIO_CONFIG_AIDL_INTERFACE_1 is supported for now */
 | 
				
			||||||
 | 
					        max_version = RADIO_CONFIG_AIDL_INTERFACE_1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        binder_device = GBINDER_DEFAULT_BINDER;
 | 
				
			||||||
 | 
					        instances = radio_config_aidl_instance;
 | 
				
			||||||
 | 
					        interfaces = radio_config_aidl_interfaces;
 | 
				
			||||||
 | 
					        num_interfaces = G_N_ELEMENTS(radio_config_aidl_interfaces);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        GINFO("Wrong interface_type %d (neither HIDL nor AIDL)", interface_type);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (radio_config_instance[max_version]) {
 | 
					    if (instances[max_version]) {
 | 
				
			||||||
        /* The requested instance already exists */
 | 
					        /* The requested instance already exists */
 | 
				
			||||||
        return radio_config_ref(radio_config_instance[max_version]);
 | 
					        return radio_config_ref(instances[max_version]);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        /* Assume /dev/hwbinder */
 | 
					        /* Assume /dev/hwbinder for HIDL, /dev/binder for AIDL */
 | 
				
			||||||
        GBinderServiceManager* sm =
 | 
					        GBinderServiceManager* sm =
 | 
				
			||||||
            gbinder_servicemanager_new(GBINDER_DEFAULT_HWBINDER);
 | 
					            gbinder_servicemanager_new(binder_device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (sm) {
 | 
					        if (sm) {
 | 
				
			||||||
            guint i;
 | 
					            guint i;
 | 
				
			||||||
@@ -572,8 +703,8 @@ radio_config_new_with_version(
 | 
				
			|||||||
            RadioConfig* config = NULL;
 | 
					            RadioConfig* config = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /* Find maximum available version not exceeding the requested one */
 | 
					            /* Find maximum available version not exceeding the requested one */
 | 
				
			||||||
            for (i=0; i<G_N_ELEMENTS(radio_config_interfaces) && !obj; i++) {
 | 
					            for (i=0; i<num_interfaces && !obj; i++) {
 | 
				
			||||||
                desc = radio_config_interfaces + i;
 | 
					                desc = interfaces + i;
 | 
				
			||||||
                if (desc->version <= max_version) {
 | 
					                if (desc->version <= max_version) {
 | 
				
			||||||
                    obj = gbinder_servicemanager_get_service_sync(sm,
 | 
					                    obj = gbinder_servicemanager_get_service_sync(sm,
 | 
				
			||||||
                        desc->fqname, NULL);
 | 
					                        desc->fqname, NULL);
 | 
				
			||||||
@@ -582,9 +713,8 @@ radio_config_new_with_version(
 | 
				
			|||||||
                         * desc->version isn't necessarily equal to
 | 
					                         * desc->version isn't necessarily equal to
 | 
				
			||||||
                         * max_version
 | 
					                         * max_version
 | 
				
			||||||
                         */
 | 
					                         */
 | 
				
			||||||
                        if (radio_config_instance[desc->version]) {
 | 
					                        if (instances[desc->version]) {
 | 
				
			||||||
                            config = radio_config_ref(radio_config_instance
 | 
					                            config = radio_config_ref(instances[desc->version]);
 | 
				
			||||||
                                [desc->version]);
 | 
					 | 
				
			||||||
                        } else {
 | 
					                        } else {
 | 
				
			||||||
                            GINFO("Connected to %s", desc->fqname);
 | 
					                            GINFO("Connected to %s", desc->fqname);
 | 
				
			||||||
                            config = radio_config_create(sm, obj, desc);
 | 
					                            config = radio_config_create(sm, obj, desc);
 | 
				
			||||||
@@ -596,9 +726,9 @@ radio_config_new_with_version(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            gbinder_servicemanager_unref(sm);
 | 
					            gbinder_servicemanager_unref(sm);
 | 
				
			||||||
            if (config) {
 | 
					            if (config) {
 | 
				
			||||||
                radio_config_instance[desc->version] = config;
 | 
					                instances[desc->version] = config;
 | 
				
			||||||
                g_object_weak_ref(G_OBJECT(config), radio_config_gone,
 | 
					                g_object_weak_ref(G_OBJECT(config), radio_config_gone,
 | 
				
			||||||
                    radio_config_instance + desc->version);
 | 
					                    instances + desc->version);
 | 
				
			||||||
                return config;
 | 
					                return config;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -632,6 +762,13 @@ radio_config_dead(
 | 
				
			|||||||
    return G_UNLIKELY(!self) || self->dead;
 | 
					    return G_UNLIKELY(!self) || self->dead;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RADIO_INTERFACE_TYPE
 | 
				
			||||||
 | 
					radio_config_interface_type(
 | 
				
			||||||
 | 
					    RadioConfig* self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return G_LIKELY(self) ? self->interface_type : RADIO_INTERFACE_TYPE_NONE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RADIO_CONFIG_INTERFACE
 | 
					RADIO_CONFIG_INTERFACE
 | 
				
			||||||
radio_config_interface(
 | 
					radio_config_interface(
 | 
				
			||||||
    RadioConfig* self)
 | 
					    RadioConfig* self)
 | 
				
			||||||
@@ -659,7 +796,7 @@ radio_config_req_name(
 | 
				
			|||||||
    RadioConfig* self,
 | 
					    RadioConfig* self,
 | 
				
			||||||
    RADIO_CONFIG_REQ req)
 | 
					    RADIO_CONFIG_REQ req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* known = radio_config_known_req_name(req);
 | 
					    const char* known = radio_config_known_req_name(self, req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (known) {
 | 
					    if (known) {
 | 
				
			||||||
        return known;
 | 
					        return known;
 | 
				
			||||||
@@ -678,7 +815,7 @@ radio_config_resp_name(
 | 
				
			|||||||
    RadioConfig* self,
 | 
					    RadioConfig* self,
 | 
				
			||||||
    RADIO_CONFIG_RESP resp)
 | 
					    RADIO_CONFIG_RESP resp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* known = radio_config_known_resp_name(resp);
 | 
					    const char* known = radio_config_known_resp_name(self, resp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (known) {
 | 
					    if (known) {
 | 
				
			||||||
        return known;
 | 
					        return known;
 | 
				
			||||||
@@ -697,7 +834,7 @@ radio_config_ind_name(
 | 
				
			|||||||
    RadioConfig* self,
 | 
					    RadioConfig* self,
 | 
				
			||||||
    RADIO_CONFIG_IND ind)
 | 
					    RADIO_CONFIG_IND ind)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* known = radio_config_known_ind_name(ind);
 | 
					    const char* known = radio_config_known_ind_name(self, ind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (known) {
 | 
					    if (known) {
 | 
				
			||||||
        return known;
 | 
					        return known;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -156,17 +156,22 @@ G_STATIC_ASSERT(G_N_ELEMENTS(radio_response_ifaces) == RADIO_INTERFACE_COUNT + 1
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct radio_interface_desc {
 | 
					typedef struct radio_interface_desc {
 | 
				
			||||||
    RADIO_INTERFACE version;
 | 
					    RADIO_INTERFACE version;
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE aidl_interface;
 | 
				
			||||||
    const char* radio_iface;
 | 
					    const char* radio_iface;
 | 
				
			||||||
    const char* const* ind_ifaces;
 | 
					    const char* const* ind_ifaces;
 | 
				
			||||||
    const char* const* resp_ifaces;
 | 
					    const char* const* resp_ifaces;
 | 
				
			||||||
 | 
					    gint32 set_response_functions_req;
 | 
				
			||||||
} RadioInterfaceDesc;
 | 
					} RadioInterfaceDesc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RADIO_INTERFACE_INDEX(x) (RADIO_INTERFACE_COUNT - x - 1)
 | 
					#define RADIO_INTERFACE_INDEX(x) (RADIO_INTERFACE_COUNT - x - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define RADIO_INTERFACE_DESC(v) \
 | 
					#define RADIO_INTERFACE_DESC(v) \
 | 
				
			||||||
        RADIO_INTERFACE_##v, RADIO_##v, \
 | 
					        RADIO_INTERFACE_##v, \
 | 
				
			||||||
 | 
					        RADIO_AIDL_INTERFACE_NONE, \
 | 
				
			||||||
 | 
					        RADIO_##v, \
 | 
				
			||||||
        radio_indication_ifaces + RADIO_INTERFACE_INDEX(RADIO_INTERFACE_##v), \
 | 
					        radio_indication_ifaces + RADIO_INTERFACE_INDEX(RADIO_INTERFACE_##v), \
 | 
				
			||||||
        radio_response_ifaces + RADIO_INTERFACE_INDEX(RADIO_INTERFACE_##v)
 | 
					        radio_response_ifaces + RADIO_INTERFACE_INDEX(RADIO_INTERFACE_##v), \
 | 
				
			||||||
 | 
					        RADIO_REQ_SET_RESPONSE_FUNCTIONS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const RadioInterfaceDesc radio_interfaces[] = {
 | 
					static const RadioInterfaceDesc radio_interfaces[] = {
 | 
				
			||||||
   { RADIO_INTERFACE_DESC(1_5) },
 | 
					   { RADIO_INTERFACE_DESC(1_5) },
 | 
				
			||||||
@@ -178,6 +183,146 @@ static const RadioInterfaceDesc radio_interfaces[] = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
G_STATIC_ASSERT(G_N_ELEMENTS(radio_interfaces) == RADIO_INTERFACE_COUNT);
 | 
					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},
 | 
				
			||||||
 | 
					    {RADIO_SIM, RADIO_SIM_1_REQ_LAST},
 | 
				
			||||||
 | 
					    {RADIO_VOICE, RADIO_VOICE_1_REQ_LAST},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_data_indication_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_DATA_INDICATION,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_data_response_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_DATA_RESPONSE,
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_messaging_response_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_MESSAGING_RESPONSE,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_modem_indication_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_MODEM_INDICATION,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_modem_response_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_MODEM_RESPONSE,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_network_indication_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_NETWORK_INDICATION,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_network_response_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_NETWORK_RESPONSE,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_sim_indication_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_SIM_INDICATION,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_sim_response_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_SIM_RESPONSE,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_voice_indication_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_VOICE_INDICATION,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char* const radio_voice_response_ifaces[] = {
 | 
				
			||||||
 | 
					    RADIO_VOICE_RESPONSE,
 | 
				
			||||||
 | 
					    NULL
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const RadioInterfaceDesc radio_aidl_interfaces[] = {
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RADIO_INTERFACE_NONE,
 | 
				
			||||||
 | 
					        RADIO_DATA_INTERFACE,
 | 
				
			||||||
 | 
					        RADIO_DATA,
 | 
				
			||||||
 | 
					        radio_data_indication_ifaces,
 | 
				
			||||||
 | 
					        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,
 | 
				
			||||||
 | 
					        RADIO_MESSAGING,
 | 
				
			||||||
 | 
					        radio_messaging_indication_ifaces,
 | 
				
			||||||
 | 
					        radio_messaging_response_ifaces,
 | 
				
			||||||
 | 
					        RADIO_MESSAGING_REQ_SET_RESPONSE_FUNCTIONS,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RADIO_INTERFACE_NONE,
 | 
				
			||||||
 | 
					        RADIO_MODEM_INTERFACE,
 | 
				
			||||||
 | 
					        RADIO_MODEM,
 | 
				
			||||||
 | 
					        radio_modem_indication_ifaces,
 | 
				
			||||||
 | 
					        radio_modem_response_ifaces,
 | 
				
			||||||
 | 
					        RADIO_MODEM_REQ_SET_RESPONSE_FUNCTIONS,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RADIO_INTERFACE_NONE,
 | 
				
			||||||
 | 
					        RADIO_NETWORK_INTERFACE,
 | 
				
			||||||
 | 
					        RADIO_NETWORK,
 | 
				
			||||||
 | 
					        radio_network_indication_ifaces,
 | 
				
			||||||
 | 
					        radio_network_response_ifaces,
 | 
				
			||||||
 | 
					        RADIO_NETWORK_REQ_SET_RESPONSE_FUNCTIONS,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RADIO_INTERFACE_NONE,
 | 
				
			||||||
 | 
					        RADIO_SIM_INTERFACE,
 | 
				
			||||||
 | 
					        RADIO_SIM,
 | 
				
			||||||
 | 
					        radio_sim_indication_ifaces,
 | 
				
			||||||
 | 
					        radio_sim_response_ifaces,
 | 
				
			||||||
 | 
					        RADIO_SIM_REQ_SET_RESPONSE_FUNCTIONS,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        RADIO_INTERFACE_NONE,
 | 
				
			||||||
 | 
					        RADIO_VOICE_INTERFACE,
 | 
				
			||||||
 | 
					        RADIO_VOICE,
 | 
				
			||||||
 | 
					        radio_voice_indication_ifaces,
 | 
				
			||||||
 | 
					        radio_voice_response_ifaces,
 | 
				
			||||||
 | 
					        RADIO_VOICE_REQ_SET_RESPONSE_FUNCTIONS,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					G_STATIC_ASSERT(G_N_ELEMENTS(radio_aidl_interfaces) == RADIO_AIDL_INTERFACE_COUNT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct radio_instance_tx {
 | 
					typedef struct radio_instance_tx {
 | 
				
			||||||
    RadioInstance* instance;
 | 
					    RadioInstance* instance;
 | 
				
			||||||
    RadioInstanceTxCompleteFunc complete;
 | 
					    RadioInstanceTxCompleteFunc complete;
 | 
				
			||||||
@@ -205,7 +350,7 @@ radio_instance_req_quark(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->req_quarks, key));
 | 
					        q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->req_quarks, key));
 | 
				
			||||||
        if (!q) {
 | 
					        if (!q) {
 | 
				
			||||||
            const char* known = radio_req_name(req);
 | 
					            const char* known = radio_req_name2(self, req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (known) {
 | 
					            if (known) {
 | 
				
			||||||
                q = g_quark_from_static_string(known);
 | 
					                q = g_quark_from_static_string(known);
 | 
				
			||||||
@@ -232,7 +377,7 @@ radio_instance_resp_quark(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->resp_quarks, key));
 | 
					        q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->resp_quarks, key));
 | 
				
			||||||
        if (!q) {
 | 
					        if (!q) {
 | 
				
			||||||
            const char* known = radio_resp_name(resp);
 | 
					            const char* known = radio_resp_name2(self, resp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (known) {
 | 
					            if (known) {
 | 
				
			||||||
                q = g_quark_from_static_string(known);
 | 
					                q = g_quark_from_static_string(known);
 | 
				
			||||||
@@ -280,7 +425,14 @@ radio_instance_indication(
 | 
				
			|||||||
    RadioInstance* self = RADIO_INSTANCE(user_data);
 | 
					    RadioInstance* self = RADIO_INSTANCE(user_data);
 | 
				
			||||||
    const char* iface = gbinder_remote_request_interface(req);
 | 
					    const char* iface = gbinder_remote_request_interface(req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gutil_strv_contains((const GStrV*)radio_indication_ifaces, iface)) {
 | 
					    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)
 | 
				
			||||||
 | 
					        || gutil_strv_contains((const GStrV*)radio_sim_indication_ifaces, iface)
 | 
				
			||||||
 | 
					        || gutil_strv_contains((const GStrV*)radio_voice_indication_ifaces, iface)) {
 | 
				
			||||||
        GBinderReader reader;
 | 
					        GBinderReader reader;
 | 
				
			||||||
        guint type;
 | 
					        guint type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -294,6 +446,7 @@ radio_instance_indication(
 | 
				
			|||||||
                SIGNAL_OBSERVE_INDICATION_0;
 | 
					                SIGNAL_OBSERVE_INDICATION_0;
 | 
				
			||||||
            int p = RADIO_OBSERVER_PRIORITY_HIGHEST;
 | 
					            int p = RADIO_OBSERVER_PRIORITY_HIGHEST;
 | 
				
			||||||
            gboolean handled = FALSE;
 | 
					            gboolean handled = FALSE;
 | 
				
			||||||
 | 
					            guint ind_ril_connected = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /* High-priority observers are notified first */
 | 
					            /* High-priority observers are notified first */
 | 
				
			||||||
            for (; p > RADIO_OBSERVER_PRIORITY_DEFAULT; p--) {
 | 
					            for (; p > RADIO_OBSERVER_PRIORITY_DEFAULT; p--) {
 | 
				
			||||||
@@ -305,7 +458,14 @@ radio_instance_indication(
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /* rilConnected is a special case */
 | 
					            /* rilConnected is a special case */
 | 
				
			||||||
            if (code == RADIO_IND_RIL_CONNECTED) {
 | 
					            if (self->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					                ind_ril_connected = RADIO_IND_RIL_CONNECTED;
 | 
				
			||||||
 | 
					            } else if (self->interface_type == RADIO_INTERFACE_TYPE_AIDL
 | 
				
			||||||
 | 
					                && gutil_strv_contains((const GStrV*)radio_modem_indication_ifaces, iface)) {
 | 
				
			||||||
 | 
					                ind_ril_connected = RADIO_MODEM_IND_RIL_CONNECTED;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (ind_ril_connected && code == ind_ril_connected) {
 | 
				
			||||||
                if (G_UNLIKELY(self->connected)) {
 | 
					                if (G_UNLIKELY(self->connected)) {
 | 
				
			||||||
                    /* We are only supposed to receive it once */
 | 
					                    /* We are only supposed to receive it once */
 | 
				
			||||||
                    GWARN("%s received unexpected rilConnected", self->slot);
 | 
					                    GWARN("%s received unexpected rilConnected", self->slot);
 | 
				
			||||||
@@ -360,69 +520,126 @@ radio_instance_response(
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    RadioInstance* self = RADIO_INSTANCE(user_data);
 | 
					    RadioInstance* self = RADIO_INSTANCE(user_data);
 | 
				
			||||||
    const char* iface = gbinder_remote_request_interface(req);
 | 
					    const char* iface = gbinder_remote_request_interface(req);
 | 
				
			||||||
 | 
					    const RadioResponseInfo* info = NULL;
 | 
				
			||||||
 | 
					    GBinderReader reader;
 | 
				
			||||||
 | 
					    gint32 ack_serial = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gbinder_remote_request_init_reader(req, &reader);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gutil_strv_contains((const GStrV*)radio_response_ifaces, iface)) {
 | 
					    if (gutil_strv_contains((const GStrV*)radio_response_ifaces, iface)) {
 | 
				
			||||||
        GBinderReader reader;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /* All these should be one-way transactions */
 | 
					 | 
				
			||||||
        GASSERT(flags & GBINDER_TX_FLAG_ONEWAY);
 | 
					 | 
				
			||||||
        gbinder_remote_request_init_reader(req, &reader);
 | 
					 | 
				
			||||||
        if (code == RADIO_RESP_ACKNOWLEDGE_REQUEST) {
 | 
					        if (code == RADIO_RESP_ACKNOWLEDGE_REQUEST) {
 | 
				
			||||||
            /* oneway acknowledgeRequest(int32_t serial) */
 | 
					            gbinder_reader_read_int32(&reader, &ack_serial);
 | 
				
			||||||
            gint32 serial;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            GDEBUG("%s %u acknowledgeRequest", iface, code);
 | 
					 | 
				
			||||||
            if (gbinder_reader_read_int32(&reader, &serial)) {
 | 
					 | 
				
			||||||
                g_signal_emit(self, radio_instance_signals[SIGNAL_ACK], 0,
 | 
					 | 
				
			||||||
                    serial);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            /* All other responses have RadioResponseInfo */
 | 
					            /* All other responses have RadioResponseInfo */
 | 
				
			||||||
            const RadioResponseInfo* info =
 | 
					            info = gbinder_reader_read_hidl_struct(&reader, RadioResponseInfo);
 | 
				
			||||||
                gbinder_reader_read_hidl_struct(&reader, RadioResponseInfo);
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (gutil_strv_contains((const GStrV*)radio_data_response_ifaces, iface)) {
 | 
				
			||||||
            if (info) {
 | 
					        if (code == RADIO_DATA_RESP_ACKNOWLEDGE_REQUEST) {
 | 
				
			||||||
                const GQuark quark = radio_instance_resp_quark(self, code);
 | 
					            gbinder_reader_read_int32(&reader, &ack_serial);
 | 
				
			||||||
                const guint* signals = radio_instance_signals +
 | 
					        } else {
 | 
				
			||||||
                    SIGNAL_OBSERVE_RESPONSE_0;
 | 
					            gsize out_size;
 | 
				
			||||||
                int p = RADIO_OBSERVER_PRIORITY_HIGHEST;
 | 
					            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
				
			||||||
                gboolean handled = FALSE;
 | 
					            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
                /* High-priority observers are notified first */
 | 
					    } else if (gutil_strv_contains((const GStrV*)radio_ims_response_ifaces, iface)) {
 | 
				
			||||||
                for (; p > RADIO_OBSERVER_PRIORITY_DEFAULT; p--) {
 | 
					        {
 | 
				
			||||||
                    if (signals[RADIO_OBSERVER_PRIORITY_INDEX(p)]) {
 | 
					            /* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
 | 
				
			||||||
                        g_signal_emit(self, signals
 | 
					            gsize out_size;
 | 
				
			||||||
                            [RADIO_OBSERVER_PRIORITY_INDEX(p)],
 | 
					            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
				
			||||||
                            quark, code, info, &reader);
 | 
					            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
				
			||||||
                    }
 | 
					        }
 | 
				
			||||||
                }
 | 
					    } else if (gutil_strv_contains((const GStrV*)radio_messaging_response_ifaces, iface)) {
 | 
				
			||||||
 | 
					        if (code == RADIO_MESSAGING_RESP_ACKNOWLEDGE_REQUEST) {
 | 
				
			||||||
                /* Then handlers */
 | 
					            gbinder_reader_read_int32(&reader, &ack_serial);
 | 
				
			||||||
                g_signal_emit(self, radio_instance_signals
 | 
					        } else {
 | 
				
			||||||
                    [SIGNAL_HANDLE_RESPONSE],
 | 
					            /* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
 | 
				
			||||||
                    quark, code, info, &reader, &handled);
 | 
					            gsize out_size;
 | 
				
			||||||
 | 
					            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
				
			||||||
                /* And then remaining observers in their priority order */
 | 
					            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
				
			||||||
                for (; p >= RADIO_OBSERVER_PRIORITY_LOWEST; p--) {
 | 
					        }
 | 
				
			||||||
                    if (signals[RADIO_OBSERVER_PRIORITY_INDEX(p)]) {
 | 
					    } else if (gutil_strv_contains((const GStrV*)radio_modem_response_ifaces, iface)) {
 | 
				
			||||||
                        g_signal_emit(self, signals
 | 
					        if (code == RADIO_MODEM_RESP_ACKNOWLEDGE_REQUEST) {
 | 
				
			||||||
                            [RADIO_OBSERVER_PRIORITY_INDEX(p)],
 | 
					            gbinder_reader_read_int32(&reader, &ack_serial);
 | 
				
			||||||
                            quark, code, info, &reader);
 | 
					        } else {
 | 
				
			||||||
                    }
 | 
					            /* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
 | 
				
			||||||
                }
 | 
					            gsize out_size;
 | 
				
			||||||
 | 
					            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
				
			||||||
                /* Ack unhandled responses */
 | 
					            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
				
			||||||
                if (info->type == RADIO_RESP_SOLICITED_ACK_EXP && !handled) {
 | 
					        }
 | 
				
			||||||
                    GDEBUG("ack unhandled response");
 | 
					    } else if (gutil_strv_contains((const GStrV*)radio_network_response_ifaces, iface)) {
 | 
				
			||||||
                    radio_instance_ack(self);
 | 
					        if (code == RADIO_NETWORK_RESP_ACKNOWLEDGE_REQUEST) {
 | 
				
			||||||
                }
 | 
					            gbinder_reader_read_int32(&reader, &ack_serial);
 | 
				
			||||||
            }
 | 
					        } else {
 | 
				
			||||||
 | 
					            gsize out_size;
 | 
				
			||||||
 | 
					            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
				
			||||||
 | 
					            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (gutil_strv_contains((const GStrV*)radio_sim_response_ifaces, iface)) {
 | 
				
			||||||
 | 
					        if (code == RADIO_SIM_RESP_ACKNOWLEDGE_REQUEST) {
 | 
				
			||||||
 | 
					            gbinder_reader_read_int32(&reader, &ack_serial);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            gsize out_size;
 | 
				
			||||||
 | 
					            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
				
			||||||
 | 
					            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (gutil_strv_contains((const GStrV*)radio_voice_response_ifaces, iface)) {
 | 
				
			||||||
 | 
					        if (code == RADIO_VOICE_RESP_ACKNOWLEDGE_REQUEST) {
 | 
				
			||||||
 | 
					            gbinder_reader_read_int32(&reader, &ack_serial);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            gsize out_size;
 | 
				
			||||||
 | 
					            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
				
			||||||
 | 
					            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        *status = GBINDER_STATUS_OK;
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        GWARN("Unexpected response %s %u", iface, code);
 | 
					        GWARN("Unexpected response %s %u", iface, code);
 | 
				
			||||||
        *status = GBINDER_STATUS_FAILED;
 | 
					        *status = GBINDER_STATUS_FAILED;
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* All these should be one-way transactions */
 | 
				
			||||||
 | 
					    GASSERT(flags & GBINDER_TX_FLAG_ONEWAY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ack_serial) {
 | 
				
			||||||
 | 
					        GDEBUG("%s %u acknowledgeRequest", iface, code);
 | 
				
			||||||
 | 
					        g_signal_emit(self, radio_instance_signals[SIGNAL_ACK], 0,
 | 
				
			||||||
 | 
					            ack_serial);
 | 
				
			||||||
 | 
					    } else if (info) {
 | 
				
			||||||
 | 
					        const GQuark quark = radio_instance_resp_quark(self, code);
 | 
				
			||||||
 | 
					        const guint* signals = radio_instance_signals +
 | 
				
			||||||
 | 
					            SIGNAL_OBSERVE_RESPONSE_0;
 | 
				
			||||||
 | 
					        int p = RADIO_OBSERVER_PRIORITY_HIGHEST;
 | 
				
			||||||
 | 
					        gboolean handled = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* High-priority observers are notified first */
 | 
				
			||||||
 | 
					        for (; p > RADIO_OBSERVER_PRIORITY_DEFAULT; p--) {
 | 
				
			||||||
 | 
					            if (signals[RADIO_OBSERVER_PRIORITY_INDEX(p)]) {
 | 
				
			||||||
 | 
					                g_signal_emit(self, signals
 | 
				
			||||||
 | 
					                    [RADIO_OBSERVER_PRIORITY_INDEX(p)],
 | 
				
			||||||
 | 
					                    quark, code, info, &reader);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Then handlers */
 | 
				
			||||||
 | 
					        g_signal_emit(self, radio_instance_signals
 | 
				
			||||||
 | 
					            [SIGNAL_HANDLE_RESPONSE],
 | 
				
			||||||
 | 
					            quark, code, info, &reader, &handled);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* And then remaining observers in their priority order */
 | 
				
			||||||
 | 
					        for (; p >= RADIO_OBSERVER_PRIORITY_LOWEST; p--) {
 | 
				
			||||||
 | 
					            if (signals[RADIO_OBSERVER_PRIORITY_INDEX(p)]) {
 | 
				
			||||||
 | 
					                g_signal_emit(self, signals
 | 
				
			||||||
 | 
					                    [RADIO_OBSERVER_PRIORITY_INDEX(p)],
 | 
				
			||||||
 | 
					                    quark, code, info, &reader);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Ack unhandled responses */
 | 
				
			||||||
 | 
					        if (info->type == RADIO_RESP_SOLICITED_ACK_EXP && !handled) {
 | 
				
			||||||
 | 
					            GDEBUG("ack unhandled response");
 | 
				
			||||||
 | 
					            radio_instance_ack(self);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    *status = GBINDER_STATUS_OK;
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -520,10 +737,9 @@ radio_instance_create_version(
 | 
				
			|||||||
    self->modem = priv->modem = g_strdup(modem);
 | 
					    self->modem = priv->modem = g_strdup(modem);
 | 
				
			||||||
    self->slot_index = slot_index;
 | 
					    self->slot_index = slot_index;
 | 
				
			||||||
    self->version = desc->version;
 | 
					    self->version = desc->version;
 | 
				
			||||||
 | 
					    self->interface_aidl = desc->aidl_interface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv->remote = gbinder_remote_object_ref(remote);
 | 
					    priv->remote = gbinder_remote_object_ref(remote);
 | 
				
			||||||
    priv->client = gbinder_client_new2(remote,
 | 
					 | 
				
			||||||
        radio_iface_info, G_N_ELEMENTS(radio_iface_info));
 | 
					 | 
				
			||||||
    priv->indication = gbinder_servicemanager_new_local_object2(sm,
 | 
					    priv->indication = gbinder_servicemanager_new_local_object2(sm,
 | 
				
			||||||
        desc->ind_ifaces, radio_instance_indication, self);
 | 
					        desc->ind_ifaces, radio_instance_indication, self);
 | 
				
			||||||
    priv->response = gbinder_servicemanager_new_local_object2(sm,
 | 
					    priv->response = gbinder_servicemanager_new_local_object2(sm,
 | 
				
			||||||
@@ -531,14 +747,27 @@ radio_instance_create_version(
 | 
				
			|||||||
    priv->death_id = gbinder_remote_object_add_death_handler(remote,
 | 
					    priv->death_id = gbinder_remote_object_add_death_handler(remote,
 | 
				
			||||||
        radio_instance_died, self);
 | 
					        radio_instance_died, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (desc->version != RADIO_INTERFACE_NONE) {
 | 
				
			||||||
 | 
					        self->interface_type = RADIO_INTERFACE_TYPE_HIDL;
 | 
				
			||||||
 | 
					        priv->client = gbinder_client_new2(remote,
 | 
				
			||||||
 | 
					            radio_iface_info, G_N_ELEMENTS(radio_iface_info));
 | 
				
			||||||
 | 
					    } else if (desc->aidl_interface != RADIO_AIDL_INTERFACE_NONE) {
 | 
				
			||||||
 | 
					        self->interface_type = RADIO_INTERFACE_TYPE_AIDL;
 | 
				
			||||||
 | 
					        priv->client = gbinder_client_new2(remote,
 | 
				
			||||||
 | 
					            radio_aidl_iface_info + desc->aidl_interface, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        gbinder_local_object_set_stability(priv->indication, GBINDER_STABILITY_VINTF);
 | 
				
			||||||
 | 
					        gbinder_local_object_set_stability(priv->response, GBINDER_STABILITY_VINTF);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* IRadio::setResponseFunctions */
 | 
					    /* IRadio::setResponseFunctions */
 | 
				
			||||||
    req = gbinder_client_new_request2(priv->client,
 | 
					    req = gbinder_client_new_request2(priv->client,
 | 
				
			||||||
        RADIO_REQ_SET_RESPONSE_FUNCTIONS);
 | 
					        desc->set_response_functions_req);
 | 
				
			||||||
    gbinder_local_request_init_writer(req, &writer);
 | 
					    gbinder_local_request_init_writer(req, &writer);
 | 
				
			||||||
    gbinder_writer_append_local_object(&writer, priv->response);
 | 
					    gbinder_writer_append_local_object(&writer, priv->response);
 | 
				
			||||||
    gbinder_writer_append_local_object(&writer, priv->indication);
 | 
					    gbinder_writer_append_local_object(&writer, priv->indication);
 | 
				
			||||||
    gbinder_remote_reply_unref(gbinder_client_transact_sync_reply(priv->client,
 | 
					    gbinder_remote_reply_unref(gbinder_client_transact_sync_reply(priv->client,
 | 
				
			||||||
        RADIO_REQ_SET_RESPONSE_FUNCTIONS, req, &status));
 | 
					        desc->set_response_functions_req, req, &status));
 | 
				
			||||||
    GVERBOSE_("setResponseFunctions %s status %d", slot, status);
 | 
					    GVERBOSE_("setResponseFunctions %s status %d", slot, status);
 | 
				
			||||||
    gbinder_local_request_unref(req);
 | 
					    gbinder_local_request_unref(req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -561,32 +790,47 @@ radio_instance_create(
 | 
				
			|||||||
    const char* key,
 | 
					    const char* key,
 | 
				
			||||||
    const char* modem,
 | 
					    const char* modem,
 | 
				
			||||||
    int slot_index,
 | 
					    int slot_index,
 | 
				
			||||||
    RADIO_INTERFACE max_version)
 | 
					    RADIO_INTERFACE max_version,
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE aidl_interface)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    RadioInstance* self = NULL;
 | 
					    RadioInstance* self = NULL;
 | 
				
			||||||
    GBinderServiceManager* sm = gbinder_servicemanager_new(dev);
 | 
					    GBinderServiceManager* sm = gbinder_servicemanager_new(dev);
 | 
				
			||||||
 | 
					    const RadioInterfaceDesc* interfaces = NULL;
 | 
				
			||||||
 | 
					    gsize num_interfaces = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (sm) {
 | 
					    if (!sm) {
 | 
				
			||||||
        guint i;
 | 
					        GERR_("Failed to get ServiceManager on %s", dev);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
        for (i = 0; i < G_N_ELEMENTS(radio_interfaces) && !self; i++) {
 | 
					 | 
				
			||||||
            const RadioInterfaceDesc* desc = radio_interfaces + i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (desc->version <= max_version) {
 | 
					 | 
				
			||||||
                char* fqname = g_strconcat(desc->radio_iface, "/", slot, NULL);
 | 
					 | 
				
			||||||
                GBinderRemoteObject* obj = /* autoreleased */
 | 
					 | 
				
			||||||
                    gbinder_servicemanager_get_service_sync(sm, fqname, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (obj) {
 | 
					 | 
				
			||||||
                    GINFO("Connected to %s", fqname);
 | 
					 | 
				
			||||||
                    self = radio_instance_create_version(sm, obj, dev, slot,
 | 
					 | 
				
			||||||
                        key, modem, slot_index, desc);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                g_free(fqname);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        gbinder_servicemanager_unref(sm);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (aidl_interface == RADIO_AIDL_INTERFACE_NONE) {
 | 
				
			||||||
 | 
					        interfaces = radio_interfaces;
 | 
				
			||||||
 | 
					        num_interfaces = G_N_ELEMENTS(radio_interfaces);
 | 
				
			||||||
 | 
					    } else if (aidl_interface > RADIO_AIDL_INTERFACE_NONE
 | 
				
			||||||
 | 
					                && aidl_interface < RADIO_AIDL_INTERFACE_COUNT) {
 | 
				
			||||||
 | 
					        interfaces = radio_aidl_interfaces + aidl_interface;
 | 
				
			||||||
 | 
					        num_interfaces = 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (guint i = 0; i < num_interfaces && !self; i++) {
 | 
				
			||||||
 | 
					        const RadioInterfaceDesc* desc = interfaces + i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (desc->version <= max_version) {
 | 
				
			||||||
 | 
					            char* fqname = g_strconcat(desc->radio_iface, "/", slot, NULL);
 | 
				
			||||||
 | 
					            GBinderRemoteObject* obj = /* autoreleased */
 | 
				
			||||||
 | 
					                gbinder_servicemanager_get_service_sync(sm, fqname, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (obj) {
 | 
				
			||||||
 | 
					                GINFO("Connected to %s", fqname);
 | 
				
			||||||
 | 
					                self = radio_instance_create_version(sm, obj, dev, slot,
 | 
				
			||||||
 | 
					                    key, modem, slot_index, desc);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            g_free(fqname);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gbinder_servicemanager_unref(sm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return self;
 | 
					    return self;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -595,9 +839,10 @@ char*
 | 
				
			|||||||
radio_instance_make_key(
 | 
					radio_instance_make_key(
 | 
				
			||||||
    const char* dev,
 | 
					    const char* dev,
 | 
				
			||||||
    const char* name,
 | 
					    const char* name,
 | 
				
			||||||
    RADIO_INTERFACE version)
 | 
					    RADIO_INTERFACE version,
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE aidl_interface)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return g_strdup_printf("%s:%s:%d", dev, name, version);
 | 
					    return g_strdup_printf("%s:%s:%d:%d", dev, name, version, aidl_interface);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static
 | 
					static
 | 
				
			||||||
@@ -705,7 +950,7 @@ radio_instance_ind_quark(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->ind_quarks, key));
 | 
					        q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->ind_quarks, key));
 | 
				
			||||||
        if (!q) {
 | 
					        if (!q) {
 | 
				
			||||||
            const char* known = radio_ind_name(ind);
 | 
					            const char* known = radio_ind_name2(self, ind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (known) {
 | 
					            if (known) {
 | 
				
			||||||
                q = g_quark_from_static_string(known);
 | 
					                q = g_quark_from_static_string(known);
 | 
				
			||||||
@@ -775,9 +1020,23 @@ radio_instance_new_with_modem_slot_and_version(
 | 
				
			|||||||
    const char* modem,
 | 
					    const char* modem,
 | 
				
			||||||
    int slot,
 | 
					    int slot,
 | 
				
			||||||
    RADIO_INTERFACE version) /* Since 1.2.1 */
 | 
					    RADIO_INTERFACE version) /* Since 1.2.1 */
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return radio_instance_new_with_modem_slot_version_and_interface(
 | 
				
			||||||
 | 
					        dev, name, modem, slot, version, RADIO_AIDL_INTERFACE_NONE);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RadioInstance*
 | 
				
			||||||
 | 
					radio_instance_new_with_modem_slot_version_and_interface(
 | 
				
			||||||
 | 
					    const char* dev,
 | 
				
			||||||
 | 
					    const char* name,
 | 
				
			||||||
 | 
					    const char* modem,
 | 
				
			||||||
 | 
					    int slot,
 | 
				
			||||||
 | 
					    RADIO_INTERFACE version,
 | 
				
			||||||
 | 
					    RADIO_AIDL_INTERFACE aidl_interface) /* Since 1.6.0 */
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (dev && dev[0] && name && name[0]) {
 | 
					    if (dev && dev[0] && name && name[0]) {
 | 
				
			||||||
        char* key = radio_instance_make_key(dev, name, version);
 | 
					        /* HIDL and AIDL would use different binder devices */
 | 
				
			||||||
 | 
					        char* key = radio_instance_make_key(dev, name, version, aidl_interface);
 | 
				
			||||||
        RadioInstance* self = NULL;
 | 
					        RadioInstance* self = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (radio_instance_table) {
 | 
					        if (radio_instance_table) {
 | 
				
			||||||
@@ -787,7 +1046,8 @@ radio_instance_new_with_modem_slot_and_version(
 | 
				
			|||||||
            g_free(key);
 | 
					            g_free(key);
 | 
				
			||||||
            return radio_instance_ref(self);
 | 
					            return radio_instance_ref(self);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            self = radio_instance_create(dev, name, key, modem, slot, version);
 | 
					            self = radio_instance_create(dev, name, key, modem, slot, version,
 | 
				
			||||||
 | 
					                                         aidl_interface);
 | 
				
			||||||
            if (self) {
 | 
					            if (self) {
 | 
				
			||||||
                if (!radio_instance_table) {
 | 
					                if (!radio_instance_table) {
 | 
				
			||||||
                    radio_instance_table = g_hash_table_new_full
 | 
					                    radio_instance_table = g_hash_table_new_full
 | 
				
			||||||
@@ -830,7 +1090,7 @@ radio_instance_get_with_version(
 | 
				
			|||||||
    RadioInstance* self = NULL;
 | 
					    RadioInstance* self = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (dev && dev[0] && name && name[0] && radio_instance_table) {
 | 
					    if (dev && dev[0] && name && name[0] && radio_instance_table) {
 | 
				
			||||||
        char* key = radio_instance_make_key(dev, name, version);
 | 
					        char* key = radio_instance_make_key(dev, name, version, RADIO_AIDL_INTERFACE_NONE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self = g_hash_table_lookup(radio_instance_table, key);
 | 
					        self = g_hash_table_lookup(radio_instance_table, key);
 | 
				
			||||||
        g_free(key);
 | 
					        g_free(key);
 | 
				
			||||||
@@ -905,7 +1165,7 @@ radio_instance_req_name(
 | 
				
			|||||||
    RadioInstance* self,
 | 
					    RadioInstance* self,
 | 
				
			||||||
    RADIO_REQ req)
 | 
					    RADIO_REQ req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* known = radio_req_name(req);
 | 
					    const char* known = radio_req_name2(self, req);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (known) {
 | 
					    if (known) {
 | 
				
			||||||
        return known;
 | 
					        return known;
 | 
				
			||||||
@@ -924,7 +1184,7 @@ radio_instance_resp_name(
 | 
				
			|||||||
    RadioInstance* self,
 | 
					    RadioInstance* self,
 | 
				
			||||||
    RADIO_RESP resp)
 | 
					    RADIO_RESP resp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* known = radio_resp_name(resp);
 | 
					    const char* known = radio_resp_name2(self, resp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (known) {
 | 
					    if (known) {
 | 
				
			||||||
        return known;
 | 
					        return known;
 | 
				
			||||||
@@ -943,7 +1203,7 @@ radio_instance_ind_name(
 | 
				
			|||||||
    RadioInstance* self,
 | 
					    RadioInstance* self,
 | 
				
			||||||
    RADIO_IND ind)
 | 
					    RADIO_IND ind)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* known = radio_ind_name(ind);
 | 
					    const char* known = radio_ind_name2(self, ind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (known) {
 | 
					    if (known) {
 | 
				
			||||||
        return known;
 | 
					        return known;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										373
									
								
								src/radio_util.c
									
									
									
									
									
								
							
							
						
						
									
										373
									
								
								src/radio_util.c
									
									
									
									
									
								
							@@ -35,6 +35,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "radio_util_p.h"
 | 
					#include "radio_util_p.h"
 | 
				
			||||||
 | 
					#include "radio_instance.h"
 | 
				
			||||||
#include "radio_log.h"
 | 
					#include "radio_log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GLOG_MODULE_DEFINE("gbinder-radio");
 | 
					GLOG_MODULE_DEFINE("gbinder-radio");
 | 
				
			||||||
@@ -56,29 +57,116 @@ const char*
 | 
				
			|||||||
radio_req_name(
 | 
					radio_req_name(
 | 
				
			||||||
    RADIO_REQ req)
 | 
					    RADIO_REQ req)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (req) {
 | 
					    return radio_req_name2(NULL, req);
 | 
				
			||||||
    case RADIO_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
					}
 | 
				
			||||||
    case RADIO_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					radio_req_name2(
 | 
				
			||||||
 | 
					    RadioInstance* instance,
 | 
				
			||||||
 | 
					    RADIO_REQ req)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!G_LIKELY(instance) || instance->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					        switch (req) {
 | 
				
			||||||
 | 
					        case RADIO_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
				
			||||||
 | 
					        case RADIO_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
				
			||||||
#define RADIO_REQ_(req,resp,Name,NAME) \
 | 
					#define RADIO_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
    case RADIO_REQ_##NAME: return #Name;
 | 
					        case RADIO_REQ_##NAME: return #Name;
 | 
				
			||||||
#define RADIO_REQ__(req,resp,Name,NAME,x) \
 | 
					#define RADIO_REQ__(req,resp,Name,NAME,x) \
 | 
				
			||||||
    case RADIO_REQ_##NAME##x: return #Name #x;
 | 
					        case RADIO_REQ_##NAME##x: return #Name #x;
 | 
				
			||||||
    RADIO_CALL_1_0(RADIO_REQ_)
 | 
					        RADIO_CALL_1_0(RADIO_REQ_)
 | 
				
			||||||
    RADIO_CALL_1_1(RADIO_REQ_)
 | 
					        RADIO_CALL_1_1(RADIO_REQ_)
 | 
				
			||||||
    RADIO_CALL_1_2(RADIO_REQ_)
 | 
					        RADIO_CALL_1_2(RADIO_REQ_)
 | 
				
			||||||
    RADIO_CALL_1_3(RADIO_REQ_)
 | 
					        RADIO_CALL_1_3(RADIO_REQ_)
 | 
				
			||||||
    RADIO_CALL_1_4_(RADIO_REQ__)
 | 
					        RADIO_CALL_1_4_(RADIO_REQ__)
 | 
				
			||||||
    RADIO_CALL_1_5_(RADIO_REQ__)
 | 
					        RADIO_CALL_1_5_(RADIO_REQ__)
 | 
				
			||||||
#undef RADIO_REQ_
 | 
					#undef RADIO_REQ_
 | 
				
			||||||
#undef RADIO_REQ__
 | 
					#undef RADIO_REQ__
 | 
				
			||||||
    case RADIO_REQ_START_NETWORK_SCAN_1_2:     return "startNetworkScan_1_2";
 | 
					        case RADIO_REQ_START_NETWORK_SCAN_1_2:     return "startNetworkScan_1_2";
 | 
				
			||||||
    case RADIO_REQ_SET_INDICATION_FILTER_1_2:  return "setIndicationFilter_1_2";
 | 
					        case RADIO_REQ_SET_INDICATION_FILTER_1_2:  return "setIndicationFilter_1_2";
 | 
				
			||||||
    case RADIO_REQ_SETUP_DATA_CALL_1_2:        return "setupDataCall_1_2";
 | 
					        case RADIO_REQ_SETUP_DATA_CALL_1_2:        return "setupDataCall_1_2";
 | 
				
			||||||
    case RADIO_REQ_DEACTIVATE_DATA_CALL_1_2:   return "deactivateDataCall_1_2";
 | 
					        case RADIO_REQ_DEACTIVATE_DATA_CALL_1_2:   return "deactivateDataCall_1_2";
 | 
				
			||||||
    case RADIO_REQ_SET_INITIAL_ATTACH_APN_1_4: return "setInitialAttachApn_1_4";
 | 
					        case RADIO_REQ_SET_INITIAL_ATTACH_APN_1_4: return "setInitialAttachApn_1_4";
 | 
				
			||||||
    case RADIO_REQ_SET_DATA_PROFILE_1_4:       return "setDataProfile_1_4";
 | 
					        case RADIO_REQ_SET_DATA_PROFILE_1_4:       return "setDataProfile_1_4";
 | 
				
			||||||
    case RADIO_REQ_ANY:
 | 
					        case RADIO_REQ_ANY:
 | 
				
			||||||
        break;
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_DATA_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_DATA_REQ)req) {
 | 
				
			||||||
 | 
					#define RADIO_DATA_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_DATA_REQ_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_DATA_CALL_1(RADIO_DATA_REQ_)
 | 
				
			||||||
 | 
					#undef RADIO_DATA_REQ_
 | 
				
			||||||
 | 
					        case RADIO_DATA_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
				
			||||||
 | 
					        case RADIO_DATA_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
				
			||||||
 | 
					        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) \
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_REQ_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_MESSAGING_CALL_1(RADIO_MESSAGING_REQ_)
 | 
				
			||||||
 | 
					#undef RADIO_MESSAGING_REQ_
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_REQ_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_MODEM_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_MODEM_REQ)req) {
 | 
				
			||||||
 | 
					#define RADIO_MODEM_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_MODEM_REQ_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_MODEM_CALL_1(RADIO_MODEM_REQ_)
 | 
				
			||||||
 | 
					#undef RADIO_MODEM_REQ_
 | 
				
			||||||
 | 
					        case RADIO_MODEM_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
				
			||||||
 | 
					        case RADIO_MODEM_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
				
			||||||
 | 
					        case RADIO_MODEM_REQ_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_NETWORK_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_NETWORK_REQ)req) {
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_REQ_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_NETWORK_CALL_1(RADIO_NETWORK_REQ_)
 | 
				
			||||||
 | 
					#undef RADIO_NETWORK_REQ_
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_REQ_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_SIM_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_SIM_REQ)req) {
 | 
				
			||||||
 | 
					#define RADIO_SIM_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_SIM_REQ_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_SIM_CALL_1(RADIO_SIM_REQ_)
 | 
				
			||||||
 | 
					#undef RADIO_SIM_REQ_
 | 
				
			||||||
 | 
					        case RADIO_SIM_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
				
			||||||
 | 
					        case RADIO_SIM_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
				
			||||||
 | 
					        case RADIO_SIM_REQ_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_VOICE_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_VOICE_REQ)req) {
 | 
				
			||||||
 | 
					#define RADIO_VOICE_REQ_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_VOICE_REQ_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_VOICE_CALL_1(RADIO_VOICE_REQ_)
 | 
				
			||||||
 | 
					#undef RADIO_VOICE_REQ_
 | 
				
			||||||
 | 
					        case RADIO_VOICE_REQ_HANGUP:                   return "hangup";
 | 
				
			||||||
 | 
					        case RADIO_VOICE_REQ_SET_RESPONSE_FUNCTIONS:   return "setResponseFunctions";
 | 
				
			||||||
 | 
					        case RADIO_VOICE_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
 | 
				
			||||||
 | 
					        case RADIO_VOICE_REQ_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -87,48 +175,128 @@ const char*
 | 
				
			|||||||
radio_resp_name(
 | 
					radio_resp_name(
 | 
				
			||||||
    RADIO_RESP resp)
 | 
					    RADIO_RESP resp)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (resp) {
 | 
					    return radio_resp_name2(NULL, resp);
 | 
				
			||||||
    case RADIO_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					radio_resp_name2(
 | 
				
			||||||
 | 
					    RadioInstance* instance,
 | 
				
			||||||
 | 
					    RADIO_RESP resp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!G_LIKELY(instance) || instance->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					        switch (resp) {
 | 
				
			||||||
 | 
					        case RADIO_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
 | 
				
			||||||
#define RADIO_RESP_(req,resp,Name,NAME) \
 | 
					#define RADIO_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
    case RADIO_RESP_##NAME: return #Name "Response";
 | 
					        case RADIO_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
#define RADIO_RESP__(req,resp,Name,NAME,x) \
 | 
					#define RADIO_RESP__(req,resp,Name,NAME,x) \
 | 
				
			||||||
    case RADIO_RESP_##NAME##x: return #Name "Response" #x;
 | 
					        case RADIO_RESP_##NAME##x: return #Name "Response" #x;
 | 
				
			||||||
    RADIO_CALL_1_0(RADIO_RESP_)
 | 
					        RADIO_CALL_1_0(RADIO_RESP_)
 | 
				
			||||||
    RADIO_CALL_1_1(RADIO_RESP_)
 | 
					        RADIO_CALL_1_1(RADIO_RESP_)
 | 
				
			||||||
    RADIO_CALL_1_2(RADIO_RESP_)
 | 
					        RADIO_CALL_1_2(RADIO_RESP_)
 | 
				
			||||||
    RADIO_CALL_1_3(RADIO_RESP_)
 | 
					        RADIO_CALL_1_3(RADIO_RESP_)
 | 
				
			||||||
    RADIO_CALL_1_4_(RADIO_RESP__)
 | 
					        RADIO_CALL_1_4_(RADIO_RESP__)
 | 
				
			||||||
    RADIO_CALL_1_5_(RADIO_RESP__)
 | 
					        RADIO_CALL_1_5_(RADIO_RESP__)
 | 
				
			||||||
#undef RADIO_RESP_
 | 
					#undef RADIO_RESP_
 | 
				
			||||||
#undef RADIO_RESP__
 | 
					#undef RADIO_RESP__
 | 
				
			||||||
    case RADIO_RESP_GET_CELL_INFO_LIST_1_2:
 | 
					        case RADIO_RESP_GET_CELL_INFO_LIST_1_2:
 | 
				
			||||||
        return "getCellInfoListResponse_1_2";
 | 
					            return "getCellInfoListResponse_1_2";
 | 
				
			||||||
    case RADIO_RESP_GET_ICC_CARD_STATUS_1_2:
 | 
					        case RADIO_RESP_GET_ICC_CARD_STATUS_1_2:
 | 
				
			||||||
        return "getIccCardStatusResponse_1_2";
 | 
					            return "getIccCardStatusResponse_1_2";
 | 
				
			||||||
    case RADIO_RESP_GET_CURRENT_CALLS_1_2:
 | 
					        case RADIO_RESP_GET_CURRENT_CALLS_1_2:
 | 
				
			||||||
        return "getCurrentCallsResponse_1_2";
 | 
					            return "getCurrentCallsResponse_1_2";
 | 
				
			||||||
    case RADIO_RESP_GET_SIGNAL_STRENGTH_1_2:
 | 
					        case RADIO_RESP_GET_SIGNAL_STRENGTH_1_2:
 | 
				
			||||||
        return "getSignalStrengthResponse_1_2";
 | 
					            return "getSignalStrengthResponse_1_2";
 | 
				
			||||||
    case RADIO_RESP_GET_VOICE_REGISTRATION_STATE_1_2:
 | 
					        case RADIO_RESP_GET_VOICE_REGISTRATION_STATE_1_2:
 | 
				
			||||||
        return "getVoiceRegistrationStateResponse_1_2";
 | 
					            return "getVoiceRegistrationStateResponse_1_2";
 | 
				
			||||||
    case RADIO_RESP_GET_DATA_REGISTRATION_STATE_1_2:
 | 
					        case RADIO_RESP_GET_DATA_REGISTRATION_STATE_1_2:
 | 
				
			||||||
        return "getDataRegistrationStateResponse_1_2";
 | 
					            return "getDataRegistrationStateResponse_1_2";
 | 
				
			||||||
    case RADIO_RESP_GET_CELL_INFO_LIST_RESPONSE_1_4:
 | 
					        case RADIO_RESP_GET_CELL_INFO_LIST_RESPONSE_1_4:
 | 
				
			||||||
        return "getCellInfoListResponse_1_4";
 | 
					            return "getCellInfoListResponse_1_4";
 | 
				
			||||||
    case RADIO_RESP_GET_DATA_REGISTRATION_STATE_RESPONSE_1_4:
 | 
					        case RADIO_RESP_GET_DATA_REGISTRATION_STATE_RESPONSE_1_4:
 | 
				
			||||||
        return "getDataRegistrationStateResponse_1_4";
 | 
					            return "getDataRegistrationStateResponse_1_4";
 | 
				
			||||||
    case RADIO_RESP_GET_ICC_CARD_STATUS_RESPONSE_1_4:
 | 
					        case RADIO_RESP_GET_ICC_CARD_STATUS_RESPONSE_1_4:
 | 
				
			||||||
        return "getIccCardStatusResponse_1_4";
 | 
					            return "getIccCardStatusResponse_1_4";
 | 
				
			||||||
    case RADIO_RESP_GET_DATA_CALL_LIST_RESPONSE_1_4:
 | 
					        case RADIO_RESP_GET_DATA_CALL_LIST_RESPONSE_1_4:
 | 
				
			||||||
        return "getDataCallListResponse_1_4";
 | 
					            return "getDataCallListResponse_1_4";
 | 
				
			||||||
    case RADIO_RESP_GET_DATA_CALL_LIST_1_5:
 | 
					        case RADIO_RESP_GET_DATA_CALL_LIST_1_5:
 | 
				
			||||||
        return "getDataCallList_1_5";
 | 
					            return "getDataCallList_1_5";
 | 
				
			||||||
    case RADIO_RESP_GET_CELL_INFO_LIST_1_5:
 | 
					        case RADIO_RESP_GET_CELL_INFO_LIST_1_5:
 | 
				
			||||||
        return "getCellInfoListResponse_1_5";
 | 
					            return "getCellInfoListResponse_1_5";
 | 
				
			||||||
    case RADIO_RESP_GET_ICC_CARD_STATUS_1_5:
 | 
					        case RADIO_RESP_GET_ICC_CARD_STATUS_1_5:
 | 
				
			||||||
        return "getIccCardStatus_1_5";
 | 
					            return "getIccCardStatus_1_5";
 | 
				
			||||||
    case RADIO_RESP_ANY:
 | 
					        case RADIO_RESP_ANY:
 | 
				
			||||||
        break;
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_DATA_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_DATA_RESP)resp) {
 | 
				
			||||||
 | 
					        case RADIO_DATA_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
 | 
				
			||||||
 | 
					#define RADIO_DATA_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_DATA_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
 | 
					        RADIO_DATA_CALL_1(RADIO_DATA_RESP_)
 | 
				
			||||||
 | 
					#undef RADIO_DATA_RESP_
 | 
				
			||||||
 | 
					        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";
 | 
				
			||||||
 | 
					#define RADIO_MESSAGING_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
 | 
					        RADIO_MESSAGING_CALL_1(RADIO_MESSAGING_RESP_)
 | 
				
			||||||
 | 
					#undef RADIO_MESSAGING_RESP_
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_RESP_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_MODEM_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_MODEM_RESP)resp) {
 | 
				
			||||||
 | 
					        case RADIO_MODEM_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
 | 
				
			||||||
 | 
					#define RADIO_MODEM_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_MODEM_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
 | 
					        RADIO_MODEM_CALL_1(RADIO_MODEM_RESP_)
 | 
				
			||||||
 | 
					#undef RADIO_MODEM_RESP_
 | 
				
			||||||
 | 
					        case RADIO_MODEM_RESP_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_NETWORK_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_NETWORK_RESP)resp) {
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
 | 
					        RADIO_NETWORK_CALL_1(RADIO_NETWORK_RESP_)
 | 
				
			||||||
 | 
					#undef RADIO_NETWORK_RESP_
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_RESP_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_SIM_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_SIM_RESP)resp) {
 | 
				
			||||||
 | 
					        case RADIO_SIM_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
 | 
				
			||||||
 | 
					#define RADIO_SIM_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_SIM_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
 | 
					        RADIO_SIM_CALL_1(RADIO_SIM_RESP_)
 | 
				
			||||||
 | 
					#undef RADIO_SIM_RESP_
 | 
				
			||||||
 | 
					        case RADIO_SIM_RESP_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_VOICE_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_VOICE_RESP)resp) {
 | 
				
			||||||
 | 
					        case RADIO_VOICE_RESP_ACKNOWLEDGE_REQUEST:        return "acknowledgeRequest";
 | 
				
			||||||
 | 
					        case RADIO_VOICE_RESP_HANGUP_CONNECTION_RESPONSE: return "hangupConnectionResponse";
 | 
				
			||||||
 | 
					#define RADIO_VOICE_RESP_(req,resp,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_VOICE_RESP_##NAME: return #Name "Response";
 | 
				
			||||||
 | 
					        RADIO_VOICE_CALL_1(RADIO_VOICE_RESP_)
 | 
				
			||||||
 | 
					#undef RADIO_VOICE_RESP_
 | 
				
			||||||
 | 
					        case RADIO_VOICE_RESP_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -137,17 +305,90 @@ const char*
 | 
				
			|||||||
radio_ind_name(
 | 
					radio_ind_name(
 | 
				
			||||||
    RADIO_IND ind)
 | 
					    RADIO_IND ind)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (ind) {
 | 
					    return radio_ind_name2(NULL, ind);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char*
 | 
				
			||||||
 | 
					radio_ind_name2(
 | 
				
			||||||
 | 
					    RadioInstance* instance,
 | 
				
			||||||
 | 
					    RADIO_IND ind)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!G_LIKELY(instance) || instance->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
 | 
				
			||||||
 | 
					        switch (ind) {
 | 
				
			||||||
#define RADIO_IND_(code,Name,NAME) \
 | 
					#define RADIO_IND_(code,Name,NAME) \
 | 
				
			||||||
    case RADIO_IND_##NAME: return #Name;
 | 
					        case RADIO_IND_##NAME: return #Name;
 | 
				
			||||||
    RADIO_EVENT_1_0(RADIO_IND_)
 | 
					        RADIO_EVENT_1_0(RADIO_IND_)
 | 
				
			||||||
    RADIO_EVENT_1_1(RADIO_IND_)
 | 
					        RADIO_EVENT_1_1(RADIO_IND_)
 | 
				
			||||||
    RADIO_EVENT_1_2(RADIO_IND_)
 | 
					        RADIO_EVENT_1_2(RADIO_IND_)
 | 
				
			||||||
    RADIO_EVENT_1_4(RADIO_IND_)
 | 
					        RADIO_EVENT_1_4(RADIO_IND_)
 | 
				
			||||||
    RADIO_EVENT_1_5(RADIO_IND_)
 | 
					        RADIO_EVENT_1_5(RADIO_IND_)
 | 
				
			||||||
#undef RADIO_IND_
 | 
					#undef RADIO_IND_
 | 
				
			||||||
    case RADIO_IND_ANY:
 | 
					        case RADIO_IND_ANY:
 | 
				
			||||||
        break;
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_DATA_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_DATA_IND)ind) {
 | 
				
			||||||
 | 
					#define RADIO_DATA_IND_(code,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_DATA_IND_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_DATA_IND_1(RADIO_DATA_IND_)
 | 
				
			||||||
 | 
					#undef RADIO_DATA_IND_
 | 
				
			||||||
 | 
					        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) \
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_IND_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_MESSAGING_IND_1(RADIO_MESSAGING_IND_)
 | 
				
			||||||
 | 
					#undef RADIO_MESSAGING_IND_
 | 
				
			||||||
 | 
					        case RADIO_MESSAGING_IND_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_MODEM_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_MODEM_IND)ind) {
 | 
				
			||||||
 | 
					#define RADIO_MODEM_IND_(code,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_MODEM_IND_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_MODEM_IND_1(RADIO_MODEM_IND_)
 | 
				
			||||||
 | 
					#undef RADIO_MODEM_IND_
 | 
				
			||||||
 | 
					        case RADIO_MODEM_IND_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_NETWORK_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_NETWORK_IND)ind) {
 | 
				
			||||||
 | 
					#define RADIO_NETWORK_IND_(code,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_IND_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_NETWORK_IND_1(RADIO_NETWORK_IND_)
 | 
				
			||||||
 | 
					#undef RADIO_NETWORK_IND_
 | 
				
			||||||
 | 
					        case RADIO_NETWORK_IND_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_SIM_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_SIM_IND)ind) {
 | 
				
			||||||
 | 
					#define RADIO_SIM_IND_(code,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_SIM_IND_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_SIM_IND_1(RADIO_SIM_IND_)
 | 
				
			||||||
 | 
					#undef RADIO_SIM_IND_
 | 
				
			||||||
 | 
					        case RADIO_SIM_IND_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else if (instance->interface_aidl == RADIO_VOICE_INTERFACE) {
 | 
				
			||||||
 | 
					        switch ((RADIO_VOICE_IND)ind) {
 | 
				
			||||||
 | 
					#define RADIO_VOICE_IND_(code,Name,NAME) \
 | 
				
			||||||
 | 
					        case RADIO_VOICE_IND_##NAME: return #Name;
 | 
				
			||||||
 | 
					        RADIO_VOICE_IND_1(RADIO_VOICE_IND_)
 | 
				
			||||||
 | 
					#undef RADIO_VOICE_IND_
 | 
				
			||||||
 | 
					        case RADIO_VOICE_IND_ANY:
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,6 +43,7 @@ struct gbinder_local_object {
 | 
				
			|||||||
    char** ifaces;
 | 
					    char** ifaces;
 | 
				
			||||||
    GBinderLocalTransactFunc txproc;
 | 
					    GBinderLocalTransactFunc txproc;
 | 
				
			||||||
    void* user_data;
 | 
					    void* user_data;
 | 
				
			||||||
 | 
					    GBINDER_STABILITY_LEVEL stability;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char hidl_base_interface[] = "android.hidl.base@1.0::IBase";
 | 
					static const char hidl_base_interface[] = "android.hidl.base@1.0::IBase";
 | 
				
			||||||
@@ -144,6 +145,16 @@ gbinder_local_object_drop(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					gbinder_local_object_set_stability(
 | 
				
			||||||
 | 
					    GBinderLocalObject* self,
 | 
				
			||||||
 | 
					    GBINDER_STABILITY_LEVEL stability)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (self) {
 | 
				
			||||||
 | 
					        self->stability = stability;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Local Variables:
 | 
					 * Local Variables:
 | 
				
			||||||
 * mode: C
 | 
					 * mode: C
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -373,6 +373,24 @@ gbinder_reader_read_hidl_struct1(
 | 
				
			|||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const void*
 | 
				
			||||||
 | 
					gbinder_reader_read_parcelable(
 | 
				
			||||||
 | 
					    GBinderReader* reader,
 | 
				
			||||||
 | 
					    gsize* size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    TestGBinderReader* self = test_gbinder_reader_cast(reader);
 | 
				
			||||||
 | 
					    TestGBinderDataItem* item = self->item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (item && item->type == DATA_TYPE_BUFFER) {
 | 
				
			||||||
 | 
					        if (size) {
 | 
				
			||||||
 | 
					            *size = item->data.blob.size;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        self->item = item->next;
 | 
				
			||||||
 | 
					        return item->data.blob.buf;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GBinderRemoteObject*
 | 
					GBinderRemoteObject*
 | 
				
			||||||
gbinder_reader_read_object(
 | 
					gbinder_reader_read_object(
 | 
				
			||||||
    GBinderReader* reader)
 | 
					    GBinderReader* reader)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user