Compare commits

...

27 Commits

Author SHA1 Message Date
eb631f637c debian files 2025-10-17 23:15:20 +08:00
ae08826314 Fix symlink according to Debian policy 2025-10-17 23:13:54 +08:00
Matti Lehtimäki
a4a19a374a Version 1.6.0 2024-09-26 14:06:44 +03:00
Matti Lehtimäki
00248f8da3 Merge pull request #28 from mer-hybris/aidl
Add support for AIDL interfaces
2024-09-26 14:01:59 +03:00
Matti Lehtimäki
418405697e [gbinder-radio] Implement support for AIDL IRadioIms. JB#61702 2024-09-23 23:37:55 +03:00
Matti Lehtimäki
12133c9685 [gbinder-radio] Implement support for AIDL IRadioVoice. JB#61702 2024-09-23 23:37:55 +03:00
Matti Lehtimäki
50c615095b [gbinder-radio] Implement support for AIDL IRadioMessaging. JB#61702 2024-09-23 23:37:55 +03:00
Matti Lehtimäki
fa6a4d7e1a [gbinder-radio] Implement support for AIDL IRadioData. JB#61702 2024-09-23 23:37:55 +03:00
Matti Lehtimäki
bedb4a7659 [gbinder-radio] Implement support for AIDL IRadioNetwork. JB#61702 2024-09-23 23:37:55 +03:00
Nikita Ukhrenkov
500465507e [gbinder-radio] Implement support for AIDL IRadioSim. JB#61702 2024-09-23 23:37:55 +03:00
Nikita Ukhrenkov
b8917f5985 [gbinder-radio] Implement support for AIDL IRadioModem. JB#61702 2024-09-23 23:37:55 +03:00
Nikita Ukhrenkov
453595be28 [gbinder-radio] Implement support for AIDL IRadioConfig. JB#61702 2024-09-23 23:37:55 +03:00
Matti Lehtimäki
4803615920 Version 1.5.6 2023-04-21 14:56:04 +03:00
Matti Lehtimäki
d4a04ab083 Version 1.5.5 2023-04-14 22:44:58 +03:00
Matti Lehtimäki
5cf3d8c3cc Merge pull request #27 from mer-hybris/jb58746-fixes
Add missing RadioAppStatus_1_5 struct and radio indication filter enum values. Fix cell identity enum values.
2023-04-14 22:40:27 +03:00
Matti Lehtimäki
b319fa4dc6 [gbinder-radio] Add missing RadioAppStatus_1_5 struct. JB#58746 2023-04-12 16:55:21 +03:00
Matti Lehtimäki
5cfa6756ee [gbinder-radio] Add missing radio indication filter enum values for IRadio@1.5 interface. JB#58746 2023-04-12 16:55:18 +03:00
Matti Lehtimäki
a997d138fa [gbinder-radio] Fix RADIO_CELL_IDENTITY_TYPE_1_5 enum values. JB#58746 2023-04-12 16:51:52 +03:00
Slava Monich
48da098644 Version 1.5.4 2022-11-30 19:17:31 +02:00
Slava Monich
3d3e023fe8 Merge pull request #26 from mer-hybris/jb58763
Add NR support
2022-11-30 19:10:06 +02:00
Matti Lehtimäki
a9da4c95d2 [gbinder-radio] Add RadioPhysicalChannelConfig structs. JB#58763
Available for IRadio@1.2 and IRadio@1.4.
2022-11-30 18:57:25 +02:00
Matti Lehtimäki
6407a0271c [gbinder-radio] Add missing enums for NR. JB#58763 2022-11-30 18:57:25 +02:00
Matti Lehtimäki
05073a8367 [gbinder-radio] Fix RadioCellIdentity_1_5 struct. JB#58746 2022-11-30 18:57:25 +02:00
Slava Monich
7725869a27 Version 1.5.3 2022-11-19 17:52:18 +02:00
Slava Monich
7b33c6d70b Merge pull request #25 from monich/ran
Add RADIO_ACCESS_NETWORKS enum
2022-11-19 17:41:50 +02:00
Slava Monich
b38ddeb4c0 [gbinder-radio] Added RADIO_ACCESS_NETWORKS enum. JB#58746
There are two similar enums defined in types.hal files, AccessNetwork
and RadioAccessNetworks. They can be easily confused with each other
and yet their enum values e.g. for NGRAN are different (although GERAN,
UTRAN and EUTRAN values match). Our mapping goes like this:

  AccessNetwork => RADIO_ACCESS_NETWORK
  RadioAccessNetworks => RADIO_ACCESS_NETWORKS
2022-11-19 03:48:48 +02:00
Slava Monich
db387d213a [gbinder-radio] Housekeeping. JB#58006
Fixed comments, use appropriate enums
2022-11-19 03:44:50 +02:00
28 changed files with 2335 additions and 424 deletions

View File

@@ -23,8 +23,8 @@ all: debug release pkgconfig
#
VERSION_MAJOR = 1
VERSION_MINOR = 5
VERSION_RELEASE = 2
VERSION_MINOR = 6
VERSION_RELEASE = 0
# Version for pkg-config
PCVERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_RELEASE)
@@ -238,7 +238,7 @@ INSTALL_PKGCONFIG_DIR = $(DESTDIR)$(ABS_LIBDIR)/pkgconfig
install: $(INSTALL_LIB_DIR)
$(INSTALL) -m 755 $(RELEASE_SO) $(INSTALL_LIB_DIR)
ln -sf $(LIB_SO) $(INSTALL_LIB_DIR)/$(LIB_SYMLINK2)
ln -sf $(LIB_SYMLINK2) $(INSTALL_LIB_DIR)/$(LIB_SYMLINK1)
ln -sf $(LIB_SO) $(INSTALL_LIB_DIR)/$(LIB_SYMLINK1)
install-dev: install $(INSTALL_INCLUDE_DIR) $(INSTALL_PKGCONFIG_DIR)
$(INSTALL_FILES) $(INCLUDE_DIR)/*.h $(INSTALL_INCLUDE_DIR)

10
debian/Jenkinsfile vendored Normal file
View File

@@ -0,0 +1,10 @@
@Library('ubports-build-tools') _
buildAndProvideDebianPackage()
// Or if the package consists entirely of arch-independent packages:
// (optional optimization, will confuse BlueOcean's live view at build stage)
// buildAndProvideDebianPackage(/* isArchIndependent */ true)
// Optionally, to skip building on some architectures (amd64 is always built):
// buildAndProvideDebianPackage(false, /* ignoredArchs */ ['arm64'])

172
debian/changelog vendored
View File

@@ -1,163 +1,49 @@
libgbinder-radio (1.5.2) unstable; urgency=medium
libgbinder-radio (1.6.0-0ubports1) UNRELEASED; urgency=unknown
* Added network scan related types
* New upstream release v1.6.0
-- Slava Monich <slava.monich@jolla.com> Thu, 17 Nov 2022 03:12:02 +0200
-- UBports package upgrader bot <dev@ubports.com> Fri, 13 Dec 2024 04:07:25 +0000
libgbinder-radio (1.5.1) unstable; urgency=medium
libgbinder-radio (1.5.6-0ubports1) UNRELEASED; urgency=unknown
* Fixed names of IRadio 1.4 and 1.5 responses
* New upstream release v1.5.6
-- Slava Monich <slava.monich@jolla.com> Mon, 14 Nov 2022 22:34:08 +0200
-- UBports package upgrader bot <dev@ubports.com> Thu, 09 Nov 2023 00:27:17 +0000
libgbinder-radio (1.5.0) unstable; urgency=medium
libgbinder-radio (1.5.4-0ubports1) focal; urgency=medium
* Added support for IRadio@1.5
* Added support for IRadioConfig@1.2
* Update from upstream
-- Slava Monich <slava.monich@jolla.com> Fri, 16 Sep 2022 14:13:04 +0300
-- Lionel Duboeuf <lduboeuf@ouvaton.org> Wed, 08 Jan 2023 10:52:34 +0100
libgbinder-radio (1.4.12) unstable; urgency=medium
libgbinder-radio (1.4.2-0ubports4) focal; urgency=medium
* Fixed RadioDataRegStateResult_1_4
* Rename libgbinder-radio-dev to libgbinder-radio1-dev
* Generate install files correctly again
-- Slava Monich <slava.monich@jolla.com> Sun, 11 Sep 2022 21:37:23 +0300
-- Guido Berhoerster <guido+gitlab.com@berhoerster.name> Wed, 24 Nov 2021 10:52:34 +0100
libgbinder-radio (1.4.11) unstable; urgency=medium
libgbinder-radio (1.4.2-0ubports3) focal; urgency=medium
* Added radio_request_user_data()
* Switch to dh version 12
* Fix lintian warnings and errors
* Add fix-library-symlink.patch: fix symlink according to Debian policy
* Rename library package based on soname
* Add long description, improve short description
* Use static install files
* Add section to source package
* Specify homepage and VCS
-- Slava Monich <slava.monich@jolla.com> Wed, 31 Aug 2022 19:10:49 +0300
-- Guido Berhoerster <guido+gitlab.com@berhoerster.name> Mon, 15 Nov 2021 15:02:18 +0100
libgbinder-radio (1.4.10) unstable; urgency=medium
libgbinder-radio (1.4.2-0ubports2) focal; urgency=medium
* Tweaked completion callback criteria
* Bump version, no changes.
-- Slava Monich <slava.monich@jolla.com> Fri, 15 Apr 2022 21:58:17 +0300
-- Guido Berhoerster <guido+gitlab.com@berhoerster.name> Thu, 11 Nov 2021 15:02:07 +0100
libgbinder-radio (1.4.9) unstable; urgency=medium
libgbinder-radio (1.4.2-0ubports1) focal; urgency=medium
* Added IMS types
* Initial packaging for UBPorts
-- Slava Monich <slava.monich@jolla.com> Thu, 17 Feb 2022 01:47:27 +0200
libgbinder-radio (1.4.8) unstable; urgency=medium
* Fixed retries of blocking requests
-- Slava Monich <slava.monich@jolla.com> Wed, 19 Jan 2022 03:32:30 +0200
libgbinder-radio (1.4.7) unstable; urgency=medium
* Fixed owner queue logic
-- Slava Monich <slava.monich@jolla.com> Mon, 10 Jan 2022 01:03:28 +0200
libgbinder-radio (1.4.6) unstable; urgency=medium
* Added RadioConfig API
-- Slava Monich <slava.monich@jolla.com> Sat, 08 Jan 2022 20:58:06 +0200
libgbinder-radio (1.4.5) unstable; urgency=medium
* Added radio_req_resp2()
-- Slava Monich <slava.monich@jolla.com> Thu, 16 Dec 2021 01:18:54 +0200
libgbinder-radio (1.4.4) unstable; urgency=medium
* Added IRadio@1.2 IndicationFilter bits
-- Slava Monich <slava.monich@jolla.com> Tue, 14 Dec 2021 18:01:43 +0200
libgbinder-radio (1.4.3) unstable; urgency=medium
* Added RadioClient and related APIs
-- Slava Monich <slava.monich@jolla.com> Thu, 02 Dec 2021 19:08:47 +0200
libgbinder-radio (1.4.2) unstable; urgency=medium
* Don't assume that GBinderServiceManager is a GObject
* Added unit tests
-- Slava Monich <slava.monich@jolla.com> Sun, 12 Sep 2021 18:05:19 +0300
libgbinder-radio (1.4.1) unstable; urgency=medium
* Added RADIO_CELL_INFO_TYPE_1_4 enum
-- Slava Monich <slava.monich@jolla.com> Thu, 20 May 2021 16:32:16 +0300
libgbinder-radio (1.4.0) unstable; urgency=medium
* Support for radio@1.4 interfaces
* Fixed RadioCellInfo_1_4 definition
-- Slava Monich <slava.monich@jolla.com> Tue, 18 May 2021 18:54:52 +0300
libgbinder-radio (1.2.6) unstable; urgency=medium
* Added RadioSimApdu type
-- Slava Monich <slava.monich@jolla.com> Sun, 25 Apr 2021 14:41:32 +0300
libgbinder-radio (1.2.5) unstable; urgency=medium
* Added radio@1.3 types
* Added radio@1.4 types
-- Slava Monich <slava.monich@jolla.com> Thu, 25 Mar 2021 20:13:08 +0200
libgbinder-radio (1.2.4) unstable; urgency=medium
* Added more radio@1.2 types
-- Slava Monich <slava.monich@jolla.com> Sat, 20 Mar 2021 02:41:07 +0200
libgbinder-radio (1.2.3) unstable; urgency=medium
* Reformatted radio@1.2 types
-- Slava Monich <slava.monich@jolla.com> Fri, 19 Mar 2021 05:21:52 +0200
libgbinder-radio (1.2.2) unstable; urgency=medium
* Added radio_instance_get_with_version()
-- Slava Monich <slava.monich@jolla.com> Fri, 05 Mar 2021 14:00:20 +0200
libgbinder-radio (1.2.1) unstable; urgency=medium
* Fixed backward compatibility with radio@1.0
-- Slava Monich <slava.monich@jolla.com> Fri, 05 Mar 2021 12:33:50 +0200
libgbinder-radio (1.2.0) unstable; urgency=medium
* Support for radio@1.2 interfaces
-- Slava Monich <slava.monich@jolla.com> Thu, 04 Mar 2021 13:36:51 +0200
libgbinder-radio (1.0.11) unstable; urgency=medium
* Make library executable on RPM based systems
* Added req => resp mapping for radio@1.1 calls
-- Slava Monich <slava.monich@jolla.com> Thu, 01 Oct 2020 21:04:59 +0300
libgbinder-radio (1.0.10) unstable; urgency=medium
* Hide internal symbols
* Respect arch specific lib dir
* Ignore GLib deprecation warnings
* Added constants for android.hardware.radio@1.1 interfaces
-- Slava Monich <slava.monich@jolla.com> Wed, 03 Jun 2020 15:24:17 +0300
libgbinder-radio (1.0.9) unstable; urgency=medium
* Added packaging for Debian-based distros.
-- Danct12 <danct12@disroot.org> Tue, 24 Mar 2020 02:55:50 +0700
-- Guido Berhoerster <guido+gitlab.com@berhoerster.name> Mon, 11 Oct 2021 16:38:02 +0200

30
debian/control vendored
View File

@@ -1,17 +1,31 @@
Source: libgbinder-radio
Priority: optional
Maintainer: Danct12 <danct12@disroot.org>
Build-Depends: debhelper (>=9), libgbinder-dev (>= 1.1.14), libglibutil-dev (>= 1.0.49)
Maintainer: UBports developers <devs@ubports.com>
Build-Depends: debhelper-compat (= 12),
libgbinder-dev (>= 1.1.14),
libglib2.0-dev,
libglibutil-dev,
Standards-Version: 3.9.6
Section: libs
Homepage: https://github.com/mer-hybris/libgbinder-radio
Vcs-Git: https://github.com/mer-hybris/libgbinder-radio.git
Vcs-Browser: https://github.com/mer-hybris/libgbinder-radio
Package: libgbinder-radio-dev
Package: libgbinder-radio1-dev
Section: libdevel
Architecture: any
Depends: libgbinder-radio (= ${binary:Version}), ${misc:Depends}
Description: Development files for libgbinder-radio
Depends: libgbinder-radio1 (= ${binary:Version}),
${misc:Depends}
Description: Client library for Android radio interfaces (development files)
A helper library based on glib which allows communicating with Android radio
interfaces via Binder.
Package: libgbinder-radio
Package: libgbinder-radio1
Section: libs
Architecture: any
Depends: libgbinder (>= 1.1.14), libglibutil (>= 1.0.49), ${shlibs:Depends}, ${misc:Depends}
Description: Binder client library for Android radio interfaces
Depends: libgbinder (>= 1.0.9),
${shlibs:Depends},
${misc:Depends}
Description: Client library for Android radio interfaces
A helper library based on glib which allows communicating with Android radio
interfaces via Binder.

4
debian/copyright vendored
View File

@@ -1,5 +1,5 @@
Copyright (C) 2018-2022 Jolla Ltd.
Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
Copyright (C) 2018-2021 Jolla Ltd.
Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
You may use this file under the terms of the BSD license as follows:

View File

@@ -0,0 +1,3 @@
debian/tmp/@LIBDIR@/libgbinder-radio.so @LIBDIR@
debian/tmp/@LIBDIR@/pkgconfig/libgbinder-radio.pc @LIBDIR@/pkgconfig
debian/tmp/usr/include/* usr/include

1
debian/libgbinder-radio1.install.in vendored Normal file
View File

@@ -0,0 +1 @@
debian/tmp/@LIBDIR@/libgbinder-radio.so.* @LIBDIR@

2
debian/rules vendored
View File

@@ -5,7 +5,7 @@
LIBDIR=usr/lib/$(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
override_dh_auto_build:
dh_auto_build -- LIBDIR=$(LIBDIR) release pkgconfig debian/libgbinder-radio.install debian/libgbinder-radio-dev.install
dh_auto_build -- LIBDIR=$(LIBDIR) release pkgconfig debian/libgbinder-radio1.install debian/libgbinder-radio1-dev.install
override_dh_auto_install:
dh_auto_install -- LIBDIR=$(LIBDIR) install-dev

View File

@@ -74,6 +74,10 @@ RADIO_INTERFACE
radio_client_interface(
RadioClient* client);
RADIO_AIDL_INTERFACE
radio_client_aidl_interface(
RadioClient* client); /* Since 1.6.0 */
const char*
radio_client_slot(
RadioClient* client);

View File

@@ -40,6 +40,7 @@
/* This API exists since 1.4.6 */
#include <radio_config_types.h>
#include <radio_config_aidl_types.h>
G_BEGIN_DECLS
@@ -83,6 +84,12 @@ radio_config_new_with_version(
RADIO_CONFIG_INTERFACE max_version)
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*
radio_config_ref(
RadioConfig* config);
@@ -95,6 +102,10 @@ gboolean
radio_config_dead(
RadioConfig* config);
RADIO_INTERFACE_TYPE
radio_config_interface_type(
RadioConfig* self); /* Since 1.6.0 */
RADIO_CONFIG_INTERFACE
radio_config_interface(
RadioConfig* config);

View 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
View 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
View 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:
*/

View File

@@ -38,6 +38,13 @@
#define RADIO_INSTANCE_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>
@@ -60,6 +67,9 @@ struct radio_instance {
RADIO_INTERFACE version;
/* Since 1.4.3 */
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 */
@@ -156,6 +166,15 @@ radio_instance_new_with_modem_slot_and_version(
int slot_index,
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*
radio_instance_get(
const char* dev,

View 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
View 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:
*/

View 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
View 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:
*/

View File

@@ -66,6 +66,24 @@ typedef enum radio_interface {
RADIO_INTERFACE_COUNT
} 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 {
RADIO_OBSERVER_PRIORITY_LOWEST,
RADIO_OBSERVER_PRIORITY_DEFAULT = 2,
@@ -245,7 +263,14 @@ typedef enum radio_ind_filter {
/* Since 1.4.4 (those appeared in IRadio@1.2) */
RADIO_IND_FILTER_LINK_CAPACITY_ESTIMATE = 0x08,
RADIO_IND_FILTER_PHYSICAL_CHANNEL_CONFIG = 0x10,
RADIO_IND_FILTER_ALL_1_2 = ~0
RADIO_IND_FILTER_ALL_1_2 =
RADIO_IND_FILTER_ALL |
RADIO_IND_FILTER_LINK_CAPACITY_ESTIMATE |
RADIO_IND_FILTER_PHYSICAL_CHANNEL_CONFIG,
/* Since 1.5.5 (those appeared in IRadio@1.5) */
RADIO_IND_FILTER_REGISTRATION_FAILURE = 0x20,
RADIO_IND_FILTER_BARRING_INFO = 0x40,
RADIO_IND_FILTER_ALL_1_5 = ~0
} RADIO_IND_FILTER;
G_STATIC_ASSERT(sizeof(RADIO_IND_FILTER) == 4);
@@ -298,7 +323,8 @@ typedef enum radio_cell_info_type_1_5 {
/* Cast guint8 RadioCellIdentity_1_5.cellIdentityType to this. */
typedef enum radio_cell_identity_type_1_5 {
RADIO_CELL_IDENTITY_1_5_GSM = 0,
RADIO_CELL_IDENTITY_1_5_NONE = 0,
RADIO_CELL_IDENTITY_1_5_GSM,
RADIO_CELL_IDENTITY_1_5_WCDMA,
RADIO_CELL_IDENTITY_1_5_TD_SCDMA,
RADIO_CELL_IDENTITY_1_5_CDMA,
@@ -314,6 +340,23 @@ typedef enum radio_network_scan_specifier_1_5_type {
RADIO_NETWORK_SCAN_SPECIFIER_1_5_NGRAN
} RADIO_NETWORK_SCAN_SPECIFIER_1_5_TYPE; /* Since 1.5.2 */
typedef enum radio_frequency_info_type {
RADIO_FREQUENCY_INFO_TYPE_RANGE,
RADIO_FREQUENCY_INFO_TYPE_CHANNEL_NUMBER,
} RADIO_FREQUENCY_INFO_TYPE; /* Since 1.5.4 */;
typedef enum radio_frequency_range {
/* Indicates the frequency range is below 1GHz. */
RADIO_FREQUENCY_RANGE_LOW = 1,
/* Indicates the frequency range is between 1GHz and 3GHz. */
RADIO_FREQUENCY_RANGE_MID,
/* Indicates the frequency range is between 3GHz and 6GHz. */
RADIO_FREQUENCY_RANGE_HIGH,
/* Indicates the frequency range is above 6GHz (millimeter wave frequency). */
RADIO_FREQUENCY_RANGE_MMWAVE,
} RADIO_FREQUENCY_RANGE; /* Since 1.5.4 */;
G_STATIC_ASSERT(sizeof(RADIO_FREQUENCY_RANGE) == 4);
typedef enum radio_tech {
RADIO_TECH_UNKNOWN = 0,
RADIO_TECH_GPRS,
@@ -334,7 +377,8 @@ typedef enum radio_tech {
RADIO_TECH_GSM,
RADIO_TECH_TD_SCDMA,
RADIO_TECH_IWLAN,
RADIO_TECH_LTE_CA
RADIO_TECH_LTE_CA,
RADIO_TECH_NR /* Since 1.5.4 */
} RADIO_TECH;
G_STATIC_ASSERT(sizeof(RADIO_TECH) == 4);
@@ -359,7 +403,8 @@ typedef enum radio_access_family {
RAF_GSM = (1 << RADIO_TECH_GSM),
RAF_TD_SCDMA = (1 << RADIO_TECH_TD_SCDMA),
RAF_IWLAN = (1 << RADIO_TECH_IWLAN),
RAF_LTE_CA = (1 << RADIO_TECH_LTE_CA)
RAF_LTE_CA = (1 << RADIO_TECH_LTE_CA),
RAF_NR = (1 << RADIO_TECH_NR) /* Since 1.5.4 */
} RADIO_ACCESS_FAMILY;
G_STATIC_ASSERT(sizeof(RADIO_ACCESS_FAMILY) == 4);
@@ -501,6 +546,7 @@ typedef enum radio_data_request_reason {
} RADIO_DATA_REQUEST_REASON; /* Since 1.2.0 */
G_STATIC_ASSERT(sizeof(RADIO_DATA_REQUEST_REASON) == 4);
/* This is AccessNetwork from types.hal */
typedef enum radio_access_network {
RADIO_ACCESS_NETWORK_UNKNOWN,
RADIO_ACCESS_NETWORK_GERAN,
@@ -512,6 +558,17 @@ typedef enum radio_access_network {
} RADIO_ACCESS_NETWORK; /* Since 1.2.0 */
G_STATIC_ASSERT(sizeof(RADIO_ACCESS_NETWORK) == 4);
/* And this is RadioAccessNetworks (easy to confuse with AccessNetwork) */
typedef enum radio_access_networks {
RADIO_ACCESS_NETWORKS_UNKNOWN,
RADIO_ACCESS_NETWORKS_GERAN,
RADIO_ACCESS_NETWORKS_UTRAN,
RADIO_ACCESS_NETWORKS_EUTRAN,
RADIO_ACCESS_NETWORKS_NGRAN,
RADIO_ACCESS_NETWORKS_CDMA2000
} RADIO_ACCESS_NETWORKS; /* Since 1.5.3 */
G_STATIC_ASSERT(sizeof(RADIO_ACCESS_NETWORKS) == 4);
typedef enum radio_data_profile_type {
RADIO_DATA_PROFILE_COMMON,
RADIO_DATA_PROFILE_3GPP,
@@ -1330,6 +1387,12 @@ typedef struct radio_app_status {
} RADIO_ALIGNED(8) RadioAppStatus;
G_STATIC_ASSERT(sizeof(RadioAppStatus) == 64);
typedef struct radio_app_status_1_5 {
RadioAppStatus base RADIO_ALIGNED(8);
RADIO_PERSO_SUBSTATE persoSubstate RADIO_ALIGNED(4);
} RADIO_ALIGNED(8) RadioAppStatus_1_5; /* Since 1.5.5 */
G_STATIC_ASSERT(sizeof(RadioAppStatus_1_5) == 72);
typedef struct radio_uus_info {
gint32 uusType RADIO_ALIGNED(4);
gint32 uusDcs RADIO_ALIGNED(4);
@@ -1619,11 +1682,11 @@ typedef struct radio_cell_info_1_2 {
guint8 registered RADIO_ALIGNED(1);
gint32 timeStampType RADIO_ALIGNED(4);
guint64 timeStamp RADIO_ALIGNED(8);
GBinderHidlVec gsm RADIO_ALIGNED(8); /* vec<RadioCellInfoGsm> */
GBinderHidlVec cdma RADIO_ALIGNED(8); /* vec<RadioCellInfoCdma> */
GBinderHidlVec lte RADIO_ALIGNED(8); /* vec<RadioCellInfoLte> */
GBinderHidlVec wcdma RADIO_ALIGNED(8); /* vec<RadioCellInfoWcdma> */
GBinderHidlVec tdscdma RADIO_ALIGNED(8); /* vec<RadioCellInfoTdscdma> */
GBinderHidlVec gsm RADIO_ALIGNED(8); /* vec<RadioCellInfoGsm_1_2> */
GBinderHidlVec cdma RADIO_ALIGNED(8); /* vec<RadioCellInfoCdma_1_2> */
GBinderHidlVec lte RADIO_ALIGNED(8); /* vec<RadioCellInfoLte_1_2> */
GBinderHidlVec wcdma RADIO_ALIGNED(8); /* vec<RadioCellInfoWcdma_1_2> */
GBinderHidlVec tdscdma RADIO_ALIGNED(8); /* vec<RadioCellInfoTdscdma_1_2> */
RADIO_CELL_CONNECTION_STATUS connectionStatus RADIO_ALIGNED(4);
} RADIO_ALIGNED(8) RadioCellInfo_1_2; /* Since 1.2.0 */
G_STATIC_ASSERT(sizeof(RadioCellInfo_1_2) == 112);
@@ -1777,7 +1840,7 @@ typedef struct radio_cell_identity_nr_1_5 {
G_STATIC_ASSERT(sizeof(RadioCellIdentityNr_1_5) == 120);
typedef struct radio_cell_identity_1_5 {
guint8 cellIdentityType RADIO_ALIGNED(4); /* RADIO_CELL_IDENTITY_TYPE_1_5 */
guint8 cellIdentityType RADIO_ALIGNED(1); /* RADIO_CELL_IDENTITY_TYPE_1_5 */
union {
RadioCellIdentityGsm_1_5 gsm RADIO_ALIGNED(8);
RadioCellIdentityWcdma_1_5 wcdma RADIO_ALIGNED(8);
@@ -1785,7 +1848,7 @@ typedef struct radio_cell_identity_1_5 {
RadioCellIdentityCdma_1_2 cdma RADIO_ALIGNED(8);
RadioCellIdentityLte_1_5 lte RADIO_ALIGNED(8);
RadioCellIdentityNr_1_5 nr RADIO_ALIGNED(8);
} identity;
} RADIO_ALIGNED(8) identity;
} RADIO_ALIGNED(8) RadioCellIdentity_1_5; /* Since 1.5.0 */
G_STATIC_ASSERT(sizeof(RadioCellIdentity_1_5) == 168);
@@ -2055,7 +2118,7 @@ G_STATIC_ASSERT(sizeof(RadioCellInfoNr) == 112);
typedef struct radio_cell_info_1_4 {
guint8 registered RADIO_ALIGNED(1);
guint32 connectionStatus RADIO_ALIGNED(4);
RADIO_CELL_CONNECTION_STATUS connectionStatus RADIO_ALIGNED(4);
guint8 cellInfoType RADIO_ALIGNED(1); /* RADIO_CELL_INFO_TYPE_1_4 */
union {
RadioCellInfoGsm_1_2 gsm RADIO_ALIGNED(8);
@@ -2102,7 +2165,7 @@ typedef struct radio_cell_info_1_5 {
guint8 registered RADIO_ALIGNED(1);
gint32 timeStampType RADIO_ALIGNED(4);
guint64 timeStamp RADIO_ALIGNED(8);
guint32 connectionStatus RADIO_ALIGNED(4);
RADIO_CELL_CONNECTION_STATUS connectionStatus RADIO_ALIGNED(4);
guint8 cellInfoType RADIO_ALIGNED(8); /* RADIO_CELL_INFO_TYPE_1_5 */
union {
RadioCellInfoGsm_1_5 gsm RADIO_ALIGNED(8);
@@ -2115,6 +2178,30 @@ typedef struct radio_cell_info_1_5 {
} RADIO_ALIGNED(8) RadioCellInfo_1_5; /* Since 1.5.0 */
G_STATIC_ASSERT(sizeof(RadioCellInfo_1_5) == 216);
typedef struct radio_physical_channel_config {
RADIO_CELL_CONNECTION_STATUS connectionStatus RADIO_ALIGNED(4);
gint32 cellBandwidthDownlink RADIO_ALIGNED(4);
} RADIO_ALIGNED(4) RadioPhysicalChannelConfig; /* Since 1.5.4 */
G_STATIC_ASSERT(sizeof(RadioPhysicalChannelConfig) == 8);
typedef struct radio_frequency_info {
guint8 frequencyInfoType RADIO_ALIGNED(1); /* RADIO_FREQUENCY_INFO_TYPE */
union {
RADIO_FREQUENCY_RANGE range RADIO_ALIGNED(4);
gint32 channelNumber RADIO_ALIGNED(4);
} info RADIO_ALIGNED(4);
} RADIO_ALIGNED(4) RadioFrequencyInfo; /* Since 1.5.4 */
G_STATIC_ASSERT(sizeof(RadioFrequencyInfo) == 8);
typedef struct radio_physical_channel_config_1_4 {
RadioPhysicalChannelConfig base RADIO_ALIGNED(4);
RADIO_TECH rat RADIO_ALIGNED(4);
RadioFrequencyInfo rfInfo RADIO_ALIGNED(4);
GBinderHidlVec contextIds RADIO_ALIGNED(8);
guint32 physicalCellId RADIO_ALIGNED(4);
} RADIO_ALIGNED(8) RadioPhysicalChannelConfig_1_4; /* Since 1.5.4 */
G_STATIC_ASSERT(sizeof(RadioPhysicalChannelConfig_1_4) == 48);
typedef struct radio_gsm_broadcast_sms_config {
gint32 fromServiceId RADIO_ALIGNED(4);
gint32 toServiceId RADIO_ALIGNED(4);
@@ -2205,7 +2292,7 @@ typedef struct radio_network_scan_result {
G_STATIC_ASSERT(sizeof(RadioNetworkScanResult) == 24);
typedef struct radio_network_scan_specifier {
RADIO_ACCESS_NETWORK radioAccessNetwork RADIO_ALIGNED(4);
RADIO_ACCESS_NETWORKS radioAccessNetwork RADIO_ALIGNED(4);
GBinderHidlVec geranBands RADIO_ALIGNED(8); /* vec<RADIO_GERAN_BAND> */
GBinderHidlVec utranBands RADIO_ALIGNED(8); /* vec<RADIO_UTRAN_BAND> */
GBinderHidlVec eutranBands RADIO_ALIGNED(8); /* vec<RADIO_EUTRAN_BAND> */
@@ -2214,7 +2301,7 @@ typedef struct radio_network_scan_specifier {
G_STATIC_ASSERT(sizeof(RadioAccessSpecifier) == 72);
typedef struct radio_network_scan_specifier_1_5 {
RADIO_ACCESS_NETWORK radioAccessNetwork RADIO_ALIGNED(4);
RADIO_ACCESS_NETWORKS radioAccessNetwork RADIO_ALIGNED(4);
guint8 type RADIO_ALIGNED(8); /* RADIO_NETWORK_SCAN_SPECIFIER_1_5_TYPE */
GBinderHidlVec bands RADIO_ALIGNED(8); /* vec<RADIO_GERAN_BAND> */
/* or vec<RADIO_UTRAN_BAND> */

View File

@@ -45,14 +45,29 @@ const char*
radio_req_name(
RADIO_REQ req);
const char*
radio_req_name2(
RadioInstance* instance,
RADIO_REQ req); /* Since 1.6.0 */
const char*
radio_resp_name(
RADIO_RESP resp);
const char*
radio_resp_name2(
RadioInstance* instance,
RADIO_RESP resp); /* Since 1.6.0 */
const char*
radio_ind_name(
RADIO_IND ind);
const char*
radio_ind_name2(
RadioInstance* instance,
RADIO_IND ind); /* Since 1.6.0 */
RADIO_RESP
radio_req_resp(
RADIO_REQ req)

168
include/radio_voice_types.h Normal file
View 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:
*/

View File

@@ -1,6 +1,6 @@
Name: libgbinder-radio
Version: 1.5.2
Version: 1.6.0
Release: 0
Summary: Binder client library for Android radio interfaces
License: BSD

View File

@@ -180,7 +180,7 @@ radio_client_handle_resp(
gpointer user_data)
{
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 */
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;
}
RADIO_AIDL_INTERFACE
radio_client_aidl_interface(
RadioClient* self)
{
return G_LIKELY(self) ? self->instance->interface_aidl : RADIO_AIDL_INTERFACE_NONE;
}
void
radio_client_set_default_timeout(
RadioClient* self,

View File

@@ -56,6 +56,7 @@ typedef struct radio_config {
GBinderRemoteObject* remote;
GBinderLocalObject* response;
GBinderLocalObject* indication;
RADIO_INTERFACE_TYPE interface_type;
RADIO_CONFIG_INTERFACE version;
GHashTable* req_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) ==
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[] = {
RADIO_CONFIG_INDICATION_1_2,
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) ==
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[] = {
RADIO_CONFIG_RESPONSE_1_2,
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) ==
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 {
RADIO_INTERFACE_TYPE interface_type;
RADIO_CONFIG_INTERFACE version;
const char* fqname;
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_DESC(v) \
RADIO_INTERFACE_TYPE_HIDL, \
RADIO_CONFIG_INTERFACE_##v, \
RADIO_CONFIG_##v##_FQNAME, \
RADIO_CONFIG_##v, \
@@ -166,9 +189,24 @@ static const RadioConfigInterfaceDesc radio_config_interfaces[] = {
G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_interfaces) ==
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 */
static RadioConfig* radio_config_instance[RADIO_CONFIG_INTERFACE_COUNT] =
{ NULL };
static RadioConfig* radio_config_aidl_instance[RADIO_CONFIG_AIDL_INTERFACE_COUNT] =
{ NULL };
typedef struct radio_config_call {
RadioRequest* req;
@@ -205,18 +243,31 @@ radio_config_call_complete(
static
const char*
radio_config_known_req_name(
RadioConfig* self,
RADIO_CONFIG_REQ req)
{
switch (req) {
case RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions";
if (!G_LIKELY(self) || self->interface_type == RADIO_INTERFACE_TYPE_HIDL) {
switch (req) {
case RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions";
#define RADIO_CONFIG_REQ_(req,resp,Name,NAME) \
case RADIO_CONFIG_REQ_##NAME: return #Name;
RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_REQ_)
RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_REQ_)
/* 1.2 defines no new requests */
case RADIO_CONFIG_REQ_##NAME: return #Name;
RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_REQ_)
RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_REQ_)
/* 1.2 defines no new requests */
#undef RADIO_CONFIG_REQ_
case RADIO_CONFIG_REQ_ANY:
break;
case RADIO_CONFIG_REQ_ANY:
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;
}
@@ -224,18 +275,30 @@ radio_config_known_req_name(
static
const char*
radio_config_known_resp_name(
RadioConfig* self,
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) \
case RADIO_CONFIG_RESP_##NAME: return #Name "Response";
RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_RESP_)
RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_RESP_)
case RADIO_CONFIG_RESP_##NAME: return #Name "Response";
RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_RESP_)
RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_RESP_)
#undef RADIO_CONFIG_RESP_
case RADIO_CONFIG_RESP_GET_SIM_SLOTS_STATUS_1_2:
return "getSimSlotsStatusResponse_1_2";
case RADIO_CONFIG_RESP_ANY:
break;
case RADIO_CONFIG_RESP_GET_SIM_SLOTS_STATUS_1_2:
return "getSimSlotsStatusResponse_1_2";
case RADIO_CONFIG_RESP_ANY:
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;
}
@@ -243,17 +306,29 @@ radio_config_known_resp_name(
static
const char*
radio_config_known_ind_name(
RadioConfig* self,
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) \
case RADIO_CONFIG_IND_##NAME: return #Name;
RADIO_CONFIG_IND_1_0(RADIO_CONFIG_IND_)
/* 1.1 defines no new indications */
RADIO_CONFIG_IND_1_2(RADIO_CONFIG_IND_)
case RADIO_CONFIG_IND_##NAME: return #Name;
RADIO_CONFIG_IND_1_0(RADIO_CONFIG_IND_)
/* 1.1 defines no new indications */
RADIO_CONFIG_IND_1_2(RADIO_CONFIG_IND_)
#undef RADIO_CONFIG_IND_
case RADIO_CONFIG_IND_ANY:
break;
case RADIO_CONFIG_IND_ANY:
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;
}
@@ -271,7 +346,7 @@ radio_config_req_quark(
q = GPOINTER_TO_UINT(g_hash_table_lookup(self->req_quarks, key));
if (!q) {
const char* known = radio_config_known_req_name(req);
const char* known = radio_config_known_req_name(self, req);
if (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));
if (!q) {
const char* known = radio_config_known_resp_name(resp);
const char* known = radio_config_known_resp_name(self, resp);
if (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));
if (!q) {
const char* known = radio_config_known_ind_name(ind);
const char* known = radio_config_known_ind_name(self, ind);
if (known) {
q = g_quark_from_static_string(known);
@@ -393,53 +468,64 @@ radio_config_response(
{
RadioConfig* self = THIS(user_data);
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)) {
GBinderReader args;
const RadioResponseInfo* info;
/* All responses must be one-way and have RadioResponseInfo */
gbinder_remote_request_init_reader(req, &args);
info = gbinder_reader_read_hidl_struct(&args, RadioResponseInfo);
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(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;
}
} else if (gutil_strv_contains((GStrV*)radio_config_aidl_response_ifaces, iface)) {
/* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
gsize out_size;
info = gbinder_reader_read_parcelable(&args, &out_size);
GASSERT(out_size == sizeof(RadioResponseInfo));
} else {
GDEBUG("radio_config_response called on unknown interface %s", iface);
return NULL;
}
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;
}
@@ -509,12 +595,12 @@ radio_config_create(
GBinderLocalRequest* req;
GBinderWriter writer;
int status;
guint req_code = RADIO_CONFIG_REQ_NONE;
radio_base_initialize(&self->base);
self->interface_type = desc->interface_type;
self->version = desc->version;
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,
desc->ind_ifaces, radio_config_indication, self);
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,
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 */
req = gbinder_client_new_request2(self->client,
RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS);
req_code);
gbinder_local_request_init_writer(req, &writer);
gbinder_writer_append_local_object(&writer, self->response);
gbinder_writer_append_local_object(&writer, self->indication);
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);
gbinder_local_request_unref(req);
return self;
@@ -550,20 +650,51 @@ RadioConfig*
radio_config_new_with_version(
RADIO_CONFIG_INTERFACE max_version)
{
/* 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;
return radio_config_new_with_version_and_interface_type(max_version,
RADIO_INTERFACE_TYPE_HIDL);
}
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 */
return radio_config_ref(radio_config_instance[max_version]);
return radio_config_ref(instances[max_version]);
} else {
/* Assume /dev/hwbinder */
/* Assume /dev/hwbinder for HIDL, /dev/binder for AIDL */
GBinderServiceManager* sm =
gbinder_servicemanager_new(GBINDER_DEFAULT_HWBINDER);
gbinder_servicemanager_new(binder_device);
if (sm) {
guint i;
@@ -572,8 +703,8 @@ radio_config_new_with_version(
RadioConfig* config = NULL;
/* Find maximum available version not exceeding the requested one */
for (i=0; i<G_N_ELEMENTS(radio_config_interfaces) && !obj; i++) {
desc = radio_config_interfaces + i;
for (i=0; i<num_interfaces && !obj; i++) {
desc = interfaces + i;
if (desc->version <= max_version) {
obj = gbinder_servicemanager_get_service_sync(sm,
desc->fqname, NULL);
@@ -582,9 +713,8 @@ radio_config_new_with_version(
* desc->version isn't necessarily equal to
* max_version
*/
if (radio_config_instance[desc->version]) {
config = radio_config_ref(radio_config_instance
[desc->version]);
if (instances[desc->version]) {
config = radio_config_ref(instances[desc->version]);
} else {
GINFO("Connected to %s", desc->fqname);
config = radio_config_create(sm, obj, desc);
@@ -596,9 +726,9 @@ radio_config_new_with_version(
gbinder_servicemanager_unref(sm);
if (config) {
radio_config_instance[desc->version] = config;
instances[desc->version] = config;
g_object_weak_ref(G_OBJECT(config), radio_config_gone,
radio_config_instance + desc->version);
instances + desc->version);
return config;
}
}
@@ -632,6 +762,13 @@ radio_config_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(
RadioConfig* self)
@@ -659,7 +796,7 @@ radio_config_req_name(
RadioConfig* self,
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) {
return known;
@@ -678,7 +815,7 @@ radio_config_resp_name(
RadioConfig* self,
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) {
return known;
@@ -697,7 +834,7 @@ radio_config_ind_name(
RadioConfig* self,
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) {
return known;

View File

@@ -156,17 +156,22 @@ G_STATIC_ASSERT(G_N_ELEMENTS(radio_response_ifaces) == RADIO_INTERFACE_COUNT + 1
typedef struct radio_interface_desc {
RADIO_INTERFACE version;
RADIO_AIDL_INTERFACE aidl_interface;
const char* radio_iface;
const char* const* ind_ifaces;
const char* const* resp_ifaces;
gint32 set_response_functions_req;
} RadioInterfaceDesc;
#define RADIO_INTERFACE_INDEX(x) (RADIO_INTERFACE_COUNT - x - 1)
#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_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[] = {
{ 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);
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 {
RadioInstance* instance;
RadioInstanceTxCompleteFunc complete;
@@ -205,7 +350,7 @@ radio_instance_req_quark(
q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->req_quarks, key));
if (!q) {
const char* known = radio_req_name(req);
const char* known = radio_req_name2(self, req);
if (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));
if (!q) {
const char* known = radio_resp_name(resp);
const char* known = radio_resp_name2(self, resp);
if (known) {
q = g_quark_from_static_string(known);
@@ -280,7 +425,14 @@ radio_instance_indication(
RadioInstance* self = RADIO_INSTANCE(user_data);
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;
guint type;
@@ -294,6 +446,7 @@ radio_instance_indication(
SIGNAL_OBSERVE_INDICATION_0;
int p = RADIO_OBSERVER_PRIORITY_HIGHEST;
gboolean handled = FALSE;
guint ind_ril_connected = 0;
/* High-priority observers are notified first */
for (; p > RADIO_OBSERVER_PRIORITY_DEFAULT; p--) {
@@ -305,7 +458,14 @@ radio_instance_indication(
}
/* 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)) {
/* We are only supposed to receive it once */
GWARN("%s received unexpected rilConnected", self->slot);
@@ -360,69 +520,126 @@ radio_instance_response(
{
RadioInstance* self = RADIO_INSTANCE(user_data);
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)) {
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) {
/* oneway acknowledgeRequest(int32_t 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);
}
gbinder_reader_read_int32(&reader, &ack_serial);
} else {
/* All other responses have RadioResponseInfo */
const RadioResponseInfo* info =
gbinder_reader_read_hidl_struct(&reader, RadioResponseInfo);
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);
}
}
info = gbinder_reader_read_hidl_struct(&reader, RadioResponseInfo);
}
} else if (gutil_strv_contains((const GStrV*)radio_data_response_ifaces, iface)) {
if (code == RADIO_DATA_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_ims_response_ifaces, iface)) {
{
/* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
gsize out_size;
info = gbinder_reader_read_parcelable(&reader, &out_size);
GASSERT(out_size >= sizeof(RadioResponseInfo));
}
} else if (gutil_strv_contains((const GStrV*)radio_messaging_response_ifaces, iface)) {
if (code == RADIO_MESSAGING_RESP_ACKNOWLEDGE_REQUEST) {
gbinder_reader_read_int32(&reader, &ack_serial);
} else {
/* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
gsize out_size;
info = gbinder_reader_read_parcelable(&reader, &out_size);
GASSERT(out_size >= sizeof(RadioResponseInfo));
}
} else if (gutil_strv_contains((const GStrV*)radio_modem_response_ifaces, iface)) {
if (code == RADIO_MODEM_RESP_ACKNOWLEDGE_REQUEST) {
gbinder_reader_read_int32(&reader, &ack_serial);
} else {
/* RadioResponseInfo has the same fields/padding between HIDL and AIDL */
gsize out_size;
info = gbinder_reader_read_parcelable(&reader, &out_size);
GASSERT(out_size >= sizeof(RadioResponseInfo));
}
} else if (gutil_strv_contains((const GStrV*)radio_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);
} 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 {
GWARN("Unexpected response %s %u", iface, code);
*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;
}
@@ -520,10 +737,9 @@ radio_instance_create_version(
self->modem = priv->modem = g_strdup(modem);
self->slot_index = slot_index;
self->version = desc->version;
self->interface_aidl = desc->aidl_interface;
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,
desc->ind_ifaces, radio_instance_indication, self);
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,
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 */
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_writer_append_local_object(&writer, priv->response);
gbinder_writer_append_local_object(&writer, priv->indication);
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);
gbinder_local_request_unref(req);
@@ -561,32 +790,47 @@ radio_instance_create(
const char* key,
const char* modem,
int slot_index,
RADIO_INTERFACE max_version)
RADIO_INTERFACE max_version,
RADIO_AIDL_INTERFACE aidl_interface)
{
RadioInstance* self = NULL;
GBinderServiceManager* sm = gbinder_servicemanager_new(dev);
const RadioInterfaceDesc* interfaces = NULL;
gsize num_interfaces = 0;
if (sm) {
guint i;
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 (!sm) {
GERR_("Failed to get ServiceManager on %s", dev);
return NULL;
}
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;
}
@@ -595,9 +839,10 @@ char*
radio_instance_make_key(
const char* dev,
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
@@ -705,7 +950,7 @@ radio_instance_ind_quark(
q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->ind_quarks, key));
if (!q) {
const char* known = radio_ind_name(ind);
const char* known = radio_ind_name2(self, ind);
if (known) {
q = g_quark_from_static_string(known);
@@ -775,9 +1020,23 @@ radio_instance_new_with_modem_slot_and_version(
const char* modem,
int slot,
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]) {
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;
if (radio_instance_table) {
@@ -787,7 +1046,8 @@ radio_instance_new_with_modem_slot_and_version(
g_free(key);
return radio_instance_ref(self);
} 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 (!radio_instance_table) {
radio_instance_table = g_hash_table_new_full
@@ -830,7 +1090,7 @@ radio_instance_get_with_version(
RadioInstance* self = NULL;
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);
g_free(key);
@@ -905,7 +1165,7 @@ radio_instance_req_name(
RadioInstance* self,
RADIO_REQ req)
{
const char* known = radio_req_name(req);
const char* known = radio_req_name2(self, req);
if (known) {
return known;
@@ -924,7 +1184,7 @@ radio_instance_resp_name(
RadioInstance* self,
RADIO_RESP resp)
{
const char* known = radio_resp_name(resp);
const char* known = radio_resp_name2(self, resp);
if (known) {
return known;
@@ -943,7 +1203,7 @@ radio_instance_ind_name(
RadioInstance* self,
RADIO_IND ind)
{
const char* known = radio_ind_name(ind);
const char* known = radio_ind_name2(self, ind);
if (known) {
return known;

View File

@@ -35,6 +35,7 @@
*/
#include "radio_util_p.h"
#include "radio_instance.h"
#include "radio_log.h"
GLOG_MODULE_DEFINE("gbinder-radio");
@@ -56,29 +57,116 @@ const char*
radio_req_name(
RADIO_REQ req)
{
switch (req) {
case RADIO_REQ_SET_RESPONSE_FUNCTIONS: return "setResponseFunctions";
case RADIO_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
return radio_req_name2(NULL, req);
}
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) \
case RADIO_REQ_##NAME: return #Name;
case RADIO_REQ_##NAME: return #Name;
#define RADIO_REQ__(req,resp,Name,NAME,x) \
case RADIO_REQ_##NAME##x: return #Name #x;
RADIO_CALL_1_0(RADIO_REQ_)
RADIO_CALL_1_1(RADIO_REQ_)
RADIO_CALL_1_2(RADIO_REQ_)
RADIO_CALL_1_3(RADIO_REQ_)
RADIO_CALL_1_4_(RADIO_REQ__)
RADIO_CALL_1_5_(RADIO_REQ__)
case RADIO_REQ_##NAME##x: return #Name #x;
RADIO_CALL_1_0(RADIO_REQ_)
RADIO_CALL_1_1(RADIO_REQ_)
RADIO_CALL_1_2(RADIO_REQ_)
RADIO_CALL_1_3(RADIO_REQ_)
RADIO_CALL_1_4_(RADIO_REQ__)
RADIO_CALL_1_5_(RADIO_REQ__)
#undef RADIO_REQ_
#undef RADIO_REQ__
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_SETUP_DATA_CALL_1_2: return "setupDataCall_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_DATA_PROFILE_1_4: return "setDataProfile_1_4";
case RADIO_REQ_ANY:
break;
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_SETUP_DATA_CALL_1_2: return "setupDataCall_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_DATA_PROFILE_1_4: return "setDataProfile_1_4";
case RADIO_REQ_ANY:
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;
}
@@ -87,48 +175,128 @@ const char*
radio_resp_name(
RADIO_RESP resp)
{
switch (resp) {
case RADIO_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
return radio_resp_name2(NULL, resp);
}
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) \
case RADIO_RESP_##NAME: return #Name "Response";
case RADIO_RESP_##NAME: return #Name "Response";
#define RADIO_RESP__(req,resp,Name,NAME,x) \
case RADIO_RESP_##NAME##x: return #Name "Response" #x;
RADIO_CALL_1_0(RADIO_RESP_)
RADIO_CALL_1_1(RADIO_RESP_)
RADIO_CALL_1_2(RADIO_RESP_)
RADIO_CALL_1_3(RADIO_RESP_)
RADIO_CALL_1_4_(RADIO_RESP__)
RADIO_CALL_1_5_(RADIO_RESP__)
case RADIO_RESP_##NAME##x: return #Name "Response" #x;
RADIO_CALL_1_0(RADIO_RESP_)
RADIO_CALL_1_1(RADIO_RESP_)
RADIO_CALL_1_2(RADIO_RESP_)
RADIO_CALL_1_3(RADIO_RESP_)
RADIO_CALL_1_4_(RADIO_RESP__)
RADIO_CALL_1_5_(RADIO_RESP__)
#undef RADIO_RESP_
#undef RADIO_RESP__
case RADIO_RESP_GET_CELL_INFO_LIST_1_2:
return "getCellInfoListResponse_1_2";
case RADIO_RESP_GET_ICC_CARD_STATUS_1_2:
return "getIccCardStatusResponse_1_2";
case RADIO_RESP_GET_CURRENT_CALLS_1_2:
return "getCurrentCallsResponse_1_2";
case RADIO_RESP_GET_SIGNAL_STRENGTH_1_2:
return "getSignalStrengthResponse_1_2";
case RADIO_RESP_GET_VOICE_REGISTRATION_STATE_1_2:
return "getVoiceRegistrationStateResponse_1_2";
case RADIO_RESP_GET_DATA_REGISTRATION_STATE_1_2:
return "getDataRegistrationStateResponse_1_2";
case RADIO_RESP_GET_CELL_INFO_LIST_RESPONSE_1_4:
return "getCellInfoListResponse_1_4";
case RADIO_RESP_GET_DATA_REGISTRATION_STATE_RESPONSE_1_4:
return "getDataRegistrationStateResponse_1_4";
case RADIO_RESP_GET_ICC_CARD_STATUS_RESPONSE_1_4:
return "getIccCardStatusResponse_1_4";
case RADIO_RESP_GET_DATA_CALL_LIST_RESPONSE_1_4:
return "getDataCallListResponse_1_4";
case RADIO_RESP_GET_DATA_CALL_LIST_1_5:
return "getDataCallList_1_5";
case RADIO_RESP_GET_CELL_INFO_LIST_1_5:
return "getCellInfoListResponse_1_5";
case RADIO_RESP_GET_ICC_CARD_STATUS_1_5:
return "getIccCardStatus_1_5";
case RADIO_RESP_ANY:
break;
case RADIO_RESP_GET_CELL_INFO_LIST_1_2:
return "getCellInfoListResponse_1_2";
case RADIO_RESP_GET_ICC_CARD_STATUS_1_2:
return "getIccCardStatusResponse_1_2";
case RADIO_RESP_GET_CURRENT_CALLS_1_2:
return "getCurrentCallsResponse_1_2";
case RADIO_RESP_GET_SIGNAL_STRENGTH_1_2:
return "getSignalStrengthResponse_1_2";
case RADIO_RESP_GET_VOICE_REGISTRATION_STATE_1_2:
return "getVoiceRegistrationStateResponse_1_2";
case RADIO_RESP_GET_DATA_REGISTRATION_STATE_1_2:
return "getDataRegistrationStateResponse_1_2";
case RADIO_RESP_GET_CELL_INFO_LIST_RESPONSE_1_4:
return "getCellInfoListResponse_1_4";
case RADIO_RESP_GET_DATA_REGISTRATION_STATE_RESPONSE_1_4:
return "getDataRegistrationStateResponse_1_4";
case RADIO_RESP_GET_ICC_CARD_STATUS_RESPONSE_1_4:
return "getIccCardStatusResponse_1_4";
case RADIO_RESP_GET_DATA_CALL_LIST_RESPONSE_1_4:
return "getDataCallListResponse_1_4";
case RADIO_RESP_GET_DATA_CALL_LIST_1_5:
return "getDataCallList_1_5";
case RADIO_RESP_GET_CELL_INFO_LIST_1_5:
return "getCellInfoListResponse_1_5";
case RADIO_RESP_GET_ICC_CARD_STATUS_1_5:
return "getIccCardStatus_1_5";
case RADIO_RESP_ANY:
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;
}
@@ -137,17 +305,90 @@ const char*
radio_ind_name(
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) \
case RADIO_IND_##NAME: return #Name;
RADIO_EVENT_1_0(RADIO_IND_)
RADIO_EVENT_1_1(RADIO_IND_)
RADIO_EVENT_1_2(RADIO_IND_)
RADIO_EVENT_1_4(RADIO_IND_)
RADIO_EVENT_1_5(RADIO_IND_)
case RADIO_IND_##NAME: return #Name;
RADIO_EVENT_1_0(RADIO_IND_)
RADIO_EVENT_1_1(RADIO_IND_)
RADIO_EVENT_1_2(RADIO_IND_)
RADIO_EVENT_1_4(RADIO_IND_)
RADIO_EVENT_1_5(RADIO_IND_)
#undef RADIO_IND_
case RADIO_IND_ANY:
break;
case RADIO_IND_ANY:
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;
}

View File

@@ -43,6 +43,7 @@ struct gbinder_local_object {
char** ifaces;
GBinderLocalTransactFunc txproc;
void* user_data;
GBINDER_STABILITY_LEVEL stability;
};
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:
* mode: C

View File

@@ -373,6 +373,24 @@ gbinder_reader_read_hidl_struct1(
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*
gbinder_reader_read_object(
GBinderReader* reader)