[gbinder-radio] Implement support for AIDL IRadioNetwork. JB#61702
This commit is contained in:
		@@ -39,6 +39,7 @@
 | 
			
		||||
 | 
			
		||||
#include <radio_types.h>
 | 
			
		||||
#include <radio_modem_types.h>
 | 
			
		||||
#include <radio_network_types.h>
 | 
			
		||||
#include <radio_sim_types.h>
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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:
 | 
			
		||||
 */
 | 
			
		||||
@@ -72,7 +72,7 @@ typedef enum radio_aidl_interface {
 | 
			
		||||
    // RADIO_IMS_INTERFACE,
 | 
			
		||||
    // RADIO_MESSAGING_INTERFACE,
 | 
			
		||||
    RADIO_MODEM_INTERFACE,
 | 
			
		||||
    // RADIO_NETWORK_INTERFACE,
 | 
			
		||||
    RADIO_NETWORK_INTERFACE,
 | 
			
		||||
    RADIO_SIM_INTERFACE,
 | 
			
		||||
    // RADIO_VOICE_INTERFACE,
 | 
			
		||||
    RADIO_AIDL_INTERFACE_COUNT
 | 
			
		||||
 
 | 
			
		||||
@@ -185,6 +185,7 @@ G_STATIC_ASSERT(G_N_ELEMENTS(radio_interfaces) == RADIO_INTERFACE_COUNT);
 | 
			
		||||
 | 
			
		||||
static const GBinderClientIfaceInfo radio_aidl_iface_info[] = {
 | 
			
		||||
    {RADIO_MODEM, RADIO_MODEM_1_REQ_LAST},
 | 
			
		||||
    {RADIO_NETWORK, RADIO_NETWORK_1_REQ_LAST},
 | 
			
		||||
    {RADIO_SIM, RADIO_SIM_1_REQ_LAST},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -198,6 +199,16 @@ static const char* const radio_modem_response_ifaces[] = {
 | 
			
		||||
    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
 | 
			
		||||
@@ -217,6 +228,14 @@ static const RadioInterfaceDesc radio_aidl_interfaces[] = {
 | 
			
		||||
        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,
 | 
			
		||||
@@ -332,6 +351,7 @@ radio_instance_indication(
 | 
			
		||||
 | 
			
		||||
    if (gutil_strv_contains((const GStrV*)radio_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)) {
 | 
			
		||||
        GBinderReader reader;
 | 
			
		||||
        guint type;
 | 
			
		||||
@@ -442,6 +462,14 @@ radio_instance_response(
 | 
			
		||||
            info = gbinder_reader_read_parcelable(&reader, &out_size);
 | 
			
		||||
            GASSERT(out_size >= sizeof(RadioResponseInfo));
 | 
			
		||||
        }
 | 
			
		||||
    } else if (gutil_strv_contains((const GStrV*)radio_network_response_ifaces, iface)) {
 | 
			
		||||
        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);
 | 
			
		||||
 
 | 
			
		||||
@@ -101,6 +101,17 @@ radio_req_name2(
 | 
			
		||||
        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) \
 | 
			
		||||
@@ -182,6 +193,16 @@ radio_resp_name2(
 | 
			
		||||
        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";
 | 
			
		||||
@@ -230,6 +251,15 @@ radio_ind_name2(
 | 
			
		||||
        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) \
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user