Compare commits
109 Commits
1.1.5
...
ubports/fo
| Author | SHA1 | Date | |
|---|---|---|---|
| b562696120 | |||
| ed3d502783 | |||
| 11399e8942 | |||
| 1e2c04e0bb | |||
| 100d9873c8 | |||
| aeeb20499f | |||
| b8991bde50 | |||
| 01a7c0fe71 | |||
|
|
0686f965fb | ||
| e29eaa45e8 | |||
|
|
cd40ce7466 | ||
|
|
f1bc06ee38 | ||
|
|
3aff488691 | ||
|
|
40c9293493 | ||
|
|
b00ecc5417 | ||
|
|
7dd348cb90 | ||
|
|
20f286f2a2 | ||
|
|
33f5a70553 | ||
|
|
fadbe2be24 | ||
|
|
4e9dc9670c | ||
|
|
b1d9cf7c63 | ||
|
|
d9724f63bd | ||
|
|
4f6f4555f4 | ||
|
|
fd57dda0ba | ||
|
|
0ad76c3528 | ||
|
|
6b30a0ec0b | ||
|
|
2cfc88f62b | ||
|
|
8287ee7558 | ||
|
|
da9353ab74 | ||
|
|
aebd7d431a | ||
|
|
f8eede4395 | ||
|
|
50d226e401 | ||
|
|
59d4bfb259 | ||
|
|
c413645fff | ||
|
|
04c803da45 | ||
|
|
1e9c46a485 | ||
|
|
8d3a7a6048 | ||
|
|
c047df31bb | ||
|
|
1f2d9a7175 | ||
|
|
05b9507a7c | ||
|
|
51b3dfafa6 | ||
|
|
eaeb88b504 | ||
|
|
eb9fcfd261 | ||
|
|
73c65171c6 | ||
|
|
88de129781 | ||
|
|
e96d1e6c29 | ||
|
|
c016258c24 | ||
|
|
4ccfd647c9 | ||
|
|
46db487a09 | ||
|
|
8c9ccc3cbd | ||
|
|
bd479ed778 | ||
|
|
44f1713c60 | ||
|
|
56f9d4dd84 | ||
|
|
99b4fe71a4 | ||
|
|
a3bd6ac710 | ||
|
|
656a5b36dd | ||
|
|
0333e60bba | ||
|
|
3cd7c36202 | ||
|
|
9e589a0c0e | ||
|
|
76e9b1e825 | ||
|
|
86abda661b | ||
|
|
dddc3e3d51 | ||
|
|
8a13fe18b4 | ||
|
|
258b187f5d | ||
|
|
a5d89fc2db | ||
|
|
97c0560717 | ||
|
|
9ad094cbf7 | ||
|
|
22530bea38 | ||
|
|
9dab7226b0 | ||
|
|
a7f69f8ced | ||
|
|
c729463bde | ||
|
|
4e703c457c | ||
|
|
83dc663d2d | ||
|
|
6090505f47 | ||
|
|
c89b1296a2 | ||
|
|
a6a362ab1b | ||
|
|
0bd4932f0c | ||
|
|
541faa7847 | ||
|
|
1a71970f82 | ||
|
|
6e2b7102c9 | ||
|
|
0969d8c13e | ||
|
|
d8825b020d | ||
|
|
5ed68de345 | ||
|
|
6125c577aa | ||
|
|
a9fc9a0dce | ||
|
|
393cb9d820 | ||
|
|
0174eb3523 | ||
|
|
6286318db9 | ||
|
|
bf16469738 | ||
|
|
89b22d61b6 | ||
|
|
29234d826d | ||
|
|
993fe31fac | ||
|
|
44fc6e6554 | ||
|
|
cc77d8eb82 | ||
|
|
1ca4036fca | ||
|
|
1ee5bde1b3 | ||
|
|
43e29a9904 | ||
|
|
6e3d429942 | ||
|
|
534a948916 | ||
|
|
304b9eb439 | ||
|
|
7b66e98dc7 | ||
|
|
38d930d3d5 | ||
|
|
254b88903d | ||
|
|
fe4ac0c5e5 | ||
|
|
aaeb509934 | ||
|
|
637a952d32 | ||
|
|
ffc7705387 | ||
|
|
fa49d5e215 | ||
|
|
4db4c5c46b |
13
Makefile
13
Makefile
@@ -5,6 +5,9 @@
|
||||
.PHONY: print_debug_lib print_release_lib print_coverage_lib
|
||||
.PHONY: debug_ext_so release_ext_so
|
||||
|
||||
# Allow building against an oFono variant.
|
||||
OFONO_PKG ?= ofono
|
||||
|
||||
#
|
||||
# Required packages
|
||||
#
|
||||
@@ -13,7 +16,7 @@
|
||||
#
|
||||
|
||||
LDPKGS = libgbinder-radio libgbinder libmce-glib libglibutil gobject-2.0 glib-2.0
|
||||
PKGS = ofono $(LDPKGS)
|
||||
PKGS = $(OFONO_PKG) $(LDPKGS)
|
||||
|
||||
#
|
||||
# Default target
|
||||
@@ -58,6 +61,7 @@ SRC = \
|
||||
binder_modem.c \
|
||||
binder_netreg.c \
|
||||
binder_network.c \
|
||||
binder_oplist.c \
|
||||
binder_radio.c \
|
||||
binder_radio_caps.c \
|
||||
binder_radio_settings.c \
|
||||
@@ -177,10 +181,7 @@ release_ext_so:
|
||||
clean:
|
||||
make -C unit clean
|
||||
make -C $(EXTLIB_DIR) clean
|
||||
rm -fr debian/*.install debian/.debhelper debian/tmp
|
||||
rm -fr debian/libofonobinderpluginext debian/libofonobinderpluginext-dev
|
||||
rm -f documentation.list debian/files debian/*.substvars
|
||||
rm -f debian/*.debhelper.log debian/*.debhelper debian/*~
|
||||
rm -f documentation.list
|
||||
rm -f *~ $(SRC_DIR)/*~ rpm/*~
|
||||
rm -fr $(BUILD_DIR)
|
||||
|
||||
@@ -230,7 +231,7 @@ $(COVERAGE_LIB): $(COVERAGE_OBJS)
|
||||
# Install
|
||||
#
|
||||
|
||||
PLUGINDIR ?= $$(pkg-config ofono --variable=plugindir)
|
||||
PLUGINDIR ?= $$(pkg-config $(OFONO_PKG) --variable=plugindir)
|
||||
ABS_PLUGINDIR := $(shell echo /$(PLUGINDIR) | sed -r 's|/+|/|g')
|
||||
|
||||
INSTALL = install
|
||||
|
||||
30
binder.conf
30
binder.conf
@@ -91,6 +91,13 @@
|
||||
#
|
||||
# [slot1]
|
||||
|
||||
# Radio interface version. At the time of this writing, versions 1.0
|
||||
# to 1.5 were supported.
|
||||
#
|
||||
# Default 1.2 (android.hardware.radio@1.2::IRadio)
|
||||
#
|
||||
#radioInterface = 1.2
|
||||
|
||||
# Specifies the extension plugin to use. The plugin must be properly
|
||||
# installed and registered at startup with libofonobinderpluginext by
|
||||
# calling binder_ext_plugin_register()
|
||||
@@ -146,6 +153,17 @@
|
||||
#
|
||||
#signalStrengthRange=-100,-60
|
||||
|
||||
# If getAvailableNetworks API is unsupported or for whatever reason
|
||||
# doesn't work, startNetworkScan can also be used to get the list of
|
||||
# available networks. Network scan API provides even more information
|
||||
# about radio technologies supported by the available operators but
|
||||
# it's only usable with IRadio interface version >= 1.2 and doesn't
|
||||
# seem to work on some devices
|
||||
#
|
||||
# Default false (try getAvailableNetworks first)
|
||||
#
|
||||
#useNetworkScan=false
|
||||
|
||||
# With some modems, network scan returns strange operator names, i.e.
|
||||
# numeric MCC+MNC values or the same name for all operators (which is
|
||||
# actually SPN fetched from the SIM). Such strange names can be replaced
|
||||
@@ -177,3 +195,15 @@
|
||||
# Default none (all supported features are enabled)
|
||||
#
|
||||
#disableFeatures=
|
||||
|
||||
# LTE network mode.
|
||||
#
|
||||
# Default 9 (LTE_GSM_WCDMA)
|
||||
#
|
||||
#lteNetworkMode=9
|
||||
|
||||
# UMTS network mode.
|
||||
#
|
||||
# Default 3 (GSM_WCDMA_AUTO)
|
||||
#
|
||||
#umtsNetworkMode=3
|
||||
|
||||
10
debian/Jenkinsfile
vendored
Normal file
10
debian/Jenkinsfile
vendored
Normal 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'])
|
||||
32
debian/changelog
vendored
32
debian/changelog
vendored
@@ -1,3 +1,35 @@
|
||||
ofono-binder-plugin (1.1.21-0ubports1) noble; urgency=medium
|
||||
|
||||
* New upstream release v1.1.21
|
||||
|
||||
-- TheKit <thekit@disroot.org> Mon, 03 Mar 2025 22:30:54 +0300
|
||||
|
||||
ofono-binder-plugin (1.1.20-0ubports1) noble; urgency=medium
|
||||
|
||||
* New upstream release v1.1.20
|
||||
|
||||
-- TheKit <thekit@disroot.org> Mon, 03 Feb 2025 00:26:23 +0300
|
||||
|
||||
ofono-binder-plugin (1.1.18-0ubports1) UNRELEASED; urgency=unknown
|
||||
|
||||
* New upstream release v1.1.18
|
||||
|
||||
-- UBports package upgrader bot <dev@ubports.com> Sun, 22 Dec 2024 18:20:07 +0000
|
||||
|
||||
ofono-binder-plugin (1.1.15-0ubports1) noble; urgency=medium
|
||||
|
||||
* New upstream release
|
||||
* debian/patches: import Fallback to IRadio in
|
||||
binder_voicecall_answer and merge calls lists from upstream PR 31
|
||||
|
||||
-- TheKit <thekit@disroot.org> Thu, 15 Aug 2024 15:32:13 +0300
|
||||
|
||||
ofono-binder-plugin (1.1.11-0ubports1) focal; urgency=low
|
||||
|
||||
* Add initial packaging for Ubuntu Touch.
|
||||
|
||||
-- TheKit <thekit@disroot.org> Mon, 26 Apr 2023 21:44:17 +0300
|
||||
|
||||
libofonobinderpluginext (1.1.0) unstable; urgency=low
|
||||
|
||||
* Stable release of the extension API
|
||||
|
||||
1
debian/compat
vendored
1
debian/compat
vendored
@@ -1 +0,0 @@
|
||||
7
|
||||
21
debian/control
vendored
21
debian/control
vendored
@@ -1,10 +1,25 @@
|
||||
Source: libofonobinderpluginext
|
||||
Source: ofono-binder-plugin
|
||||
Section: libs
|
||||
Priority: optional
|
||||
Maintainer: Slava Monich <slava.monich@jolla.com>
|
||||
Build-Depends: debhelper (>= 8.1.3), libglib2.0-dev (>= 2.0)
|
||||
Maintainer: UBports developers <devs@ubports.com>
|
||||
Build-Depends: debhelper-compat (= 12),
|
||||
libglib2.0-dev (>= 2.0),
|
||||
libmce-glib-dev,
|
||||
libglibutil-dev,
|
||||
libgbinder-dev,
|
||||
libgbinder-radio1-dev,
|
||||
ofono-sailfish-dev (>= 1.29+git8-0ubports1~),
|
||||
Standards-Version: 3.8.4
|
||||
|
||||
Package: ofono-binder-plugin
|
||||
Section: libs
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends},
|
||||
${misc:Depends},
|
||||
Description: oFono binder-based IRadio plugin
|
||||
Integrates Sailfish OS fork of ofono with Android adaptations
|
||||
which support IRadio family of binder interfaces.
|
||||
|
||||
Package: libofonobinderpluginext
|
||||
Section: libs
|
||||
Architecture: any
|
||||
|
||||
3
debian/libofonobinderpluginext-dev.install
vendored
Normal file
3
debian/libofonobinderpluginext-dev.install
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
usr/lib/*/libofonobinderpluginext.so
|
||||
usr/lib/*/pkgconfig/libofonobinderpluginext.pc
|
||||
usr/include/*
|
||||
1
debian/libofonobinderpluginext.install
vendored
Normal file
1
debian/libofonobinderpluginext.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/lib/*/libofonobinderpluginext.so.*
|
||||
1
debian/ofono-binder-plugin.install
vendored
Normal file
1
debian/ofono-binder-plugin.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/lib/*/ofono-sailfish/plugins/binderplugin.so
|
||||
9
debian/rules
vendored
9
debian/rules
vendored
@@ -3,14 +3,19 @@
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
export DEB_BUILD_OPTIONS='nostrip debug'
|
||||
|
||||
export OFONO_PKG = ofono-sailfish
|
||||
|
||||
LIBDIR=usr/lib/$(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
|
||||
|
||||
override_dh_auto_build:
|
||||
dh_auto_build -- -C lib LIBDIR=$(LIBDIR) release pkgconfig ../debian/libofonobinderpluginext.install ../debian/libofonobinderpluginext-dev.install
|
||||
dh_auto_build -- LIBDIR=$(LIBDIR) CFLAGS="-g -O0"
|
||||
|
||||
override_dh_auto_install:
|
||||
dh_auto_install -- -C lib LIBDIR=$(LIBDIR) install-dev
|
||||
dh_auto_install
|
||||
make -C lib LIBDIR=$(LIBDIR) pkgconfig
|
||||
make -C lib LIBDIR=$(LIBDIR) DESTDIR=../debian/tmp install-dev
|
||||
|
||||
%:
|
||||
dh $@
|
||||
|
||||
@@ -6,12 +6,15 @@
|
||||
.PHONY: print_debug_lib print_release_lib print_coverage_lib
|
||||
.PHONY: pkgconfig install install-dev
|
||||
|
||||
# Allow building against an oFono variant.
|
||||
OFONO_PKG ?= ofono
|
||||
|
||||
#
|
||||
# Required packages
|
||||
#
|
||||
|
||||
PKGS = libgbinder-radio libglibutil glib-2.0 gobject-2.0
|
||||
LDPKGS = libgbinder-radio libglibutil glib-2.0 gobject-2.0
|
||||
PKGS = $(OFONO_PKG) $(LDPKGS)
|
||||
|
||||
#
|
||||
# Default target
|
||||
@@ -25,7 +28,7 @@ all: debug release pkgconfig
|
||||
|
||||
VERSION_MAJOR = 1
|
||||
VERSION_MINOR = 1
|
||||
VERSION_RELEASE = 5
|
||||
VERSION_RELEASE = 21
|
||||
|
||||
# Version for pkg-config
|
||||
PCVERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_RELEASE)
|
||||
@@ -78,7 +81,7 @@ BASE_FLAGS = -fPIC
|
||||
FULL_CFLAGS = $(BASE_FLAGS) $(CFLAGS) $(DEFINES) $(WARNINGS) $(INCLUDES) \
|
||||
-MMD -MP $(shell pkg-config --cflags $(PKGS))
|
||||
FULL_LDFLAGS = $(BASE_FLAGS) $(LDFLAGS) -shared -Wl,-soname,$(LIB_SONAME) \
|
||||
$(shell pkg-config --libs $(PKGS)) -lpthread
|
||||
$(shell pkg-config --libs $(LDPKGS)) -lpthread
|
||||
DEBUG_FLAGS = -g
|
||||
RELEASE_FLAGS =
|
||||
COVERAGE_FLAGS = -g
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
*/
|
||||
|
||||
#include "binder_ext_call_impl.h"
|
||||
#include <gutil_log.h>
|
||||
#define DBG(fmt, ...) \
|
||||
gutil_log(GLOG_MODULE_CURRENT, GLOG_LEVEL_ALWAYS, "ext:"fmt, ##__VA_ARGS__)
|
||||
|
||||
G_DEFINE_INTERFACE(BinderExtCall, binder_ext_call, G_TYPE_OBJECT)
|
||||
#define GET_IFACE(obj) BINDER_EXT_CALL_GET_IFACE(obj)
|
||||
@@ -26,6 +29,7 @@ BinderExtCall*
|
||||
binder_ext_call_ref(
|
||||
BinderExtCall* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_ref(self);
|
||||
}
|
||||
@@ -36,6 +40,7 @@ void
|
||||
binder_ext_call_unref(
|
||||
BinderExtCall* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_unref(self);
|
||||
}
|
||||
@@ -45,6 +50,7 @@ BINDER_EXT_CALL_INTERFACE_FLAGS
|
||||
binder_ext_call_get_interface_flags(
|
||||
BinderExtCall* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return G_LIKELY(self) ? GET_IFACE(self)->flags :
|
||||
BINDER_EXT_CALL_INTERFACE_NO_FLAGS;
|
||||
}
|
||||
@@ -53,6 +59,7 @@ const BinderExtCallInfo* const*
|
||||
binder_ext_call_get_calls(
|
||||
BinderExtCall* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
static const BinderExtCallInfo* none = NULL;
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -82,6 +89,7 @@ binder_ext_call_dial(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(number)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -103,6 +111,7 @@ binder_ext_call_deflect(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(number)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -122,6 +131,7 @@ binder_ext_call_answer(
|
||||
GDestroyNotify destroy,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -141,6 +151,7 @@ binder_ext_call_swap(
|
||||
GDestroyNotify destroy,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -160,6 +171,7 @@ binder_ext_call_transfer(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -178,6 +190,7 @@ binder_ext_call_conference(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -196,6 +209,7 @@ binder_ext_call_send_dtmf(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(tones)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -216,6 +230,7 @@ binder_ext_call_hangup(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -232,6 +247,7 @@ binder_ext_call_cancel(
|
||||
BinderExtCall* self,
|
||||
guint id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -247,6 +263,7 @@ binder_ext_call_add_calls_changed_handler(
|
||||
BinderExtCallFunc handler,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -263,6 +280,7 @@ binder_ext_call_add_disconnect_handler(
|
||||
BinderExtCallDisconnectFunc handler,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -279,6 +297,7 @@ binder_ext_call_add_ring_handler(
|
||||
BinderExtCallFunc handler,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -295,6 +314,7 @@ binder_ext_call_add_ssn_handler(
|
||||
BinderExtCallSuppSvcNotifyFunc handler,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -310,6 +330,7 @@ binder_ext_call_remove_handler(
|
||||
BinderExtCall* self,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
/*
|
||||
* Since we provide the default callback, we can safely assume
|
||||
@@ -325,6 +346,7 @@ binder_ext_call_remove_handlers(
|
||||
gulong* ids,
|
||||
guint count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(ids) && G_LIKELY(count)) {
|
||||
BinderExtCallInterface* iface = GET_IFACE(self);
|
||||
int i;
|
||||
@@ -352,6 +374,7 @@ binder_ext_call_default_remove_handler(
|
||||
BinderExtCall* self,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (id) {
|
||||
g_signal_handler_disconnect(self, id);
|
||||
}
|
||||
@@ -362,6 +385,7 @@ void
|
||||
binder_ext_call_default_init(
|
||||
BinderExtCallInterface* iface)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/*
|
||||
* Assume the smallest interface version. Implementation must overwrite
|
||||
* iface->version with BINDER_EXT_CALL_INTERFACE_VERSION known to it at
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
*/
|
||||
|
||||
#include "binder_ext_ims_impl.h"
|
||||
#include <gutil_log.h>
|
||||
#define DBG(fmt, ...) \
|
||||
gutil_log(GLOG_MODULE_CURRENT, GLOG_LEVEL_ALWAYS, "ext:"fmt, ##__VA_ARGS__)
|
||||
|
||||
G_DEFINE_INTERFACE(BinderExtIms, binder_ext_ims, G_TYPE_OBJECT)
|
||||
#define GET_IFACE(obj) BINDER_EXT_IMS_GET_IFACE(obj)
|
||||
@@ -26,6 +29,7 @@ BinderExtIms*
|
||||
binder_ext_ims_ref(
|
||||
BinderExtIms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_ref(self);
|
||||
}
|
||||
@@ -36,6 +40,7 @@ void
|
||||
binder_ext_ims_unref(
|
||||
BinderExtIms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_unref(self);
|
||||
}
|
||||
@@ -45,6 +50,7 @@ BINDER_EXT_IMS_INTERFACE_FLAGS
|
||||
binder_ext_ims_get_interface_flags(
|
||||
BinderExtIms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return G_LIKELY(self) ? GET_IFACE(self)->flags :
|
||||
BINDER_EXT_IMS_INTERFACE_NO_FLAGS;
|
||||
}
|
||||
@@ -53,6 +59,7 @@ BINDER_EXT_IMS_STATE
|
||||
binder_ext_ims_get_state(
|
||||
BinderExtIms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtImsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -71,6 +78,7 @@ binder_ext_ims_set_registration(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtImsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -87,6 +95,7 @@ binder_ext_ims_cancel(
|
||||
BinderExtIms* self,
|
||||
guint id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
BinderExtImsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -102,6 +111,7 @@ binder_ext_ims_add_state_handler(
|
||||
BinderExtImsFunc handler,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(handler)) {
|
||||
BinderExtImsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -117,6 +127,7 @@ binder_ext_ims_remove_handler(
|
||||
BinderExtIms* self,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
/*
|
||||
* Since we provide the default callback, we can safely assume
|
||||
@@ -132,6 +143,7 @@ binder_ext_ims_remove_handlers(
|
||||
gulong* ids,
|
||||
guint count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(ids) && G_LIKELY(count)) {
|
||||
BinderExtImsInterface* iface = GET_IFACE(self);
|
||||
int i;
|
||||
@@ -159,6 +171,7 @@ binder_ext_ims_default_remove_handler(
|
||||
BinderExtIms* self,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (id) {
|
||||
g_signal_handler_disconnect(self, id);
|
||||
}
|
||||
@@ -169,6 +182,7 @@ void
|
||||
binder_ext_ims_default_init(
|
||||
BinderExtImsInterface* iface)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/*
|
||||
* Assume the smallest interface version. Implementation must overwrite
|
||||
* iface->version with BINDER_EXT_IMS_INTERFACE_VERSION known to it at
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
*/
|
||||
|
||||
#include "binder_ext_plugin_impl.h"
|
||||
#include <gutil_log.h>
|
||||
#define DBG(fmt, ...) \
|
||||
gutil_log(GLOG_MODULE_CURRENT, GLOG_LEVEL_ALWAYS, "ext:"fmt, ##__VA_ARGS__)
|
||||
|
||||
#define THIS(obj) BINDER_EXT_PLUGIN(obj)
|
||||
#define THIS_TYPE BINDER_EXT_TYPE_PLUGIN
|
||||
@@ -36,6 +39,7 @@ binder_ext_slot_new(
|
||||
RadioInstance* radio,
|
||||
GHashTable* params)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Well, this is kind of BinderExtSlot API but let it be here. */
|
||||
return plugin ? GET_CLASS(plugin)->new_slot(plugin, radio, params) : NULL;
|
||||
}
|
||||
@@ -44,6 +48,7 @@ BinderExtPlugin*
|
||||
binder_ext_plugin_ref(
|
||||
BinderExtPlugin* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_ref(THIS(self));
|
||||
}
|
||||
@@ -54,6 +59,7 @@ void
|
||||
binder_ext_plugin_unref(
|
||||
BinderExtPlugin* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_unref(THIS(self));
|
||||
}
|
||||
@@ -63,6 +69,7 @@ const char*
|
||||
binder_ext_plugin_name(
|
||||
BinderExtPlugin* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return G_LIKELY(self) ? GET_CLASS(self)->plugin_name : NULL;
|
||||
}
|
||||
|
||||
@@ -70,6 +77,7 @@ BinderExtPlugin*
|
||||
binder_ext_plugin_get(
|
||||
const char* name)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return (binder_ext_plugin_table && G_LIKELY(name)) ?
|
||||
g_hash_table_lookup(binder_ext_plugin_table, name) :
|
||||
NULL;
|
||||
@@ -79,6 +87,7 @@ void
|
||||
binder_ext_plugin_register(
|
||||
BinderExtPlugin* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const char* name = binder_ext_plugin_name(self);
|
||||
|
||||
if (name) {
|
||||
@@ -95,6 +104,7 @@ void
|
||||
binder_ext_plugin_unregister(
|
||||
const char* name)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (binder_ext_plugin_table) {
|
||||
g_hash_table_remove(binder_ext_plugin_table, name);
|
||||
if (!g_hash_table_size(binder_ext_plugin_table)) {
|
||||
@@ -113,6 +123,7 @@ void
|
||||
binder_ext_plugin_init(
|
||||
BinderExtPlugin* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -120,6 +131,7 @@ void
|
||||
binder_ext_plugin_class_init(
|
||||
BinderExtPluginClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
#define GLIB_DISABLE_DEPRECATION_WARNINGS
|
||||
|
||||
#include "binder_ext_slot_impl.h"
|
||||
#include <gutil_log.h>
|
||||
#define DBG(fmt, ...) \
|
||||
gutil_log(GLOG_MODULE_CURRENT, GLOG_LEVEL_ALWAYS, "ext:"fmt, ##__VA_ARGS__)
|
||||
|
||||
struct binder_ext_slot_priv {
|
||||
gboolean dropped;
|
||||
@@ -37,6 +40,7 @@ BinderExtSlot*
|
||||
binder_ext_slot_ref(
|
||||
BinderExtSlot* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_ref(self);
|
||||
}
|
||||
@@ -47,6 +51,7 @@ void
|
||||
binder_ext_slot_unref(
|
||||
BinderExtSlot* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_unref(self);
|
||||
}
|
||||
@@ -56,6 +61,7 @@ void
|
||||
binder_ext_slot_drop(
|
||||
BinderExtSlot* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtSlotPriv* priv = self->priv;
|
||||
|
||||
@@ -72,6 +78,7 @@ binder_ext_slot_get_interface(
|
||||
BinderExtSlot* self,
|
||||
GType type)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return G_LIKELY(self) ? GET_CLASS(self)->get_interface(self, type) : NULL;
|
||||
}
|
||||
|
||||
@@ -85,6 +92,7 @@ binder_ext_slot_default_get_interface(
|
||||
BinderExtSlot* self,
|
||||
GType iface)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -93,6 +101,7 @@ void
|
||||
binder_ext_slot_nop(
|
||||
BinderExtSlot* slot)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -100,6 +109,7 @@ void
|
||||
binder_ext_slot_init(
|
||||
BinderExtSlot* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, THIS_TYPE,
|
||||
BinderExtSlotPriv);
|
||||
}
|
||||
@@ -109,6 +119,7 @@ void
|
||||
binder_ext_slot_class_init(
|
||||
BinderExtSlotClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_type_class_add_private(klass, sizeof(BinderExtSlotPriv));
|
||||
klass->get_interface = binder_ext_slot_default_get_interface;
|
||||
klass->shutdown = binder_ext_slot_nop;
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
*/
|
||||
|
||||
#include "binder_ext_sms_impl.h"
|
||||
#include <gutil_log.h>
|
||||
#define DBG(fmt, ...) \
|
||||
gutil_log(GLOG_MODULE_CURRENT, GLOG_LEVEL_ALWAYS, "ext:"fmt, ##__VA_ARGS__)
|
||||
|
||||
G_DEFINE_INTERFACE(BinderExtSms, binder_ext_sms, G_TYPE_OBJECT)
|
||||
#define GET_IFACE(obj) BINDER_EXT_SMS_GET_IFACE(obj)
|
||||
@@ -26,6 +29,7 @@ BinderExtSms*
|
||||
binder_ext_sms_ref(
|
||||
BinderExtSms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_ref(self);
|
||||
}
|
||||
@@ -36,6 +40,7 @@ void
|
||||
binder_ext_sms_unref(
|
||||
BinderExtSms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_unref(self);
|
||||
}
|
||||
@@ -45,6 +50,7 @@ BINDER_EXT_SMS_INTERFACE_FLAGS
|
||||
binder_ext_sms_get_interface_flags(
|
||||
BinderExtSms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return G_LIKELY(self) ? GET_IFACE(self)->flags :
|
||||
BINDER_EXT_SMS_INTERFACE_NO_FLAGS;
|
||||
}
|
||||
@@ -61,6 +67,7 @@ binder_ext_sms_send(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtSmsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -77,6 +84,7 @@ binder_ext_sms_cancel(
|
||||
BinderExtSms* self,
|
||||
guint id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
BinderExtSmsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -92,6 +100,7 @@ binder_ext_sms_add_report_handler(
|
||||
BinderExtSmsReportFunc cb,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(cb)) {
|
||||
BinderExtSmsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -108,6 +117,7 @@ binder_ext_sms_add_incoming_handler(
|
||||
BinderExtSmsIncomingFunc cb,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(cb)) {
|
||||
BinderExtSmsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -124,6 +134,7 @@ binder_ext_sms_ack_report(
|
||||
guint msg_ref,
|
||||
gboolean ok)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtSmsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -138,6 +149,7 @@ binder_ext_sms_ack_incoming(
|
||||
BinderExtSms* self,
|
||||
gboolean ok)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
BinderExtSmsInterface* iface = GET_IFACE(self);
|
||||
|
||||
@@ -152,6 +164,7 @@ binder_ext_sms_remove_handler(
|
||||
BinderExtSms* self,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
/*
|
||||
* Since we provide the default callback, we can safely assume
|
||||
@@ -167,6 +180,7 @@ binder_ext_sms_remove_handlers(
|
||||
gulong* ids,
|
||||
guint count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(ids) && G_LIKELY(count)) {
|
||||
BinderExtSmsInterface* iface = GET_IFACE(self);
|
||||
int i;
|
||||
@@ -194,6 +208,7 @@ binder_ext_sms_default_remove_handler(
|
||||
BinderExtSms* self,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (id) {
|
||||
g_signal_handler_disconnect(self, id);
|
||||
}
|
||||
@@ -204,6 +219,7 @@ void
|
||||
binder_ext_sms_default_init(
|
||||
BinderExtSmsInterface* iface)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/*
|
||||
* Assume the smallest interface version. Implementation must overwrite
|
||||
* iface->version with BINDER_EXT_SMS_INTERFACE_VERSION known to it at
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Name: ofono-binder-plugin
|
||||
|
||||
Version: 1.1.5
|
||||
Version: 1.1.21
|
||||
Release: 1
|
||||
Summary: Binder based ofono plugin
|
||||
License: GPLv2
|
||||
@@ -8,11 +8,11 @@ URL: https://github.com/mer-hybris/ofono-binder-plugin
|
||||
Source: %{name}-%{version}.tar.bz2
|
||||
|
||||
%define libglibutil_version 1.0.61
|
||||
%define libgbinder_version 1.1.15
|
||||
%define libgbinder_radio_version 1.4.8
|
||||
%define libgbinder_version 1.1.29
|
||||
%define libgbinder_radio_version 1.6.0
|
||||
%define libmce_version 1.0.6
|
||||
%define libofonobinderpluginext_version 1.1.0
|
||||
%define ofono_version 1.28+git3
|
||||
%define ofono_version 1.29+git8
|
||||
|
||||
BuildRequires: pkgconfig
|
||||
BuildRequires: ofono-devel >= %{ofono_version}
|
||||
@@ -26,6 +26,9 @@ BuildRequires: pkgconfig(glib-2.0)
|
||||
BuildRequires: pkgconfig(rpm)
|
||||
%define license_support %(pkg-config --exists 'rpm >= 4.11'; echo $?)
|
||||
|
||||
# make_build macro appeared in rpm 4.12
|
||||
%{!?make_build:%define make_build make %{_smp_mflags}}
|
||||
|
||||
Requires: ofono >= %{ofono_version}
|
||||
Requires: libofonobinderpluginext >= %{libofonobinderpluginext_version}
|
||||
Requires: libgbinder >= %{libgbinder_version}
|
||||
@@ -48,14 +51,13 @@ Binder plugin for Sailfish OS fork of ofono
|
||||
%setup -q -n %{name}-%{version}
|
||||
|
||||
%build
|
||||
make %{_smp_mflags} PLUGINDIR=%{plugin_dir} KEEP_SYMBOLS=1 release
|
||||
make %{_smp_mflags} -C lib LIBDIR=%{_libdir} KEEP_SYMBOLS=1 release pkgconfig
|
||||
%make_build PLUGINDIR=%{plugin_dir} KEEP_SYMBOLS=1 release
|
||||
%make_build -C lib LIBDIR=%{_libdir} KEEP_SYMBOLS=1 release pkgconfig
|
||||
|
||||
%check
|
||||
make test
|
||||
|
||||
%install
|
||||
rm -rf %{buildroot}
|
||||
make DESTDIR=%{buildroot} PLUGINDIR=%{plugin_dir} install
|
||||
make -C lib DESTDIR=%{buildroot} LIBDIR=%{_libdir} install install-dev
|
||||
mkdir -p %{buildroot}%{config_dir}
|
||||
@@ -103,6 +105,7 @@ Interfaces for ofono binder plugin extensions
|
||||
|
||||
%files -n libofonobinderpluginext-devel
|
||||
%defattr(-,root,root,-)
|
||||
%dir %{_includedir}/ofonobinderpluginext
|
||||
%{_libdir}/pkgconfig/libofonobinderpluginext.pc
|
||||
%{_libdir}/libofonobinderpluginext.so
|
||||
%{_includedir}/ofonobinderpluginext/*.h
|
||||
|
||||
@@ -53,6 +53,7 @@ GQuark
|
||||
binder_base_property_quark(
|
||||
guint property)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GASSERT(property < BINDER_BASE_MAX_PROPERTIES);
|
||||
/* For ANY property this function is expected to return zero */
|
||||
if (property > 0 && G_LIKELY(property < BINDER_BASE_MAX_PROPERTIES)) {
|
||||
@@ -77,6 +78,7 @@ binder_base_property_changed(
|
||||
guint property,
|
||||
BinderBaseClosure* closure)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const BinderBaseClass* klass = GET_CLASS(self);
|
||||
|
||||
closure->callback(((guint8*)self) + klass->public_offset, property,
|
||||
@@ -94,6 +96,7 @@ binder_base_add_property_handler(
|
||||
GCallback callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(callback)) {
|
||||
/*
|
||||
* We can't directly connect the provided callback because
|
||||
@@ -122,6 +125,7 @@ binder_base_queue_property_change(
|
||||
BinderBase* self,
|
||||
guint property)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->queued_signals |= BINDER_BASE_PROPERTY_BIT(property);
|
||||
}
|
||||
|
||||
@@ -130,6 +134,7 @@ binder_base_emit_property_change(
|
||||
BinderBase* self,
|
||||
guint property)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_base_queue_property_change(self, property);
|
||||
binder_base_emit_queued_signals(self);
|
||||
}
|
||||
@@ -138,13 +143,14 @@ void
|
||||
binder_base_emit_queued_signals(
|
||||
BinderBase* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint p;
|
||||
|
||||
/* Signal handlers may release references to this object */
|
||||
g_object_ref(self);
|
||||
|
||||
/* Emit the signals */
|
||||
for (p = 0; self->queued_signals && p < BINDER_BASE_MAX_PROPERTIES; p++) {
|
||||
/* Emit the signals, ignore the ANY property */
|
||||
for (p = 1; self->queued_signals && p < BINDER_BASE_MAX_PROPERTIES; p++) {
|
||||
if (self->queued_signals & BINDER_BASE_PROPERTY_BIT(p)) {
|
||||
self->queued_signals &= ~BINDER_BASE_PROPERTY_BIT(p);
|
||||
g_signal_emit(self, binder_base_signals[SIGNAL_PROPERTY_CHANGED],
|
||||
@@ -165,6 +171,7 @@ void
|
||||
binder_base_init(
|
||||
BinderBase* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -172,6 +179,7 @@ void
|
||||
binder_base_class_init(
|
||||
BinderBaseClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* By default assume that public part immediately follows BinderBase */
|
||||
klass->public_offset = sizeof(BinderBase);
|
||||
binder_base_signals[SIGNAL_PROPERTY_CHANGED] =
|
||||
|
||||
@@ -22,8 +22,11 @@
|
||||
#include <ofono/call-barring.h>
|
||||
#include <ofono/log.h>
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_network_types.h>
|
||||
#include <radio_sim_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -31,7 +34,9 @@
|
||||
typedef struct binder_call_barring {
|
||||
struct ofono_call_barring* b;
|
||||
BinderSimCard* card;
|
||||
RadioClient* network_client;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
char* log_prefix;
|
||||
guint register_id;
|
||||
} BinderCallBarring;
|
||||
@@ -59,6 +64,7 @@ binder_call_barring_callback_data_new(
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallBarringCbData* cbd = g_slice_new0(BinderCallBarringCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -72,6 +78,7 @@ void
|
||||
binder_call_barring_callback_data_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderCallBarringCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -81,6 +88,7 @@ binder_call_barring_query_ok(
|
||||
const BinderCallBarringCbData* cbd,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderReader reader;
|
||||
gint32 response;
|
||||
|
||||
@@ -112,11 +120,15 @@ binder_call_barring_query_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallBarringCbData* cbd = user_data;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_FACILITY_LOCK_FOR_APP) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_RESP_GET_FACILITY_LOCK_FOR_APP :
|
||||
RADIO_RESP_GET_FACILITY_LOCK_FOR_APP;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
if (binder_call_barring_query_ok(cbd, args)) {
|
||||
return;
|
||||
@@ -140,6 +152,7 @@ binder_call_barring_query(
|
||||
ofono_call_barring_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallBarring* self = ofono_call_barring_get_data(b);
|
||||
|
||||
/*
|
||||
@@ -147,18 +160,29 @@ binder_call_barring_query(
|
||||
* string password, int32_t serviceClass, string appId);
|
||||
*/
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_REQ_GET_FACILITY_LOCK_FOR_APP :
|
||||
RADIO_REQ_GET_FACILITY_LOCK_FOR_APP;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_GET_FACILITY_LOCK_FOR_APP, &writer,
|
||||
code, &writer,
|
||||
binder_call_barring_query_cb,
|
||||
binder_call_barring_callback_data_free,
|
||||
binder_call_barring_callback_data_new(self, BINDER_CB(cb), data));
|
||||
|
||||
DBG_(self, "lock: %s, services to query: 0x%02x", lock, cls);
|
||||
binder_append_hidl_string(&writer, lock); /* facility */
|
||||
binder_append_hidl_string(&writer, ""); /* password */
|
||||
gbinder_writer_append_int32(&writer, cls); /* serviceClass */
|
||||
binder_append_hidl_string(&writer, binder_sim_card_app_aid(self->card));
|
||||
/* appId */
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
binder_append_hidl_string(&writer, lock); /* facility */
|
||||
binder_append_hidl_string(&writer, ""); /* password */
|
||||
gbinder_writer_append_int32(&writer, cls); /* serviceClass */
|
||||
binder_append_hidl_string(&writer, binder_sim_card_app_aid(self->card));
|
||||
/* appId */
|
||||
} else {
|
||||
gbinder_writer_append_string16(&writer, lock); /* facility */
|
||||
gbinder_writer_append_string16(&writer, ""); /* password */
|
||||
gbinder_writer_append_int32(&writer, cls); /* serviceClass */
|
||||
gbinder_writer_append_string16(&writer,
|
||||
binder_sim_card_app_aid(self->card)); /* appId */
|
||||
}
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
}
|
||||
@@ -173,12 +197,16 @@ binder_call_barring_set_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallBarringCbData* cbd = user_data;
|
||||
ofono_call_barring_set_cb_t cb = cbd->cb.set;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_FACILITY_LOCK_FOR_APP) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_RESP_SET_FACILITY_LOCK_FOR_APP :
|
||||
RADIO_RESP_SET_FACILITY_LOCK_FOR_APP;
|
||||
if (resp == code) {
|
||||
/*
|
||||
* setFacilityLockForAppResponse(RadioResponseInfo, int32_t retry);
|
||||
*
|
||||
@@ -208,6 +236,7 @@ binder_call_barring_set(
|
||||
ofono_call_barring_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallBarring* self = ofono_call_barring_get_data(b);
|
||||
|
||||
/*
|
||||
@@ -215,20 +244,32 @@ binder_call_barring_set(
|
||||
* string password, int32_t serviceClass, string appId);
|
||||
*/
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_REQ_SET_FACILITY_LOCK_FOR_APP :
|
||||
RADIO_REQ_SET_FACILITY_LOCK_FOR_APP;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_FACILITY_LOCK_FOR_APP, &writer,
|
||||
code, &writer,
|
||||
binder_call_barring_set_cb,
|
||||
binder_call_barring_callback_data_free,
|
||||
binder_call_barring_callback_data_new(self, BINDER_CB(cb), data));
|
||||
|
||||
DBG_(self, "lock: %s, enable: %i, bearer class: %i", lock, enable, cls);
|
||||
|
||||
binder_append_hidl_string(&writer, lock); /* facility */
|
||||
gbinder_writer_append_bool(&writer, enable); /* lockState */
|
||||
binder_append_hidl_string(&writer, passwd); /* password */
|
||||
gbinder_writer_append_int32(&writer, cls); /* serviceClass */
|
||||
binder_append_hidl_string(&writer, binder_sim_card_app_aid(self->card));
|
||||
/* appId */
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
binder_append_hidl_string(&writer, lock); /* facility */
|
||||
gbinder_writer_append_bool(&writer, enable); /* lockState */
|
||||
binder_append_hidl_string(&writer, passwd); /* password */
|
||||
gbinder_writer_append_int32(&writer, cls); /* serviceClass */
|
||||
binder_append_hidl_string(&writer, binder_sim_card_app_aid(self->card));
|
||||
/* appId */
|
||||
} else {
|
||||
gbinder_writer_append_string16(&writer, lock); /* facility */
|
||||
gbinder_writer_append_bool(&writer, enable); /* lockState */
|
||||
gbinder_writer_append_string16(&writer, passwd); /* password */
|
||||
gbinder_writer_append_int32(&writer, cls); /* serviceClass */
|
||||
gbinder_writer_append_string16(&writer,
|
||||
binder_sim_card_app_aid(self->card)); /* appId */
|
||||
}
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
}
|
||||
@@ -243,12 +284,18 @@ binder_call_barring_set_passwd_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallBarringCbData* cbd = user_data;
|
||||
ofono_call_barring_set_cb_t cb = cbd->cb.set;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_BARRING_PASSWORD) {
|
||||
const RADIO_AIDL_INTERFACE iface_aidl =
|
||||
radio_client_aidl_interface(cbd->self->network_client);
|
||||
guint32 code = iface_aidl == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_RESP_SET_BARRING_PASSWORD :
|
||||
RADIO_RESP_SET_BARRING_PASSWORD;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cb(binder_error_ok(&err), cbd->data);
|
||||
return;
|
||||
@@ -272,23 +319,36 @@ binder_call_barring_set_passwd(
|
||||
ofono_call_barring_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallBarring* self = ofono_call_barring_get_data(b);
|
||||
const RADIO_AIDL_INTERFACE iface_aidl =
|
||||
radio_client_aidl_interface(self->network_client);
|
||||
|
||||
/*
|
||||
* setBarringPassword(int32_t serial, string facility,
|
||||
* string oldPassword, string newPassword);
|
||||
*/
|
||||
GBinderWriter writer;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_BARRING_PASSWORD, &writer,
|
||||
guint32 code = iface_aidl == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_REQ_SET_BARRING_PASSWORD :
|
||||
RADIO_REQ_SET_BARRING_PASSWORD;
|
||||
|
||||
RadioRequest* req = radio_request_new(self->network_client,
|
||||
code, &writer,
|
||||
binder_call_barring_set_passwd_cb,
|
||||
binder_call_barring_callback_data_free,
|
||||
binder_call_barring_callback_data_new(self, BINDER_CB(cb), data));
|
||||
|
||||
DBG_(self, "");
|
||||
binder_append_hidl_string(&writer, lock); /* facility */
|
||||
binder_append_hidl_string(&writer, old_passwd); /* oldPassword */
|
||||
binder_append_hidl_string(&writer, new_passwd); /* newPassword */
|
||||
if (iface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
binder_append_hidl_string(&writer, lock); /* facility */
|
||||
binder_append_hidl_string(&writer, old_passwd); /* oldPassword */
|
||||
binder_append_hidl_string(&writer, new_passwd); /* newPassword */
|
||||
} else {
|
||||
gbinder_writer_append_string16(&writer, lock); /* facility */
|
||||
gbinder_writer_append_string16(&writer, old_passwd); /* oldPassword */
|
||||
gbinder_writer_append_string16(&writer, new_passwd); /* newPassword */
|
||||
}
|
||||
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
@@ -299,6 +359,7 @@ gboolean
|
||||
binder_call_barring_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallBarring* self = user_data;
|
||||
|
||||
GASSERT(self->register_id);
|
||||
@@ -314,13 +375,16 @@ binder_call_barring_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderCallBarring* self = g_new0(struct binder_call_barring, 1);
|
||||
|
||||
self->b = b;
|
||||
self->card = binder_sim_card_ref(modem->sim_card);
|
||||
self->g = radio_request_group_new(modem->client);
|
||||
self->g = radio_request_group_new(modem->sim_client);
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->sim_client);
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
self->network_client = radio_client_ref(modem->network_client);
|
||||
self->register_id = g_idle_add(binder_call_barring_register, self);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -333,6 +397,7 @@ void
|
||||
binder_call_barring_remove(
|
||||
struct ofono_call_barring* b)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallBarring* self = binder_call_barring_get_data(b);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -342,6 +407,7 @@ binder_call_barring_remove(
|
||||
binder_sim_card_unref(self->card);
|
||||
radio_request_group_cancel(self->g);
|
||||
radio_request_group_unref(self->g);
|
||||
radio_client_unref(self->network_client);
|
||||
g_free(self->log_prefix);
|
||||
g_free(self);
|
||||
|
||||
@@ -364,12 +430,14 @@ static const struct ofono_call_barring_driver binder_call_barring_driver = {
|
||||
void
|
||||
binder_call_barring_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_barring_driver_register(&binder_call_barring_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_call_barring_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_barring_driver_unregister(&binder_call_barring_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,10 @@
|
||||
#include <ofono/call-forwarding.h>
|
||||
#include <ofono/log.h>
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_voice_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -30,11 +32,13 @@
|
||||
typedef struct binder_call_forwarding {
|
||||
struct ofono_call_forwarding* f;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
char* log_prefix;
|
||||
guint register_id;
|
||||
} BinderCallForwarding;
|
||||
|
||||
typedef struct binder_call_forwarding_cbd {
|
||||
BinderCallForwarding* self;
|
||||
union call_forwarding_cb {
|
||||
ofono_call_forwarding_query_cb_t query;
|
||||
ofono_call_forwarding_set_cb_t set;
|
||||
@@ -54,11 +58,14 @@ binder_call_forwarding_get_data(struct ofono_call_forwarding* f)
|
||||
static
|
||||
BinderCallForwardingCbData*
|
||||
binder_call_forwarding_callback_data_new(
|
||||
BinderCallForwarding* self,
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwardingCbData* cbd = g_slice_new0(BinderCallForwardingCbData);
|
||||
|
||||
cbd->self = self;
|
||||
cbd->cb.ptr = cb;
|
||||
cbd->data = data;
|
||||
return cbd;
|
||||
@@ -69,6 +76,7 @@ void
|
||||
binder_call_forwarding_callback_data_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderCallForwardingCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -86,6 +94,7 @@ binder_call_forwarding_call(
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/*
|
||||
* getCallForwardStatus(int32_t serial, CallForwardInfo callInfo);
|
||||
* setCallForward(int32_t serial, CallForwardInfo callInfo);
|
||||
@@ -93,24 +102,50 @@ binder_call_forwarding_call(
|
||||
GBinderWriter writer;
|
||||
RadioRequest* req = radio_request_new2(self->g, code, &writer, complete,
|
||||
binder_call_forwarding_callback_data_free,
|
||||
binder_call_forwarding_callback_data_new(cb, data));
|
||||
RadioCallForwardInfo* info = gbinder_writer_new0(&writer,
|
||||
RadioCallForwardInfo);
|
||||
guint parent;
|
||||
binder_call_forwarding_callback_data_new(self, cb, data));
|
||||
|
||||
info->status = action;
|
||||
info->reason = reason;
|
||||
info->serviceClass = cls;
|
||||
info->timeSeconds = time;
|
||||
if (number) {
|
||||
info->toa = number->type;
|
||||
binder_copy_hidl_string(&writer, &info->number, number->number);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
RadioCallForwardInfo* info = gbinder_writer_new0(&writer,
|
||||
RadioCallForwardInfo);
|
||||
guint parent;
|
||||
|
||||
info->status = action;
|
||||
info->reason = reason;
|
||||
info->serviceClass = cls;
|
||||
info->timeSeconds = time;
|
||||
if (number) {
|
||||
info->toa = number->type;
|
||||
binder_copy_hidl_string(&writer, &info->number, number->number);
|
||||
} else {
|
||||
info->toa = OFONO_NUMBER_TYPE_UNKNOWN;
|
||||
binder_copy_hidl_string(&writer, &info->number, NULL);
|
||||
}
|
||||
parent = gbinder_writer_append_buffer_object(&writer, info, sizeof(*info));
|
||||
binder_append_hidl_string_data(&writer, info, number, parent);
|
||||
} else {
|
||||
info->toa = OFONO_NUMBER_TYPE_UNKNOWN;
|
||||
binder_copy_hidl_string(&writer, &info->number, NULL);
|
||||
gint32 initial_size;
|
||||
/* Non-null parcelable */
|
||||
gbinder_writer_append_int32(&writer, 1);
|
||||
initial_size = gbinder_writer_bytes_written(&writer);
|
||||
/* Dummy parcelable size, replaced at the end */
|
||||
gbinder_writer_append_int32(&writer, -1);
|
||||
|
||||
gbinder_writer_append_int32(&writer, action);
|
||||
gbinder_writer_append_int32(&writer, reason);
|
||||
gbinder_writer_append_int32(&writer, cls);
|
||||
if (number) {
|
||||
gbinder_writer_append_int32(&writer, number->type);
|
||||
gbinder_writer_append_string16(&writer, number->number);
|
||||
} else {
|
||||
gbinder_writer_append_int32(&writer, OFONO_NUMBER_TYPE_UNKNOWN);
|
||||
gbinder_writer_append_string16(&writer, NULL);
|
||||
}
|
||||
gbinder_writer_append_int32(&writer, time);
|
||||
|
||||
/* Overwrite parcelable size */
|
||||
gbinder_writer_overwrite_int32(&writer, initial_size,
|
||||
gbinder_writer_bytes_written(&writer) - initial_size);
|
||||
}
|
||||
parent = gbinder_writer_append_buffer_object(&writer, info, sizeof(*info));
|
||||
binder_append_hidl_string_data(&writer, info, number, parent);
|
||||
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
@@ -126,12 +161,16 @@ binder_call_forwarding_set_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallForwardingCbData* cbd = user_data;
|
||||
ofono_call_forwarding_set_cb_t cb = cbd->cb.set;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_CALL_FORWARD) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_SET_CALL_FORWARD :
|
||||
RADIO_RESP_SET_CALL_FORWARD;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cb(binder_error_ok(&err), cbd->data);
|
||||
return;
|
||||
@@ -157,7 +196,11 @@ binder_call_forwarding_set(
|
||||
ofono_call_forwarding_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
binder_call_forwarding_call(self, RADIO_REQ_SET_CALL_FORWARD,
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_SET_CALL_FORWARD :
|
||||
RADIO_REQ_SET_CALL_FORWARD;
|
||||
binder_call_forwarding_call(self, code,
|
||||
action, reason, cls, number, time, binder_call_forwarding_set_cb,
|
||||
BINDER_CB(cb), data);
|
||||
}
|
||||
@@ -173,6 +216,7 @@ binder_call_forwarding_registration(
|
||||
ofono_call_forwarding_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwarding* self = binder_call_forwarding_get_data(f);
|
||||
|
||||
DBG_(self, "%d", type);
|
||||
@@ -189,6 +233,7 @@ binder_call_forwarding_erasure(
|
||||
ofono_call_forwarding_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwarding* self = binder_call_forwarding_get_data(f);
|
||||
|
||||
DBG_(self, "%d", type);
|
||||
@@ -205,6 +250,7 @@ binder_call_forwarding_deactivate(
|
||||
ofono_call_forwarding_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwarding* self = binder_call_forwarding_get_data(f);
|
||||
|
||||
DBG_(self, "%d", type);
|
||||
@@ -221,6 +267,7 @@ binder_call_forwarding_activate(
|
||||
ofono_call_forwarding_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwarding* self = binder_call_forwarding_get_data(f);
|
||||
|
||||
DBG_(self, "%d", type);
|
||||
@@ -234,6 +281,7 @@ binder_call_forwarding_query_ok(
|
||||
const BinderCallForwardingCbData* cbd,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const RadioCallForwardInfo* infos;
|
||||
struct ofono_call_forwarding_condition* list = NULL;
|
||||
@@ -274,11 +322,15 @@ binder_call_forwarding_query_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallForwardingCbData* cbd = user_data;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_CALL_FORWARD_STATUS) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_GET_CALL_FORWARD_STATUS :
|
||||
RADIO_RESP_GET_CALL_FORWARD_STATUS;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
binder_call_forwarding_query_ok(cbd, args);
|
||||
return;
|
||||
@@ -301,7 +353,11 @@ binder_call_forwarding_query(
|
||||
ofono_call_forwarding_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwarding* self = binder_call_forwarding_get_data(f);
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_GET_CALL_FORWARD_STATUS :
|
||||
RADIO_REQ_GET_CALL_FORWARD_STATUS;
|
||||
|
||||
DBG_(self, "%d", type);
|
||||
|
||||
@@ -311,7 +367,7 @@ binder_call_forwarding_query(
|
||||
DBG_(self, "cls %d => %d", cls, RADIO_SERVICE_CLASS_NONE);
|
||||
cls = RADIO_SERVICE_CLASS_NONE;
|
||||
}
|
||||
binder_call_forwarding_call(self, RADIO_REQ_GET_CALL_FORWARD_STATUS,
|
||||
binder_call_forwarding_call(self, code,
|
||||
RADIO_CALL_FORWARD_INTERROGATE, type, cls, NULL, CF_TIME_DEFAULT,
|
||||
binder_call_forwarding_query_cb, BINDER_CB(cb), data);
|
||||
}
|
||||
@@ -321,6 +377,7 @@ gboolean
|
||||
binder_call_forwarding_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwarding* self = user_data;
|
||||
|
||||
GASSERT(self->register_id);
|
||||
@@ -336,11 +393,13 @@ binder_call_forwarding_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderCallForwarding* self = g_new0(BinderCallForwarding, 1);
|
||||
|
||||
self->f = f;
|
||||
self->g = radio_request_group_new(modem->client);
|
||||
self->g = radio_request_group_new(modem->voice_client);
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->voice_client);
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
self->register_id = g_idle_add(binder_call_forwarding_register, self);
|
||||
|
||||
@@ -354,6 +413,7 @@ void
|
||||
binder_call_forwarding_remove(
|
||||
struct ofono_call_forwarding* f)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallForwarding* self = binder_call_forwarding_get_data(f);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -387,12 +447,14 @@ binder_call_forwarding_driver = {
|
||||
void
|
||||
binder_call_forwarding_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_forwarding_driver_register(&binder_call_forwarding_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_call_forwarding_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_forwarding_driver_unregister(&binder_call_forwarding_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,10 @@
|
||||
#include <ofono/call-settings.h>
|
||||
#include <ofono/log.h>
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_voice_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -30,6 +32,7 @@
|
||||
typedef struct binder_call_settings {
|
||||
struct ofono_call_settings* s;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
char* log_prefix;
|
||||
guint register_id;
|
||||
} BinderCallSettings;
|
||||
@@ -58,6 +61,7 @@ binder_call_settings_callback_data_new(
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettingsCbData* cbd = g_slice_new0(BinderCallSettingsCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -71,6 +75,7 @@ void
|
||||
binder_call_settings_callback_data_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderCallSettingsCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -83,6 +88,7 @@ binder_call_settings_call(
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RadioRequest* req = radio_request_new2(self->g, code, NULL, complete,
|
||||
binder_call_settings_callback_data_free,
|
||||
binder_call_settings_callback_data_new(self, cb, data));
|
||||
@@ -101,6 +107,7 @@ binder_call_settings_set_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallSettingsCbData* cbd = user_data;
|
||||
ofono_call_settings_set_cb_t cb = cbd->cb.set;
|
||||
@@ -121,12 +128,26 @@ binder_call_settings_cw_set(
|
||||
ofono_call_settings_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettings* self = binder_call_settings_get_data(s);
|
||||
|
||||
/*
|
||||
* Modem seems to respond with error to all queries
|
||||
* or settings made with bearer class
|
||||
* BEARER_CLASS_DEFAULT. Design decision: If given
|
||||
* class is BEARER_CLASS_DEFAULT let's map it to
|
||||
* SERVICE_CLASS_VOICE effectively making it the
|
||||
* default bearer.
|
||||
*/
|
||||
if (cls == BEARER_CLASS_DEFAULT)
|
||||
cls = BEARER_CLASS_VOICE;
|
||||
|
||||
/* setCallWaiting(int32_t serial, bool enable, int32_t serviceClass); */
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_SET_CALL_WAITING : RADIO_REQ_SET_CALL_WAITING;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_CALL_WAITING, &writer,
|
||||
code, &writer,
|
||||
binder_call_settings_set_cb,
|
||||
binder_call_settings_callback_data_free,
|
||||
binder_call_settings_callback_data_new(self, BINDER_CB(cb), data));
|
||||
@@ -144,6 +165,7 @@ binder_call_settings_cw_query_ok(
|
||||
const BinderCallSettingsCbData* cbd,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
ofono_call_settings_status_cb_t cb = cbd->cb.status;
|
||||
GBinderReader reader;
|
||||
@@ -180,11 +202,14 @@ binder_call_settings_cw_query_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallSettingsCbData* cbd = user_data;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_CALL_WAITING) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_GET_CALL_WAITING : RADIO_RESP_GET_CALL_WAITING;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
if (binder_call_settings_cw_query_ok(cbd, args)) {
|
||||
return;
|
||||
@@ -206,12 +231,26 @@ void binder_call_settings_cw_query(
|
||||
ofono_call_settings_status_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettings* self = binder_call_settings_get_data(s);
|
||||
|
||||
/*
|
||||
* Modem seems to respond with error to all queries
|
||||
* or settings made with bearer class
|
||||
* BEARER_CLASS_DEFAULT. Design decision: If given
|
||||
* class is BEARER_CLASS_DEFAULT let's map it to
|
||||
* SERVICE_CLASS_VOICE effectively making it the
|
||||
* default bearer.
|
||||
*/
|
||||
if (cls == BEARER_CLASS_DEFAULT)
|
||||
cls = BEARER_CLASS_VOICE;
|
||||
|
||||
/* getCallWaiting(int32_t serial, int32_t serviceClass); */
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_GET_CALL_WAITING : RADIO_REQ_GET_CALL_WAITING;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_GET_CALL_WAITING, &writer,
|
||||
code, &writer,
|
||||
binder_call_settings_cw_query_cb,
|
||||
binder_call_settings_callback_data_free,
|
||||
binder_call_settings_callback_data_new(self, BINDER_CB(cb), data));
|
||||
@@ -228,6 +267,7 @@ binder_call_settings_clip_query_ok(
|
||||
const BinderCallSettingsCbData* cbd,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
GBinderReader reader;
|
||||
gint32 status;
|
||||
@@ -251,11 +291,14 @@ binder_call_settings_clip_query_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallSettingsCbData* cbd = user_data;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_CLIP) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_GET_CLIP : RADIO_RESP_GET_CLIP;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
if (binder_call_settings_clip_query_ok(cbd, args)) {
|
||||
return;
|
||||
@@ -277,11 +320,14 @@ binder_call_settings_clip_query(
|
||||
ofono_call_settings_status_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettings* self = binder_call_settings_get_data(s);
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_GET_CLIP : RADIO_REQ_GET_CLIP;
|
||||
|
||||
DBG_(self, "");
|
||||
/* getClip(int32_t serial); */
|
||||
binder_call_settings_call(self, RADIO_REQ_GET_CLIP,
|
||||
binder_call_settings_call(self, code,
|
||||
binder_call_settings_clip_query_cb, BINDER_CB(cb), data);
|
||||
}
|
||||
|
||||
@@ -291,6 +337,7 @@ binder_call_settings_clir_ok(
|
||||
const BinderCallSettingsCbData* cbd,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
GBinderReader reader;
|
||||
gint32 n, m;
|
||||
@@ -316,11 +363,14 @@ binder_call_settings_clir_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallSettingsCbData* cbd = user_data;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_CLIR) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_GET_CLIR : RADIO_RESP_GET_CLIR;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
if (binder_call_settings_clir_ok(cbd, args)) {
|
||||
return;
|
||||
@@ -342,11 +392,14 @@ binder_call_settings_clir_query(
|
||||
ofono_call_settings_clir_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettings* self = binder_call_settings_get_data(s);
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_GET_CLIR : RADIO_REQ_GET_CLIR;
|
||||
|
||||
DBG_(self, "");
|
||||
/* getClir(int32_t serial); */
|
||||
binder_call_settings_call(self, RADIO_REQ_GET_CLIR,
|
||||
binder_call_settings_call(self, code,
|
||||
binder_call_settings_clir_cb , BINDER_CB(cb), data);
|
||||
}
|
||||
|
||||
@@ -358,12 +411,15 @@ binder_call_settings_clir_set(
|
||||
ofono_call_settings_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettings* self = binder_call_settings_get_data(s);
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_SET_CLIR : RADIO_REQ_SET_CLIR;
|
||||
|
||||
/* setClir(int32_t serial, int32_t status); */
|
||||
GBinderWriter writer;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_CLIR, &writer,
|
||||
code, &writer,
|
||||
binder_call_settings_set_cb,
|
||||
binder_call_settings_callback_data_free,
|
||||
binder_call_settings_callback_data_new(self, BINDER_CB(cb), data));
|
||||
@@ -380,6 +436,7 @@ gboolean
|
||||
binder_call_settings_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettings* self = user_data;
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -396,11 +453,13 @@ binder_call_settings_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderCallSettings* self = g_new0(BinderCallSettings, 1);
|
||||
|
||||
self->s = s;
|
||||
self->g = radio_request_group_new(modem->client);
|
||||
self->g = radio_request_group_new(modem->voice_client);
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->voice_client);
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
self->register_id = g_idle_add(binder_call_settings_register, self);
|
||||
|
||||
@@ -414,6 +473,7 @@ void
|
||||
binder_call_settings_remove(
|
||||
struct ofono_call_settings* s)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallSettings* self = binder_call_settings_get_data(s);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -446,12 +506,14 @@ static const struct ofono_call_settings_driver binder_call_settings_driver = {
|
||||
void
|
||||
binder_call_settings_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_settings_driver_register(&binder_call_settings_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_call_settings_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_settings_driver_unregister(&binder_call_settings_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,8 +21,10 @@
|
||||
#include <ofono/call-volume.h>
|
||||
#include <ofono/log.h>
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_voice_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -30,11 +32,13 @@
|
||||
typedef struct binder_call_volume {
|
||||
struct ofono_call_volume* v;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
char* log_prefix;
|
||||
guint register_id;
|
||||
} BinderCallVolume;
|
||||
|
||||
typedef struct binder_call_volume_req {
|
||||
BinderCallVolume* self;
|
||||
ofono_call_volume_cb_t cb;
|
||||
gpointer data;
|
||||
} BinderCallVolumeCbData;
|
||||
@@ -48,11 +52,14 @@ binder_call_volume_get_data(struct ofono_call_volume* v)
|
||||
static
|
||||
BinderCallVolumeCbData*
|
||||
binder_call_volume_callback_data_new(
|
||||
BinderCallVolume* self,
|
||||
ofono_call_volume_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallVolumeCbData* cbd = g_slice_new0(BinderCallVolumeCbData);
|
||||
|
||||
cbd->self = self;
|
||||
cbd->cb = cb;
|
||||
cbd->data = data;
|
||||
return cbd;
|
||||
@@ -63,6 +70,7 @@ void
|
||||
binder_call_volume_callback_data_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderCallVolumeCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -76,12 +84,15 @@ binder_call_volume_mute_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderCallVolumeCbData* cbd = user_data;
|
||||
ofono_call_volume_cb_t cb = cbd->cb;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_MUTE) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_SET_MUTE : RADIO_RESP_SET_MUTE;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cb(binder_error_ok(&err), cbd->data);
|
||||
return;
|
||||
@@ -103,15 +114,18 @@ binder_call_volume_mute(
|
||||
ofono_call_volume_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallVolume* self = binder_call_volume_get_data(v);
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_SET_MUTE : RADIO_REQ_SET_MUTE;
|
||||
|
||||
/* setMute(int32_t serial, bool enable); */
|
||||
GBinderWriter writer;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_MUTE, &writer,
|
||||
code, &writer,
|
||||
binder_call_volume_mute_cb,
|
||||
binder_call_volume_callback_data_free,
|
||||
binder_call_volume_callback_data_new(cb, data));
|
||||
binder_call_volume_callback_data_new(self, cb, data));
|
||||
|
||||
DBG_(self, "%d", muted);
|
||||
gbinder_writer_append_bool(&writer, muted); /* enabled */
|
||||
@@ -130,8 +144,12 @@ binder_call_volume_query_mute_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const BinderCallVolume* self = user_data;
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_MUTE) {
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_GET_MUTE : RADIO_RESP_GET_MUTE;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
GBinderReader reader;
|
||||
gboolean muted;
|
||||
@@ -158,7 +176,10 @@ gboolean
|
||||
binder_call_volume_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallVolume* self = user_data;
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_GET_MUTE : RADIO_REQ_GET_MUTE;
|
||||
|
||||
DBG_(self, "");
|
||||
GASSERT(self->register_id);
|
||||
@@ -166,7 +187,7 @@ binder_call_volume_register(
|
||||
ofono_call_volume_register(self->v);
|
||||
|
||||
/* Probe the mute state */
|
||||
binder_submit_request2(self->g, RADIO_REQ_GET_MUTE,
|
||||
binder_submit_request2(self->g, code,
|
||||
binder_call_volume_query_mute_cb, NULL, self);
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
@@ -179,11 +200,13 @@ binder_call_volume_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderCallVolume* self = g_new0(BinderCallVolume, 1);
|
||||
|
||||
self->v = v;
|
||||
self->g = radio_request_group_new(modem->client);
|
||||
self->g = radio_request_group_new(modem->voice_client);
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->voice_client);
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
self->register_id = g_idle_add(binder_call_volume_register, self);
|
||||
|
||||
@@ -197,6 +220,7 @@ void
|
||||
binder_call_volume_remove(
|
||||
struct ofono_call_volume* v)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCallVolume* self = binder_call_volume_get_data(v);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -225,12 +249,14 @@ static const struct ofono_call_volume_driver binder_call_volume_driver = {
|
||||
void
|
||||
binder_call_volume_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_volume_driver_register(&binder_call_volume_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_call_volume_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_call_volume_driver_unregister(&binder_call_volume_driver);
|
||||
}
|
||||
|
||||
|
||||
146
src/binder_cbs.c
146
src/binder_cbs.c
@@ -24,6 +24,7 @@
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_messaging_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -34,6 +35,7 @@
|
||||
typedef struct binder_cbs {
|
||||
struct ofono_cbs* cbs;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
char* log_prefix;
|
||||
guint register_id;
|
||||
gulong event_id;
|
||||
@@ -60,6 +62,7 @@ binder_cbs_callback_data_new(
|
||||
ofono_cbs_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCbsCbData* cbd = g_slice_new0(BinderCbsCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -73,6 +76,7 @@ void
|
||||
binder_cbs_callback_data_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderCbsCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -86,6 +90,7 @@ binder_cbs_retry(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return error == RADIO_ERROR_INVALID_STATE;
|
||||
}
|
||||
|
||||
@@ -99,11 +104,15 @@ binder_cbs_activate_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
BinderCbsCbData* cbd = user_data;
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_RESP_SET_GSM_BROADCAST_ACTIVATION :
|
||||
RADIO_RESP_SET_GSM_BROADCAST_ACTIVATION;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_GSM_BROADCAST_ACTIVATION) {
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cbd->cb(binder_error_ok(&err), cbd->data);
|
||||
return;
|
||||
@@ -127,10 +136,14 @@ binder_cbs_activate(
|
||||
ofono_cbs_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* setGsmBroadcastActivation(int32_t serial, bool activate); */
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_REQ_SET_GSM_BROADCAST_ACTIVATION :
|
||||
RADIO_REQ_SET_GSM_BROADCAST_ACTIVATION;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_GSM_BROADCAST_ACTIVATION, &writer,
|
||||
code, &writer,
|
||||
binder_cbs_activate_cb,
|
||||
binder_cbs_callback_data_free,
|
||||
binder_cbs_callback_data_new(self, cb, data));
|
||||
@@ -153,11 +166,15 @@ binder_cbs_set_config_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCbsCbData* cbd = user_data;
|
||||
struct ofono_error err;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_GSM_BROADCAST_CONFIG) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_RESP_SET_GSM_BROADCAST_CONFIG :
|
||||
RADIO_RESP_SET_GSM_BROADCAST_CONFIG;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
binder_cbs_activate(cbd->self, TRUE, cbd->cb, cbd->data);
|
||||
return;
|
||||
@@ -180,51 +197,87 @@ binder_cbs_set_config(
|
||||
ofono_cbs_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
/* setGsmBroadcastConfig(int32_t serial, vec<GsmBroadcastSmsConfigInfo>); */
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_REQ_SET_GSM_BROADCAST_CONFIG :
|
||||
RADIO_REQ_SET_GSM_BROADCAST_CONFIG;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_GSM_BROADCAST_CONFIG, &writer,
|
||||
code, &writer,
|
||||
binder_cbs_set_config_cb,
|
||||
binder_cbs_callback_data_free,
|
||||
binder_cbs_callback_data_new(self, cb, data));
|
||||
|
||||
GBinderParent parent;
|
||||
GBinderHidlVec* vec = gbinder_writer_new0(&writer, GBinderHidlVec);
|
||||
RadioGsmBroadcastSmsConfig* configs = NULL;
|
||||
char** list = topics ? g_strsplit(topics, ",", 0) : NULL;
|
||||
const guint count = gutil_strv_length(list);
|
||||
guint i;
|
||||
|
||||
vec->count = count;
|
||||
vec->owns_buffer = TRUE;
|
||||
vec->data.ptr = configs = gbinder_writer_malloc0(&writer,
|
||||
sizeof(RadioGsmBroadcastSmsConfig) * count);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
/* setGsmBroadcastConfig(int32_t serial, vec<GsmBroadcastSmsConfigInfo>); */
|
||||
GBinderParent parent;
|
||||
GBinderHidlVec* vec = gbinder_writer_new0(&writer, GBinderHidlVec);
|
||||
RadioGsmBroadcastSmsConfig* configs = NULL;
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
RadioGsmBroadcastSmsConfig* config = configs + i;
|
||||
const char* entry = list[i];
|
||||
const char* delim = strchr(entry, '-');
|
||||
vec->count = count;
|
||||
vec->owns_buffer = TRUE;
|
||||
vec->data.ptr = configs = gbinder_writer_malloc0(&writer,
|
||||
sizeof(RadioGsmBroadcastSmsConfig) * count);
|
||||
|
||||
config->selected = TRUE;
|
||||
config->toCodeScheme = 0xff;
|
||||
if (delim) {
|
||||
char** range = g_strsplit(entry, "-", 0);
|
||||
for (i = 0; i < count; i++) {
|
||||
RadioGsmBroadcastSmsConfig* config = configs + i;
|
||||
const char* entry = list[i];
|
||||
const char* delim = strchr(entry, '-');
|
||||
|
||||
config->fromServiceId = atoi(range[0]);
|
||||
config->toServiceId = atoi(range[1]);
|
||||
g_strfreev(range);
|
||||
} else {
|
||||
config->fromServiceId = config->toServiceId = atoi(entry);
|
||||
config->selected = TRUE;
|
||||
config->toCodeScheme = 0xff;
|
||||
if (delim) {
|
||||
char** range = g_strsplit(entry, "-", 0);
|
||||
|
||||
config->fromServiceId = atoi(range[0]);
|
||||
config->toServiceId = atoi(range[1]);
|
||||
g_strfreev(range);
|
||||
} else {
|
||||
config->fromServiceId = config->toServiceId = atoi(entry);
|
||||
}
|
||||
}
|
||||
|
||||
/* Every vector, even the one without data, requires two buffer objects */
|
||||
parent.offset = GBINDER_HIDL_VEC_BUFFER_OFFSET;
|
||||
parent.index = gbinder_writer_append_buffer_object(&writer, vec,
|
||||
sizeof(*vec));
|
||||
gbinder_writer_append_buffer_object_with_parent(&writer, configs,
|
||||
sizeof(configs[0]) * count, &parent);
|
||||
} else {
|
||||
/* setGsmBroadcastConfig(int32_t serial, GsmBroadcastSmsConfigInfo[]); */
|
||||
guint i;
|
||||
|
||||
gbinder_writer_append_int32(&writer, count);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const char* entry = list[i];
|
||||
const char* delim = strchr(entry, '-');
|
||||
|
||||
/* Non-null parcelable */
|
||||
gbinder_writer_append_int32(&writer, 1);
|
||||
/* Parcelable size */
|
||||
gbinder_writer_append_int32(&writer, 6 * sizeof(gint32));
|
||||
|
||||
if (delim) {
|
||||
char** range = g_strsplit(entry, "-", 0);
|
||||
|
||||
gbinder_writer_append_int32(&writer, atoi(range[0]));
|
||||
gbinder_writer_append_int32(&writer, atoi(range[1]));
|
||||
g_strfreev(range);
|
||||
} else {
|
||||
gbinder_writer_append_int32(&writer, atoi(entry));
|
||||
gbinder_writer_append_int32(&writer, atoi(entry));
|
||||
}
|
||||
gbinder_writer_append_int32(&writer, 0);
|
||||
gbinder_writer_append_int32(&writer, 0xff);
|
||||
gbinder_writer_append_bool(&writer, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Every vector, even the one without data, requires two buffer objects */
|
||||
parent.offset = GBINDER_HIDL_VEC_BUFFER_OFFSET;
|
||||
parent.index = gbinder_writer_append_buffer_object(&writer, vec,
|
||||
sizeof(*vec));
|
||||
gbinder_writer_append_buffer_object_with_parent(&writer, configs,
|
||||
sizeof(configs[0]) * count, &parent);
|
||||
|
||||
DBG_(self, "configuring CB");
|
||||
radio_request_set_retry_func(req, binder_cbs_retry);
|
||||
radio_request_set_retry(req, CBS_CHECK_RETRY_MS, CBS_CHECK_RETRY_COUNT);
|
||||
@@ -241,6 +294,7 @@ binder_cbs_set_topics(
|
||||
ofono_cbs_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCbs* self = binder_cbs_get_data(cbs);
|
||||
|
||||
DBG_(self, "%s", topics);
|
||||
@@ -254,6 +308,7 @@ binder_cbs_clear_topics(
|
||||
ofono_cbs_set_cb_t cb,
|
||||
void *data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCbs* self = binder_cbs_get_data(cbs);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -268,15 +323,23 @@ binder_cbs_notify(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCbs* self = user_data;
|
||||
GBinderReader reader;
|
||||
const guchar* ptr;
|
||||
gsize len;
|
||||
guint32 ind_code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_IND_NEW_BROADCAST_SMS :
|
||||
RADIO_IND_NEW_BROADCAST_SMS;
|
||||
|
||||
/* newBroadcastSms(RadioIndicationType type, vec<uint8_t> data); */
|
||||
GASSERT(code == RADIO_IND_NEW_BROADCAST_SMS);
|
||||
GASSERT(code == ind_code);
|
||||
gbinder_reader_copy(&reader, args);
|
||||
ptr = gbinder_reader_read_hidl_byte_vec(&reader, &len);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
ptr = gbinder_reader_read_hidl_byte_vec(&reader, &len);
|
||||
} else {
|
||||
ptr = gbinder_reader_read_byte_array(&reader, &len);
|
||||
}
|
||||
|
||||
/* By default assume that it's a length followed by the binary PDU data. */
|
||||
if (ptr) {
|
||||
@@ -303,14 +366,18 @@ gboolean
|
||||
binder_cbs_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCbs* self = user_data;
|
||||
RadioClient* client = self->g->client;
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_IND_NEW_BROADCAST_SMS :
|
||||
RADIO_IND_NEW_BROADCAST_SMS;
|
||||
|
||||
GASSERT(self->register_id);
|
||||
self->register_id = 0;
|
||||
DBG_(self, "registering for CB");
|
||||
self->event_id = radio_client_add_indication_handler(client,
|
||||
RADIO_IND_NEW_BROADCAST_SMS, binder_cbs_notify, self);
|
||||
code, binder_cbs_notify, self);
|
||||
ofono_cbs_register(self->cbs);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
@@ -322,11 +389,13 @@ binder_cbs_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderCbs* self = g_new0(BinderCbs, 1);
|
||||
|
||||
self->cbs = cbs;
|
||||
self->g = radio_request_group_new(modem->client); /* Keeps ref to client */
|
||||
self->g = radio_request_group_new(modem->messaging_client); /* Keeps ref to client */
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->messaging_client);
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
self->register_id = g_idle_add(binder_cbs_register, self);
|
||||
|
||||
@@ -340,6 +409,7 @@ void
|
||||
binder_cbs_remove(
|
||||
struct ofono_cbs* cbs)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCbs* self = binder_cbs_get_data(cbs);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -370,12 +440,14 @@ static const struct ofono_cbs_driver binder_cbs_driver = {
|
||||
void
|
||||
binder_cbs_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_cbs_driver_register(&binder_cbs_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_cbs_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_cbs_driver_unregister(&binder_cbs_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,9 +20,12 @@
|
||||
#include "binder_log.h"
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_instance.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_util.h>
|
||||
|
||||
#include <radio_network_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
|
||||
@@ -37,6 +40,7 @@ enum binder_cell_info_event {
|
||||
CELL_INFO_EVENT_1_0,
|
||||
CELL_INFO_EVENT_1_2,
|
||||
CELL_INFO_EVENT_1_4,
|
||||
CELL_INFO_EVENT_1_5,
|
||||
CELL_INFO_EVENT_COUNT
|
||||
};
|
||||
|
||||
@@ -45,6 +49,7 @@ typedef struct binder_cell_info {
|
||||
GObject object;
|
||||
struct ofono_cell_info info;
|
||||
struct ofono_cell **cells;
|
||||
RadioInstance* instance;
|
||||
RadioClient* client;
|
||||
BinderRadio* radio;
|
||||
BinderSimCard* sim_card;
|
||||
@@ -66,6 +71,7 @@ enum binder_cell_info_signal {
|
||||
|
||||
#define SIGNAL_CELLS_CHANGED_NAME "binder-cell-info-cells-changed"
|
||||
|
||||
static GUtilIdlePool* binder_cell_info_pool = NULL;
|
||||
static guint binder_cell_info_signals[SIGNAL_COUNT] = { 0 };
|
||||
|
||||
G_DEFINE_TYPE(BinderCellInfo, binder_cell_info, G_TYPE_OBJECT)
|
||||
@@ -89,10 +95,28 @@ binder_cell_info_int_format(
|
||||
int value,
|
||||
const char* format)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (value == OFONO_CELL_INVALID_VALUE) {
|
||||
return "";
|
||||
} else {
|
||||
static GUtilIdlePool* binder_cell_info_pool = NULL;
|
||||
GUtilIdlePool* pool = gutil_idle_pool_get(&binder_cell_info_pool);
|
||||
char* str = g_strdup_printf(format, value);
|
||||
|
||||
gutil_idle_pool_add(pool, str, g_free);
|
||||
return str;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_cell_info_int64_format(
|
||||
guint64 value,
|
||||
const char* format)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (value == OFONO_CELL_INVALID_VALUE_INT64) {
|
||||
return "";
|
||||
} else {
|
||||
GUtilIdlePool* pool = gutil_idle_pool_get(&binder_cell_info_pool);
|
||||
char* str = g_strdup_printf(format, value);
|
||||
|
||||
@@ -107,6 +131,7 @@ binder_cell_info_list_compare(
|
||||
gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return ofono_cell_compare_location(*(struct ofono_cell**)a,
|
||||
*(struct ofono_cell**)b);
|
||||
}
|
||||
@@ -117,6 +142,7 @@ binder_cell_info_list_equal(
|
||||
const ofono_cell_ptr* l1,
|
||||
const ofono_cell_ptr* l2)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (l1 && l2) {
|
||||
while (*l1 && *l2) {
|
||||
if (memcmp(*l1, *l2, sizeof(struct ofono_cell))) {
|
||||
@@ -136,6 +162,7 @@ void
|
||||
binder_cell_info_clear(
|
||||
BinderCellInfo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->cells && self->cells[0]) {
|
||||
gutil_ptrv_free((void**)self->cells);
|
||||
self->info.cells = self->cells = g_new0(struct ofono_cell*, 1);
|
||||
@@ -150,6 +177,7 @@ binder_cell_info_update_cells(
|
||||
BinderCellInfo* self,
|
||||
GPtrArray* l)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (l) {
|
||||
g_ptr_array_sort(l, binder_cell_info_list_compare);
|
||||
g_ptr_array_add(l, NULL);
|
||||
@@ -175,6 +203,7 @@ binder_cell_info_invalidate(
|
||||
void* info,
|
||||
gsize size)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const int n = size/sizeof(int);
|
||||
int* value = info;
|
||||
int i;
|
||||
@@ -184,6 +213,26 @@ binder_cell_info_invalidate(
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_invalidate_nr(
|
||||
struct ofono_cell_info_nr* nr)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
nr->mcc = OFONO_CELL_INVALID_VALUE;
|
||||
nr->mnc = OFONO_CELL_INVALID_VALUE;
|
||||
nr->nci = OFONO_CELL_INVALID_VALUE_INT64;
|
||||
nr->pci = OFONO_CELL_INVALID_VALUE;
|
||||
nr->tac = OFONO_CELL_INVALID_VALUE;
|
||||
nr->nrarfcn = OFONO_CELL_INVALID_VALUE;
|
||||
nr->ssRsrp = OFONO_CELL_INVALID_VALUE;
|
||||
nr->ssRsrq = OFONO_CELL_INVALID_VALUE;
|
||||
nr->ssSinr = OFONO_CELL_INVALID_VALUE;
|
||||
nr->csiRsrp = OFONO_CELL_INVALID_VALUE;
|
||||
nr->csiRsrq = OFONO_CELL_INVALID_VALUE;
|
||||
nr->csiSinr = OFONO_CELL_INVALID_VALUE;
|
||||
}
|
||||
|
||||
static
|
||||
struct ofono_cell*
|
||||
binder_cell_info_new_cell_gsm(
|
||||
@@ -191,6 +240,7 @@ binder_cell_info_new_cell_gsm(
|
||||
const RadioCellIdentityGsm* id,
|
||||
const RadioSignalStrengthGsm* ss)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_gsm* gsm = &cell->info.gsm;
|
||||
|
||||
@@ -228,6 +278,7 @@ binder_cell_info_new_cell_wcdma(
|
||||
const RadioCellIdentityWcdma* id,
|
||||
const RadioSignalStrengthWcdma* ss)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_wcdma* wcdma = &cell->info.wcdma;
|
||||
|
||||
@@ -261,6 +312,7 @@ binder_cell_info_new_cell_lte(
|
||||
const RadioCellIdentityLte* id,
|
||||
const RadioSignalStrengthLte* ss)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_lte* lte = &cell->info.lte;
|
||||
|
||||
@@ -294,6 +346,282 @@ binder_cell_info_new_cell_lte(
|
||||
binder_cell_info_int_format(lte->timingAdvance, ",t=%d"));
|
||||
return cell;
|
||||
}
|
||||
static
|
||||
struct ofono_cell*
|
||||
binder_cell_info_new_cell_nr(
|
||||
gboolean registered,
|
||||
const RadioCellIdentityNr* id,
|
||||
const RadioSignalStrengthNr* ss)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_nr* nr = &cell->info.nr;
|
||||
|
||||
cell->type = OFONO_CELL_TYPE_NR;
|
||||
cell->registered = registered;
|
||||
|
||||
binder_cell_info_invalidate_nr(nr);
|
||||
gutil_parse_int(id->mcc.data.str, 10, &nr->mcc);
|
||||
gutil_parse_int(id->mnc.data.str, 10, &nr->mnc);
|
||||
nr->nci = id->nci;
|
||||
nr->pci = id->pci;
|
||||
nr->tac = id->tac;
|
||||
nr->nrarfcn = id->nrarfcn;
|
||||
nr->ssRsrp = ss->ssRsrp;
|
||||
nr->ssRsrq = ss->ssRsrq;
|
||||
nr->ssSinr = ss->ssSinr;
|
||||
nr->csiRsrp = ss->csiRsrp;
|
||||
nr->csiRsrq = ss->csiRsrq;
|
||||
nr->csiSinr = ss->csiSinr;
|
||||
DBG("[nr] reg=%d%s%s%s%s%s%s%s%s%s%s%s", registered,
|
||||
binder_cell_info_int_format(nr->mcc, ",mcc=%d"),
|
||||
binder_cell_info_int_format(nr->mnc, ",mnc=%d"),
|
||||
binder_cell_info_int64_format(nr->nci, ",nci=%" G_GINT64_FORMAT),
|
||||
binder_cell_info_int_format(nr->pci, ",pci=%d"),
|
||||
binder_cell_info_int_format(nr->tac, ",tac=%d"),
|
||||
binder_cell_info_int_format(nr->ssRsrp, ",ssRsrp=%d"),
|
||||
binder_cell_info_int_format(nr->ssRsrq, ",ssRsrq=%d"),
|
||||
binder_cell_info_int_format(nr->ssSinr, ",ssSinr=%d"),
|
||||
binder_cell_info_int_format(nr->csiRsrp, ",csiRsrp=%d"),
|
||||
binder_cell_info_int_format(nr->csiRsrq, ",csiRsrq=%d"),
|
||||
binder_cell_info_int_format(nr->csiSinr, ",csiSinr=%d"));
|
||||
return cell;
|
||||
}
|
||||
|
||||
static
|
||||
struct ofono_cell*
|
||||
binder_cell_info_new_cell_gsm_aidl(
|
||||
gboolean registered,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_gsm* gsm = &cell->info.gsm;
|
||||
gsize data_read;
|
||||
gsize initial_size;
|
||||
gsize parcel_size;
|
||||
|
||||
cell->type = OFONO_CELL_TYPE_GSM;
|
||||
cell->registered = registered;
|
||||
|
||||
binder_cell_info_invalidate(gsm, sizeof(*gsm));
|
||||
/* CellInfoGsm */
|
||||
if (binder_read_parcelable_size(reader)) {
|
||||
/* CellIdentityGsm */
|
||||
parcel_size = binder_read_parcelable_size(reader);
|
||||
initial_size = gbinder_reader_bytes_read(reader);
|
||||
binder_read_string16_parse_int(reader, &gsm->mcc);
|
||||
binder_read_string16_parse_int(reader, &gsm->mnc);
|
||||
gbinder_reader_read_int32(reader, &gsm->lac);
|
||||
gbinder_reader_read_int32(reader, &gsm->cid);
|
||||
gbinder_reader_read_int32(reader, &gsm->arfcn);
|
||||
gbinder_reader_read_int32(reader, &gsm->bsic);
|
||||
data_read = gbinder_reader_bytes_read(reader) - initial_size;
|
||||
while (data_read < parcel_size) {
|
||||
gbinder_reader_read_uint32(reader, NULL);
|
||||
data_read += sizeof(guint32);
|
||||
}
|
||||
|
||||
/* SignalStrengthGsm */
|
||||
binder_read_parcelable_size(reader);
|
||||
gbinder_reader_read_int32(reader, &gsm->signalStrength);
|
||||
gbinder_reader_read_int32(reader, &gsm->bitErrorRate);
|
||||
gbinder_reader_read_int32(reader, &gsm->timingAdvance);
|
||||
}
|
||||
|
||||
DBG("[gsm] reg=%d%s%s%s%s%s%s%s%s%s", registered,
|
||||
binder_cell_info_int_format(gsm->mcc, ",mcc=%d"),
|
||||
binder_cell_info_int_format(gsm->mnc, ",mnc=%d"),
|
||||
binder_cell_info_int_format(gsm->lac, ",lac=%d"),
|
||||
binder_cell_info_int_format(gsm->cid, ",cid=%d"),
|
||||
binder_cell_info_int_format(gsm->arfcn, ",arfcn=%d"),
|
||||
binder_cell_info_int_format(gsm->bsic, ",bsic=%d"),
|
||||
binder_cell_info_int_format(gsm->signalStrength, ",strength=%d"),
|
||||
binder_cell_info_int_format(gsm->bitErrorRate, ",err=%d"),
|
||||
binder_cell_info_int_format(gsm->timingAdvance, ",t=%d"));
|
||||
return cell;
|
||||
}
|
||||
|
||||
static
|
||||
struct
|
||||
ofono_cell*
|
||||
binder_cell_info_new_cell_wcdma_aidl(
|
||||
gboolean registered,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_wcdma* wcdma = &cell->info.wcdma;
|
||||
gsize data_read;
|
||||
gsize initial_size;
|
||||
gsize parcel_size;
|
||||
|
||||
cell->type = OFONO_CELL_TYPE_WCDMA;
|
||||
cell->registered = registered;
|
||||
|
||||
binder_cell_info_invalidate(wcdma, sizeof(*wcdma));
|
||||
|
||||
/* CellInfoWcdma */
|
||||
if (binder_read_parcelable_size(reader)) {
|
||||
/* CellIdentityWcdma */
|
||||
parcel_size = binder_read_parcelable_size(reader);
|
||||
initial_size = gbinder_reader_bytes_read(reader);
|
||||
binder_read_string16_parse_int(reader, &wcdma->mcc);
|
||||
binder_read_string16_parse_int(reader, &wcdma->mnc);
|
||||
gbinder_reader_read_int32(reader, &wcdma->lac);
|
||||
gbinder_reader_read_int32(reader, &wcdma->cid);
|
||||
gbinder_reader_read_int32(reader, &wcdma->psc);
|
||||
gbinder_reader_read_int32(reader, &wcdma->uarfcn);
|
||||
data_read = gbinder_reader_bytes_read(reader) - initial_size;
|
||||
while (data_read < parcel_size) {
|
||||
gbinder_reader_read_uint32(reader, NULL);
|
||||
data_read += sizeof(guint32);
|
||||
}
|
||||
|
||||
/* SignalStrengthWcdma */
|
||||
binder_read_parcelable_size(reader);
|
||||
gbinder_reader_read_int32(reader, &wcdma->signalStrength);
|
||||
gbinder_reader_read_int32(reader, &wcdma->bitErrorRate);
|
||||
gbinder_reader_read_int32(reader, NULL); /* rscp */
|
||||
gbinder_reader_read_int32(reader, NULL); /* ecno */
|
||||
}
|
||||
|
||||
DBG("[wcdma] reg=%d%s%s%s%s%s%s%s", registered,
|
||||
binder_cell_info_int_format(wcdma->mcc, ",mcc=%d"),
|
||||
binder_cell_info_int_format(wcdma->mnc, ",mnc=%d"),
|
||||
binder_cell_info_int_format(wcdma->lac, ",lac=%d"),
|
||||
binder_cell_info_int_format(wcdma->cid, ",cid=%d"),
|
||||
binder_cell_info_int_format(wcdma->psc, ",psc=%d"),
|
||||
binder_cell_info_int_format(wcdma->signalStrength, ",strength=%d"),
|
||||
binder_cell_info_int_format(wcdma->bitErrorRate, ",err=%d"));
|
||||
return cell;
|
||||
}
|
||||
|
||||
static
|
||||
struct ofono_cell*
|
||||
binder_cell_info_new_cell_lte_aidl(
|
||||
gboolean registered,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_lte* lte = &cell->info.lte;
|
||||
gsize data_read;
|
||||
gsize initial_size;
|
||||
gsize parcel_size;
|
||||
|
||||
cell->type = OFONO_CELL_TYPE_LTE;
|
||||
cell->registered = registered;
|
||||
|
||||
binder_cell_info_invalidate(lte, sizeof(*lte));
|
||||
|
||||
/* CellInfoLte */
|
||||
if (binder_read_parcelable_size(reader)) {
|
||||
/* CellIdentityLte */
|
||||
parcel_size = binder_read_parcelable_size(reader);
|
||||
initial_size = gbinder_reader_bytes_read(reader);
|
||||
binder_read_string16_parse_int(reader, <e->mcc);
|
||||
binder_read_string16_parse_int(reader, <e->mnc);
|
||||
gbinder_reader_read_int32(reader, <e->ci);
|
||||
gbinder_reader_read_int32(reader, <e->pci);
|
||||
gbinder_reader_read_int32(reader, <e->tac);
|
||||
gbinder_reader_read_int32(reader, <e->earfcn);
|
||||
data_read = gbinder_reader_bytes_read(reader) - initial_size;
|
||||
while (data_read < parcel_size) {
|
||||
gbinder_reader_read_uint32(reader, NULL);
|
||||
data_read += sizeof(guint32);
|
||||
}
|
||||
|
||||
/* SignalStrengthLte */
|
||||
binder_read_parcelable_size(reader);
|
||||
gbinder_reader_read_int32(reader, <e->signalStrength);
|
||||
gbinder_reader_read_int32(reader, <e->rsrp);
|
||||
gbinder_reader_read_int32(reader, <e->rsrq);
|
||||
gbinder_reader_read_int32(reader, <e->rssnr);
|
||||
gbinder_reader_read_int32(reader, <e->cqi);
|
||||
gbinder_reader_read_int32(reader, <e->timingAdvance);
|
||||
gbinder_reader_read_int32(reader, NULL);
|
||||
}
|
||||
|
||||
DBG("[lte] reg=%d%s%s%s%s%s%s%s%s%s%s%s", registered,
|
||||
binder_cell_info_int_format(lte->mcc, ",mcc=%d"),
|
||||
binder_cell_info_int_format(lte->mnc, ",mnc=%d"),
|
||||
binder_cell_info_int_format(lte->ci, ",ci=%d"),
|
||||
binder_cell_info_int_format(lte->pci, ",pci=%d"),
|
||||
binder_cell_info_int_format(lte->tac, ",tac=%d"),
|
||||
binder_cell_info_int_format(lte->signalStrength, ",strength=%d"),
|
||||
binder_cell_info_int_format(lte->rsrp, ",rsrp=%d"),
|
||||
binder_cell_info_int_format(lte->rsrq, ",rsrq=%d"),
|
||||
binder_cell_info_int_format(lte->rssnr, ",rssnr=%d"),
|
||||
binder_cell_info_int_format(lte->cqi, ",cqi=%d"),
|
||||
binder_cell_info_int_format(lte->timingAdvance, ",t=%d"));
|
||||
return cell;
|
||||
}
|
||||
static
|
||||
struct ofono_cell*
|
||||
binder_cell_info_new_cell_nr_aidl(
|
||||
gboolean registered,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_cell* cell = binder_cell_new();
|
||||
struct ofono_cell_info_nr* nr = &cell->info.nr;
|
||||
gsize data_read;
|
||||
gsize initial_size;
|
||||
gsize parcel_size;
|
||||
|
||||
cell->type = OFONO_CELL_TYPE_NR;
|
||||
cell->registered = registered;
|
||||
|
||||
binder_cell_info_invalidate_nr(nr);
|
||||
|
||||
/* CellInfoNr */
|
||||
if (binder_read_parcelable_size(reader)) {
|
||||
/* CellIdentityNr */
|
||||
parcel_size = binder_read_parcelable_size(reader);
|
||||
initial_size = gbinder_reader_bytes_read(reader);
|
||||
binder_read_string16_parse_int(reader, &nr->mcc);
|
||||
binder_read_string16_parse_int(reader, &nr->mnc);
|
||||
gbinder_reader_read_int64(reader, &nr->nci);
|
||||
gbinder_reader_read_int32(reader, &nr->pci);
|
||||
gbinder_reader_read_int32(reader, &nr->tac);
|
||||
gbinder_reader_read_int32(reader, &nr->nrarfcn);
|
||||
data_read = gbinder_reader_bytes_read(reader) - initial_size;
|
||||
while (data_read < parcel_size) {
|
||||
gbinder_reader_read_uint32(reader, NULL);
|
||||
data_read += sizeof(guint32);
|
||||
}
|
||||
|
||||
/* SignalStrengthNr */
|
||||
parcel_size = binder_read_parcelable_size(reader);
|
||||
initial_size = gbinder_reader_bytes_read(reader);
|
||||
gbinder_reader_read_int32(reader, &nr->ssRsrp);
|
||||
gbinder_reader_read_int32(reader, &nr->ssRsrp);
|
||||
gbinder_reader_read_int32(reader, &nr->ssSinr);
|
||||
gbinder_reader_read_int32(reader, &nr->csiRsrp);
|
||||
gbinder_reader_read_int32(reader, &nr->csiRsrq);
|
||||
gbinder_reader_read_int32(reader, &nr->csiSinr);
|
||||
data_read = gbinder_reader_bytes_read(reader) - initial_size;
|
||||
while (data_read < parcel_size) {
|
||||
gbinder_reader_read_uint32(reader, NULL);
|
||||
data_read += sizeof(guint32);
|
||||
}
|
||||
}
|
||||
|
||||
DBG("[nr] reg=%d%s%s%s%s%s%s%s%s%s%s%s", registered,
|
||||
binder_cell_info_int_format(nr->mcc, ",mcc=%d"),
|
||||
binder_cell_info_int_format(nr->mnc, ",mnc=%d"),
|
||||
binder_cell_info_int64_format(nr->nci, ",nci=%" G_GINT64_FORMAT),
|
||||
binder_cell_info_int_format(nr->pci, ",pci=%d"),
|
||||
binder_cell_info_int_format(nr->tac, ",tac=%d"),
|
||||
binder_cell_info_int_format(nr->ssRsrp, ",ssRsrp=%d"),
|
||||
binder_cell_info_int_format(nr->ssRsrq, ",ssRsrq=%d"),
|
||||
binder_cell_info_int_format(nr->ssSinr, ",ssSinr=%d"),
|
||||
binder_cell_info_int_format(nr->csiRsrp, ",csiRsrp=%d"),
|
||||
binder_cell_info_int_format(nr->csiRsrq, ",csiRsrq=%d"),
|
||||
binder_cell_info_int_format(nr->csiSinr, ",csiSinr=%d"));
|
||||
return cell;
|
||||
}
|
||||
|
||||
static
|
||||
GPtrArray*
|
||||
@@ -301,6 +629,7 @@ binder_cell_info_array_new_1_0(
|
||||
const RadioCellInfo* cells,
|
||||
gsize count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize i;
|
||||
GPtrArray* l = g_ptr_array_sized_new(count + 1);
|
||||
|
||||
@@ -352,6 +681,7 @@ binder_cell_info_array_new_1_2(
|
||||
const RadioCellInfo_1_2* cells,
|
||||
gsize count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize i;
|
||||
GPtrArray* l = g_ptr_array_sized_new(count + 1);
|
||||
|
||||
@@ -403,6 +733,7 @@ binder_cell_info_array_new_1_4(
|
||||
const RadioCellInfo_1_4* cells,
|
||||
gsize count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize i;
|
||||
GPtrArray* l = g_ptr_array_sized_new(count + 1);
|
||||
|
||||
@@ -426,9 +757,13 @@ binder_cell_info_array_new_1_4(
|
||||
&cell->info.wcdma.cellIdentityWcdma.base,
|
||||
&cell->info.wcdma.signalStrengthWcdma.base));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_4_NR:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_nr(registered,
|
||||
&cell->info.nr.cellIdentity,
|
||||
&cell->info.nr.signalStrength));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_4_TD_SCDMA:
|
||||
case RADIO_CELL_INFO_1_4_CDMA:
|
||||
case RADIO_CELL_INFO_1_4_NR:
|
||||
break;
|
||||
}
|
||||
DBG("unsupported cell type %d", cell->cellInfoType);
|
||||
@@ -436,12 +771,110 @@ binder_cell_info_array_new_1_4(
|
||||
return l;
|
||||
}
|
||||
|
||||
static
|
||||
GPtrArray*
|
||||
binder_cell_info_array_new_1_5(
|
||||
const RadioCellInfo_1_5* cells,
|
||||
gsize count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize i;
|
||||
GPtrArray* l = g_ptr_array_sized_new(count + 1);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
const RadioCellInfo_1_5* cell = cells + i;
|
||||
const gboolean registered = cell->registered;
|
||||
|
||||
switch ((RADIO_CELL_INFO_TYPE_1_5)cell->cellInfoType) {
|
||||
case RADIO_CELL_INFO_1_5_GSM:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_gsm(registered,
|
||||
&cell->info.gsm.cellIdentityGsm.base.base,
|
||||
&cell->info.gsm.signalStrengthGsm));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_LTE:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_lte(registered,
|
||||
&cell->info.lte.cellIdentityLte.base.base,
|
||||
&cell->info.lte.signalStrengthLte));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_WCDMA:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_wcdma(registered,
|
||||
&cell->info.wcdma.cellIdentityWcdma.base.base,
|
||||
&cell->info.wcdma.signalStrengthWcdma.base));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_NR:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_nr(registered,
|
||||
&cell->info.nr.cellIdentityNr.base,
|
||||
&cell->info.nr.signalStrengthNr));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_TD_SCDMA:
|
||||
case RADIO_CELL_INFO_1_5_CDMA:
|
||||
break;
|
||||
}
|
||||
DBG("unsupported cell type %d", cell->cellInfoType);
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
static
|
||||
GPtrArray*
|
||||
binder_cell_info_array_new_aidl(
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize i;
|
||||
gint32 count = 0;
|
||||
GPtrArray* l;
|
||||
gbinder_reader_read_int32(reader, &count);
|
||||
l = g_ptr_array_sized_new(count + 1);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
gboolean registered;
|
||||
gint32 type;
|
||||
if (!binder_read_parcelable_size(reader)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
gbinder_reader_read_bool(reader, ®istered);
|
||||
gbinder_reader_read_int32(reader, NULL); /* connectionStatus */
|
||||
gbinder_reader_read_int32(reader, NULL); /* non-null rat specific info union */
|
||||
gbinder_reader_read_int32(reader, &type);
|
||||
|
||||
switch (type) {
|
||||
case RADIO_CELL_INFO_1_5_GSM:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_gsm_aidl(registered,
|
||||
reader));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_LTE:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_lte_aidl(registered,
|
||||
reader));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_WCDMA:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_wcdma_aidl(registered,
|
||||
reader));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_NR:
|
||||
g_ptr_array_add(l, binder_cell_info_new_cell_nr_aidl(registered,
|
||||
reader));
|
||||
continue;
|
||||
case RADIO_CELL_INFO_1_5_TD_SCDMA:
|
||||
case RADIO_CELL_INFO_1_5_CDMA:
|
||||
/* Skip not implemented cell info types */
|
||||
gbinder_reader_read_parcelable(reader, NULL);
|
||||
break;
|
||||
}
|
||||
DBG("unsupported cell type %d", type);
|
||||
gbinder_reader_read_parcelable(reader, NULL);
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_list_1_0(
|
||||
BinderCellInfo* self,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize count;
|
||||
const RadioCellInfo* cells = gbinder_reader_read_hidl_type_vec(reader,
|
||||
RadioCellInfo, &count);
|
||||
@@ -460,6 +893,7 @@ binder_cell_info_list_1_2(
|
||||
BinderCellInfo* self,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize count;
|
||||
const RadioCellInfo_1_2* cells = gbinder_reader_read_hidl_type_vec(reader,
|
||||
RadioCellInfo_1_2, &count);
|
||||
@@ -478,6 +912,7 @@ binder_cell_info_list_1_4(
|
||||
BinderCellInfo* self,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize count;
|
||||
const RadioCellInfo_1_4* cells = gbinder_reader_read_hidl_type_vec(reader,
|
||||
RadioCellInfo_1_4, &count);
|
||||
@@ -490,6 +925,36 @@ binder_cell_info_list_1_4(
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_list_1_5(
|
||||
BinderCellInfo* self,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize count;
|
||||
const RadioCellInfo_1_5* cells = gbinder_reader_read_hidl_type_vec(reader,
|
||||
RadioCellInfo_1_5, &count);
|
||||
|
||||
if (cells) {
|
||||
binder_cell_info_update_cells(self,
|
||||
binder_cell_info_array_new_1_5(cells, count));
|
||||
} else {
|
||||
ofono_warn("Failed to parse cellInfoList_1_5 payload");
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_list_aidl(
|
||||
BinderCellInfo* self,
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_cell_info_update_cells(self,
|
||||
binder_cell_info_array_new_aidl(reader));
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_list_changed_1_0(
|
||||
@@ -498,6 +963,7 @@ binder_cell_info_list_changed_1_0(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
GASSERT(code == RADIO_IND_CELL_INFO_LIST);
|
||||
@@ -517,6 +983,7 @@ binder_cell_info_list_changed_1_2(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
GASSERT(code == RADIO_IND_CELL_INFO_LIST_1_2);
|
||||
@@ -536,6 +1003,7 @@ binder_cell_info_list_changed_1_4(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
GASSERT(code == RADIO_IND_CELL_INFO_LIST_1_4);
|
||||
@@ -547,6 +1015,46 @@ binder_cell_info_list_changed_1_4(
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_list_changed_1_5(
|
||||
RadioClient* client,
|
||||
RADIO_IND code,
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
GASSERT(code == RADIO_IND_CELL_INFO_LIST_1_5);
|
||||
if (self->enabled) {
|
||||
GBinderReader reader;
|
||||
|
||||
gbinder_reader_copy(&reader, args);
|
||||
binder_cell_info_list_1_5(self, &reader);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_list_changed_aidl(
|
||||
RadioClient* client,
|
||||
RADIO_IND code,
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
GASSERT((RADIO_NETWORK_IND)code == RADIO_NETWORK_IND_CELL_INFO_LIST);
|
||||
if (self->enabled) {
|
||||
GBinderReader reader;
|
||||
|
||||
gbinder_reader_copy(&reader, args);
|
||||
binder_cell_info_list_aidl(self, &reader);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_cell_info_list_cb(
|
||||
@@ -557,6 +1065,7 @@ binder_cell_info_list_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
GASSERT(self->query_req == req);
|
||||
@@ -569,23 +1078,31 @@ binder_cell_info_list_cb(
|
||||
GBinderReader reader;
|
||||
|
||||
gbinder_reader_copy(&reader, args);
|
||||
switch (resp) {
|
||||
case RADIO_RESP_GET_CELL_INFO_LIST:
|
||||
binder_cell_info_list_1_0(self, &reader);
|
||||
break;
|
||||
case RADIO_RESP_GET_CELL_INFO_LIST_1_2:
|
||||
binder_cell_info_list_1_2(self, &reader);
|
||||
break;
|
||||
case RADIO_RESP_GET_CELL_INFO_LIST_1_4:
|
||||
binder_cell_info_list_1_4(self, &reader);
|
||||
break;
|
||||
default:
|
||||
ofono_warn("Unexpected getCellInfoList response %d", resp);
|
||||
break;
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(self->client);
|
||||
if (iface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
switch (resp) {
|
||||
case RADIO_RESP_GET_CELL_INFO_LIST:
|
||||
binder_cell_info_list_1_0(self, &reader);
|
||||
break;
|
||||
case RADIO_RESP_GET_CELL_INFO_LIST_1_2:
|
||||
binder_cell_info_list_1_2(self, &reader);
|
||||
break;
|
||||
case RADIO_RESP_GET_CELL_INFO_LIST_1_4:
|
||||
binder_cell_info_list_1_4(self, &reader);
|
||||
break;
|
||||
case RADIO_RESP_GET_CELL_INFO_LIST_1_5:
|
||||
binder_cell_info_list_1_5(self, &reader);
|
||||
break;
|
||||
default:
|
||||
ofono_warn("Unexpected getCellInfoList response %d", resp);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
binder_cell_info_list_aidl(self, &reader);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DBG_(self, "%s error %d", radio_resp_name(resp), error);
|
||||
DBG_(self, "%s error %d", radio_resp_name2(self->instance, resp), error);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -600,7 +1117,12 @@ binder_cell_info_set_rate_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(self->client);
|
||||
guint32 code = iface_aidl == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_RESP_SET_CELL_INFO_LIST_RATE :
|
||||
RADIO_RESP_SET_CELL_INFO_LIST_RATE;
|
||||
|
||||
DBG_(self, "");
|
||||
GASSERT(self->set_rate_req == req);
|
||||
@@ -608,7 +1130,7 @@ binder_cell_info_set_rate_cb(
|
||||
self->set_rate_req = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_CELL_INFO_LIST_RATE) {
|
||||
if (resp == code) {
|
||||
if (error != RADIO_ERROR_NONE) {
|
||||
DBG_(self, "Failed to set cell info rate, error %d", error);
|
||||
}
|
||||
@@ -628,6 +1150,7 @@ binder_cell_info_retry(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
switch (error) {
|
||||
@@ -644,9 +1167,15 @@ void
|
||||
binder_cell_info_query(
|
||||
BinderCellInfo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(self->client);
|
||||
guint32 code = iface_aidl == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_REQ_GET_CELL_INFO_LIST :
|
||||
RADIO_REQ_GET_CELL_INFO_LIST;
|
||||
|
||||
radio_request_drop(self->query_req);
|
||||
self->query_req = radio_request_new(self->client,
|
||||
RADIO_REQ_GET_CELL_INFO_LIST, NULL,
|
||||
code, NULL,
|
||||
binder_cell_info_list_cb, NULL, self);
|
||||
radio_request_set_retry(self->query_req, BINDER_RETRY_MS, MAX_RETRIES);
|
||||
radio_request_set_retry_func(self->query_req, binder_cell_info_retry);
|
||||
@@ -658,11 +1187,16 @@ void
|
||||
binder_cell_info_set_rate(
|
||||
BinderCellInfo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderWriter writer;
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(self->client);
|
||||
guint32 code = iface_aidl == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_REQ_SET_CELL_INFO_LIST_RATE :
|
||||
RADIO_REQ_SET_CELL_INFO_LIST_RATE;
|
||||
|
||||
radio_request_drop(self->set_rate_req);
|
||||
self->set_rate_req = radio_request_new(self->client,
|
||||
RADIO_REQ_SET_CELL_INFO_LIST_RATE, &writer,
|
||||
code, &writer,
|
||||
binder_cell_info_set_rate_cb, NULL, self);
|
||||
|
||||
gbinder_writer_append_int32(&writer,
|
||||
@@ -679,6 +1213,7 @@ void
|
||||
binder_cell_info_refresh(
|
||||
BinderCellInfo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* getCellInfoList fails without SIM card */
|
||||
if (self->enabled &&
|
||||
self->radio->state == RADIO_STATE_ON &&
|
||||
@@ -696,6 +1231,7 @@ binder_cell_info_radio_state_cb(
|
||||
BINDER_RADIO_PROPERTY property,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
DBG_(self, "%s", binder_radio_state_string(radio->state));
|
||||
@@ -708,6 +1244,7 @@ binder_cell_info_sim_status_cb(
|
||||
BinderSimCard* sim,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(user_data);
|
||||
|
||||
self->sim_card_ready = binder_sim_card_ready(sim);
|
||||
@@ -736,6 +1273,7 @@ void
|
||||
binder_cell_info_ref_proc(
|
||||
struct ofono_cell_info* info)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_object_ref(binder_cell_info_cast(info));
|
||||
}
|
||||
|
||||
@@ -744,6 +1282,7 @@ void
|
||||
binder_cell_info_unref_proc(
|
||||
struct ofono_cell_info* info)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_object_unref(binder_cell_info_cast(info));
|
||||
}
|
||||
|
||||
@@ -753,6 +1292,7 @@ binder_cell_info_cells_changed_cb(
|
||||
BinderCellInfo* self,
|
||||
BinderCellInfoClosure* closure)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
closure->cb(&self->info, closure->user_data);
|
||||
}
|
||||
|
||||
@@ -763,6 +1303,7 @@ binder_cell_info_add_cells_changed_handler_proc(
|
||||
ofono_cell_info_cb_t cb,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (cb) {
|
||||
BinderCellInfoClosure* closure = (BinderCellInfoClosure *)
|
||||
g_closure_new_simple(sizeof(BinderCellInfoClosure), NULL);
|
||||
@@ -786,6 +1327,7 @@ binder_cell_info_remove_handler_proc(
|
||||
struct ofono_cell_info* info,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(id)) {
|
||||
g_signal_handler_disconnect(binder_cell_info_cast(info), id);
|
||||
}
|
||||
@@ -797,6 +1339,7 @@ binder_cell_info_set_update_interval_proc(
|
||||
struct ofono_cell_info* info,
|
||||
int ms)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = binder_cell_info_cast(info);
|
||||
|
||||
if (self->update_rate_ms != ms) {
|
||||
@@ -814,6 +1357,7 @@ binder_cell_info_set_enabled_proc(
|
||||
struct ofono_cell_info* info,
|
||||
gboolean enabled)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = binder_cell_info_cast(info);
|
||||
|
||||
if (self->enabled != enabled) {
|
||||
@@ -832,31 +1376,47 @@ binder_cell_info_set_enabled_proc(
|
||||
|
||||
struct ofono_cell_info*
|
||||
binder_cell_info_new(
|
||||
RadioInstance* instance,
|
||||
RadioClient* client,
|
||||
const char* log_prefix,
|
||||
BinderRadio* radio,
|
||||
BinderSimCard* sim)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = g_object_new(THIS_TYPE, 0);
|
||||
|
||||
self->instance = radio_instance_ref(instance);
|
||||
self->client = radio_client_ref(client);
|
||||
self->radio = binder_radio_ref(radio);
|
||||
self->sim_card = binder_sim_card_ref(sim);
|
||||
self->log_prefix = binder_dup_prefix(log_prefix);
|
||||
const RADIO_AIDL_INTERFACE iface_aidl =
|
||||
radio_client_aidl_interface(self->client);
|
||||
|
||||
DBG_(self, "");
|
||||
self->event_id[CELL_INFO_EVENT_1_0] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_CELL_INFO_LIST,
|
||||
binder_cell_info_list_changed_1_0, self);
|
||||
self->event_id[CELL_INFO_EVENT_1_2] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_CELL_INFO_LIST_1_2,
|
||||
binder_cell_info_list_changed_1_2, self);
|
||||
self->event_id[CELL_INFO_EVENT_1_4] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_CELL_INFO_LIST_1_4,
|
||||
binder_cell_info_list_changed_1_4, self);
|
||||
if (iface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
self->event_id[CELL_INFO_EVENT_1_0] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_CELL_INFO_LIST,
|
||||
binder_cell_info_list_changed_1_0, self);
|
||||
self->event_id[CELL_INFO_EVENT_1_2] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_CELL_INFO_LIST_1_2,
|
||||
binder_cell_info_list_changed_1_2, self);
|
||||
self->event_id[CELL_INFO_EVENT_1_4] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_CELL_INFO_LIST_1_4,
|
||||
binder_cell_info_list_changed_1_4, self);
|
||||
self->event_id[CELL_INFO_EVENT_1_5] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_CELL_INFO_LIST_1_5,
|
||||
binder_cell_info_list_changed_1_5, self);
|
||||
} else {
|
||||
self->event_id[CELL_INFO_EVENT_1_0] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_NETWORK_IND_CELL_INFO_LIST,
|
||||
binder_cell_info_list_changed_aidl, self);
|
||||
}
|
||||
self->radio_state_event_id =
|
||||
binder_radio_add_property_handler(radio,
|
||||
BINDER_RADIO_PROPERTY_STATE,
|
||||
@@ -884,6 +1444,7 @@ void
|
||||
binder_cell_info_init(
|
||||
BinderCellInfo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
static const struct ofono_cell_info_proc binder_cell_info_proc = {
|
||||
binder_cell_info_ref_proc,
|
||||
binder_cell_info_unref_proc,
|
||||
@@ -903,6 +1464,7 @@ void
|
||||
binder_cell_info_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderCellInfo* self = THIS(object);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -910,6 +1472,7 @@ binder_cell_info_finalize(
|
||||
radio_request_drop(self->set_rate_req);
|
||||
radio_client_remove_all_handlers(self->client, self->event_id);
|
||||
radio_client_unref(self->client);
|
||||
radio_instance_unref(self->instance);
|
||||
binder_radio_remove_handler(self->radio, self->radio_state_event_id);
|
||||
binder_radio_unref(self->radio);
|
||||
binder_sim_card_remove_handler(self->sim_card, self->sim_status_event_id);
|
||||
@@ -924,6 +1487,7 @@ void
|
||||
binder_cell_info_class_init(
|
||||
BinderCellInfoClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
G_OBJECT_CLASS(klass)->finalize = binder_cell_info_finalize;
|
||||
binder_cell_info_signals[SIGNAL_CELLS_CHANGED] =
|
||||
g_signal_new(SIGNAL_CELLS_CHANGED_NAME, G_OBJECT_CLASS_TYPE(klass),
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
struct ofono_cell_info*
|
||||
binder_cell_info_new(
|
||||
RadioInstance* instance,
|
||||
RadioClient* client,
|
||||
const char* log_prefix,
|
||||
BinderRadio* radio,
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "binder_base.h"
|
||||
#include "binder_connman.h"
|
||||
#include "binder_log.h"
|
||||
|
||||
#include <ofono/log.h>
|
||||
#include <ofono/gdbus.h>
|
||||
@@ -85,6 +86,7 @@ ConnManObject*
|
||||
connman_object_cast(
|
||||
BinderConnman* connman)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return G_LIKELY(connman) ?
|
||||
THIS(G_CAST(connman, ConnManObject, pub)) :
|
||||
NULL;
|
||||
@@ -95,6 +97,7 @@ const char*
|
||||
connman_iter_get_string(
|
||||
DBusMessageIter* it)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const char* str = NULL;
|
||||
|
||||
dbus_message_iter_get_basic(it, &str);
|
||||
@@ -106,6 +109,7 @@ void
|
||||
connman_object_emit_pending_signals(
|
||||
ConnManObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderBase* base = &self->base;
|
||||
BinderConnman* connman = &self->pub;
|
||||
gsize late_signals = 0;
|
||||
@@ -144,6 +148,7 @@ void
|
||||
connman_cancel_call(
|
||||
ConnManObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->call) {
|
||||
dbus_pending_call_cancel(self->call);
|
||||
dbus_pending_call_unref(self->call);
|
||||
@@ -157,6 +162,7 @@ connman_tech_new(
|
||||
ConnManObject* self,
|
||||
const char* path)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManTech* tech = g_new0(ConnManTech, 1);
|
||||
char* key = g_strdup(path);
|
||||
|
||||
@@ -171,6 +177,7 @@ void
|
||||
connman_invalidate(
|
||||
ConnManObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderConnman* connman = &self->pub;
|
||||
|
||||
if (connman->valid) {
|
||||
@@ -185,6 +192,7 @@ void
|
||||
connman_update_valid(
|
||||
ConnManObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderConnman* connman = &self->pub;
|
||||
const gboolean valid = (connman->present && !self->call);
|
||||
|
||||
@@ -200,6 +208,7 @@ gboolean
|
||||
connman_update_tethering(
|
||||
ConnManObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderConnman* connman = &self->pub;
|
||||
gboolean tethering = FALSE;
|
||||
GHashTableIter it;
|
||||
@@ -231,6 +240,7 @@ connman_set_tech_tethering(
|
||||
ConnManTech* tech,
|
||||
gboolean tethering)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (tech->tethering != tethering) {
|
||||
ConnManObject* self = tech->obj;
|
||||
|
||||
@@ -260,6 +270,7 @@ connman_set_tech_connected(
|
||||
ConnManTech* tech,
|
||||
gboolean connected)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (tech->connected != connected) {
|
||||
ConnManObject* self = tech->obj;
|
||||
|
||||
@@ -283,6 +294,7 @@ connman_tech_set_property(
|
||||
ConnManTech* tech,
|
||||
DBusMessageIter* it)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DBusMessageIter var;
|
||||
DBusBasicValue value;
|
||||
const char* key = connman_iter_get_string(it);
|
||||
@@ -310,6 +322,7 @@ connman_tech_set_properties(
|
||||
ConnManTech* tech,
|
||||
DBusMessageIter* it)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DBusMessageIter dict;
|
||||
int handled = 0;
|
||||
|
||||
@@ -334,6 +347,7 @@ connman_tech_property_changed(
|
||||
DBusMessage* msg,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const char* path = dbus_message_get_path(msg);
|
||||
ConnManObject* self = THIS(user_data);
|
||||
ConnManTech* tech = g_hash_table_lookup(self->techs, path);
|
||||
@@ -357,6 +371,7 @@ connman_set_techs(
|
||||
ConnManObject* self,
|
||||
DBusMessageIter* it)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DBusMessageIter list;
|
||||
|
||||
dbus_message_iter_recurse(it, &list);
|
||||
@@ -387,6 +402,7 @@ connman_techs_reply(
|
||||
DBusPendingCall* call,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManObject* self = THIS(user_data);
|
||||
DBusMessage* reply = dbus_pending_call_steal_reply(call);
|
||||
DBusError error;
|
||||
@@ -413,6 +429,7 @@ void
|
||||
connman_get_techs(
|
||||
ConnManObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DBusMessage* msg = dbus_message_new_method_call(CONNMAN_SERVICE,
|
||||
CONNMAN_PATH, CONNMAN_MANAGER_INTERFACE, CONNMAN_GET_TECHNOLOGIES);
|
||||
|
||||
@@ -433,6 +450,7 @@ connman_appeared(
|
||||
DBusConnection* conn,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManObject* self = THIS(user_data);
|
||||
BinderConnman* connman = &self->pub;
|
||||
|
||||
@@ -452,6 +470,7 @@ connman_vanished(
|
||||
DBusConnection* conn,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManObject* self = THIS(user_data);
|
||||
BinderConnman* connman = &self->pub;
|
||||
|
||||
@@ -482,6 +501,7 @@ connman_init(
|
||||
ConnManObject* self,
|
||||
DBusConnection* connection)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->connection = dbus_connection_ref(connection);
|
||||
self->service_watch = g_dbus_add_service_watch(self->connection,
|
||||
CONNMAN_SERVICE, connman_appeared, connman_vanished, self, NULL);
|
||||
@@ -497,6 +517,7 @@ connman_init(
|
||||
BinderConnman*
|
||||
binder_connman_new()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
static ConnManObject* instance = NULL;
|
||||
|
||||
if (instance) {
|
||||
@@ -528,6 +549,7 @@ BinderConnman*
|
||||
binder_connman_ref(
|
||||
BinderConnman* connman)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManObject* self = connman_object_cast(connman);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -540,6 +562,7 @@ void
|
||||
binder_connman_unref(
|
||||
BinderConnman* connman)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManObject* self = connman_object_cast(connman);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -554,6 +577,7 @@ binder_connman_add_property_changed_handler(
|
||||
BinderConnmanPropertyFunc callback,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManObject* self = connman_object_cast(connman);
|
||||
|
||||
return G_LIKELY(self) ? binder_base_add_property_handler(&self->base,
|
||||
@@ -565,6 +589,7 @@ binder_connman_remove_handler(
|
||||
BinderConnman* connman,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(id)) {
|
||||
ConnManObject* self = connman_object_cast(connman);
|
||||
|
||||
@@ -580,6 +605,7 @@ binder_connman_remove_handlers(
|
||||
gulong* ids,
|
||||
int n)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_disconnect_handlers(connman_object_cast(connman), ids, n);
|
||||
}
|
||||
|
||||
@@ -592,6 +618,7 @@ void
|
||||
connman_object_init(
|
||||
ConnManObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->techs = g_hash_table_new_full(g_str_hash, g_str_equal,
|
||||
g_free, g_free);
|
||||
}
|
||||
@@ -601,6 +628,7 @@ void
|
||||
connman_object_finalize(
|
||||
GObject *object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ConnManObject* self = THIS(object);
|
||||
|
||||
connman_cancel_call(self);
|
||||
@@ -613,6 +641,7 @@ connman_object_finalize(
|
||||
|
||||
static void connman_object_class_init(ConnManObjectClass *klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
G_OBJECT_CLASS(klass)->finalize = connman_object_finalize;
|
||||
BINDER_BASE_CLASS(klass)->public_offset =
|
||||
G_STRUCT_OFFSET(ConnManObject, pub);
|
||||
|
||||
1027
src/binder_data.c
1027
src/binder_data.c
File diff suppressed because it is too large
Load Diff
@@ -18,6 +18,8 @@
|
||||
|
||||
#include "binder_types.h"
|
||||
|
||||
#include <gbinder_writer.h>
|
||||
|
||||
#include <radio_request.h>
|
||||
|
||||
#include <ofono/slot.h>
|
||||
@@ -130,6 +132,7 @@ BinderData*
|
||||
binder_data_new(
|
||||
BinderDataManager* dm,
|
||||
RadioClient* client,
|
||||
RadioClient* network_client,
|
||||
const char* name,
|
||||
BinderRadio* radio,
|
||||
BinderNetwork* network,
|
||||
@@ -252,6 +255,10 @@ binder_data_set_data_allowed_request_new(
|
||||
void* user_data)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
extern const GBinderWriterType binder_data_profile_type BINDER_INTERNAL;
|
||||
extern const GBinderWriterType binder_data_profile_1_4_type BINDER_INTERNAL;
|
||||
extern const GBinderWriterType binder_data_profile_1_5_type BINDER_INTERNAL;
|
||||
|
||||
#endif /* BINDER_DATA_H */
|
||||
|
||||
/*
|
||||
|
||||
@@ -16,10 +16,14 @@
|
||||
#include "binder_devinfo.h"
|
||||
#include "binder_modem.h"
|
||||
#include "binder_util.h"
|
||||
#include "binder_log.h"
|
||||
|
||||
#include <ofono/devinfo.h>
|
||||
#include <ofono/log.h>
|
||||
|
||||
#include <radio_modem_types.h>
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
|
||||
@@ -60,6 +64,7 @@ binder_devinfo_callback_data_new(
|
||||
ofono_devinfo_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfoCbData* cbd = g_slice_new0(BinderDevInfoCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -73,6 +78,7 @@ void
|
||||
binder_devinfo_callback_data_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderDevInfoCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -83,6 +89,7 @@ binder_devinfo_query_unsupported(
|
||||
ofono_devinfo_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error error;
|
||||
|
||||
cb(binder_error_failure(&error), "", data);
|
||||
@@ -94,15 +101,26 @@ binder_devinfo_query_revision_ok(
|
||||
const BinderDevInfoCbData* cbd,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
GBinderReader reader;
|
||||
const char* res;
|
||||
char* res;
|
||||
RADIO_AIDL_INTERFACE interface_aidl =
|
||||
radio_client_aidl_interface(cbd->self->g->client);
|
||||
|
||||
/* getBasebandVersionResponse(RadioResponseInfo, string version); */
|
||||
gbinder_reader_copy(&reader, args);
|
||||
res = gbinder_reader_read_hidl_string_c(&reader);
|
||||
if (interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
res = gbinder_reader_read_hidl_string(&reader);
|
||||
} else {
|
||||
res = gbinder_reader_read_string16(&reader);
|
||||
|
||||
}
|
||||
|
||||
DBG_(cbd->self, "%s", res);
|
||||
cbd->cb(binder_error_ok(&err), res ? res : "", cbd->data);
|
||||
|
||||
g_free(res);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -115,11 +133,17 @@ binder_devinfo_query_revision_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
struct ofono_error err;
|
||||
const BinderDevInfoCbData* cbd = user_data;
|
||||
guint32 code =
|
||||
radio_client_aidl_interface(
|
||||
cbd->self->g->client) == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_RESP_GET_BASEBAND_VERSION :
|
||||
RADIO_RESP_GET_BASEBAND_VERSION;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_BASEBAND_VERSION) {
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
binder_devinfo_query_revision_ok(cbd, args);
|
||||
return;
|
||||
@@ -140,9 +164,15 @@ binder_devinfo_query_revision(
|
||||
ofono_devinfo_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfo* self = binder_devinfo_get_data(di);
|
||||
guint32 code =
|
||||
(radio_client_aidl_interface(self->g->client) == RADIO_MODEM_INTERFACE) ?
|
||||
RADIO_MODEM_REQ_GET_BASEBAND_VERSION :
|
||||
RADIO_REQ_GET_BASEBAND_VERSION;
|
||||
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_GET_BASEBAND_VERSION, NULL,
|
||||
code, NULL,
|
||||
binder_devinfo_query_revision_cb,
|
||||
binder_devinfo_callback_data_free,
|
||||
binder_devinfo_callback_data_new(self, cb, data));
|
||||
@@ -157,6 +187,7 @@ void
|
||||
binder_devinfo_query_serial_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfoCbData* cbd = user_data;
|
||||
BinderDevInfo* self = cbd->self;
|
||||
struct ofono_error error;
|
||||
@@ -170,6 +201,7 @@ void
|
||||
binder_devinfo_query_svn_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfoCbData* cbd = user_data;
|
||||
BinderDevInfo* self = cbd->self;
|
||||
struct ofono_error error;
|
||||
@@ -191,6 +223,7 @@ binder_devinfo_query(
|
||||
ofono_devinfo_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GVERIFY_FALSE(gutil_idle_queue_cancel_tag(self->iq, tag));
|
||||
gutil_idle_queue_add_tag_full(self->iq, tag, fn,
|
||||
binder_devinfo_callback_data_new(self, cb, data),
|
||||
@@ -204,6 +237,7 @@ binder_devinfo_query_serial(
|
||||
ofono_devinfo_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfo* self = binder_devinfo_get_data(devinfo);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -218,6 +252,7 @@ binder_devinfo_query_svn(
|
||||
ofono_devinfo_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfo* self = binder_devinfo_get_data(devinfo);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -230,6 +265,7 @@ void
|
||||
binder_devinfo_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfo* self = user_data;
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -243,6 +279,7 @@ binder_devinfo_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderDevInfo* self = g_new0(BinderDevInfo, 1);
|
||||
|
||||
@@ -264,6 +301,7 @@ void
|
||||
binder_devinfo_remove(
|
||||
struct ofono_devinfo* di)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDevInfo* self = binder_devinfo_get_data(di);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -296,12 +334,14 @@ static const struct ofono_devinfo_driver binder_devinfo_driver = {
|
||||
void
|
||||
binder_devinfo_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_devinfo_driver_register(&binder_devinfo_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_devinfo_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_devinfo_driver_unregister(&binder_devinfo_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,20 +14,24 @@
|
||||
*/
|
||||
|
||||
#include "binder_devmon.h"
|
||||
#include "binder_log.h"
|
||||
|
||||
BinderDevmonIo*
|
||||
binder_devmon_start_io(
|
||||
BinderDevmon* devmon,
|
||||
RadioClient* client,
|
||||
RadioClient* ds_client,
|
||||
RadioClient* if_client,
|
||||
struct ofono_slot* slot)
|
||||
{
|
||||
return devmon ? devmon->start_io(devmon, client, slot) : NULL;
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return devmon ? devmon->start_io(devmon, ds_client, if_client, slot) : NULL;
|
||||
}
|
||||
|
||||
void
|
||||
binder_devmon_io_free(
|
||||
BinderDevmonIo* io)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (io) {
|
||||
io->free(io);
|
||||
}
|
||||
@@ -37,6 +41,7 @@ void
|
||||
binder_devmon_free(
|
||||
BinderDevmon* devmon)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (devmon) {
|
||||
devmon->free(devmon);
|
||||
}
|
||||
|
||||
@@ -33,8 +33,8 @@ struct binder_devmon_io {
|
||||
|
||||
struct binder_devmon {
|
||||
void (*free)(BinderDevmon* devmon);
|
||||
BinderDevmonIo* (*start_io)(BinderDevmon* devmon, RadioClient* client,
|
||||
struct ofono_slot* slot);
|
||||
BinderDevmonIo* (*start_io)(BinderDevmon* devmon, RadioClient* ds_client,
|
||||
RadioClient* if_client, struct ofono_slot* slot);
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -70,7 +70,8 @@ binder_devmon_combine(
|
||||
BinderDevmonIo*
|
||||
binder_devmon_start_io(
|
||||
BinderDevmon* devmon,
|
||||
RadioClient* client,
|
||||
RadioClient* ds_client,
|
||||
RadioClient* if_client,
|
||||
struct ofono_slot* slot)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
#include "binder_devmon.h"
|
||||
#include "binder_log.h"
|
||||
|
||||
#include <ofono/log.h>
|
||||
|
||||
@@ -42,6 +43,7 @@ void
|
||||
binder_devmon_combine_io_free(
|
||||
BinderDevmonIo* io)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
DevMonIo* self = binder_devmon_combine_io_cast(io);
|
||||
|
||||
@@ -55,9 +57,11 @@ static
|
||||
BinderDevmonIo*
|
||||
binder_devmon_combine_start_io(
|
||||
BinderDevmon* devmon,
|
||||
RadioClient* client,
|
||||
RadioClient* ds_client,
|
||||
RadioClient* if_client,
|
||||
struct ofono_slot* slot)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
DevMon* self = binder_devmon_combine_cast(devmon);
|
||||
DevMonIo* io = g_malloc0(sizeof(DevMonIo) +
|
||||
@@ -67,7 +71,8 @@ binder_devmon_combine_start_io(
|
||||
io->impl = (BinderDevmonIo**)(io + 1);
|
||||
io->count = self->count;
|
||||
for (i = 0; i < io->count; i++) {
|
||||
io->impl[i] = binder_devmon_start_io(self->impl[i], client, slot);
|
||||
io->impl[i] = binder_devmon_start_io(self->impl[i], ds_client,
|
||||
if_client, slot);
|
||||
}
|
||||
return &io->pub;
|
||||
}
|
||||
@@ -77,6 +82,7 @@ void
|
||||
binder_devmon_combine_free(
|
||||
BinderDevmon* dm)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMon* self = binder_devmon_combine_cast(dm);
|
||||
guint i;
|
||||
|
||||
@@ -95,6 +101,7 @@ binder_devmon_combine(
|
||||
BinderDevmon* dm[],
|
||||
guint n)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
DevMon* self = g_malloc0(sizeof(DevMon) + sizeof(BinderDevmon*) * n);
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_modem_types.h>
|
||||
|
||||
#include <gbinder_writer.h>
|
||||
|
||||
@@ -117,14 +118,18 @@ binder_devmon_ds_io_low_data_state_sent(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = user_data;
|
||||
guint32 code =
|
||||
radio_client_aidl_interface(self->client) == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_RESP_SEND_DEVICE_STATE : RADIO_RESP_SEND_DEVICE_STATE;
|
||||
|
||||
GASSERT(self->low_data_req == req);
|
||||
radio_request_unref(self->low_data_req);
|
||||
self->low_data_req = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SEND_DEVICE_STATE) {
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_REQUEST_NOT_SUPPORTED) {
|
||||
DBG_(self, "LOW_DATA_EXPECTED state is not supported");
|
||||
self->low_data_supported = FALSE;
|
||||
@@ -146,14 +151,18 @@ binder_devmon_ds_io_charging_state_sent(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = user_data;
|
||||
guint32 code =
|
||||
radio_client_aidl_interface(self->client) == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_RESP_SEND_DEVICE_STATE : RADIO_RESP_SEND_DEVICE_STATE;
|
||||
|
||||
GASSERT(self->charging_req == req);
|
||||
radio_request_unref(self->charging_req);
|
||||
self->charging_req = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SEND_DEVICE_STATE) {
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_REQUEST_NOT_SUPPORTED) {
|
||||
DBG_(self, "CHARGING state is not supported");
|
||||
self->charging_supported = FALSE;
|
||||
@@ -173,9 +182,15 @@ binder_devmon_ds_io_send_device_state(
|
||||
gboolean state,
|
||||
RadioRequestCompleteFunc callback)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderWriter writer;
|
||||
RadioRequest* req = radio_request_new(self->client,
|
||||
RADIO_REQ_SEND_DEVICE_STATE, &writer, callback, NULL, self);
|
||||
RadioRequest* req;
|
||||
guint32 code =
|
||||
radio_client_aidl_interface(self->client) == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_REQ_SEND_DEVICE_STATE : RADIO_REQ_SEND_DEVICE_STATE;
|
||||
|
||||
req = radio_request_new(self->client,
|
||||
code, &writer, callback, NULL, self);
|
||||
|
||||
/* sendDeviceState(int32_t serial, DeviceStateType type, bool state); */
|
||||
gbinder_writer_append_int32(&writer, type);
|
||||
@@ -193,6 +208,7 @@ void
|
||||
binder_devmon_ds_io_update_charging(
|
||||
DevMonIo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const gboolean charging = binder_devmon_ds_charging(self->charger);
|
||||
|
||||
if (self->charging != charging) {
|
||||
@@ -212,6 +228,7 @@ void
|
||||
binder_devmon_ds_io_update_low_data(
|
||||
DevMonIo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const gboolean low_data =
|
||||
!binder_devmon_ds_tethering_on(self->connman) &&
|
||||
!binder_devmon_ds_charging(self->charger) &&
|
||||
@@ -234,6 +251,7 @@ void
|
||||
binder_devmon_ds_io_set_cell_info_update_interval(
|
||||
DevMonIo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_slot_set_cell_info_update_interval(self->slot, self,
|
||||
(binder_devmon_ds_display_on(self->display) &&
|
||||
(binder_devmon_ds_charging(self->charger) ||
|
||||
@@ -249,6 +267,7 @@ binder_devmon_ds_io_connman_cb(
|
||||
BINDER_CONNMAN_PROPERTY property,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_devmon_ds_io_update_low_data((DevMonIo*)user_data);
|
||||
}
|
||||
|
||||
@@ -258,6 +277,7 @@ binder_devmon_ds_io_battery_cb(
|
||||
MceBattery* battery,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_devmon_ds_io_set_cell_info_update_interval((DevMonIo*)user_data);
|
||||
}
|
||||
|
||||
@@ -267,6 +287,7 @@ binder_devmon_ds_io_display_cb(
|
||||
MceDisplay* display,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = user_data;
|
||||
|
||||
binder_devmon_ds_io_update_low_data(self);
|
||||
@@ -279,6 +300,7 @@ binder_devmon_ds_io_charger_cb(
|
||||
MceCharger* charger,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = user_data;
|
||||
|
||||
binder_devmon_ds_io_update_low_data(self);
|
||||
@@ -291,6 +313,7 @@ void
|
||||
binder_devmon_ds_io_free(
|
||||
BinderDevmonIo* io)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = binder_devmon_ds_io_cast(io);
|
||||
|
||||
binder_connman_remove_all_handlers(self->connman, self->connman_event_id);
|
||||
@@ -318,16 +341,18 @@ static
|
||||
BinderDevmonIo*
|
||||
binder_devmon_ds_start_io(
|
||||
BinderDevmon* devmon,
|
||||
RadioClient* client,
|
||||
RadioClient* ds_client,
|
||||
RadioClient* if_client,
|
||||
struct ofono_slot* slot)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMon* ds = binder_devmon_ds_cast(devmon);
|
||||
DevMonIo* self = g_new0(DevMonIo, 1);
|
||||
|
||||
self->pub.free = binder_devmon_ds_io_free;
|
||||
self->low_data_supported = TRUE;
|
||||
self->charging_supported = TRUE;
|
||||
self->client = radio_client_ref(client);
|
||||
self->client = radio_client_ref(ds_client);
|
||||
self->slot = ofono_slot_ref(slot);
|
||||
|
||||
self->connman = binder_connman_ref(ds->connman);
|
||||
@@ -378,6 +403,7 @@ void
|
||||
binder_devmon_ds_free(
|
||||
BinderDevmon* devmon)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMon* self = binder_devmon_ds_cast(devmon);
|
||||
|
||||
binder_connman_unref(self->connman);
|
||||
@@ -395,6 +421,7 @@ BinderDevmon*
|
||||
binder_devmon_ds_new(
|
||||
const BinderSlotConfig* config)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMon* self = g_new0(DevMon, 1);
|
||||
|
||||
self->pub.free = binder_devmon_ds_free;
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_network_types.h>
|
||||
|
||||
#include <gbinder_writer.h>
|
||||
|
||||
@@ -101,6 +102,7 @@ binder_devmon_if_io_indication_filter_sent(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = user_data;
|
||||
|
||||
GASSERT(self->req == req);
|
||||
@@ -108,7 +110,13 @@ binder_devmon_if_io_indication_filter_sent(
|
||||
self->req = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_INDICATION_FILTER) {
|
||||
const RADIO_AIDL_INTERFACE iface_aidl =
|
||||
radio_client_aidl_interface(self->client);
|
||||
guint32 code = iface_aidl == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_RESP_SET_INDICATION_FILTER :
|
||||
RADIO_RESP_SET_INDICATION_FILTER;
|
||||
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_REQUEST_NOT_SUPPORTED) {
|
||||
/* This is a permanent failure */
|
||||
DBG_(self, "Indication response filter is not supported");
|
||||
@@ -125,32 +133,53 @@ void
|
||||
binder_devmon_if_io_set_indication_filter(
|
||||
DevMonIo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->ind_filter_supported) {
|
||||
GBinderWriter args;
|
||||
RADIO_REQ code;
|
||||
gint32 value;
|
||||
const RADIO_AIDL_INTERFACE iface_aidl =
|
||||
radio_client_aidl_interface(self->client);
|
||||
|
||||
/*
|
||||
* Both requests take the same args:
|
||||
*
|
||||
* setIndicationFilter(serial, bitfield<IndicationFilter>)
|
||||
* setIndicationFilter_1_2(serial, bitfield<IndicationFilter>)
|
||||
*
|
||||
* and both produce IRadioResponse.setIndicationFilterResponse()
|
||||
*
|
||||
* However setIndicationFilter_1_2 comments says "If unset, defaults
|
||||
* to @1.2::IndicationFilter:ALL" and it's unclear what "unset" means
|
||||
* wrt a bitmask. How is "unset" different from NONE which is zero.
|
||||
* To be on the safe side, let's always set the most innocently
|
||||
* looking bit which I think is DATA_CALL_DORMANCY.
|
||||
*/
|
||||
if (radio_client_interface(self->client) < RADIO_INTERFACE_1_2) {
|
||||
code = RADIO_REQ_SET_INDICATION_FILTER;
|
||||
value = self->display_on ? RADIO_IND_FILTER_ALL :
|
||||
RADIO_IND_FILTER_DATA_CALL_DORMANCY;
|
||||
if (iface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
/*
|
||||
* Both requests take the same args:
|
||||
*
|
||||
* setIndicationFilter(serial, bitfield<IndicationFilter>)
|
||||
* setIndicationFilter_1_2(serial, bitfield<IndicationFilter>)
|
||||
*
|
||||
* and both produce IRadioResponse.setIndicationFilterResponse()
|
||||
*
|
||||
* However setIndicationFilter_1_2 comments says "If unset, defaults
|
||||
* to @1.2::IndicationFilter:ALL" and it's unclear what "unset" means
|
||||
* wrt a bitmask. How is "unset" different from NONE which is zero.
|
||||
* To be on the safe side, let's always set the most innocently
|
||||
* looking bit which I think is DATA_CALL_DORMANCY.
|
||||
*/
|
||||
if (radio_client_interface(self->client) < RADIO_INTERFACE_1_2) {
|
||||
code = RADIO_REQ_SET_INDICATION_FILTER;
|
||||
value = self->display_on ? RADIO_IND_FILTER_ALL :
|
||||
RADIO_IND_FILTER_DATA_CALL_DORMANCY;
|
||||
} else if (radio_client_interface(self->client) < RADIO_INTERFACE_1_5) {
|
||||
code = RADIO_REQ_SET_INDICATION_FILTER_1_2;
|
||||
value = self->display_on ? RADIO_IND_FILTER_ALL_1_2 :
|
||||
RADIO_IND_FILTER_DATA_CALL_DORMANCY;
|
||||
} else {
|
||||
code = RADIO_REQ_SET_INDICATION_FILTER_1_5;
|
||||
value = self->display_on ? RADIO_IND_FILTER_ALL_1_5 :
|
||||
RADIO_IND_FILTER_DATA_CALL_DORMANCY;
|
||||
}
|
||||
} else {
|
||||
code = RADIO_REQ_SET_INDICATION_FILTER_1_2;
|
||||
value = self->display_on ? RADIO_IND_FILTER_ALL_1_2 :
|
||||
code = RADIO_NETWORK_REQ_SET_INDICATION_FILTER;
|
||||
/* Some devices don't like setting all filters */
|
||||
value = self->display_on ?
|
||||
RADIO_IND_FILTER_SIGNAL_STRENGTH |
|
||||
RADIO_IND_FILTER_FULL_NETWORK_STATE |
|
||||
RADIO_IND_FILTER_DATA_CALL_DORMANCY |
|
||||
RADIO_IND_FILTER_LINK_CAPACITY_ESTIMATE |
|
||||
RADIO_IND_FILTER_PHYSICAL_CHANNEL_CONFIG |
|
||||
RADIO_IND_FILTER_REGISTRATION_FAILURE |
|
||||
RADIO_IND_FILTER_BARRING_INFO :
|
||||
RADIO_IND_FILTER_DATA_CALL_DORMANCY;
|
||||
}
|
||||
|
||||
@@ -168,6 +197,7 @@ void
|
||||
binder_devmon_if_io_set_cell_info_update_interval(
|
||||
DevMonIo* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_slot_set_cell_info_update_interval(self->slot, self,
|
||||
(self->display_on && (binder_devmon_if_charging(self->charger) ||
|
||||
binder_devmon_if_battery_ok(self->battery))) ?
|
||||
@@ -181,6 +211,7 @@ binder_devmon_if_io_battery_cb(
|
||||
MceBattery* battery,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_devmon_if_io_set_cell_info_update_interval((DevMonIo*)user_data);
|
||||
}
|
||||
|
||||
@@ -189,6 +220,7 @@ void binder_devmon_if_io_charger_cb(
|
||||
MceCharger* charger,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_devmon_if_io_set_cell_info_update_interval((DevMonIo*)user_data);
|
||||
}
|
||||
|
||||
@@ -198,6 +230,7 @@ binder_devmon_if_io_display_cb(
|
||||
MceDisplay* display,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = user_data;
|
||||
const gboolean display_on = binder_devmon_if_display_on(display);
|
||||
|
||||
@@ -213,6 +246,7 @@ void
|
||||
binder_devmon_if_io_free(
|
||||
BinderDevmonIo* io)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMonIo* self = binder_devmon_if_io_cast(io);
|
||||
|
||||
mce_battery_remove_all_handlers(self->battery, self->battery_event_id);
|
||||
@@ -236,15 +270,17 @@ static
|
||||
BinderDevmonIo*
|
||||
binder_devmon_if_start_io(
|
||||
BinderDevmon* devmon,
|
||||
RadioClient* client,
|
||||
RadioClient* ds_client,
|
||||
RadioClient* if_client,
|
||||
struct ofono_slot* slot)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMon* impl = binder_devmon_if_cast(devmon);
|
||||
DevMonIo* self = g_new0(DevMonIo, 1);
|
||||
|
||||
self->pub.free = binder_devmon_if_io_free;
|
||||
self->ind_filter_supported = TRUE;
|
||||
self->client = radio_client_ref(client);
|
||||
self->client = radio_client_ref(if_client);
|
||||
self->slot = ofono_slot_ref(slot);
|
||||
|
||||
self->battery = mce_battery_ref(impl->battery);
|
||||
@@ -285,6 +321,7 @@ void
|
||||
binder_devmon_if_free(
|
||||
BinderDevmon* devmon)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMon* self = binder_devmon_if_cast(devmon);
|
||||
|
||||
mce_battery_unref(self->battery);
|
||||
@@ -301,6 +338,7 @@ BinderDevmon*
|
||||
binder_devmon_if_new(
|
||||
const BinderSlotConfig* config)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DevMon* self = g_new0(DevMon, 1);
|
||||
|
||||
self->pub.free = binder_devmon_if_free;
|
||||
|
||||
@@ -65,6 +65,7 @@ binder_gprs_cbd_new(
|
||||
ofono_gprs_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsCbData* cbd = g_slice_new0(BinderGprsCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -77,6 +78,7 @@ void
|
||||
binder_gprs_cbd_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderGprsCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -86,6 +88,7 @@ binder_gprs_fix_registration_status(
|
||||
BinderGprs* self,
|
||||
enum ofono_netreg_status status)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!binder_data_allowed(self->data)) {
|
||||
return OFONO_NETREG_STATUS_NOT_REGISTERED;
|
||||
} else {
|
||||
@@ -104,6 +107,7 @@ void
|
||||
binder_gprs_data_update_registration_state(
|
||||
BinderGprs* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const enum ofono_netreg_status status = binder_gprs_fix_registration_status
|
||||
(self, self->network->data.status);
|
||||
|
||||
@@ -121,6 +125,7 @@ void
|
||||
binder_gprs_check_data_allowed(
|
||||
BinderGprs* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DBG_(self, "%d %d", binder_data_allowed(self->data), self->attached);
|
||||
if (!binder_data_allowed(self->data) && self->attached) {
|
||||
self->attached = FALSE;
|
||||
@@ -137,6 +142,7 @@ gboolean
|
||||
binder_gprs_set_attached_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsCbData* cbd = user_data;
|
||||
BinderGprs* self = cbd->self;
|
||||
struct ofono_error err;
|
||||
@@ -156,6 +162,7 @@ binder_gprs_set_attached(
|
||||
ofono_gprs_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprs* self = binder_gprs_get_data(gprs);
|
||||
struct ofono_error err;
|
||||
|
||||
@@ -181,6 +188,7 @@ binder_gprs_allow_data_changed(
|
||||
BINDER_DATA_PROPERTY property,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprs* self = user_data;
|
||||
|
||||
DBG_(self, "%d", binder_data_allowed(data));
|
||||
@@ -196,11 +204,19 @@ binder_gprs_max_data_calls_changed(
|
||||
BINDER_NETWORK_PROPERTY property,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprs* self = user_data;
|
||||
|
||||
if (net->max_data_calls > 0) {
|
||||
DBG_(self, "setting max cids to %d", net->max_data_calls);
|
||||
ofono_gprs_set_cid_range(self->gprs, 1, net->max_data_calls);
|
||||
int max_data_calls = net->max_data_calls;
|
||||
|
||||
// Some MediaTek RILs support more than 1 active context on Android
|
||||
// but report only 1 in response to getDataRegistrationState
|
||||
if (max_data_calls == 1)
|
||||
max_data_calls = 3;
|
||||
|
||||
DBG_(self, "setting max cids to %d", max_data_calls);
|
||||
ofono_gprs_set_cid_range(self->gprs, 1, max_data_calls);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,6 +227,7 @@ binder_gprs_data_registration_state_changed(
|
||||
BINDER_NETWORK_PROPERTY property,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_gprs_data_update_registration_state((BinderGprs*)user_data);
|
||||
}
|
||||
|
||||
@@ -221,6 +238,7 @@ binder_gprs_registration_status(
|
||||
ofono_gprs_status_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprs* self = binder_gprs_get_data(gprs);
|
||||
struct ofono_error err;
|
||||
const enum ofono_netreg_status status = self->attached ?
|
||||
@@ -235,6 +253,7 @@ gboolean
|
||||
binder_gprs_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprs* self = user_data;
|
||||
BinderNetwork* network = self->network;
|
||||
struct ofono_gprs* gprs = self->gprs;
|
||||
@@ -256,8 +275,15 @@ binder_gprs_register(
|
||||
network->data.status);
|
||||
|
||||
if (network->max_data_calls > 0) {
|
||||
DBG_(self, "setting max cids to %d", network->max_data_calls);
|
||||
ofono_gprs_set_cid_range(gprs, 1,network->max_data_calls);
|
||||
int max_data_calls = network->max_data_calls;
|
||||
|
||||
// Some MediaTek RILs support more than 1 active context on Android
|
||||
// but report only 1 in response to getDataRegistrationState
|
||||
if (max_data_calls == 1)
|
||||
max_data_calls = 3;
|
||||
|
||||
DBG_(self, "setting max cids to %d", max_data_calls);
|
||||
ofono_gprs_set_cid_range(self->gprs, 1, max_data_calls);
|
||||
}
|
||||
|
||||
ofono_gprs_register(gprs);
|
||||
@@ -271,6 +297,7 @@ binder_gprs_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderGprs* self = g_new0(BinderGprs, 1);
|
||||
|
||||
@@ -292,6 +319,7 @@ void
|
||||
binder_gprs_remove(
|
||||
struct ofono_gprs* gprs)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprs* self = binder_gprs_get_data(gprs);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -332,12 +360,14 @@ static const struct ofono_gprs_driver binder_gprs_driver = {
|
||||
void
|
||||
binder_gprs_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_gprs_driver_register(&binder_gprs_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_gprs_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_gprs_driver_unregister(&binder_gprs_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ char*
|
||||
binder_gprs_context_netmask(
|
||||
const char* bits)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint nbits;
|
||||
|
||||
if (gutil_parse_uint(bits, 0, &nbits) && nbits < 33) {
|
||||
@@ -87,6 +88,7 @@ int
|
||||
binder_gprs_context_address_family(
|
||||
const char* addr)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (strchr(addr, ':')) {
|
||||
return AF_INET6;
|
||||
} else if (strchr(addr, '.')) {
|
||||
@@ -101,6 +103,7 @@ void
|
||||
binder_gprs_context_free_active_call(
|
||||
BinderGprsContext* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->active_call) {
|
||||
binder_data_call_release(self->data, self->active_call->cid, self);
|
||||
binder_data_call_free(self->active_call);
|
||||
@@ -122,6 +125,7 @@ binder_gprs_context_set_active_call(
|
||||
BinderGprsContext* self,
|
||||
const BinderDataCall* call)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (call) {
|
||||
binder_data_call_free(self->active_call);
|
||||
self->active_call = binder_data_call_dup(call);
|
||||
@@ -147,6 +151,7 @@ void
|
||||
binder_gprs_context_set_disconnected(
|
||||
BinderGprsContext* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->active_call) {
|
||||
binder_gprs_context_free_active_call(self);
|
||||
if (self->deactivate.req) {
|
||||
@@ -178,6 +183,7 @@ binder_gprs_context_set_address(
|
||||
struct ofono_gprs_context *gc,
|
||||
const BinderDataCall* call)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const char* ip_addr = NULL;
|
||||
char* ip_mask = NULL;
|
||||
const char* ipv6_addr = NULL;
|
||||
@@ -250,6 +256,7 @@ binder_gprs_context_set_gateway(
|
||||
struct ofono_gprs_context *gc,
|
||||
const BinderDataCall* call)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const char* ip_gw = NULL;
|
||||
const char* ipv6_gw = NULL;
|
||||
char* const* list = call->gateways;
|
||||
@@ -287,6 +294,7 @@ binder_gprs_context_set_servers(
|
||||
ofono_gprs_context_list_setter_t set_ipv4,
|
||||
ofono_gprs_context_list_setter_t set_ipv6)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
int i;
|
||||
const char** ip_list = NULL, ** ip_ptr = NULL;
|
||||
const char** ipv6_list = NULL, ** ipv6_ptr = NULL;
|
||||
@@ -326,6 +334,7 @@ binder_gprs_context_set_dns_servers(
|
||||
struct ofono_gprs_context* gc,
|
||||
const BinderDataCall* call)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_gprs_context_set_servers(gc, call->dnses,
|
||||
ofono_gprs_context_set_ipv4_dns_servers,
|
||||
ofono_gprs_context_set_ipv6_dns_servers);
|
||||
@@ -337,6 +346,7 @@ binder_gprs_context_set_proxy_cscf(
|
||||
struct ofono_gprs_context* gc,
|
||||
const BinderDataCall* call)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_gprs_context_set_servers(gc, call->pcscf,
|
||||
ofono_gprs_context_set_ipv4_proxy_cscf,
|
||||
ofono_gprs_context_set_ipv6_proxy_cscf);
|
||||
@@ -357,6 +367,7 @@ binder_gprs_context_data_call_change(
|
||||
const BinderDataCall* c1,
|
||||
const BinderDataCall* c2)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (c1 == c2) {
|
||||
return 0;
|
||||
} else if (c1 && c2) {
|
||||
@@ -395,6 +406,7 @@ binder_gprs_context_call_list_changed(
|
||||
BINDER_DATA_PROPERTY property,
|
||||
void* arg)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsContext* self = arg;
|
||||
struct ofono_gprs_context* gc = self->gc;
|
||||
|
||||
@@ -476,6 +488,7 @@ binder_gprs_context_activate_primary_cb(
|
||||
const BinderDataCall* call,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsContext* self = user_data;
|
||||
struct ofono_gprs_context* gc = self->gc;
|
||||
struct ofono_error error;
|
||||
@@ -532,6 +545,7 @@ binder_gprs_context_activate_primary(
|
||||
ofono_gprs_context_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsContext* self = binder_gprs_context_get_data(gc);
|
||||
struct ofono_watch* watch = self->watch;
|
||||
struct ofono_netreg* netreg = watch->netreg;
|
||||
@@ -571,6 +585,7 @@ binder_gprs_context_deactivate_primary_cb(
|
||||
RADIO_ERROR radio_error,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsContext* gcd = user_data;
|
||||
|
||||
/*
|
||||
@@ -612,6 +627,7 @@ binder_gprs_context_deactivate_primary(
|
||||
ofono_gprs_context_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsContext* self = binder_gprs_context_get_data(gc);
|
||||
|
||||
GASSERT(self->active_ctx_cid == id);
|
||||
@@ -636,6 +652,7 @@ binder_gprs_context_detach_shutdown(
|
||||
struct ofono_gprs_context* gc,
|
||||
unsigned int id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_gprs_context_deactivate_primary(gc, id, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -646,6 +663,7 @@ binder_gprs_context_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderGprsContext* self = g_new0(BinderGprsContext, 1);
|
||||
|
||||
@@ -667,6 +685,7 @@ void
|
||||
binder_gprs_context_remove(
|
||||
struct ofono_gprs_context* gc)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderGprsContext* self = binder_gprs_context_get_data(gc);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -717,12 +736,14 @@ static const struct ofono_gprs_context_driver binder_gprs_context_driver = {
|
||||
void
|
||||
binder_gprs_context_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_gprs_context_driver_register(&binder_gprs_context_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_gprs_context_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_gprs_context_driver_unregister(&binder_gprs_context_driver);
|
||||
}
|
||||
|
||||
|
||||
165
src/binder_ims.c
165
src/binder_ims.c
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* oFono - Open Source Telephony - binder based adaptation
|
||||
*
|
||||
* Copyright (C) 2024 Slava Monich <slava@monich.com>
|
||||
* Copyright (C) 2022 Jolla Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -19,36 +20,21 @@
|
||||
#include "binder_modem.h"
|
||||
#include "binder_util.h"
|
||||
|
||||
#include "binder_ext_call.h"
|
||||
#include "binder_ext_ims.h"
|
||||
#include "binder_ext_slot.h"
|
||||
#include "binder_ext_sms.h"
|
||||
|
||||
#include <ofono/ims.h>
|
||||
#include <ofono/log.h>
|
||||
|
||||
#include <gutil_macros.h>
|
||||
|
||||
enum binder_ims_events {
|
||||
EVENT_IMS_REGISTRATION_CHANGED,
|
||||
EVENT_COUNT
|
||||
};
|
||||
|
||||
enum binder_ims_ext_events {
|
||||
IMS_EXT_STATE_CHANGED,
|
||||
IMS_EXT_EVENT_COUNT
|
||||
};
|
||||
|
||||
typedef struct binder_ims {
|
||||
struct ofono_ims* ims;
|
||||
struct ofono_ims* handle;
|
||||
char* log_prefix;
|
||||
BinderImsReg* reg;
|
||||
BinderImsReg* ims;
|
||||
BinderExtIms* ext;
|
||||
gulong radio_event[EVENT_COUNT];
|
||||
gulong ext_event[IMS_EXT_EVENT_COUNT];
|
||||
gulong event_id;
|
||||
guint ext_req_id;
|
||||
guint start_id;
|
||||
int caps;
|
||||
} BinderIms;
|
||||
|
||||
typedef struct binder_ims_cbd {
|
||||
@@ -59,8 +45,8 @@ typedef struct binder_ims_cbd {
|
||||
|
||||
#define DBG_(self,fmt,args...) DBG("%s" fmt, (self)->log_prefix, ##args)
|
||||
|
||||
static inline BinderIms* binder_ims_get_data(struct ofono_ims* ims)
|
||||
{ return ofono_ims_get_data(ims); }
|
||||
static inline BinderIms* binder_ims_get_data(struct ofono_ims* handle)
|
||||
{ return ofono_ims_get_data(handle); }
|
||||
|
||||
static
|
||||
BinderImsCbData*
|
||||
@@ -69,6 +55,7 @@ binder_ims_cbd_new(
|
||||
ofono_ims_register_cb_t cb,
|
||||
void* cb_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsCbData* cbd = g_slice_new0(BinderImsCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -82,6 +69,7 @@ void
|
||||
binder_ims_cbd_free(
|
||||
BinderImsCbData* cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_slice_free(cbd);
|
||||
}
|
||||
|
||||
@@ -92,6 +80,7 @@ binder_ims_register_complete(
|
||||
BINDER_EXT_IMS_RESULT result,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsCbData* cbd = user_data;
|
||||
BinderIms* self = cbd->self;
|
||||
struct ofono_error err;
|
||||
@@ -105,29 +94,16 @@ binder_ims_register_complete(
|
||||
cbd->cb(&err, cbd->cb_data);
|
||||
}
|
||||
|
||||
static
|
||||
gboolean
|
||||
binder_ims_is_registered(
|
||||
BinderIms* self)
|
||||
{
|
||||
if (self->ext) {
|
||||
return binder_ext_ims_get_state(self->ext) ==
|
||||
BINDER_EXT_IMS_STATE_REGISTERED;
|
||||
} else if (self->reg) {
|
||||
return self->reg->registered;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_ims_notify(
|
||||
BinderIms* self)
|
||||
{
|
||||
const gboolean registered = binder_ims_is_registered(self);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsReg* ims = self->ims;
|
||||
|
||||
ofono_ims_status_notify(self->ims, registered, registered ? self->caps : 0);
|
||||
ofono_ims_status_notify(self->handle, ims->registered,
|
||||
ims->registered ? ims->caps : 0);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -137,33 +113,24 @@ binder_ims_registration_changed(
|
||||
BINDER_IMS_REG_PROPERTY property,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderIms* self = user_data;
|
||||
|
||||
DBG_(self, "");
|
||||
binder_ims_notify(self);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_ims_ext_state_changed(
|
||||
BinderExtIms* ext,
|
||||
void* user_data)
|
||||
{
|
||||
BinderIms* self = user_data;
|
||||
|
||||
DBG_(self, "");
|
||||
GASSERT(property == BINDER_IMS_REG_PROPERTY_REGISTERED);
|
||||
binder_ims_notify(self);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_ims_control(
|
||||
struct ofono_ims* ims,
|
||||
struct ofono_ims* handle,
|
||||
BINDER_EXT_IMS_REGISTRATION registration,
|
||||
ofono_ims_register_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
BinderIms* self = binder_ims_get_data(ims);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderIms* self = binder_ims_get_data(handle);
|
||||
struct ofono_error err;
|
||||
|
||||
if (self->ext) {
|
||||
@@ -185,35 +152,39 @@ binder_ims_control(
|
||||
static
|
||||
void
|
||||
binder_ims_register(
|
||||
struct ofono_ims* ims,
|
||||
struct ofono_ims* handle,
|
||||
ofono_ims_register_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
binder_ims_control(ims, BINDER_EXT_IMS_REGISTRATION_ON, cb, data);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_ims_control(handle, BINDER_EXT_IMS_REGISTRATION_ON, cb, data);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_ims_unregister(
|
||||
struct ofono_ims* ims,
|
||||
struct ofono_ims* handle,
|
||||
ofono_ims_register_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
binder_ims_control(ims, BINDER_EXT_IMS_REGISTRATION_OFF, cb, data);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_ims_control(handle, BINDER_EXT_IMS_REGISTRATION_OFF, cb, data);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_ims_registration_status(
|
||||
struct ofono_ims* ims,
|
||||
struct ofono_ims* handle,
|
||||
ofono_ims_status_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
BinderIms* self = binder_ims_get_data(ims);
|
||||
const gboolean registered = binder_ims_is_registered(self);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderIms* self = binder_ims_get_data(handle);
|
||||
BinderImsReg* ims = self->ims;
|
||||
struct ofono_error err;
|
||||
|
||||
cb(binder_error_ok(&err), registered, registered ? self->caps : 0, data);
|
||||
cb(binder_error_ok(&err), ims->registered,
|
||||
ims->registered ? ims->caps : 0, data);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -221,86 +192,51 @@ gboolean
|
||||
binder_ims_start(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderIms* self = user_data;
|
||||
|
||||
DBG_(self, "");
|
||||
GASSERT(self->start_id);
|
||||
self->start_id = 0;
|
||||
|
||||
if (self->ext) {
|
||||
self->ext_event[IMS_EXT_STATE_CHANGED] =
|
||||
binder_ext_ims_add_state_handler(self->ext,
|
||||
binder_ims_ext_state_changed, self);
|
||||
}
|
||||
GASSERT(!self->event_id);
|
||||
self->event_id = binder_ims_reg_add_property_handler(self->ims,
|
||||
BINDER_IMS_REG_PROPERTY_REGISTERED, binder_ims_registration_changed,
|
||||
self);
|
||||
|
||||
if (!self->ext_event[IMS_EXT_STATE_CHANGED]) {
|
||||
self->radio_event[EVENT_IMS_REGISTRATION_CHANGED] =
|
||||
binder_ims_reg_add_property_handler(self->reg,
|
||||
BINDER_IMS_REG_PROPERTY_REGISTERED,
|
||||
binder_ims_registration_changed, self);
|
||||
}
|
||||
|
||||
ofono_ims_register(self->ims);
|
||||
ofono_ims_register(self->handle);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static
|
||||
int
|
||||
binder_ims_probe(
|
||||
struct ofono_ims* ims,
|
||||
struct ofono_ims* handle,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderIms* self = g_new0(BinderIms, 1);
|
||||
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
DBG_(self, "");
|
||||
|
||||
self->reg = binder_ims_reg_ref(modem->ims);
|
||||
self->ims = ims;
|
||||
|
||||
if (modem->ext && (self->ext =
|
||||
binder_ext_slot_get_interface(modem->ext,
|
||||
BINDER_EXT_TYPE_IMS)) != NULL) {
|
||||
BINDER_EXT_IMS_INTERFACE_FLAGS flags =
|
||||
binder_ext_ims_get_interface_flags(self->ext);
|
||||
|
||||
DBG_(self, "using ims extension");
|
||||
binder_ext_ims_ref(self->ext);
|
||||
if (flags & BINDER_EXT_IMS_INTERFACE_FLAG_SMS_SUPPORT) {
|
||||
DBG_(self, "ims sms support is detected");
|
||||
self->caps |= OFONO_IMS_SMS_CAPABLE;
|
||||
}
|
||||
if (flags & BINDER_EXT_IMS_INTERFACE_FLAG_VOICE_SUPPORT) {
|
||||
DBG_(self, "ims call support is detected");
|
||||
self->caps |= OFONO_IMS_VOICE_CAPABLE;
|
||||
}
|
||||
} else {
|
||||
if (binder_ext_sms_get_interface_flags
|
||||
(binder_ext_slot_get_interface(modem->ext, BINDER_EXT_TYPE_SMS)) &
|
||||
BINDER_EXT_SMS_INTERFACE_FLAG_IMS_SUPPORT) {
|
||||
DBG_(self, "ims sms support is detected");
|
||||
self->caps |= OFONO_IMS_SMS_CAPABLE;
|
||||
}
|
||||
if (binder_ext_call_get_interface_flags
|
||||
(binder_ext_slot_get_interface(modem->ext, BINDER_EXT_TYPE_CALL)) &
|
||||
BINDER_EXT_CALL_INTERFACE_FLAG_IMS_SUPPORT) {
|
||||
DBG_(self, "ims call support is detected");
|
||||
self->caps |= OFONO_IMS_VOICE_CAPABLE;
|
||||
}
|
||||
}
|
||||
|
||||
self->handle = handle;
|
||||
self->ims = binder_ims_reg_ref(modem->ims);
|
||||
self->ext = binder_ext_ims_ref(binder_ext_slot_get_interface(modem->ext,
|
||||
BINDER_EXT_TYPE_IMS));
|
||||
self->start_id = g_idle_add(binder_ims_start, self);
|
||||
ofono_ims_set_data(ims, self);
|
||||
ofono_ims_set_data(handle, self);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_ims_remove(
|
||||
struct ofono_ims* ims)
|
||||
struct ofono_ims* handle)
|
||||
{
|
||||
BinderIms* self = binder_ims_get_data(ims);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderIms* self = binder_ims_get_data(handle);
|
||||
|
||||
DBG_(self, "");
|
||||
|
||||
@@ -309,18 +245,17 @@ binder_ims_remove(
|
||||
}
|
||||
|
||||
if (self->ext) {
|
||||
binder_ext_ims_remove_all_handlers(self->ext, self->ext_event);
|
||||
binder_ext_ims_cancel(self->ext, self->ext_req_id);
|
||||
binder_ext_ims_unref(self->ext);
|
||||
}
|
||||
|
||||
binder_ims_reg_remove_all_handlers(self->reg, self->radio_event);
|
||||
binder_ims_reg_unref(self->reg);
|
||||
binder_ims_reg_remove_handler(self->ims, self->event_id);
|
||||
binder_ims_reg_unref(self->ims);
|
||||
|
||||
g_free(self->log_prefix);
|
||||
g_free(self);
|
||||
|
||||
ofono_ims_set_data(ims, NULL);
|
||||
ofono_ims_set_data(handle, NULL);
|
||||
}
|
||||
|
||||
/*==========================================================================*
|
||||
@@ -339,12 +274,14 @@ static const struct ofono_ims_driver binder_ims_driver = {
|
||||
void
|
||||
binder_ims_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_ims_driver_register(&binder_ims_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_ims_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_ims_driver_unregister(&binder_ims_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* oFono - Open Source Telephony - binder based adaptation
|
||||
*
|
||||
* Copyright (C) 2024 Slava Monich <slava@monich.com>
|
||||
* Copyright (C) 2022 Jolla Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -18,13 +19,19 @@
|
||||
#include "binder_log.h"
|
||||
#include "binder_util.h"
|
||||
|
||||
#include "binder_ext_call.h"
|
||||
#include "binder_ext_ims.h"
|
||||
#include "binder_ext_slot.h"
|
||||
#include "binder_ext_sms.h"
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
|
||||
#include <radio_network_types.h>
|
||||
|
||||
#include <ofono/ims.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gutil_macros.h>
|
||||
#include <gutil_misc.h>
|
||||
@@ -78,6 +85,7 @@ binder_ims_reg_query_done(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsRegObject* self = THIS(user_data);
|
||||
BinderBase* base = &self->base;
|
||||
BinderImsReg* ims = &self->pub;
|
||||
@@ -85,7 +93,8 @@ binder_ims_reg_query_done(
|
||||
|
||||
if (status != RADIO_TX_STATUS_OK) {
|
||||
ofono_error("getImsRegistrationState failed");
|
||||
} else if (resp != RADIO_RESP_GET_IMS_REGISTRATION_STATE) {
|
||||
} else if (resp != RADIO_RESP_GET_IMS_REGISTRATION_STATE &&
|
||||
resp != RADIO_NETWORK_RESP_GET_IMS_REGISTRATION_STATE) {
|
||||
ofono_error("Unexpected getImsRegistrationState response %d", resp);
|
||||
} else if (error != RADIO_ERROR_NONE) {
|
||||
DBG_(self, "%s", binder_radio_error_string(error));
|
||||
@@ -120,9 +129,13 @@ void
|
||||
binder_ims_reg_query(
|
||||
BinderImsRegObject* self)
|
||||
{
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_GET_IMS_REGISTRATION_STATE, NULL,
|
||||
binder_ims_reg_query_done, NULL, self);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RadioRequestGroup* g = self->g;
|
||||
RadioRequest* req = radio_request_new2(g,
|
||||
radio_client_aidl_interface(g->client) == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_REQ_GET_IMS_REGISTRATION_STATE :
|
||||
RADIO_REQ_GET_IMS_REGISTRATION_STATE,
|
||||
NULL, binder_ims_reg_query_done, NULL, self);
|
||||
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
@@ -136,6 +149,7 @@ binder_ims_reg_state_changed(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsRegObject* self = THIS(user_data);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -144,9 +158,10 @@ binder_ims_reg_state_changed(
|
||||
|
||||
static
|
||||
void
|
||||
binder_ims_ext_update_state(
|
||||
binder_ims_reg_update_state(
|
||||
BinderImsRegObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const BINDER_EXT_IMS_STATE state = binder_ext_ims_get_state(self->ext);
|
||||
const gboolean registered = (state == BINDER_EXT_IMS_STATE_REGISTERED);
|
||||
BinderImsReg* ims = &self->pub;
|
||||
@@ -165,9 +180,10 @@ binder_ims_ext_state_changed(
|
||||
BinderExtIms* ext,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsRegObject* self = THIS(user_data);
|
||||
|
||||
binder_ims_ext_update_state(self);
|
||||
binder_ims_reg_update_state(self);
|
||||
binder_base_emit_queued_signals(&self->base);
|
||||
}
|
||||
|
||||
@@ -181,6 +197,7 @@ binder_ims_reg_new(
|
||||
BinderExtSlot* ext_slot,
|
||||
const char* log_prefix)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsReg* ims = NULL;
|
||||
|
||||
if (client) {
|
||||
@@ -188,12 +205,27 @@ binder_ims_reg_new(
|
||||
|
||||
ims = &self->pub;
|
||||
self->log_prefix = binder_dup_prefix(log_prefix);
|
||||
self->ext = binder_ext_ims_ref(binder_ext_slot_get_interface(ext_slot,
|
||||
BINDER_EXT_TYPE_IMS));
|
||||
self->ext = binder_ext_slot_get_interface(ext_slot,
|
||||
BINDER_EXT_TYPE_IMS);
|
||||
|
||||
if (self->ext) {
|
||||
BINDER_EXT_IMS_INTERFACE_FLAGS flags =
|
||||
binder_ext_ims_get_interface_flags(self->ext);
|
||||
|
||||
DBG_(self, "using ims ext");
|
||||
binder_ims_ext_update_state(self);
|
||||
binder_ext_ims_ref(self->ext);
|
||||
|
||||
/* Query flags from the extension */
|
||||
if (flags & BINDER_EXT_IMS_INTERFACE_FLAG_SMS_SUPPORT) {
|
||||
DBG_(self, "ims sms support is detected");
|
||||
ims->caps |= OFONO_IMS_SMS_CAPABLE;
|
||||
}
|
||||
if (flags & BINDER_EXT_IMS_INTERFACE_FLAG_VOICE_SUPPORT) {
|
||||
DBG_(self, "ims call support is detected");
|
||||
ims->caps |= OFONO_IMS_VOICE_CAPABLE;
|
||||
}
|
||||
|
||||
binder_ims_reg_update_state(self);
|
||||
|
||||
/* Register event handler */
|
||||
self->ext_event_id[EVENT_EXT_IMS_STATE_CHANGED] =
|
||||
@@ -203,9 +235,28 @@ binder_ims_reg_new(
|
||||
DBG_(self, "using ims radio api");
|
||||
self->g = radio_request_group_new(client); /* Keeps ref to client */
|
||||
|
||||
/* Initialize the flags based on which interfaces are supported */
|
||||
if (binder_ext_sms_get_interface_flags
|
||||
(binder_ext_slot_get_interface(ext_slot,
|
||||
BINDER_EXT_TYPE_SMS)) &
|
||||
BINDER_EXT_SMS_INTERFACE_FLAG_IMS_SUPPORT) {
|
||||
DBG_(self, "ims sms support is detected");
|
||||
ims->caps |= OFONO_IMS_SMS_CAPABLE;
|
||||
}
|
||||
if (binder_ext_call_get_interface_flags
|
||||
(binder_ext_slot_get_interface(ext_slot,
|
||||
BINDER_EXT_TYPE_CALL)) &
|
||||
BINDER_EXT_CALL_INTERFACE_FLAG_IMS_SUPPORT) {
|
||||
DBG_(self, "ims call support is detected");
|
||||
ims->caps |= OFONO_IMS_VOICE_CAPABLE;
|
||||
}
|
||||
|
||||
/* Register event handler */
|
||||
self->event_id[EVENT_IMS_NETWORK_STATE_CHANGED] =
|
||||
radio_client_add_indication_handler(client,
|
||||
radio_client_aidl_interface(client) ==
|
||||
RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_IND_IMS_NETWORK_STATE_CHANGED :
|
||||
RADIO_IND_IMS_NETWORK_STATE_CHANGED,
|
||||
binder_ims_reg_state_changed, self);
|
||||
|
||||
@@ -223,6 +274,7 @@ BinderImsReg*
|
||||
binder_ims_reg_ref(
|
||||
BinderImsReg* ims)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsRegObject* self = binder_ims_reg_cast(ims);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -237,6 +289,7 @@ void
|
||||
binder_ims_reg_unref(
|
||||
BinderImsReg* ims)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsRegObject* self = binder_ims_reg_cast(ims);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -251,6 +304,7 @@ binder_ims_reg_add_property_handler(
|
||||
BinderImsRegPropertyFunc callback,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsRegObject* self = binder_ims_reg_cast(ims);
|
||||
|
||||
return G_LIKELY(self) ? binder_base_add_property_handler(&self->base,
|
||||
@@ -262,6 +316,7 @@ binder_ims_reg_remove_handler(
|
||||
BinderImsReg* ims,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(id)) {
|
||||
BinderImsRegObject* self = binder_ims_reg_cast(ims);
|
||||
|
||||
@@ -277,6 +332,7 @@ binder_ims_reg_remove_handlers(
|
||||
gulong* ids,
|
||||
int count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_disconnect_handlers(binder_ims_reg_cast(ims), ids, count);
|
||||
}
|
||||
|
||||
@@ -289,6 +345,7 @@ void
|
||||
binder_ims_reg_object_init(
|
||||
BinderImsRegObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -296,6 +353,7 @@ void
|
||||
binder_ims_reg_object_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderImsRegObject* self = THIS(object);
|
||||
|
||||
if (self->ext) {
|
||||
@@ -320,6 +378,7 @@ void
|
||||
binder_ims_reg_object_class_init(
|
||||
BinderImsRegObjectClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
G_OBJECT_CLASS(klass)->finalize = binder_ims_reg_object_finalize;
|
||||
BINDER_BASE_CLASS(klass)->public_offset =
|
||||
G_STRUCT_OFFSET(BinderImsRegObject, pub);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* oFono - Open Source Telephony - binder based adaptation
|
||||
*
|
||||
* Copyright (C) 2024 Slava Monich <slava@monich.com>
|
||||
* Copyright (C) 2022 Jolla Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -29,6 +30,7 @@ typedef enum binder_ims_reg_property {
|
||||
|
||||
struct binder_ims_reg {
|
||||
gboolean registered;
|
||||
int caps; /* OFONO_IMS_xxx bits */
|
||||
};
|
||||
|
||||
typedef
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
#include <gutil_log.h>
|
||||
#include <ofono/log.h>
|
||||
|
||||
#undef DBG
|
||||
#define DBG(fmt, ...) \
|
||||
gutil_log(GLOG_MODULE_CURRENT, GLOG_LEVEL_ALWAYS, "binder_plugin:"fmt, ##__VA_ARGS__)
|
||||
|
||||
#endif /* BINDER_LOG_H */
|
||||
|
||||
/*
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "binder_logger.h"
|
||||
#include "binder_util.h"
|
||||
#include "binder_log.h"
|
||||
|
||||
#include <radio_config.h>
|
||||
#include <radio_instance.h>
|
||||
@@ -35,9 +36,9 @@ enum binder_logger_events {
|
||||
};
|
||||
|
||||
typedef struct binder_logger_callbacks {
|
||||
const char* (*req_name)(guint32 code);
|
||||
const char* (*resp_name)(guint32 code);
|
||||
const char* (*ind_name)(guint32 code);
|
||||
const char* (*req_name)(gpointer object, guint32 code);
|
||||
const char* (*resp_name)(gpointer object, guint32 code);
|
||||
const char* (*ind_name)(gpointer object, guint32 code);
|
||||
gsize (*rpc_header_size)(gpointer object, guint32 code);
|
||||
void (*drop_object)(BinderLogger* logger);
|
||||
} BinderLoggerCallbacks;
|
||||
@@ -71,10 +72,11 @@ binder_logger_trace_req(
|
||||
guint code,
|
||||
GBinderLocalRequest* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const BinderLoggerCallbacks* cb = logger->cb;
|
||||
static const GLogModule* log = &binder_logger_module;
|
||||
const gsize header_size = cb->rpc_header_size(logger->object, code);
|
||||
const char* name = cb->req_name(code);
|
||||
const char* name = cb->req_name(logger->object, code);
|
||||
GBinderWriter writer;
|
||||
const guint8* data;
|
||||
guint32 serial;
|
||||
@@ -102,9 +104,10 @@ binder_logger_trace_resp(
|
||||
const RadioResponseInfo* info,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
static const GLogModule* log = &binder_logger_module;
|
||||
const BinderLoggerCallbacks* cb = logger->cb;
|
||||
const char* name = cb->resp_name(code);
|
||||
const char* name = cb->resp_name(logger->object, code);
|
||||
const char* error = (info->error == RADIO_ERROR_NONE) ? NULL :
|
||||
binder_radio_error_string(info->error);
|
||||
const char* arg1 = name ? name : error;
|
||||
@@ -129,8 +132,9 @@ binder_logger_trace_ind(
|
||||
RADIO_IND code,
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const BinderLoggerCallbacks* cb = logger->cb;
|
||||
const char* name = cb->ind_name(code);
|
||||
const char* name = cb->ind_name(logger->object, code);
|
||||
static const GLogModule* log = &binder_logger_module;
|
||||
|
||||
gutil_log(log, GLOG_LEVEL_VERBOSE, "%s> %u %s",
|
||||
@@ -142,6 +146,7 @@ void
|
||||
binder_logger_dump_req(
|
||||
GBinderLocalRequest* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderWriter writer;
|
||||
const guint8* data;
|
||||
gsize size;
|
||||
@@ -158,6 +163,7 @@ void
|
||||
binder_logger_dump_reader(
|
||||
const GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gsize size;
|
||||
const guint8* data = gbinder_reader_get_data(reader, &size);
|
||||
|
||||
@@ -177,6 +183,7 @@ binder_logger_radio_trace_req_cb(
|
||||
GBinderLocalRequest* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_trace_req((BinderLogger*)user_data, code, args);
|
||||
}
|
||||
|
||||
@@ -189,6 +196,7 @@ binder_logger_radio_trace_resp_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_trace_resp((BinderLogger*)user_data, code, info, args);
|
||||
}
|
||||
|
||||
@@ -201,6 +209,7 @@ binder_logger_radio_trace_ind_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_trace_ind((BinderLogger*)user_data, code, args);
|
||||
}
|
||||
|
||||
@@ -211,6 +220,7 @@ binder_logger_radio_trace_ack_cb(
|
||||
guint32 serial,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderLogger* logger = user_data;
|
||||
|
||||
gutil_log(&binder_logger_module, GLOG_LEVEL_VERBOSE, "%s> [%08x] "
|
||||
@@ -225,6 +235,7 @@ binder_logger_radio_dump_req_cb(
|
||||
GBinderLocalRequest* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_dump_req(args);
|
||||
}
|
||||
|
||||
@@ -237,6 +248,7 @@ binder_logger_radio_dump_resp_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_dump_reader(args);
|
||||
}
|
||||
|
||||
@@ -249,31 +261,38 @@ binder_logger_radio_dump_ind_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_dump_reader(args);
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_logger_radio_req_name(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
return radio_req_name(code);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_req_name2(object, code);
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_logger_radio_resp_name(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
return radio_resp_name(code);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_resp_name2(object, code);
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_logger_radio_ind_name(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
return radio_ind_name(code);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_ind_name2(object, code);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -282,6 +301,7 @@ binder_logger_radio_rpc_header_size(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_instance_rpc_header_size(object, code);
|
||||
}
|
||||
|
||||
@@ -290,6 +310,7 @@ void
|
||||
binder_logger_radio_drop_object(
|
||||
BinderLogger* logger)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
radio_instance_remove_all_handlers(logger->object, logger->event_id);
|
||||
radio_instance_unref(logger->object);
|
||||
}
|
||||
@@ -305,6 +326,7 @@ binder_logger_radio_new(
|
||||
RadioIndicationObserverFunc ind_cb,
|
||||
RadioAckFunc ack_cb)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
static BinderLoggerCallbacks binder_logger_radio_callbacks = {
|
||||
.req_name = binder_logger_radio_req_name,
|
||||
.resp_name = binder_logger_radio_resp_name,
|
||||
@@ -348,6 +370,7 @@ binder_logger_config_trace_req_cb(
|
||||
GBinderLocalRequest* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_trace_req((BinderLogger*)user_data, code, args);
|
||||
}
|
||||
|
||||
@@ -360,6 +383,7 @@ binder_logger_config_trace_resp_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_trace_resp((BinderLogger*)user_data, code, info, args);
|
||||
}
|
||||
|
||||
@@ -371,6 +395,7 @@ binder_logger_config_trace_ind_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_trace_ind((BinderLogger*)user_data, code, args);
|
||||
}
|
||||
|
||||
@@ -382,6 +407,7 @@ binder_logger_config_dump_req_cb(
|
||||
GBinderLocalRequest* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_dump_req(args);
|
||||
}
|
||||
|
||||
@@ -394,6 +420,7 @@ binder_logger_config_dump_resp_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_dump_reader(args);
|
||||
}
|
||||
|
||||
@@ -405,31 +432,38 @@ binder_logger_config_dump_ind_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_logger_dump_reader(args);
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_logger_config_req_name(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
return radio_config_req_name(NULL, code);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_config_req_name(object, code);
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_logger_config_resp_name(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
return radio_config_resp_name(NULL, code);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_config_resp_name(object, code);
|
||||
}
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_logger_config_ind_name(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
return radio_config_ind_name(NULL, code);
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_config_ind_name(object, code);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -438,6 +472,7 @@ binder_logger_config_rpc_header_size(
|
||||
gpointer object,
|
||||
guint32 code)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return radio_config_rpc_header_size(object, code);
|
||||
}
|
||||
|
||||
@@ -446,6 +481,7 @@ void
|
||||
binder_logger_config_drop_object(
|
||||
BinderLogger* logger)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
radio_config_remove_all_handlers(logger->object, logger->event_id);
|
||||
radio_config_unref(logger->object);
|
||||
}
|
||||
@@ -460,6 +496,7 @@ binder_logger_config_new(
|
||||
RadioConfigResponseObserverFunc resp_cb,
|
||||
RadioConfigIndicationObserverFunc ind_cb)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
static BinderLoggerCallbacks binder_logger_config_callbacks = {
|
||||
.req_name = binder_logger_config_req_name,
|
||||
.resp_name = binder_logger_config_resp_name,
|
||||
@@ -498,6 +535,7 @@ binder_logger_new_radio_trace(
|
||||
RadioInstance* radio,
|
||||
const char* prefix)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return binder_logger_radio_new(radio, prefix,
|
||||
RADIO_INSTANCE_PRIORITY_HIGHEST, binder_logger_radio_trace_req_cb,
|
||||
binder_logger_radio_trace_resp_cb, binder_logger_radio_trace_ind_cb,
|
||||
@@ -509,6 +547,7 @@ binder_logger_new_radio_dump(
|
||||
RadioInstance* radio,
|
||||
const char* prefix)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return binder_logger_radio_new(radio, prefix,
|
||||
RADIO_INSTANCE_PRIORITY_HIGHEST - 1, binder_logger_radio_dump_req_cb,
|
||||
binder_logger_radio_dump_resp_cb, binder_logger_radio_dump_ind_cb,
|
||||
@@ -519,6 +558,7 @@ BinderLogger*
|
||||
binder_logger_new_config_trace(
|
||||
RadioConfig* config)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return binder_logger_config_new(config, CONFIG_PREFIX,
|
||||
RADIO_INSTANCE_PRIORITY_HIGHEST, binder_logger_config_trace_req_cb,
|
||||
binder_logger_config_trace_resp_cb, binder_logger_config_trace_ind_cb);
|
||||
@@ -528,6 +568,7 @@ BinderLogger*
|
||||
binder_logger_new_config_dump(
|
||||
RadioConfig* config)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return binder_logger_config_new(config, CONFIG_PREFIX,
|
||||
RADIO_INSTANCE_PRIORITY_HIGHEST - 1, binder_logger_config_dump_req_cb,
|
||||
binder_logger_config_dump_resp_cb, binder_logger_config_dump_ind_cb);
|
||||
@@ -537,6 +578,7 @@ void
|
||||
binder_logger_free(
|
||||
BinderLogger* logger)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (logger) {
|
||||
logger->cb->drop_object(logger);
|
||||
g_free(logger->prefix);
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
#include <ofono/watch.h>
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_instance.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
|
||||
@@ -112,6 +113,7 @@ void
|
||||
binder_modem_online_request_done(
|
||||
BinderModemOnlineRequest* req)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (req->cb) {
|
||||
struct ofono_error error;
|
||||
ofono_modem_online_cb_t cb = req->cb;
|
||||
@@ -129,6 +131,7 @@ void
|
||||
binder_modem_online_request_ok(
|
||||
BinderModemOnlineRequest* req)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (req->timeout_id) {
|
||||
g_source_remove(req->timeout_id);
|
||||
req->timeout_id = 0;
|
||||
@@ -141,6 +144,7 @@ void
|
||||
binder_modem_update_online_state(
|
||||
BinderModemPriv* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (self->pub.radio->state) {
|
||||
case RADIO_STATE_ON:
|
||||
DBG_(self, "online");
|
||||
@@ -171,6 +175,7 @@ gboolean
|
||||
binder_modem_online_request_timeout(
|
||||
gpointer data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModemOnlineRequest* req = data;
|
||||
|
||||
GASSERT(req->timeout_id);
|
||||
@@ -186,6 +191,7 @@ gboolean
|
||||
binder_modem_online_check(
|
||||
gpointer data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModemPriv* self = data;
|
||||
|
||||
GASSERT(self->online_check_id);
|
||||
@@ -199,6 +205,7 @@ void
|
||||
binder_modem_schedule_online_check(
|
||||
BinderModemPriv* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!self->online_check_id) {
|
||||
self->online_check_id = g_idle_add(binder_modem_online_check, self);
|
||||
}
|
||||
@@ -209,6 +216,7 @@ void
|
||||
binder_modem_update_radio_settings(
|
||||
BinderModemPriv* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = &self->pub;
|
||||
struct ofono_watch* watch = modem->watch;
|
||||
struct ofono_radio_settings* rs =
|
||||
@@ -234,6 +242,7 @@ binder_modem_radio_state_cb(
|
||||
BINDER_RADIO_PROPERTY property,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_modem_update_online_state((BinderModemPriv*)data);
|
||||
}
|
||||
|
||||
@@ -243,6 +252,7 @@ binder_modem_imsi_cb(
|
||||
struct ofono_watch* watch,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_modem_update_radio_settings((BinderModemPriv*)data);
|
||||
}
|
||||
|
||||
@@ -252,6 +262,7 @@ binder_modem_iccid_cb(
|
||||
struct ofono_watch* watch,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModemPriv* self = data;
|
||||
|
||||
if (watch->iccid) {
|
||||
@@ -267,6 +278,7 @@ binder_modem_sim_state_cb(
|
||||
struct ofono_watch* watch,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModemPriv* self = data;
|
||||
const enum ofono_sim_state state = ofono_sim_get_state(watch->sim);
|
||||
|
||||
@@ -283,6 +295,7 @@ void
|
||||
binder_modem_pre_sim(
|
||||
struct ofono_modem* ofono)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(ofono);
|
||||
BinderModemPriv* self = binder_modem_cast(modem);
|
||||
const BINDER_FEATURE_MASK features = modem->config.features;
|
||||
@@ -306,6 +319,7 @@ void
|
||||
binder_modem_post_sim(
|
||||
struct ofono_modem* ofono)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(ofono);
|
||||
BinderModemPriv* self = binder_modem_cast(modem);
|
||||
const BINDER_FEATURE_MASK features = modem->config.features;
|
||||
@@ -368,6 +382,7 @@ void
|
||||
binder_modem_post_online(
|
||||
struct ofono_modem* ofono)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(ofono);
|
||||
const BINDER_FEATURE_MASK features = modem->config.features;
|
||||
|
||||
@@ -394,6 +409,7 @@ binder_modem_set_online(
|
||||
ofono_modem_online_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(ofono);
|
||||
BinderModemPriv* self = binder_modem_cast(modem);
|
||||
struct binder_radio* radio = modem->radio;
|
||||
@@ -425,6 +441,7 @@ int
|
||||
binder_modem_enable(
|
||||
struct ofono_modem* ofono)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModemPriv* self = binder_modem_get_priv(ofono);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -437,6 +454,7 @@ int
|
||||
binder_modem_disable(
|
||||
struct ofono_modem* ofono)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModemPriv* self = binder_modem_get_priv(ofono);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -454,6 +472,7 @@ int
|
||||
binder_modem_probe(
|
||||
struct ofono_modem* ofono)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
DBG("%s", ofono_modem_get_path(ofono));
|
||||
return 0;
|
||||
}
|
||||
@@ -463,6 +482,7 @@ void
|
||||
binder_modem_remove(
|
||||
struct ofono_modem* ofono)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(ofono);
|
||||
BinderModemPriv* self = binder_modem_cast(modem);
|
||||
|
||||
@@ -499,6 +519,12 @@ binder_modem_remove(
|
||||
radio_request_group_cancel(self->g);
|
||||
radio_request_group_unref(self->g);
|
||||
radio_client_unref(modem->client);
|
||||
radio_client_unref(modem->data_client);
|
||||
radio_client_unref(modem->messaging_client);
|
||||
radio_client_unref(modem->network_client);
|
||||
radio_client_unref(modem->sim_client);
|
||||
radio_client_unref(modem->voice_client);
|
||||
radio_instance_unref(modem->instance);
|
||||
|
||||
g_free(self->last_known_iccid);
|
||||
g_free(self->reset_iccid);
|
||||
@@ -527,18 +553,26 @@ static const struct ofono_modem_driver binder_modem_driver = {
|
||||
void
|
||||
binder_modem_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_modem_driver_register(&binder_modem_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_modem_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_modem_driver_unregister(&binder_modem_driver);
|
||||
}
|
||||
|
||||
BinderModem*
|
||||
binder_modem_create(
|
||||
RadioInstance* instance,
|
||||
RadioClient* client,
|
||||
RadioClient* data_client,
|
||||
RadioClient* messaging_client,
|
||||
RadioClient* network_client,
|
||||
RadioClient* sim_client,
|
||||
RadioClient* voice_client,
|
||||
const char* log_prefix,
|
||||
const char* path,
|
||||
const char* imei,
|
||||
@@ -552,6 +586,7 @@ binder_modem_create(
|
||||
BinderSimSettings* settings,
|
||||
struct ofono_cell_info* cell_info)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Skip the slash from the path, it looks like "/ril_0" */
|
||||
struct ofono_modem* ofono = ofono_modem_create(path + 1, BINDER_DRIVER);
|
||||
|
||||
@@ -579,8 +614,14 @@ binder_modem_create(
|
||||
modem->cell_info = ofono_cell_info_ref(cell_info);
|
||||
modem->data = binder_data_ref(data);
|
||||
modem->watch = ofono_watch_new(path);
|
||||
modem->instance = radio_instance_ref(instance);
|
||||
modem->client = radio_client_ref(client);
|
||||
modem->ims = binder_ims_reg_new(client, ext, log_prefix);
|
||||
modem->data_client = radio_client_ref(data_client);
|
||||
modem->messaging_client = radio_client_ref(messaging_client);
|
||||
modem->network_client = radio_client_ref(network_client);
|
||||
modem->sim_client = radio_client_ref(sim_client);
|
||||
modem->voice_client = radio_client_ref(voice_client);
|
||||
modem->ims = binder_ims_reg_new(network_client, ext, log_prefix);
|
||||
modem->ext = binder_ext_slot_ref(ext);
|
||||
self->g = radio_request_group_new(client);
|
||||
self->last_known_iccid = g_strdup(modem->watch->iccid);
|
||||
@@ -620,9 +661,14 @@ binder_modem_create(
|
||||
* the only reason for making this call.
|
||||
*/
|
||||
if (config->query_available_band_mode) {
|
||||
guint32 code =
|
||||
radio_client_aidl_interface(
|
||||
modem->network_client) == RADIO_NETWORK_INTERFACE ?
|
||||
RADIO_NETWORK_REQ_GET_AVAILABLE_BAND_MODES :
|
||||
RADIO_REQ_GET_AVAILABLE_BAND_MODES;
|
||||
/* oneway getAvailableBandModes(int32 serial); */
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_GET_AVAILABLE_BAND_MODES, NULL,
|
||||
code, NULL,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
radio_request_submit(req);
|
||||
|
||||
@@ -22,7 +22,13 @@
|
||||
#include <ofono/modem.h>
|
||||
|
||||
struct binder_modem {
|
||||
RadioInstance* instance;
|
||||
RadioClient* client;
|
||||
RadioClient* data_client;
|
||||
RadioClient* messaging_client;
|
||||
RadioClient* network_client;
|
||||
RadioClient* sim_client;
|
||||
RadioClient* voice_client;
|
||||
const char* path;
|
||||
const char* log_prefix;
|
||||
const char* imei;
|
||||
@@ -53,7 +59,13 @@ binder_modem_cleanup(void)
|
||||
|
||||
BinderModem*
|
||||
binder_modem_create(
|
||||
RadioInstance* instance,
|
||||
RadioClient* client,
|
||||
RadioClient* data_client,
|
||||
RadioClient* messaging_client,
|
||||
RadioClient* network_client,
|
||||
RadioClient* sim_client,
|
||||
RadioClient* voice_client,
|
||||
const char* name,
|
||||
const char* path,
|
||||
const char* imei,
|
||||
|
||||
1517
src/binder_netreg.c
1517
src/binder_netreg.c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -62,6 +62,8 @@ BinderNetwork*
|
||||
binder_network_new(
|
||||
const char* path,
|
||||
RadioClient* client,
|
||||
RadioClient* data_client,
|
||||
RadioClient* modem_client,
|
||||
const char* log_prefix,
|
||||
BinderRadio* radio,
|
||||
BinderSimCard* sim_card,
|
||||
|
||||
71
src/binder_oplist.c
Normal file
71
src/binder_oplist.c
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* oFono - Open Source Telephony - binder based adaptation
|
||||
*
|
||||
* Copyright (C) 2022 Jolla Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "binder_oplist.h"
|
||||
#include "binder_log.h"
|
||||
|
||||
#include <ofono/netreg.h>
|
||||
|
||||
BinderOpList*
|
||||
binder_oplist_new()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return (BinderOpList*) g_array_new(FALSE, TRUE,
|
||||
sizeof(struct ofono_network_operator));
|
||||
}
|
||||
|
||||
BinderOpList*
|
||||
binder_oplist_set_count(
|
||||
BinderOpList* oplist,
|
||||
guint count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!oplist) {
|
||||
oplist = binder_oplist_new();
|
||||
}
|
||||
g_array_set_size((GArray*)oplist, count);
|
||||
return oplist;
|
||||
}
|
||||
|
||||
BinderOpList*
|
||||
binder_oplist_append(
|
||||
BinderOpList* oplist,
|
||||
const struct ofono_network_operator* op)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!oplist) {
|
||||
oplist = binder_oplist_new();
|
||||
}
|
||||
g_array_append_vals((GArray*)oplist, op, 1);
|
||||
return oplist;
|
||||
}
|
||||
|
||||
void
|
||||
binder_oplist_free(
|
||||
BinderOpList* oplist)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (oplist) {
|
||||
g_array_free((GArray*)oplist, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* mode: C
|
||||
* c-basic-offset: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
60
src/binder_oplist.h
Normal file
60
src/binder_oplist.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* oFono - Open Source Telephony - binder based adaptation
|
||||
*
|
||||
* Copyright (C) 2022 Jolla Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef BINDER_OPLIST_H
|
||||
#define BINDER_OPLIST_H
|
||||
|
||||
#include "binder_types.h"
|
||||
|
||||
/*
|
||||
* This is basically a GArray providing better type safety at compile time.
|
||||
* If NULL is passed to binder_oplist_set_count() and binder_oplist_append()
|
||||
* they allocate a new list with binder_oplist_new() and return it.
|
||||
*/
|
||||
typedef struct binder_oplist {
|
||||
struct ofono_network_operator* op;
|
||||
guint count;
|
||||
} BinderOpList;
|
||||
|
||||
BinderOpList*
|
||||
binder_oplist_new()
|
||||
BINDER_INTERNAL;
|
||||
|
||||
BinderOpList*
|
||||
binder_oplist_set_count(
|
||||
BinderOpList* oplist,
|
||||
guint count)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
BinderOpList*
|
||||
binder_oplist_append(
|
||||
BinderOpList* oplist,
|
||||
const struct ofono_network_operator* op)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
void
|
||||
binder_oplist_free(
|
||||
BinderOpList* oplist)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
#endif /* BINDER_OPLIST_H */
|
||||
|
||||
/*
|
||||
* Local Variables:
|
||||
* mode: C
|
||||
* c-basic-offset: 4
|
||||
* indent-tabs-mode: nil
|
||||
* End:
|
||||
*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -21,6 +21,7 @@
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_modem_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -88,6 +89,7 @@ gboolean
|
||||
binder_radio_power_should_be_on(
|
||||
BinderRadioObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadio* radio = &self->pub;
|
||||
|
||||
return (radio->online || g_hash_table_size(self->req_table) > 0) &&
|
||||
@@ -99,6 +101,7 @@ gboolean
|
||||
binder_radio_power_request_retry_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = THIS(user_data);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -115,6 +118,7 @@ void
|
||||
binder_radio_cancel_retry(
|
||||
BinderRadioObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->retry_id) {
|
||||
DBG_(self, "retry cancelled");
|
||||
g_source_remove(self->retry_id);
|
||||
@@ -127,6 +131,7 @@ void
|
||||
binder_radio_check_state(
|
||||
BinderRadioObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadio* radio = &self->pub;
|
||||
|
||||
if (!self->pending_req) {
|
||||
@@ -162,6 +167,7 @@ void
|
||||
binder_radio_power_request_done(
|
||||
BinderRadioObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GASSERT(!self->pending_req);
|
||||
if (self->next_state_valid) {
|
||||
binder_radio_submit_power_request(self, self->next_state);
|
||||
@@ -180,14 +186,26 @@ binder_radio_power_request_cb(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = THIS(user_data);
|
||||
const RADIO_INTERFACE iface = radio_client_interface(self->client);
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(self->client);
|
||||
guint32 code = RADIO_RESP_NONE;
|
||||
|
||||
if (iface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
code = (iface >= RADIO_INTERFACE_1_5) ?
|
||||
RADIO_RESP_SET_RADIO_POWER_1_5 :
|
||||
RADIO_RESP_SET_RADIO_POWER;
|
||||
} else if (iface_aidl == RADIO_MODEM_INTERFACE) {
|
||||
code = RADIO_MODEM_RESP_SET_RADIO_POWER;
|
||||
}
|
||||
|
||||
GASSERT(self->pending_req == req);
|
||||
radio_request_unref(self->pending_req);
|
||||
self->pending_req = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp != RADIO_RESP_SET_RADIO_POWER) {
|
||||
if (resp != code) {
|
||||
ofono_error("Unexpected setRadioPower response %d", resp);
|
||||
} else if (error != RADIO_ERROR_NONE) {
|
||||
ofono_error("Power request failed: %s",
|
||||
@@ -206,13 +224,37 @@ binder_radio_submit_power_request(
|
||||
BinderRadioObject* self,
|
||||
gboolean on)
|
||||
{
|
||||
/* setRadioPower(int32 serial, bool on) */
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* setRadioPower(int32 serial, bool on)
|
||||
* setRadioPower_1_5(int32 serial, bool on, bool forEmergencyCall,
|
||||
* bool preferredForEmergencyCall)
|
||||
* AIDL:
|
||||
* setRadioPower(int32 serial, bool on, bool forEmergencyCall,
|
||||
* bool preferredForEmergencyCall)
|
||||
*/
|
||||
GBinderWriter writer;
|
||||
const RADIO_INTERFACE iface = radio_client_interface(self->client);
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(self->client);
|
||||
guint32 code = RADIO_REQ_NONE;
|
||||
|
||||
if (iface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
code = (iface >= RADIO_INTERFACE_1_5) ?
|
||||
RADIO_REQ_SET_RADIO_POWER_1_5 :
|
||||
RADIO_REQ_SET_RADIO_POWER;
|
||||
} else if (iface_aidl == RADIO_MODEM_INTERFACE) {
|
||||
code = RADIO_MODEM_REQ_SET_RADIO_POWER;
|
||||
}
|
||||
|
||||
RadioRequest* req = radio_request_new(self->client,
|
||||
RADIO_REQ_SET_RADIO_POWER, &writer,
|
||||
code, &writer,
|
||||
binder_radio_power_request_cb, NULL, self);
|
||||
|
||||
gbinder_writer_append_bool(&writer, on);
|
||||
if ((iface_aidl == RADIO_AIDL_INTERFACE_NONE && iface >= RADIO_INTERFACE_1_5) ||
|
||||
iface_aidl == RADIO_MODEM_INTERFACE) {
|
||||
gbinder_writer_append_bool(&writer, FALSE);
|
||||
gbinder_writer_append_bool(&writer, FALSE);
|
||||
}
|
||||
|
||||
self->next_state_valid = FALSE;
|
||||
self->next_state = on;
|
||||
@@ -235,6 +277,7 @@ binder_radio_power_request(
|
||||
gboolean on,
|
||||
gboolean allow_repeat)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const char* on_off = on ? "on" : "off";
|
||||
|
||||
if (self->pending_req) {
|
||||
@@ -265,6 +308,7 @@ binder_radio_state_changed(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = THIS(user_data);
|
||||
RADIO_STATE radio_state = RADIO_STATE_UNAVAILABLE;
|
||||
GBinderReader reader;
|
||||
@@ -322,16 +366,23 @@ binder_radio_new(
|
||||
RadioClient* client,
|
||||
const char* log_prefix)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = g_object_new(THIS_TYPE, NULL);
|
||||
BinderRadio* radio = &self->pub;
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(client);
|
||||
|
||||
self->client = radio_client_ref(client);
|
||||
self->g = radio_request_group_new(client);
|
||||
self->log_prefix = binder_dup_prefix(log_prefix);
|
||||
DBG_(self, "");
|
||||
|
||||
self->state_event_id = radio_client_add_indication_handler(client,
|
||||
RADIO_IND_RADIO_STATE_CHANGED, binder_radio_state_changed, self);
|
||||
if (iface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
self->state_event_id = radio_client_add_indication_handler(client,
|
||||
RADIO_IND_RADIO_STATE_CHANGED, binder_radio_state_changed, self);
|
||||
} else if (iface_aidl == RADIO_MODEM_INTERFACE) {
|
||||
self->state_event_id = radio_client_add_indication_handler(client,
|
||||
RADIO_MODEM_IND_RADIO_STATE_CHANGED, binder_radio_state_changed, self);
|
||||
}
|
||||
|
||||
/*
|
||||
* Some modem adaptations like to receive power off request at startup
|
||||
@@ -345,6 +396,7 @@ BinderRadio*
|
||||
binder_radio_ref(
|
||||
BinderRadio* radio)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -359,6 +411,7 @@ void
|
||||
binder_radio_unref(
|
||||
BinderRadio* radio)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -371,6 +424,7 @@ binder_radio_set_online(
|
||||
BinderRadio* radio,
|
||||
gboolean online)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
if (G_LIKELY(self) && radio->online != online) {
|
||||
@@ -390,6 +444,7 @@ void
|
||||
binder_radio_confirm_power_on(
|
||||
BinderRadio* radio)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
if (G_LIKELY(self) && binder_radio_power_should_be_on(self)) {
|
||||
@@ -411,6 +466,7 @@ void
|
||||
binder_radio_power_cycle(
|
||||
BinderRadio* radio)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -434,6 +490,7 @@ binder_radio_power_on(
|
||||
BinderRadio* radio,
|
||||
gpointer tag)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -454,6 +511,7 @@ binder_radio_power_off(
|
||||
BinderRadio* radio,
|
||||
gpointer tag)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -474,6 +532,7 @@ binder_radio_add_property_handler(
|
||||
BinderRadioPropertyFunc callback,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
return G_LIKELY(self) ? binder_base_add_property_handler(&self->base,
|
||||
@@ -485,6 +544,7 @@ binder_radio_remove_handler(
|
||||
BinderRadio* radio,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(id)) {
|
||||
BinderRadioObject* self = binder_radio_object_cast(radio);
|
||||
|
||||
@@ -500,6 +560,7 @@ binder_radio_remove_handlers(
|
||||
gulong* ids,
|
||||
int count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_disconnect_handlers(binder_radio_object_cast(radio), ids, count);
|
||||
}
|
||||
|
||||
@@ -512,6 +573,7 @@ void
|
||||
binder_radio_object_init(
|
||||
BinderRadioObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->req_table = g_hash_table_new(g_direct_hash, g_direct_equal);
|
||||
}
|
||||
|
||||
@@ -520,6 +582,7 @@ void
|
||||
binder_radio_object_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioObject* self = THIS(object);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -542,6 +605,7 @@ void
|
||||
binder_radio_object_class_init(
|
||||
BinderRadioObjectClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
G_OBJECT_CLASS(klass)->finalize = binder_radio_object_finalize;
|
||||
BINDER_BASE_CLASS(klass)->public_offset =
|
||||
G_STRUCT_OFFSET(BinderRadioObject, pub);
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
|
||||
#include <radio_modem_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
|
||||
@@ -86,6 +88,7 @@ typedef struct binder_radio_caps_object {
|
||||
char* log_prefix;
|
||||
RadioClient* client;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
GUtilIdlePool* idle_pool;
|
||||
gulong watch_event_id[WATCH_EVENT_COUNT];
|
||||
gulong settings_event_id[SETTINGS_EVENT_COUNT];
|
||||
@@ -135,6 +138,7 @@ struct binder_radio_caps_request {
|
||||
typedef struct binder_radio_caps_check_data {
|
||||
BinderRadioCapsCheckFunc cb;
|
||||
void* cb_data;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
} BinderRadioCapsCheckData;
|
||||
|
||||
typedef struct binder_radio_caps_request_tx_phase {
|
||||
@@ -188,7 +192,8 @@ static const struct binder_access_mode_raf {
|
||||
} binder_access_mode_raf_map[] = {
|
||||
{ OFONO_RADIO_ACCESS_MODE_GSM, RAF_EDGE | RAF_GPRS | RAF_GSM },
|
||||
{ OFONO_RADIO_ACCESS_MODE_UMTS, RAF_UMTS },
|
||||
{ OFONO_RADIO_ACCESS_MODE_LTE, RAF_LTE | RAF_LTE_CA }
|
||||
{ OFONO_RADIO_ACCESS_MODE_LTE, RAF_LTE | RAF_LTE_CA },
|
||||
{ OFONO_RADIO_ACCESS_MODE_NR, RAF_NR }
|
||||
};
|
||||
|
||||
static const BinderRadioCapsRequestTxPhase binder_radio_caps_tx_phase[] = {
|
||||
@@ -261,6 +266,7 @@ binder_radio_caps_permutate(
|
||||
guint off,
|
||||
guint n)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (off < n) {
|
||||
guint i;
|
||||
|
||||
@@ -282,6 +288,7 @@ binder_radio_caps_generate_permutations(
|
||||
GPtrArray* list,
|
||||
guint n)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_ptr_array_set_size(list, 0);
|
||||
|
||||
if (n > 0) {
|
||||
@@ -304,6 +311,7 @@ RadioCapability*
|
||||
binder_radio_caps_dup(
|
||||
const RadioCapability* in)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (in) {
|
||||
if (in->logicalModemUuid.data.str) {
|
||||
/* Allocate the whole thing from a single memory block */
|
||||
@@ -329,6 +337,7 @@ binder_radio_caps_equal(
|
||||
const RadioCapability* rc1,
|
||||
const RadioCapability* rc2)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (rc1 == rc2) {
|
||||
return TRUE;
|
||||
} else if (rc1 && rc2) {
|
||||
@@ -357,13 +366,33 @@ binder_radio_caps_check_done(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsCheckData* check = user_data;
|
||||
const RadioCapability* result = NULL;
|
||||
RadioCapability* result = NULL;
|
||||
char* uuid_str = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_RADIO_CAPABILITY) {
|
||||
guint32 code = check->interface_aidl == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_RESP_GET_RADIO_CAPABILITY :
|
||||
RADIO_RESP_GET_RADIO_CAPABILITY;
|
||||
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
result = binder_read_hidl_struct(args, RadioCapability);
|
||||
if (check->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
result = (RadioCapability*)binder_read_hidl_struct(args, RadioCapability);
|
||||
} else {
|
||||
GBinderReader reader;
|
||||
gbinder_reader_copy(&reader, args);
|
||||
result = g_malloc0(sizeof(RadioCapability));
|
||||
binder_read_parcelable_size(&reader);
|
||||
gbinder_reader_read_int32(&reader, &result->session);
|
||||
gbinder_reader_read_uint32(&reader, &result->phase);
|
||||
gbinder_reader_read_uint32(&reader, &result->raf);
|
||||
uuid_str = gbinder_reader_read_string16(&reader);
|
||||
result->logicalModemUuid.data.str = (const char*)uuid_str;
|
||||
result->logicalModemUuid.len = strlen(uuid_str);
|
||||
gbinder_reader_read_uint32(&reader, &result->status);
|
||||
}
|
||||
if (result) {
|
||||
DBG("tx=%d,phase=%d,raf=0x%x,uuid=%s,status=%d",
|
||||
result->session, result->phase, result->raf,
|
||||
@@ -379,6 +408,10 @@ binder_radio_caps_check_done(
|
||||
}
|
||||
|
||||
check->cb(result, check->cb_data);
|
||||
if (check->interface_aidl == RADIO_MODEM_INTERFACE) {
|
||||
g_free(result);
|
||||
g_free(uuid_str);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
@@ -391,6 +424,7 @@ binder_radio_caps_check_retry(
|
||||
const GBinderReader* args,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
switch (error) {
|
||||
case RADIO_ERROR_NONE:
|
||||
@@ -410,15 +444,21 @@ binder_radio_caps_check(
|
||||
BinderRadioCapsCheckFunc cb,
|
||||
void* cb_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsCheckData* check = g_new0(BinderRadioCapsCheckData, 1);
|
||||
const RADIO_AIDL_INTERFACE iface_aidl = radio_client_aidl_interface(client);
|
||||
guint32 code = iface_aidl == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_REQ_GET_RADIO_CAPABILITY :
|
||||
RADIO_REQ_GET_RADIO_CAPABILITY;
|
||||
|
||||
/* getRadioCapability(int32 serial) */
|
||||
RadioRequest* req = radio_request_new(client,
|
||||
RADIO_REQ_GET_RADIO_CAPABILITY, NULL,
|
||||
code, NULL,
|
||||
binder_radio_caps_check_done, g_free, check);
|
||||
|
||||
check->cb = cb;
|
||||
check->cb_data = cb_data;
|
||||
check->interface_aidl = iface_aidl;
|
||||
|
||||
/*
|
||||
* Make is blocking because this is typically happening at startup
|
||||
@@ -454,6 +494,7 @@ enum ofono_radio_access_mode
|
||||
binder_radio_caps_access_mode(
|
||||
const RadioCapability* cap)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (cap) {
|
||||
const RADIO_ACCESS_FAMILY raf = cap->raf;
|
||||
int i;
|
||||
@@ -473,6 +514,7 @@ enum ofono_radio_access_mode
|
||||
binder_radio_caps_modes(
|
||||
const RadioCapability* cap)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
enum ofono_radio_access_mode modes = OFONO_RADIO_ACCESS_MODE_NONE;
|
||||
|
||||
if (cap) {
|
||||
@@ -494,6 +536,7 @@ void
|
||||
binder_radio_caps_update_raf(
|
||||
BinderRadioCapsObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCaps* caps = &self->pub;
|
||||
const RadioCapability* cap = self->cap;
|
||||
RADIO_ACCESS_FAMILY raf = cap ? cap->raf : RAF_NONE;
|
||||
@@ -512,6 +555,7 @@ binder_radio_caps_score(
|
||||
const BinderRadioCapsObject* self,
|
||||
const RadioCapability* cap)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!self->radio->online || !self->simcard->status ||
|
||||
self->simcard->status->card_state != RADIO_CARD_STATE_PRESENT) {
|
||||
/* Unusable slot */
|
||||
@@ -536,6 +580,7 @@ binder_radio_caps_slot_compare(
|
||||
gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const BinderRadioCapsObject* c1 = *(void**)a;
|
||||
const BinderRadioCapsObject* c2 = *(void**)b;
|
||||
|
||||
@@ -549,6 +594,7 @@ binder_radio_caps_radio_event(
|
||||
BINDER_RADIO_PROPERTY property,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = RADIO_CAPS(user_data);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -561,6 +607,7 @@ binder_radio_caps_simcard_event(
|
||||
BinderSimCard* sim,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = RADIO_CAPS(user_data);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -573,6 +620,7 @@ binder_radio_caps_watch_event(
|
||||
struct ofono_watch* watch,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = RADIO_CAPS(user_data);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -586,6 +634,7 @@ binder_radio_caps_settings_event(
|
||||
BINDER_SIM_SETTINGS_PROPERTY property,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = RADIO_CAPS(user_data);
|
||||
BinderRadioCapsManager* mgr = self->pub.mgr;
|
||||
|
||||
@@ -602,6 +651,7 @@ binder_radio_caps_changed_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* radioCapabilityIndication(RadioIndicationType, RadioCapability rc) */
|
||||
BinderRadioCapsObject* self = RADIO_CAPS(user_data);
|
||||
const RadioCapability* cap = binder_read_hidl_struct(args, RadioCapability);
|
||||
@@ -622,6 +672,7 @@ void
|
||||
binder_radio_caps_finish_init(
|
||||
BinderRadioCapsObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Register for update notifications */
|
||||
self->client_event_id[CLIENT_EVENT_IND_RADIO_CAPABILITY] =
|
||||
radio_client_add_indication_handler(self->client,
|
||||
@@ -642,11 +693,15 @@ binder_radio_caps_initial_query_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = RADIO_CAPS(user_data);
|
||||
const RadioCapability* cap = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_RADIO_CAPABILITY) {
|
||||
guint32 code = self->interface_aidl == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_RESP_GET_RADIO_CAPABILITY :
|
||||
RADIO_RESP_GET_RADIO_CAPABILITY;
|
||||
if (resp == code) {
|
||||
/* getRadioCapabilityResponse(RadioResponseInfo, RadioCapability) */
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cap = binder_read_hidl_struct(args, RadioCapability);
|
||||
@@ -678,6 +733,7 @@ binder_radio_caps_new(
|
||||
const BinderSlotConfig* config,
|
||||
const RadioCapability* cap)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GASSERT(mgr);
|
||||
if (G_LIKELY(mgr)) {
|
||||
BinderRadioCapsObject* self = g_object_new(RADIO_CAPS_TYPE, 0);
|
||||
@@ -687,6 +743,7 @@ binder_radio_caps_new(
|
||||
self->log_prefix = binder_dup_prefix(log_prefix);
|
||||
|
||||
self->g = radio_request_group_new(client);
|
||||
self->interface_aidl = radio_client_aidl_interface(client);
|
||||
self->radio = binder_radio_ref(radio);
|
||||
self->data = binder_data_ref(data);
|
||||
caps->mgr = binder_radio_caps_manager_ref(mgr);
|
||||
@@ -748,6 +805,7 @@ BinderRadioCaps*
|
||||
binder_radio_caps_ref(
|
||||
BinderRadioCaps* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = binder_radio_caps_cast(caps);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -760,6 +818,7 @@ void
|
||||
binder_radio_caps_unref(
|
||||
BinderRadioCaps* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = binder_radio_caps_cast(caps);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -771,6 +830,7 @@ void
|
||||
binder_radio_caps_drop(
|
||||
BinderRadioCaps* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = binder_radio_caps_cast(caps);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -785,6 +845,7 @@ binder_radio_caps_signal_cb(
|
||||
BinderRadioCapsObject* caps,
|
||||
BinderRadioCapsClosure* closure)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
closure->cb(&caps->pub, closure->user_data);
|
||||
}
|
||||
|
||||
@@ -794,6 +855,7 @@ binder_radio_caps_add_raf_handler(
|
||||
BinderRadioCapsFunc cb,
|
||||
void* arg)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = binder_radio_caps_cast(caps);
|
||||
|
||||
if (G_LIKELY(self) && G_LIKELY(cb)) {
|
||||
@@ -817,6 +879,7 @@ binder_radio_caps_remove_handler(
|
||||
BinderRadioCaps* caps,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(id)) {
|
||||
BinderRadioCapsObject* self = binder_radio_caps_cast(caps);
|
||||
|
||||
@@ -831,6 +894,7 @@ void
|
||||
binder_radio_caps_object_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* self = RADIO_CAPS(object);
|
||||
BinderRadioCapsManager* mgr = self->pub.mgr;
|
||||
|
||||
@@ -867,6 +931,7 @@ void
|
||||
binder_radio_caps_object_init(
|
||||
BinderRadioCapsObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->idle_pool = gutil_idle_pool_ref
|
||||
(gutil_idle_pool_get(&binder_radio_caps_shared_pool));
|
||||
}
|
||||
@@ -875,6 +940,7 @@ static
|
||||
void
|
||||
binder_radio_caps_object_class_init(BinderRadioCapsObjectClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
G_OBJECT_CLASS(klass)->finalize = binder_radio_caps_object_finalize;
|
||||
binder_radio_caps_signals[CAPS_SIGNAL_RAF_CHANGED] =
|
||||
g_signal_new(CAPS_SIGNAL_RAF_CHANGED_NAME,
|
||||
@@ -892,6 +958,7 @@ binder_radio_caps_manager_order_str(
|
||||
BinderRadioCapsManager* self,
|
||||
const guint* order)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const guint n = self->caps_list->len;
|
||||
|
||||
if (n > 0) {
|
||||
@@ -918,6 +985,7 @@ binder_radio_caps_manager_role_str(
|
||||
BinderRadioCapsManager* self,
|
||||
enum ofono_slot_data_role role)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
char* str;
|
||||
|
||||
switch (role) {
|
||||
@@ -940,6 +1008,7 @@ binder_radio_caps_manager_foreach(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsEnumFunc cb)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
|
||||
@@ -954,6 +1023,7 @@ binder_radio_caps_manager_foreach_tx(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsEnumFunc cb)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
|
||||
@@ -972,6 +1042,7 @@ gboolean
|
||||
binder_radio_caps_manager_tx_pending(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
|
||||
@@ -997,6 +1068,7 @@ gboolean
|
||||
binder_radio_caps_manager_can_check(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->caps_list && !binder_radio_caps_manager_tx_pending(self)) {
|
||||
const GPtrArray* list = self->caps_list;
|
||||
const BinderRadioCapsObject* prev_caps = NULL;
|
||||
@@ -1050,6 +1122,7 @@ binder_radio_caps_manager_issue_requests(
|
||||
const BinderRadioCapsRequestTxPhase* phase,
|
||||
RadioRequestCompleteFunc handler)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
|
||||
@@ -1104,6 +1177,7 @@ binder_radio_caps_manager_next_transaction_cb(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
radio_request_group_cancel(caps->g);
|
||||
radio_client_remove_handlers(caps->client, caps->client_event_id +
|
||||
CLIENT_EVENT_OWNER, 1);
|
||||
@@ -1116,6 +1190,7 @@ void
|
||||
binder_radio_caps_manager_next_transaction(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_radio_caps_manager_foreach(self,
|
||||
binder_radio_caps_manager_next_transaction_cb);
|
||||
self->tx_failed = FALSE;
|
||||
@@ -1129,6 +1204,7 @@ void binder_radio_caps_manager_cancel_cb(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GASSERT(!caps->client_event_id[CLIENT_EVENT_OWNER]);
|
||||
radio_request_group_unblock(caps->g);
|
||||
}
|
||||
@@ -1138,6 +1214,7 @@ void
|
||||
binder_radio_caps_manager_transaction_done(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_radio_caps_manager_schedule_check(self);
|
||||
binder_data_manager_assert_data_on(self->data_manager);
|
||||
binder_radio_caps_manager_foreach(self,
|
||||
@@ -1154,11 +1231,15 @@ binder_radio_caps_manager_abort_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* caps = RADIO_CAPS(user_data);
|
||||
BinderRadioCapsManager* self = caps->pub.mgr;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_RADIO_CAPABILITY) {
|
||||
guint32 code = caps->interface_aidl == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_RESP_SET_RADIO_CAPABILITY :
|
||||
RADIO_RESP_SET_RADIO_CAPABILITY;
|
||||
if (resp == code) {
|
||||
if (error != RADIO_ERROR_NONE) {
|
||||
DBG_(caps, "Failed to abort radio caps switch, error %s",
|
||||
binder_radio_error_string(error));
|
||||
@@ -1183,6 +1264,7 @@ void
|
||||
binder_radio_caps_manager_abort_transaction(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
const int prev_tx_id = self->tx_id;
|
||||
@@ -1222,14 +1304,18 @@ void binder_radio_caps_manager_next_phase_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* caps = RADIO_CAPS(user_data);
|
||||
BinderRadioCapsManager* self = caps->pub.mgr;
|
||||
gboolean ok = FALSE;
|
||||
|
||||
GASSERT(caps->tx_pending > 0);
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
guint32 code = caps->interface_aidl == RADIO_MODEM_INTERFACE ?
|
||||
RADIO_MODEM_RESP_SET_RADIO_CAPABILITY :
|
||||
RADIO_RESP_SET_RADIO_CAPABILITY;
|
||||
/* getRadioCapabilityResponse(RadioResponseInfo, RadioCapability rc) */
|
||||
if (resp == RADIO_RESP_SET_RADIO_CAPABILITY) {
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
GBinderReader reader;
|
||||
const RadioCapability* rc;
|
||||
@@ -1271,6 +1357,7 @@ void
|
||||
binder_radio_caps_manager_next_phase(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Note: -1 > 2 if 2 is unsigned (which turns -1 into 4294967295) */
|
||||
const int max_index = G_N_ELEMENTS(binder_radio_caps_tx_phase) - 1;
|
||||
|
||||
@@ -1320,6 +1407,7 @@ binder_radio_caps_manager_data_off_done(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!binder_radio_caps_manager_tx_pending(self)) {
|
||||
if (self->tx_failed) {
|
||||
DBG("failed to start the transaction");
|
||||
@@ -1346,6 +1434,7 @@ binder_radio_caps_manager_data_disallowed(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* caps = RADIO_CAPS(user_data);
|
||||
BinderRadioCapsManager* self = caps->pub.mgr;
|
||||
|
||||
@@ -1366,6 +1455,7 @@ binder_radio_caps_manager_data_off(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (binder_data_manager_need_set_data_allowed(self->data_manager)) {
|
||||
RadioRequest* req = binder_data_set_data_allowed_request_new(caps->g,
|
||||
FALSE, binder_radio_caps_manager_data_disallowed, NULL, caps);
|
||||
@@ -1390,6 +1480,7 @@ binder_radio_caps_manager_deactivate_data_call_done(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* caps = RADIO_CAPS(user_data);
|
||||
BinderRadioCapsManager* self = caps->pub.mgr;
|
||||
|
||||
@@ -1425,6 +1516,7 @@ binder_radio_caps_deactivate_data_call(
|
||||
BinderRadioCapsObject* caps,
|
||||
int cid)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RadioRequest* req = binder_data_deactivate_data_call_request_new(caps->g,
|
||||
cid, binder_radio_caps_manager_deactivate_data_call_done,
|
||||
NULL, caps);
|
||||
@@ -1443,6 +1535,7 @@ binder_radio_caps_deactivate_data_call_cb(
|
||||
gpointer list_data,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderDataCall* call = list_data;
|
||||
|
||||
if (call->status == RADIO_DATA_CALL_FAIL_NONE) {
|
||||
@@ -1457,6 +1550,7 @@ binder_radio_caps_manager_deactivate_all_cb(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderData* data = caps->data;
|
||||
|
||||
if (data) {
|
||||
@@ -1470,6 +1564,7 @@ void
|
||||
binder_radio_caps_manager_deactivate_all(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_radio_caps_manager_foreach_tx(self,
|
||||
binder_radio_caps_manager_deactivate_all_cb);
|
||||
if (!binder_radio_caps_manager_tx_pending(self)) {
|
||||
@@ -1486,6 +1581,7 @@ binder_radio_caps_tx_wait_cb(
|
||||
RadioClient* client,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* caps = RADIO_CAPS(user_data);
|
||||
BinderRadioCapsManager* self = caps->pub.mgr;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
@@ -1521,6 +1617,7 @@ void
|
||||
binder_radio_caps_manager_lock_io_for_transaction(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const GPtrArray* list = self->caps_list;
|
||||
gboolean can_start = TRUE;
|
||||
guint i;
|
||||
@@ -1569,6 +1666,7 @@ binder_radio_caps_manager_stop_sim_io_watch(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* binder_sim_card_remove_handlers zeros the id */
|
||||
binder_sim_card_remove_handlers(caps->simcard, caps->simcard_event_id +
|
||||
SIM_EVENT_IO_ACTIVE_CHANGED, 1);
|
||||
@@ -1580,6 +1678,7 @@ binder_radio_caps_tx_wait_sim_io_cb(
|
||||
BinderSimCard* simcard,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsObject* src = RADIO_CAPS(user_data);
|
||||
BinderRadioCapsManager* self = src->pub.mgr;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
@@ -1609,6 +1708,7 @@ binder_radio_caps_manager_start_sim_io_watch(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
caps->simcard_event_id[SIM_EVENT_IO_ACTIVE_CHANGED] =
|
||||
binder_sim_card_add_sim_io_active_changed_handler(caps->simcard,
|
||||
binder_radio_caps_tx_wait_sim_io_cb, caps);
|
||||
@@ -1619,6 +1719,7 @@ void
|
||||
binder_radio_caps_manager_start_transaction(
|
||||
BinderRadioCapsManager *self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const GPtrArray* list = self->caps_list;
|
||||
gboolean sim_io_active = FALSE;
|
||||
guint i, count = 0;
|
||||
@@ -1664,6 +1765,7 @@ binder_radio_caps_manager_set_order(
|
||||
BinderRadioCapsManager* self,
|
||||
const guint* order)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const GPtrArray* list = self->caps_list;
|
||||
guint i;
|
||||
|
||||
@@ -1688,6 +1790,7 @@ void
|
||||
binder_radio_caps_manager_check(
|
||||
BinderRadioCapsManager *self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (binder_radio_caps_manager_can_check(self)) {
|
||||
guint i;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
@@ -1726,6 +1829,7 @@ gboolean
|
||||
binder_radio_caps_manager_check_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsManager* self = RADIO_CAPS_MANAGER(user_data);
|
||||
|
||||
GASSERT(self->check_id);
|
||||
@@ -1739,6 +1843,7 @@ void
|
||||
binder_radio_caps_manager_recheck_later(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!binder_radio_caps_manager_tx_pending(self)) {
|
||||
if (self->check_id) {
|
||||
g_source_remove(self->check_id);
|
||||
@@ -1754,6 +1859,7 @@ void
|
||||
binder_radio_caps_manager_schedule_check(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!self->check_id && !binder_radio_caps_manager_tx_pending(self)) {
|
||||
self->check_id = g_idle_add(binder_radio_caps_manager_check_cb, self);
|
||||
}
|
||||
@@ -1765,6 +1871,7 @@ binder_caps_manager_request_sort(
|
||||
gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const BinderRadioCapsRequest* r1 = *(void**)a;
|
||||
const BinderRadioCapsRequest* r2 = *(void**)b;
|
||||
|
||||
@@ -1784,6 +1891,7 @@ void
|
||||
binder_radio_caps_manager_consider_requests(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
guint i;
|
||||
gboolean changed = FALSE;
|
||||
const GPtrArray* list = self->caps_list;
|
||||
@@ -1826,6 +1934,7 @@ void
|
||||
binder_radio_caps_manager_list_changed(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Order list elements according to slot numbers */
|
||||
g_ptr_array_sort(self->caps_list, binder_radio_caps_slot_compare);
|
||||
|
||||
@@ -1840,6 +1949,7 @@ binder_radio_caps_manager_add(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_ptr_array_add(self->caps_list, caps);
|
||||
binder_radio_caps_manager_list_changed(self);
|
||||
}
|
||||
@@ -1849,6 +1959,7 @@ void binder_radio_caps_manager_remove(
|
||||
BinderRadioCapsManager* self,
|
||||
BinderRadioCapsObject* caps)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (g_ptr_array_remove(self->caps_list, caps)) {
|
||||
binder_radio_caps_manager_list_changed(self);
|
||||
}
|
||||
@@ -1860,6 +1971,7 @@ binder_radio_caps_manager_add_tx_aborted_handler(
|
||||
BinderRadioCapsManagerFunc cb,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return (G_LIKELY(self) && G_LIKELY(cb)) ? g_signal_connect(self,
|
||||
CAPS_MANAGER_SIGNAL_ABORTED_NAME, G_CALLBACK(cb), user_data) : 0;
|
||||
}
|
||||
@@ -1870,6 +1982,7 @@ binder_radio_caps_manager_add_tx_done_handler(
|
||||
BinderRadioCapsManagerFunc cb,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return (G_LIKELY(self) && G_LIKELY(cb)) ? g_signal_connect(self,
|
||||
CAPS_MANAGER_SIGNAL_TX_DONE_NAME, G_CALLBACK(cb), user_data) : 0;
|
||||
}
|
||||
@@ -1879,6 +1992,7 @@ binder_radio_caps_manager_remove_handler(
|
||||
BinderRadioCapsManager* self,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
g_signal_handler_disconnect(self, id);
|
||||
}
|
||||
@@ -1890,6 +2004,7 @@ binder_radio_caps_manager_remove_handlers(
|
||||
gulong* ids,
|
||||
int count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_disconnect_handlers(self, ids, count);
|
||||
}
|
||||
|
||||
@@ -1897,6 +2012,7 @@ BinderRadioCapsManager*
|
||||
binder_radio_caps_manager_ref(
|
||||
BinderRadioCapsManager *self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_ref(RADIO_CAPS_MANAGER(self));
|
||||
}
|
||||
@@ -1907,6 +2023,7 @@ void
|
||||
binder_radio_caps_manager_unref(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(self)) {
|
||||
g_object_unref(RADIO_CAPS_MANAGER(self));
|
||||
}
|
||||
@@ -1916,6 +2033,7 @@ BinderRadioCapsManager*
|
||||
binder_radio_caps_manager_new(
|
||||
BinderDataManager* dm)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsManager* self = g_object_new(RADIO_CAPS_MANAGER_TYPE, 0);
|
||||
|
||||
self->data_manager = binder_data_manager_ref(dm);
|
||||
@@ -1927,6 +2045,7 @@ void
|
||||
binder_radio_caps_manager_init(
|
||||
BinderRadioCapsManager* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->caps_list = g_ptr_array_new();
|
||||
self->order_list = g_ptr_array_new();
|
||||
self->requests = g_ptr_array_new();
|
||||
@@ -1940,6 +2059,7 @@ void
|
||||
binder_radio_caps_manager_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsManager* self = RADIO_CAPS_MANAGER(object);
|
||||
|
||||
GASSERT(!self->caps_list->len);
|
||||
@@ -1961,6 +2081,7 @@ void
|
||||
binder_radio_caps_manager_class_init(
|
||||
BinderRadioCapsManagerClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GType type = G_OBJECT_CLASS_TYPE(klass);
|
||||
|
||||
G_OBJECT_CLASS(klass)->finalize = binder_radio_caps_manager_finalize;
|
||||
@@ -1982,6 +2103,7 @@ binder_radio_caps_request_new(
|
||||
enum ofono_radio_access_mode modes,
|
||||
enum ofono_slot_data_role role)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioCapsRequest* req = NULL;
|
||||
BinderRadioCapsObject* caps = binder_radio_caps_cast(pub);
|
||||
|
||||
@@ -2005,6 +2127,7 @@ void
|
||||
binder_radio_caps_request_free(
|
||||
BinderRadioCapsRequest* req)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (req) {
|
||||
/* In case if g_object_unref frees the caps */
|
||||
BinderRadioCapsManager* mgr =
|
||||
|
||||
@@ -50,6 +50,7 @@ void
|
||||
binder_radio_settings_callback_data_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderRadioSettingsCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -61,6 +62,7 @@ binder_radio_settings_later(
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettingsCbData* cbd = g_slice_new0(BinderRadioSettingsCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -77,6 +79,7 @@ gboolean
|
||||
binder_radio_settings_set_rat_mode_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettingsCbData* cbd = user_data;
|
||||
BinderRadioSettings* self = cbd->self;
|
||||
struct ofono_error error;
|
||||
@@ -95,6 +98,7 @@ binder_radio_settings_set_rat_mode(
|
||||
ofono_radio_settings_rat_mode_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettings* self = binder_radio_settings_get_data(rs);
|
||||
|
||||
DBG_(self, "%s", ofono_radio_access_mode_to_string(mode));
|
||||
@@ -109,6 +113,7 @@ gboolean
|
||||
binder_radio_settings_query_rat_mode_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettingsCbData* cbd = user_data;
|
||||
BinderRadioSettings* self = cbd->self;
|
||||
const enum ofono_radio_access_mode mode =
|
||||
@@ -129,6 +134,7 @@ binder_radio_settings_query_rat_mode(
|
||||
ofono_radio_settings_rat_mode_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettings* self = binder_radio_settings_get_data(rs);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -141,6 +147,7 @@ gboolean
|
||||
binder_radio_settings_query_available_rats_cb(
|
||||
gpointer data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettingsCbData* cbd = data;
|
||||
BinderRadioSettings* self = cbd->self;
|
||||
struct ofono_error error;
|
||||
@@ -159,6 +166,7 @@ binder_radio_settings_query_available_rats(
|
||||
ofono_radio_settings_available_rats_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettings* self = binder_radio_settings_get_data(rs);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -171,6 +179,7 @@ gboolean
|
||||
binder_radio_settings_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettings* self = user_data;
|
||||
|
||||
GASSERT(self->callback_id);
|
||||
@@ -186,6 +195,7 @@ binder_radio_settings_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderRadioSettings* self = g_new0(struct binder_radio_settings, 1);
|
||||
|
||||
@@ -204,6 +214,7 @@ void
|
||||
binder_radio_settings_remove(
|
||||
struct ofono_radio_settings* rs)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderRadioSettings* self = binder_radio_settings_get_data(rs);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -233,12 +244,14 @@ static const struct ofono_radio_settings_driver binder_radio_settings_driver = {
|
||||
void
|
||||
binder_radio_settings_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_radio_settings_driver_register(&binder_radio_settings_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_radio_settings_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_radio_settings_driver_unregister(&binder_radio_settings_driver);
|
||||
}
|
||||
|
||||
|
||||
489
src/binder_sim.c
489
src/binder_sim.c
File diff suppressed because it is too large
Load Diff
@@ -21,6 +21,7 @@
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_sim_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -59,6 +60,7 @@ typedef struct binder_sim_card_object {
|
||||
RadioRequest* status_req;
|
||||
RadioRequest* sub_req;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
guint sub_start_timer;
|
||||
gulong event_id[EVENT_COUNT];
|
||||
guint sim_io_idle_id;
|
||||
@@ -110,6 +112,7 @@ binder_sim_card_app_equal(
|
||||
const BinderSimCardApp* a1,
|
||||
const BinderSimCardApp* a2)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (a1 == a2) {
|
||||
return TRUE;
|
||||
} else if (!a1 || !a2) {
|
||||
@@ -132,6 +135,7 @@ binder_sim_card_status_compare(
|
||||
const BinderSimCardStatus* s1,
|
||||
const BinderSimCardStatus* s2)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (s1 == s2) {
|
||||
return 0;
|
||||
} else if (!s1 || !s2) {
|
||||
@@ -168,6 +172,7 @@ void
|
||||
binder_sim_card_status_free(
|
||||
BinderSimCardStatus* status)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (status) {
|
||||
if (status->apps) {
|
||||
int i;
|
||||
@@ -187,6 +192,7 @@ void
|
||||
binder_sim_card_tx_start(
|
||||
BinderSimCardObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RADIO_BLOCK block = radio_request_group_block_status(self->g);
|
||||
|
||||
if (block == RADIO_BLOCK_NONE) {
|
||||
@@ -201,6 +207,7 @@ void
|
||||
binder_sim_card_tx_check(
|
||||
BinderSimCardObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (radio_request_group_block_status(self->g) != RADIO_BLOCK_NONE) {
|
||||
BinderSimCard* card = &self->card;
|
||||
const BinderSimCardStatus* status = card->status;
|
||||
@@ -229,6 +236,7 @@ void
|
||||
binder_sim_card_subscription_done(
|
||||
BinderSimCardObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->sub_start_timer) {
|
||||
/* Don't need this timer anymore */
|
||||
g_source_remove(self->sub_start_timer);
|
||||
@@ -251,9 +259,12 @@ binder_sim_card_subscribe_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = THIS(user_data);
|
||||
guint32 code = self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_RESP_SET_UICC_SUBSCRIPTION: RADIO_RESP_SET_UICC_SUBSCRIPTION;
|
||||
|
||||
GASSERT(resp == RADIO_RESP_SET_UICC_SUBSCRIPTION);
|
||||
GASSERT(resp == code);
|
||||
GASSERT(status == RADIO_TX_STATUS_OK);
|
||||
GASSERT(error == RADIO_ERROR_NONE);
|
||||
GASSERT(self->sub_req == req);
|
||||
@@ -270,19 +281,30 @@ binder_sim_card_subscribe(
|
||||
BinderSimCardObject* self,
|
||||
int app_index)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCard* card = &self->card;
|
||||
GBinderWriter args;
|
||||
guint32 code = self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_REQ_SET_UICC_SUBSCRIPTION : RADIO_REQ_SET_UICC_SUBSCRIPTION;
|
||||
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_UICC_SUBSCRIPTION, &args,
|
||||
code, &args,
|
||||
binder_sim_card_subscribe_cb, NULL, self);
|
||||
|
||||
RadioSelectUiccSub* sub = gbinder_writer_new0(&args, RadioSelectUiccSub);
|
||||
|
||||
/* setUiccSubscription(serial, SelectUiccSub uiccSub) */
|
||||
DBG("%u,%d", card->slot, app_index);
|
||||
|
||||
sub->slot = card->slot;
|
||||
sub->appIndex = app_index;
|
||||
sub->actStatus = RADIO_UICC_SUB_ACTIVATE;
|
||||
gbinder_writer_append_buffer_object(&args, sub, sizeof(*sub));
|
||||
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
gbinder_writer_append_buffer_object(&args, sub, sizeof(*sub));
|
||||
} else {
|
||||
gbinder_writer_append_parcelable(&args, sub, sizeof(*sub));
|
||||
}
|
||||
|
||||
radio_request_set_retry(req, UICC_SUBSCRIPTION_RETRY_MS, -1);
|
||||
radio_request_set_timeout(req, UICC_SUBSCRIPTION_TIMEOUT_MS);
|
||||
@@ -304,6 +326,7 @@ int
|
||||
binder_sim_card_select_app(
|
||||
const BinderSimCardStatus *status)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
int i, selected_app = -1;
|
||||
|
||||
for (i = 0; i < status->num_apps; i++) {
|
||||
@@ -326,6 +349,7 @@ void
|
||||
binder_sim_card_update_app(
|
||||
BinderSimCardObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCard* card = &self->card;
|
||||
const BinderSimCardApp* old_app = card->app;
|
||||
const BinderSimCardStatus* status = card->status;
|
||||
@@ -364,6 +388,7 @@ gboolean
|
||||
binder_sim_card_sub_start_timeout(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = THIS(user_data);
|
||||
|
||||
DBG("%u", self->card.slot);
|
||||
@@ -379,6 +404,7 @@ binder_sim_card_update_status(
|
||||
BinderSimCardObject* self,
|
||||
BinderSimCardStatus* status)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCard* card = &self->card;
|
||||
const int diff = binder_sim_card_status_compare(card->status, status);
|
||||
|
||||
@@ -429,6 +455,7 @@ BinderSimCardStatus*
|
||||
binder_sim_card_status_new(
|
||||
const RadioCardStatus* radio_status)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
const guint num_apps = radio_status->apps.count;
|
||||
BinderSimCardStatus* status = g_malloc0(sizeof(BinderSimCardStatus) +
|
||||
num_apps * sizeof(BinderSimCardApp));
|
||||
@@ -473,6 +500,90 @@ binder_sim_card_status_new(
|
||||
return status;
|
||||
}
|
||||
|
||||
static
|
||||
BinderSimCardStatus*
|
||||
binder_sim_card_status_new_from_aidl(
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gint32 card_state, pin_state;
|
||||
gint32 gsm_umts_index, cdma_index, ims_index;
|
||||
guint32 num_apps = 0;
|
||||
gsize parcel_size = binder_read_parcelable_size(reader);
|
||||
BinderSimCardStatus* status = NULL;
|
||||
char* atr, *iccid, *eid = NULL;
|
||||
|
||||
if (!parcel_size) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gbinder_reader_read_int32(reader, &card_state);
|
||||
gbinder_reader_read_int32(reader, &pin_state);
|
||||
gbinder_reader_read_int32(reader, &gsm_umts_index);
|
||||
gbinder_reader_read_int32(reader, &cdma_index);
|
||||
gbinder_reader_read_int32(reader, &ims_index);
|
||||
gbinder_reader_read_uint32(reader, &num_apps);
|
||||
|
||||
DBG("card_state=%d, universal_pin_state=%d, gsm_umts_index=%d, "
|
||||
"ims_index=%d, cdma_index=%d, num_apps=%d",
|
||||
card_state, pin_state, gsm_umts_index, cdma_index,
|
||||
ims_index, num_apps);
|
||||
|
||||
/* The observed size of parcel for empty SIM slot */
|
||||
GASSERT(parcel_size >= 64);
|
||||
|
||||
status = g_malloc0(sizeof(BinderSimCardStatus) +
|
||||
num_apps * sizeof(BinderSimCardApp));
|
||||
|
||||
status->card_state = card_state;
|
||||
status->pin_state = pin_state;
|
||||
status->gsm_umts_index = gsm_umts_index;
|
||||
status->ims_index = ims_index;
|
||||
|
||||
if ((status->num_apps = num_apps) > 0) {
|
||||
guint i;
|
||||
|
||||
status->apps = (BinderSimCardApp*)(status + 1);
|
||||
for (i = 0; i < num_apps; i++) {
|
||||
BinderSimCardApp* app = status->apps + i;
|
||||
|
||||
gsize app_parcel_size = binder_read_parcelable_size(reader);
|
||||
GASSERT(app_parcel_size >= sizeof(guint32) * 8);
|
||||
|
||||
gbinder_reader_read_int32(reader, (gint32*)&app->app_type);
|
||||
gbinder_reader_read_int32(reader, (gint32*)&app->app_state);
|
||||
gbinder_reader_read_int32(reader, (gint32*)&app->perso_substate);
|
||||
|
||||
app->aid = gbinder_reader_read_string16(reader);
|
||||
app->label = gbinder_reader_read_string16(reader);
|
||||
|
||||
gbinder_reader_read_bool(reader, (gboolean*)&app->pin_replaced);
|
||||
gbinder_reader_read_int32(reader, (gint32*)&app->pin1_state);
|
||||
gbinder_reader_read_int32(reader, (gint32*)&app->pin2_state);
|
||||
|
||||
DBG("app[%d]: app_parcel_size=%d, type=%d, state=%d, perso_substate=%d, "
|
||||
"aid_ptr=%s, label=%s, pin1_replaced=%d, pin1=%d, pin2=%d", i,
|
||||
app_parcel_size, app->app_type, app->app_state, app->perso_substate,
|
||||
app->aid, app->label, app->pin_replaced, app->pin1_state,
|
||||
app->pin2_state);
|
||||
}
|
||||
}
|
||||
|
||||
/* Not used by the plugin, but useful to visually verify the parsing */
|
||||
atr = gbinder_reader_read_string16(reader);
|
||||
iccid = gbinder_reader_read_string16(reader);
|
||||
eid = gbinder_reader_read_string16(reader);
|
||||
|
||||
DBG("atr=%s, iccid=%s, eid=%s", atr ? atr : "(null)",
|
||||
iccid ? iccid : "(null)", eid ? eid : "(null)");
|
||||
|
||||
g_free(atr);
|
||||
g_free(iccid);
|
||||
g_free(eid);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_sim_card_status_cb(
|
||||
@@ -483,6 +594,7 @@ binder_sim_card_status_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = THIS(user_data);
|
||||
|
||||
GASSERT(self->status_req);
|
||||
@@ -493,34 +605,46 @@ binder_sim_card_status_cb(
|
||||
const RadioCardStatus* status_1_0;
|
||||
const RadioCardStatus_1_2* status_1_2;
|
||||
const RadioCardStatus_1_4* status_1_4;
|
||||
const RadioCardStatus_1_5* status_1_5;
|
||||
BinderSimCardStatus* status = NULL;
|
||||
GBinderReader reader;
|
||||
|
||||
gbinder_reader_copy(&reader, args);
|
||||
switch (resp) {
|
||||
case RADIO_RESP_GET_ICC_CARD_STATUS:
|
||||
status_1_0 = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioCardStatus);
|
||||
if (status_1_0) {
|
||||
status = binder_sim_card_status_new(status_1_0);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
switch (resp) {
|
||||
case RADIO_RESP_GET_ICC_CARD_STATUS:
|
||||
status_1_0 = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioCardStatus);
|
||||
if (status_1_0) {
|
||||
status = binder_sim_card_status_new(status_1_0);
|
||||
}
|
||||
break;
|
||||
case RADIO_RESP_GET_ICC_CARD_STATUS_1_2:
|
||||
status_1_2 = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioCardStatus_1_2);
|
||||
if (status_1_2) {
|
||||
status = binder_sim_card_status_new(&status_1_2->base);
|
||||
}
|
||||
break;
|
||||
case RADIO_RESP_GET_ICC_CARD_STATUS_RESPONSE_1_4:
|
||||
status_1_4 = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioCardStatus_1_4);
|
||||
if (status_1_4) {
|
||||
status = binder_sim_card_status_new(&status_1_4->base);
|
||||
}
|
||||
break;
|
||||
case RADIO_RESP_GET_ICC_CARD_STATUS_1_5:
|
||||
status_1_5 = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioCardStatus_1_5);
|
||||
if (status_1_5) {
|
||||
status = binder_sim_card_status_new(&status_1_5->base.base);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ofono_warn("Unexpected getIccCardStatus response %u", resp);
|
||||
}
|
||||
break;
|
||||
case RADIO_RESP_GET_ICC_CARD_STATUS_1_2:
|
||||
status_1_2 = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioCardStatus_1_2);
|
||||
if (status_1_2) {
|
||||
status = binder_sim_card_status_new(&status_1_2->base);
|
||||
}
|
||||
break;
|
||||
case RADIO_RESP_GET_ICC_CARD_STATUS_RESPONSE_1_4:
|
||||
status_1_4 = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioCardStatus_1_4);
|
||||
if (status_1_4) {
|
||||
status = binder_sim_card_status_new(&status_1_4->base);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ofono_warn("Unexpected getIccCardStatus response %u", resp);
|
||||
} else {
|
||||
status = binder_sim_card_status_new_from_aidl(&reader);
|
||||
}
|
||||
|
||||
if (status) {
|
||||
@@ -535,12 +659,16 @@ void
|
||||
binder_sim_card_get_status(
|
||||
BinderSimCardObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (self->status_req) {
|
||||
/* Retry right away, don't wait for retry timeout to expire */
|
||||
radio_request_retry(self->status_req);
|
||||
} else {
|
||||
guint32 code = self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_REQ_GET_ICC_CARD_STATUS : RADIO_REQ_GET_ICC_CARD_STATUS;
|
||||
|
||||
self->status_req = radio_request_new2(self->g,
|
||||
RADIO_REQ_GET_ICC_CARD_STATUS, NULL,
|
||||
code, NULL,
|
||||
binder_sim_card_status_cb, NULL, self);
|
||||
|
||||
/*
|
||||
@@ -558,6 +686,7 @@ void
|
||||
binder_sim_card_update_sim_io_active(
|
||||
BinderSimCardObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* SIM I/O is considered active for certain period of time after
|
||||
* the last request has completed. That's because SIM_IO requests
|
||||
* are usually submitted in large quantities and quick succession.
|
||||
@@ -581,6 +710,7 @@ gboolean
|
||||
binder_sim_card_sim_io_idle_cb(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = THIS(user_data);
|
||||
|
||||
if (++(self->sim_io_idle_count) >= SIM_IO_IDLE_LOOPS) {
|
||||
@@ -601,6 +731,7 @@ binder_sim_card_status_changed(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_sim_card_get_status(THIS(user_data));
|
||||
}
|
||||
|
||||
@@ -613,21 +744,34 @@ binder_sim_card_new(
|
||||
RadioClient* client,
|
||||
guint slot)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = g_object_new(THIS_TYPE, NULL);
|
||||
BinderSimCard *card = &self->card;
|
||||
|
||||
DBG("%u", slot);
|
||||
card->slot = slot;
|
||||
self->g = radio_request_group_new(client); /* Keeps ref to client */
|
||||
self->interface_aidl = radio_client_aidl_interface(client);
|
||||
|
||||
self->event_id[EVENT_SIM_STATUS_CHANGED] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_SIM_STATUS_CHANGED,
|
||||
binder_sim_card_status_changed, self);
|
||||
self->event_id[EVENT_UICC_SUBSCRIPTION_STATUS_CHANGED] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_SUBSCRIPTION_STATUS_CHANGED,
|
||||
binder_sim_card_status_changed, self);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
self->event_id[EVENT_SIM_STATUS_CHANGED] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_SIM_STATUS_CHANGED,
|
||||
binder_sim_card_status_changed, self);
|
||||
self->event_id[EVENT_UICC_SUBSCRIPTION_STATUS_CHANGED] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_SUBSCRIPTION_STATUS_CHANGED,
|
||||
binder_sim_card_status_changed, self);
|
||||
} else {
|
||||
self->event_id[EVENT_SIM_STATUS_CHANGED] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_SIM_IND_SIM_STATUS_CHANGED,
|
||||
binder_sim_card_status_changed, self);
|
||||
self->event_id[EVENT_UICC_SUBSCRIPTION_STATUS_CHANGED] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_SIM_IND_SUBSCRIPTION_STATUS_CHANGED,
|
||||
binder_sim_card_status_changed, self);
|
||||
}
|
||||
binder_sim_card_get_status(self);
|
||||
return card;
|
||||
}
|
||||
@@ -636,6 +780,7 @@ BinderSimCard*
|
||||
binder_sim_card_ref(
|
||||
BinderSimCard* card)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(card)) {
|
||||
g_object_ref(THIS(card));
|
||||
}
|
||||
@@ -646,6 +791,7 @@ void
|
||||
binder_sim_card_unref(
|
||||
BinderSimCard* card)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(card)) {
|
||||
g_object_unref(THIS(card));
|
||||
}
|
||||
@@ -655,6 +801,7 @@ void
|
||||
binder_sim_card_reset(
|
||||
BinderSimCard* card)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(card)) {
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
BinderSimCardStatus* status = g_new0(BinderSimCardStatus, 1);
|
||||
@@ -672,6 +819,7 @@ void
|
||||
binder_sim_card_request_status(
|
||||
BinderSimCard* card)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(card)) {
|
||||
binder_sim_card_get_status(binder_sim_card_cast(card));
|
||||
}
|
||||
@@ -682,6 +830,7 @@ binder_sim_card_sim_io_started(
|
||||
BinderSimCard* card,
|
||||
gpointer key)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
if (G_LIKELY(self) && G_LIKELY(key)) {
|
||||
@@ -700,6 +849,7 @@ binder_sim_card_sim_io_finished(
|
||||
BinderSimCard* card,
|
||||
gpointer key)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (G_LIKELY(card) && G_LIKELY(key)) {
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
@@ -721,6 +871,7 @@ gboolean
|
||||
binder_sim_card_ready(
|
||||
BinderSimCard* card)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return card && card->app &&
|
||||
((card->app->app_state == RADIO_APP_STATE_READY) ||
|
||||
(card->app->app_state == RADIO_APP_STATE_SUBSCRIPTION_PERSO &&
|
||||
@@ -733,6 +884,7 @@ binder_sim_card_add_status_received_handler(
|
||||
BinderSimCardFunc fn,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
|
||||
@@ -745,6 +897,7 @@ binder_sim_card_add_status_changed_handler(
|
||||
BinderSimCardFunc fn,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
|
||||
@@ -757,6 +910,7 @@ binder_sim_card_add_state_changed_handler(
|
||||
BinderSimCardFunc fn,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
|
||||
@@ -769,6 +923,7 @@ binder_sim_card_add_app_changed_handler(
|
||||
BinderSimCardFunc fn,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
|
||||
@@ -781,6 +936,7 @@ binder_sim_card_add_sim_io_active_changed_handler(
|
||||
BinderSimCardFunc fn,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
return (G_LIKELY(self) && G_LIKELY(fn)) ? g_signal_connect(self,
|
||||
@@ -792,6 +948,7 @@ binder_sim_card_remove_handler(
|
||||
BinderSimCard* card,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = binder_sim_card_cast(card);
|
||||
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
@@ -805,6 +962,7 @@ binder_sim_card_remove_handlers(
|
||||
gulong* ids,
|
||||
int n)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_disconnect_handlers(binder_sim_card_cast(card), ids, n);
|
||||
}
|
||||
|
||||
@@ -817,6 +975,7 @@ void
|
||||
binder_sim_card_init(
|
||||
BinderSimCardObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
self->sim_io_pending = g_hash_table_new(g_direct_hash, g_direct_equal);
|
||||
}
|
||||
|
||||
@@ -825,6 +984,7 @@ void
|
||||
binder_sim_card_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimCardObject* self = THIS(object);
|
||||
BinderSimCard* card = &self->card;
|
||||
|
||||
@@ -853,6 +1013,7 @@ void
|
||||
binder_sim_card_class_init(
|
||||
BinderSimCardObjectClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
G_OBJECT_CLASS(klass)->finalize = binder_sim_card_finalize;
|
||||
NEW_SIGNAL_(klass,STATUS_RECEIVED);
|
||||
NEW_SIGNAL(klass,STATUS);
|
||||
|
||||
@@ -51,6 +51,7 @@ BinderSimSettingsObject*
|
||||
binder_sim_settings_cast(
|
||||
BinderSimSettings* settings)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return G_LIKELY(settings) ?
|
||||
THIS(G_CAST(settings, BinderSimSettingsObject, pub)) :
|
||||
NULL;
|
||||
@@ -62,6 +63,7 @@ binder_sim_settings_imsi_changed(
|
||||
struct ofono_watch* watch,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettingsObject* self = THIS(user_data);
|
||||
|
||||
if (g_strcmp0(self->imsi, watch->imsi)) {
|
||||
@@ -83,6 +85,7 @@ binder_sim_settings_new(
|
||||
const char* path,
|
||||
enum ofono_radio_access_mode techs)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettings* settings = NULL;
|
||||
|
||||
if (G_LIKELY(path)) {
|
||||
@@ -104,6 +107,7 @@ BinderSimSettings*
|
||||
binder_sim_settings_ref(
|
||||
BinderSimSettings* settings)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettingsObject* self = binder_sim_settings_cast(settings);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -116,6 +120,7 @@ void
|
||||
binder_sim_settings_unref(
|
||||
BinderSimSettings* settings)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettingsObject* self = binder_sim_settings_cast(settings);
|
||||
|
||||
if (G_LIKELY(self)) {
|
||||
@@ -128,6 +133,7 @@ binder_sim_settings_set_pref(
|
||||
BinderSimSettings* settings,
|
||||
enum ofono_radio_access_mode pref)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettingsObject* self = binder_sim_settings_cast(settings);
|
||||
|
||||
if (G_LIKELY(self) && settings->pref != pref) {
|
||||
@@ -144,6 +150,7 @@ binder_sim_settings_add_property_handler(
|
||||
BinderSimSettingsPropertyFunc callback,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettingsObject* self = binder_sim_settings_cast(settings);
|
||||
|
||||
return G_LIKELY(self) ? binder_base_add_property_handler(&self->base,
|
||||
@@ -155,6 +162,7 @@ binder_sim_settings_remove_handler(
|
||||
BinderSimSettings* settings,
|
||||
gulong id)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettingsObject* self = binder_sim_settings_cast(settings);
|
||||
|
||||
if (G_LIKELY(self) && G_LIKELY(id)) {
|
||||
@@ -168,6 +176,7 @@ binder_sim_settings_remove_handlers(
|
||||
gulong* ids,
|
||||
int count)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_disconnect_handlers(binder_sim_settings_cast(settings), ids, count);
|
||||
}
|
||||
|
||||
@@ -180,6 +189,7 @@ void
|
||||
binder_sim_settings_object_init(
|
||||
BinderSimSettingsObject* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -187,6 +197,7 @@ void
|
||||
binder_sim_settings_object_finalize(
|
||||
GObject* object)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSimSettingsObject* self = THIS(object);
|
||||
|
||||
ofono_watch_remove_all_handlers(self->watch, self->watch_event_id);
|
||||
@@ -200,6 +211,7 @@ void
|
||||
binder_sim_settings_object_class_init(
|
||||
BinderSimSettingsObjectClass* klass)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
G_OBJECT_CLASS(klass)->finalize = binder_sim_settings_object_finalize;
|
||||
BINDER_BASE_CLASS(klass)->public_offset =
|
||||
G_STRUCT_OFFSET(BinderSimSettingsObject, pub);
|
||||
|
||||
423
src/binder_sms.c
423
src/binder_sms.c
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* oFono - Open Source Telephony - binder based adaptation
|
||||
*
|
||||
* Copyright (C) 2024 Slava Monich <slava@monich.com>
|
||||
* Copyright (C) 2021-2022 Jolla Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -22,7 +23,7 @@
|
||||
#include "binder_ext_slot.h"
|
||||
#include "binder_ext_sms.h"
|
||||
|
||||
#include <ofono/log.h>
|
||||
#include <ofono/ims.h>
|
||||
#include <ofono/misc.h>
|
||||
#include <ofono/sim.h>
|
||||
#include <ofono/sms.h>
|
||||
@@ -31,6 +32,7 @@
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_messaging_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -81,6 +83,7 @@ typedef struct binder_sms {
|
||||
BinderExtSms* sms_ext;
|
||||
BinderImsReg* ims_reg;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
gulong ext_event[SMS_EXT_EVENT_COUNT];
|
||||
gulong radio_event[SMS_RADIO_EVENT_COUNT];
|
||||
guint register_id;
|
||||
@@ -142,6 +145,7 @@ binder_sms_cbd_new(
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsCbData* cbd = g_slice_new0(BinderSmsCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -155,6 +159,7 @@ void
|
||||
binder_sms_cbd_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderSmsCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -168,6 +173,7 @@ binder_sms_submit_cbd_new(
|
||||
ofono_sms_submit_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsSubmitCbData* cbd = g_slice_new0(BinderSmsSubmitCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -184,6 +190,7 @@ void
|
||||
binder_sms_submit_cbd_free(
|
||||
gpointer data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsSubmitCbData* cbd = data;
|
||||
|
||||
g_free(cbd->pdu);
|
||||
@@ -196,6 +203,7 @@ binder_sms_sim_read_data_new(
|
||||
BinderSms* self,
|
||||
int rec)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsSimReadData* rd = g_slice_new0(BinderSmsSimReadData);
|
||||
|
||||
rd->self = self;
|
||||
@@ -208,6 +216,7 @@ void
|
||||
binder_sms_sim_read_data_free(
|
||||
BinderSmsSimReadData* rd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gutil_slice_free(rd);
|
||||
}
|
||||
|
||||
@@ -221,12 +230,16 @@ binder_sms_sca_set_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsCbData* cbd = user_data;
|
||||
ofono_sms_sca_set_cb_t cb = cbd->cb.sca_set;
|
||||
struct ofono_error err;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SET_SMSC_ADDRESS) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_RESP_SET_SMSC_ADDRESS :
|
||||
RADIO_RESP_SET_SMSC_ADDRESS;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cb(binder_error_ok(&err), cbd->data);
|
||||
return;
|
||||
@@ -250,19 +263,27 @@ binder_sms_sca_set(
|
||||
ofono_sms_sca_set_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = binder_sms_get_data(sms);
|
||||
char* tmp = NULL;
|
||||
GBinderWriter writer;
|
||||
const char* number = (sca->type == OFONO_NUMBER_TYPE_INTERNATIONAL) ?
|
||||
(tmp = g_strconcat("+", sca->number, NULL)) : sca->number;
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_REQ_SET_SMSC_ADDRESS :
|
||||
RADIO_REQ_SET_SMSC_ADDRESS;
|
||||
|
||||
/* setSmscAddress(int32_t serial, string smsc); */
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SET_SMSC_ADDRESS, &writer, binder_sms_sca_set_cb,
|
||||
code, &writer, binder_sms_sca_set_cb,
|
||||
binder_sms_cbd_free, binder_sms_cbd_new(self, BINDER_CB(cb), data));
|
||||
|
||||
DBG_(self, "setting sca: %s", number);
|
||||
binder_append_hidl_string(&writer, number);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
binder_append_hidl_string(&writer, number);
|
||||
} else {
|
||||
gbinder_writer_append_string16(&writer, number);
|
||||
}
|
||||
|
||||
if (!radio_request_submit(req)) {
|
||||
struct ofono_error err;
|
||||
@@ -284,30 +305,42 @@ binder_sms_sca_query_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsCbData* cbd = user_data;
|
||||
BinderSms* self = cbd->self;
|
||||
ofono_sms_sca_query_cb_t cb = cbd->cb.sca_query;
|
||||
struct ofono_error err;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_GET_SMSC_ADDRESS) {
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_RESP_GET_SMSC_ADDRESS :
|
||||
RADIO_RESP_GET_SMSC_ADDRESS;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
GBinderReader reader;
|
||||
const char* smsc;
|
||||
char* smsc;
|
||||
|
||||
gbinder_reader_copy(&reader, args);
|
||||
smsc = gbinder_reader_read_hidl_string_c(&reader);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
smsc = gbinder_reader_read_hidl_string(&reader);
|
||||
} else {
|
||||
smsc = gbinder_reader_read_string16(&reader);
|
||||
}
|
||||
if (smsc) {
|
||||
struct ofono_phone_number sca;
|
||||
const char* str = smsc;
|
||||
|
||||
if (smsc[0] == '+') {
|
||||
smsc++;
|
||||
if (str[0] == '+') {
|
||||
str++;
|
||||
sca.type = OFONO_NUMBER_TYPE_INTERNATIONAL;
|
||||
} else {
|
||||
sca.type = OFONO_NUMBER_TYPE_UNKNOWN;
|
||||
}
|
||||
g_strlcpy(sca.number, smsc, sizeof(sca.number));
|
||||
g_strlcpy(sca.number, str, sizeof(sca.number));
|
||||
DBG("csca_query_cb: %s, %d", sca.number, sca.type);
|
||||
cb(binder_error_ok(&err), &sca, cbd->data);
|
||||
|
||||
g_free(smsc);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
@@ -330,9 +363,13 @@ binder_sms_sca_query(
|
||||
ofono_sms_sca_query_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = binder_sms_get_data(sms);
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_REQ_GET_SMSC_ADDRESS :
|
||||
RADIO_REQ_GET_SMSC_ADDRESS;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_GET_SMSC_ADDRESS, NULL, binder_sms_sca_query_cb,
|
||||
code, NULL, binder_sms_sca_query_cb,
|
||||
binder_sms_cbd_free, binder_sms_cbd_new(self, BINDER_CB(cb), data));
|
||||
|
||||
DBG_(self, "sending csca_query");
|
||||
@@ -349,7 +386,9 @@ gboolean
|
||||
binder_sms_can_send_ims_message(
|
||||
BinderSms* self)
|
||||
{
|
||||
return self->ims_reg && self->ims_reg->registered;
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return self->ims_reg && self->ims_reg->registered &&
|
||||
(self->ims_reg->caps & OFONO_IMS_SMS_CAPABLE);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -357,6 +396,7 @@ gboolean
|
||||
binder_sms_can_send_ext_message(
|
||||
BinderSms* self)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return self->sms_ext && (!(binder_ext_sms_get_interface_flags
|
||||
(self->sms_ext) & BINDER_EXT_SMS_INTERFACE_FLAG_IMS_REQUIRED) ||
|
||||
binder_sms_can_send_ims_message(self));
|
||||
@@ -372,13 +412,17 @@ binder_sms_submit_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsSubmitCbData* cbd = user_data;
|
||||
BinderSms* self = cbd->self;
|
||||
ofono_sms_submit_cb_t cb = cbd->cb;
|
||||
struct ofono_error err;
|
||||
|
||||
binder_error_init_failure(&err);
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
const gboolean ims = (resp == RADIO_RESP_SEND_IMS_SMS);
|
||||
const gboolean ims = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
((RADIO_MESSAGING_RESP)resp == RADIO_MESSAGING_RESP_SEND_IMS_SMS) :
|
||||
(resp == RADIO_RESP_SEND_IMS_SMS);
|
||||
|
||||
/*
|
||||
* Luckily, all 3 responses that we're handling here have the
|
||||
@@ -388,47 +432,95 @@ binder_sms_submit_cb(
|
||||
* sendSMSExpectMoreResponse(RadioResponseInfo, SendSmsResult sms);
|
||||
* sendImsSmsResponse(RadioResponseInfo, SendSmsResult sms);
|
||||
*/
|
||||
if (resp == RADIO_RESP_SEND_SMS ||
|
||||
resp == RADIO_RESP_SEND_SMS_EXPECT_MORE ||
|
||||
resp == RADIO_RESP_SEND_IMS_SMS) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
const RadioSendSmsResult* res;
|
||||
GBinderReader reader;
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
if (resp == RADIO_RESP_SEND_SMS ||
|
||||
resp == RADIO_RESP_SEND_SMS_EXPECT_MORE ||
|
||||
resp == RADIO_RESP_SEND_IMS_SMS) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
const RadioSendSmsResult* res;
|
||||
GBinderReader reader;
|
||||
|
||||
gbinder_reader_copy(&reader, args);
|
||||
res = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioSendSmsResult);
|
||||
gbinder_reader_copy(&reader, args);
|
||||
res = gbinder_reader_read_hidl_struct(&reader,
|
||||
RadioSendSmsResult);
|
||||
|
||||
if (res) {
|
||||
DBG("%ssms msg ref: %d, ack: %s err: %d", ims ? "ims " : "",
|
||||
res->messageRef, res->ackPDU.data.str, res->errorCode);
|
||||
if (res) {
|
||||
DBG("%ssms msg ref: %d, ack: %s err: %d", ims ? "ims " : "",
|
||||
res->messageRef, res->ackPDU.data.str, res->errorCode);
|
||||
|
||||
/*
|
||||
* Error is -1 if unknown or not applicable,
|
||||
* otherwise 3GPP 27.005, 3.2.5
|
||||
*/
|
||||
if (res->errorCode > 0) {
|
||||
err.type = OFONO_ERROR_TYPE_CMS;
|
||||
err.error = res->errorCode;
|
||||
} else {
|
||||
/* Success */
|
||||
cb(binder_error_ok(&err), res->messageRef, cbd->data);
|
||||
return;
|
||||
/*
|
||||
* Error is -1 if unknown or not applicable,
|
||||
* otherwise 3GPP 27.005, 3.2.5
|
||||
*/
|
||||
if (res->errorCode > 0) {
|
||||
err.type = OFONO_ERROR_TYPE_CMS;
|
||||
err.error = res->errorCode;
|
||||
} else {
|
||||
/* Success */
|
||||
cb(binder_error_ok(&err), res->messageRef, cbd->data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ofono_error("%ssms send error %s", ims ? "ims " : "",
|
||||
binder_radio_error_string(error));
|
||||
}
|
||||
if (ims && cbd->pdu) {
|
||||
/* Failed to send IMS SMS, try GSM */
|
||||
binder_sms_send(cbd->self, cbd->pdu, cbd->pdu_len,
|
||||
cbd->tpdu_len, BINDER_SMS_SEND_FLAG_FORCE_GSM,
|
||||
cbd->cb, cbd->data);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
ofono_error("%ssms send error %s", ims ? "ims " : "",
|
||||
binder_radio_error_string(error));
|
||||
}
|
||||
if (ims && cbd->pdu) {
|
||||
/* Failed to send IMS SMS, try GSM */
|
||||
binder_sms_send(cbd->self, cbd->pdu, cbd->pdu_len,
|
||||
cbd->tpdu_len, BINDER_SMS_SEND_FLAG_FORCE_GSM,
|
||||
cbd->cb, cbd->data);
|
||||
return;
|
||||
ofono_error("Unexpected send sms response %d", resp);
|
||||
}
|
||||
} else {
|
||||
ofono_error("Unexpected send sms response %d", resp);
|
||||
if ((RADIO_MESSAGING_RESP)resp == RADIO_MESSAGING_RESP_SEND_SMS ||
|
||||
(RADIO_MESSAGING_RESP)resp == RADIO_MESSAGING_RESP_SEND_SMS_EXPECT_MORE ||
|
||||
(RADIO_MESSAGING_RESP)resp == RADIO_MESSAGING_RESP_SEND_IMS_SMS) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
GBinderReader reader;
|
||||
|
||||
gbinder_reader_copy(&reader, args);
|
||||
|
||||
if (binder_read_parcelable_size(&reader)) {
|
||||
gint32 message_ref;
|
||||
char* ack_pdu = NULL;
|
||||
gint32 error_code;
|
||||
|
||||
gbinder_reader_read_int32(&reader, &message_ref);
|
||||
ack_pdu = gbinder_reader_read_string16(&reader);
|
||||
gbinder_reader_read_int32(&reader, &error_code);
|
||||
DBG("%ssms msg ref: %d, ack: %s err: %d", ims ? "ims " : "",
|
||||
message_ref, ack_pdu, error_code);
|
||||
g_free(ack_pdu);
|
||||
|
||||
/*
|
||||
* Error is -1 if unknown or not applicable,
|
||||
* otherwise 3GPP 27.005, 3.2.5
|
||||
*/
|
||||
if (error_code > 0) {
|
||||
err.type = OFONO_ERROR_TYPE_CMS;
|
||||
err.error = error_code;
|
||||
} else {
|
||||
/* Success */
|
||||
cb(binder_error_ok(&err), message_ref, cbd->data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ofono_error("%ssms send error %s", ims ? "ims " : "",
|
||||
binder_radio_error_string(error));
|
||||
}
|
||||
if (ims && cbd->pdu) {
|
||||
/* Failed to send IMS SMS, try GSM */
|
||||
binder_sms_send(cbd->self, cbd->pdu, cbd->pdu_len,
|
||||
cbd->tpdu_len, BINDER_SMS_SEND_FLAG_FORCE_GSM,
|
||||
cbd->cb, cbd->data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Error path */
|
||||
@@ -443,6 +535,7 @@ binder_sms_submit_ext_cb(
|
||||
guint msg_ref,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsSubmitCbData* cbd = user_data;
|
||||
BinderSms* self = cbd->self;
|
||||
struct ofono_error err;
|
||||
@@ -489,6 +582,7 @@ binder_sms_gsm_message(
|
||||
int tpdu_len,
|
||||
const GBinderParent* parent)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/*
|
||||
* SMSC address:
|
||||
*
|
||||
@@ -530,6 +624,7 @@ binder_sms_ims_message(
|
||||
int pdu_len,
|
||||
int tpdu_len)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RadioImsSmsMessage* ims = gbinder_writer_new0(writer, RadioImsSmsMessage);
|
||||
RadioGsmSmsMessage* gsm = gbinder_writer_new0(writer, RadioGsmSmsMessage);
|
||||
GBinderParent p;
|
||||
@@ -547,6 +642,81 @@ binder_sms_ims_message(
|
||||
binder_sms_gsm_message(self, writer, gsm, pdu, pdu_len, tpdu_len, &p);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_sms_gsm_message_aidl(
|
||||
BinderSms* self,
|
||||
GBinderWriter* writer,
|
||||
const unsigned char* pdu,
|
||||
int pdu_len,
|
||||
int tpdu_len)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/*
|
||||
* SMSC address:
|
||||
*
|
||||
* smsc_len == 1, then zero-length SMSC was specified but IRadio
|
||||
* interface expects an empty string for default SMSC.
|
||||
*/
|
||||
char* tpdu;
|
||||
int smsc_len = pdu_len - tpdu_len;
|
||||
gint32 initial_size;
|
||||
|
||||
/* PDU is sent as an ASCII hex string */
|
||||
tpdu = g_malloc0(sizeof(char) * (tpdu_len * 2 + 1));
|
||||
ofono_encode_hex(pdu + smsc_len, tpdu_len, tpdu);
|
||||
DBG_(self, "%s", tpdu);
|
||||
|
||||
/* Non-null parcelable */
|
||||
gbinder_writer_append_int32(writer, 1);
|
||||
initial_size = gbinder_writer_bytes_written(writer);
|
||||
/* Dummy parcelable size, replaced at the end */
|
||||
gbinder_writer_append_int32(writer, -1);
|
||||
|
||||
gbinder_writer_append_string16_len(writer, (const char*) pdu, smsc_len);
|
||||
gbinder_writer_append_string16_len(writer, tpdu, tpdu_len * 2 + 1);
|
||||
|
||||
/* Overwrite parcelable size */
|
||||
gbinder_writer_overwrite_int32(writer, initial_size,
|
||||
gbinder_writer_bytes_written(writer) - initial_size);
|
||||
|
||||
g_free(tpdu);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_sms_ims_message_aidl(
|
||||
BinderSms* self,
|
||||
GBinderWriter* writer,
|
||||
const unsigned char* pdu,
|
||||
int pdu_len,
|
||||
int tpdu_len)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
gint32 initial_size;
|
||||
/* Non-null parcelable */
|
||||
gbinder_writer_append_int32(writer, 1);
|
||||
initial_size = gbinder_writer_bytes_written(writer);
|
||||
/* Dummy parcelable size, replaced at the end */
|
||||
gbinder_writer_append_int32(writer, -1);
|
||||
|
||||
gbinder_writer_append_int32(writer, RADIO_TECH_FAMILY_3GPP2);
|
||||
gbinder_writer_append_bool(writer, FALSE);
|
||||
gbinder_writer_append_int32(writer, 0);
|
||||
|
||||
/* CDMA message count */
|
||||
gbinder_writer_append_int32(writer, 0);
|
||||
|
||||
/* GSM message count */
|
||||
gbinder_writer_append_int32(writer, 1);
|
||||
|
||||
/* Overwrite parcelable size */
|
||||
gbinder_writer_overwrite_int32(writer, initial_size,
|
||||
gbinder_writer_bytes_written(writer) - initial_size);
|
||||
|
||||
binder_sms_gsm_message_aidl(self, writer, pdu, pdu_len, tpdu_len);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
binder_sms_send(
|
||||
@@ -558,6 +728,7 @@ binder_sms_send(
|
||||
ofono_sms_submit_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsSubmitCbData* cbd = NULL;
|
||||
struct ofono_error err;
|
||||
|
||||
@@ -591,16 +762,26 @@ binder_sms_send(
|
||||
* sendSMSExpectMore(serial, GsmSmsMessage message);
|
||||
*/
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
((flags & BINDER_SMS_SEND_FLAG_EXPECT_MORE) ?
|
||||
RADIO_MESSAGING_REQ_SEND_SMS_EXPECT_MORE :
|
||||
RADIO_MESSAGING_REQ_SEND_SMS) :
|
||||
((flags & BINDER_SMS_SEND_FLAG_EXPECT_MORE) ?
|
||||
RADIO_REQ_SEND_SMS_EXPECT_MORE : RADIO_REQ_SEND_SMS);
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
(flags & BINDER_SMS_SEND_FLAG_EXPECT_MORE) ?
|
||||
RADIO_REQ_SEND_SMS_EXPECT_MORE : RADIO_REQ_SEND_SMS, &writer,
|
||||
code, &writer,
|
||||
binder_sms_submit_cb, binder_sms_submit_cbd_free,
|
||||
cbd ? cbd : /* No need to copy the PDU */
|
||||
binder_sms_submit_cbd_new(self, NULL, 0, 0, cb, data));
|
||||
|
||||
binder_sms_gsm_message(self, &writer,
|
||||
gbinder_writer_new0(&writer, RadioGsmSmsMessage),
|
||||
pdu, pdu_len, tpdu_len, NULL);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
binder_sms_gsm_message(self, &writer,
|
||||
gbinder_writer_new0(&writer, RadioGsmSmsMessage),
|
||||
pdu, pdu_len, tpdu_len, NULL);
|
||||
} else {
|
||||
binder_sms_gsm_message_aidl(self, &writer,
|
||||
pdu, pdu_len, tpdu_len);
|
||||
}
|
||||
if (radio_request_submit(req)) {
|
||||
radio_request_unref(req);
|
||||
/* Request submitted */
|
||||
@@ -609,14 +790,21 @@ binder_sms_send(
|
||||
} else if (self->use_standard_ims_sms_api) {
|
||||
/* sendImsSms(serial, ImsSmsMessage message); */
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_REQ_SEND_IMS_SMS : RADIO_REQ_SEND_IMS_SMS;
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SEND_IMS_SMS, &writer,
|
||||
code, &writer,
|
||||
binder_sms_submit_cb, binder_sms_submit_cbd_free,
|
||||
cbd ? cbd : /* Copy the PDU for GSM SMS fallback */
|
||||
binder_sms_submit_cbd_new(self, pdu, pdu_len, tpdu_len, cb, data));
|
||||
|
||||
DBG("sending ims message");
|
||||
binder_sms_ims_message(self, &writer, pdu, pdu_len, tpdu_len);
|
||||
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
binder_sms_ims_message(self, &writer, pdu, pdu_len, tpdu_len);
|
||||
} else {
|
||||
binder_sms_ims_message_aidl(self, &writer, pdu, pdu_len, tpdu_len);
|
||||
}
|
||||
if (radio_request_submit(req)) {
|
||||
radio_request_unref(req);
|
||||
/* Request submitted */
|
||||
@@ -642,6 +830,7 @@ binder_sms_submit(
|
||||
ofono_sms_submit_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_sms_send(binder_sms_get_data(sms), pdu, pdu_len, tpdu_len,
|
||||
expect_more ? BINDER_SMS_SEND_FLAG_EXPECT_MORE :
|
||||
BINDER_SMS_SEND_FLAGS_NONE, cb, data);
|
||||
@@ -657,8 +846,13 @@ binder_sms_ack_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = user_data;
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_ACKNOWLEDGE_LAST_INCOMING_GSM_SMS) {
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_RESP_ACKNOWLEDGE_LAST_INCOMING_GSM_SMS :
|
||||
RADIO_RESP_ACKNOWLEDGE_LAST_INCOMING_GSM_SMS;
|
||||
if (resp == code) {
|
||||
if (error != RADIO_ERROR_NONE) {
|
||||
ofono_error("SMS acknowledgement failed: %s",
|
||||
binder_radio_error_string(error));
|
||||
@@ -678,15 +872,19 @@ binder_sms_ack(
|
||||
BinderSms* self,
|
||||
gboolean ok)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_REQ_ACKNOWLEDGE_LAST_INCOMING_GSM_SMS :
|
||||
RADIO_REQ_ACKNOWLEDGE_LAST_INCOMING_GSM_SMS;
|
||||
|
||||
/*
|
||||
* acknowledgeLastIncomingGsmSms(int32 serial, bool success,
|
||||
* SmsAcknowledgeFailCause cause);
|
||||
*/
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_ACKNOWLEDGE_LAST_INCOMING_GSM_SMS, &writer,
|
||||
binder_sms_ack_cb, NULL, NULL);
|
||||
code, &writer,
|
||||
binder_sms_ack_cb, NULL, self);
|
||||
|
||||
DBG_(self, "%s", ok ? "ok" : "fail");
|
||||
gbinder_writer_append_bool(&writer, ok);
|
||||
@@ -707,6 +905,7 @@ binder_sms_incoming(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = user_data;
|
||||
GBinderReader reader;
|
||||
const guint8* pdu;
|
||||
@@ -717,12 +916,19 @@ binder_sms_incoming(
|
||||
* newSmsStatusReport(RadioIndicationType, vec<uint8_t> pdu);
|
||||
*/
|
||||
gbinder_reader_copy(&reader, args);
|
||||
pdu = gbinder_reader_read_hidl_byte_vec(&reader, &len);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
pdu = gbinder_reader_read_hidl_byte_vec(&reader, &len);
|
||||
} else {
|
||||
pdu = gbinder_reader_read_byte_array(&reader, &len);
|
||||
}
|
||||
if (pdu) {
|
||||
const guint pdu_len = (guint) len;
|
||||
const guint smsc_len = (guint) pdu[0] + 1;
|
||||
|
||||
ofono_info("%s, %u bytes",(code == RADIO_IND_NEW_SMS) ?
|
||||
guint32 ind_code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_IND_NEW_SMS : RADIO_IND_NEW_SMS;
|
||||
|
||||
ofono_info("%s, %u bytes",(code == ind_code) ?
|
||||
"incoming sms" : "sms status", pdu_len);
|
||||
if (pdu_len > smsc_len) {
|
||||
/* The PDU starts with the SMSC address per TS 27.005 (+CMT:) */
|
||||
@@ -731,18 +937,34 @@ binder_sms_incoming(
|
||||
DBG_(self, "smsc: %s", binder_print_hex(pdu, smsc_len));
|
||||
DBG_(self, "tpdu: %s", binder_print_hex(pdu + smsc_len, tpdu_len));
|
||||
|
||||
switch (code) {
|
||||
case RADIO_IND_NEW_SMS:
|
||||
ofono_sms_deliver_notify(self->sms, pdu, pdu_len, tpdu_len);
|
||||
binder_sms_ack(self, TRUE);
|
||||
break;
|
||||
case RADIO_IND_NEW_SMS_STATUS_REPORT:
|
||||
ofono_sms_status_notify(self->sms, pdu, pdu_len, tpdu_len);
|
||||
binder_sms_ack(self, TRUE);
|
||||
break;
|
||||
default:
|
||||
binder_sms_ack(self, FALSE);
|
||||
break;
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
switch (code) {
|
||||
case RADIO_IND_NEW_SMS:
|
||||
ofono_sms_deliver_notify(self->sms, pdu, pdu_len, tpdu_len);
|
||||
binder_sms_ack(self, TRUE);
|
||||
break;
|
||||
case RADIO_IND_NEW_SMS_STATUS_REPORT:
|
||||
ofono_sms_status_notify(self->sms, pdu, pdu_len, tpdu_len);
|
||||
binder_sms_ack(self, TRUE);
|
||||
break;
|
||||
default:
|
||||
binder_sms_ack(self, FALSE);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (code) {
|
||||
case RADIO_MESSAGING_IND_NEW_SMS:
|
||||
ofono_sms_deliver_notify(self->sms, pdu, pdu_len, tpdu_len);
|
||||
binder_sms_ack(self, TRUE);
|
||||
break;
|
||||
case RADIO_MESSAGING_IND_NEW_SMS_STATUS_REPORT:
|
||||
ofono_sms_status_notify(self->sms, pdu, pdu_len, tpdu_len);
|
||||
binder_sms_ack(self, TRUE);
|
||||
break;
|
||||
default:
|
||||
binder_sms_ack(self, FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -763,6 +985,7 @@ binder_sms_notify(
|
||||
int len,
|
||||
int tpdu_len))
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (pdu_len > 0) {
|
||||
const guint smsc_len = (guint)pdu[0] + 1;
|
||||
|
||||
@@ -786,6 +1009,7 @@ binder_sms_ext_incoming(
|
||||
guint pdu_len,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_info("incoming %ssms, %u bytes", SMS_TYPE_STR(ext), pdu_len);
|
||||
if (binder_sms_notify((BinderSms*) user_data, pdu, pdu_len,
|
||||
ofono_sms_deliver_notify)) {
|
||||
@@ -805,6 +1029,7 @@ binder_sms_ext_status_report(
|
||||
guint msg_ref,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_info("incoming %ssms report, %u bytes", SMS_TYPE_STR(ext), pdu_len);
|
||||
if (binder_sms_notify((BinderSms*) user_data, pdu, pdu_len,
|
||||
ofono_sms_status_notify)) {
|
||||
@@ -825,8 +1050,13 @@ binder_sms_delete_on_sim_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = user_data;
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_DELETE_SMS_ON_SIM) {
|
||||
guint32 code = self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_RESP_DELETE_SMS_ON_SIM :
|
||||
RADIO_RESP_DELETE_SMS_ON_SIM;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
ofono_info("sms deleted from sim");
|
||||
} else {
|
||||
@@ -851,6 +1081,7 @@ binder_sms_on_sim_cb(
|
||||
int length,
|
||||
void* userdata)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSmsSimReadData* cbd = userdata;
|
||||
BinderSms* self = cbd->self;
|
||||
|
||||
@@ -869,6 +1100,10 @@ binder_sms_on_sim_cb(
|
||||
RadioRequest* req;
|
||||
GBinderWriter writer;
|
||||
const guint tpdu_len = pdu_len - smsc_len;
|
||||
guint32 code =
|
||||
self->interface_aidl == RADIO_MESSAGING_INTERFACE ?
|
||||
RADIO_MESSAGING_REQ_DELETE_SMS_ON_SIM :
|
||||
RADIO_REQ_DELETE_SMS_ON_SIM;
|
||||
|
||||
ofono_info("read sms from sim, %u bytes", pdu_len);
|
||||
DBG_(self, "smsc: %s", binder_print_hex(pdu, smsc_len));
|
||||
@@ -880,8 +1115,8 @@ binder_sms_on_sim_cb(
|
||||
/* deleteSmsOnSim(int32 serial, int32 index); */
|
||||
DBG_(self, "deleting record: %d", cbd->record);
|
||||
req = radio_request_new2(self->g,
|
||||
RADIO_REQ_DELETE_SMS_ON_SIM, &writer,
|
||||
binder_sms_delete_on_sim_cb, NULL, NULL);
|
||||
code, &writer,
|
||||
binder_sms_delete_on_sim_cb, NULL, self);
|
||||
gbinder_writer_append_int32(&writer, cbd->record);
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
@@ -906,6 +1141,7 @@ binder_sms_on_sim(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = user_data;
|
||||
GBinderReader reader;
|
||||
gint32 rec;
|
||||
@@ -913,7 +1149,8 @@ binder_sms_on_sim(
|
||||
ofono_info("new sms on sim");
|
||||
|
||||
/* newSmsOnSim(RadioIndicationType type, int32 recordNumber); */
|
||||
GASSERT(code == RADIO_IND_NEW_SMS_ON_SIM);
|
||||
GASSERT(code == RADIO_IND_NEW_SMS_ON_SIM ||
|
||||
code == RADIO_MESSAGING_IND_NEW_SMS_ON_SIM);
|
||||
gbinder_reader_copy(&reader, args);
|
||||
if (gbinder_reader_read_int32(&reader, &rec)) {
|
||||
DBG("rec %d", rec);
|
||||
@@ -930,6 +1167,7 @@ static
|
||||
gboolean binder_sms_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = user_data;
|
||||
RadioClient* client = self->g->client;
|
||||
|
||||
@@ -940,15 +1178,27 @@ gboolean binder_sms_register(
|
||||
ofono_sms_register(self->sms);
|
||||
|
||||
/* Register event handlers */
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_SMS] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_NEW_SMS, binder_sms_incoming, self);
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_STATUS_REPORT] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_NEW_SMS_STATUS_REPORT, binder_sms_incoming, self);
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_SMS_ON_SIM] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_NEW_SMS_ON_SIM, binder_sms_on_sim, self);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_SMS] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_NEW_SMS, binder_sms_incoming, self);
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_STATUS_REPORT] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_NEW_SMS_STATUS_REPORT, binder_sms_incoming, self);
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_SMS_ON_SIM] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_NEW_SMS_ON_SIM, binder_sms_on_sim, self);
|
||||
} else {
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_SMS] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_MESSAGING_IND_NEW_SMS, binder_sms_incoming, self);
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_STATUS_REPORT] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_MESSAGING_IND_NEW_SMS_STATUS_REPORT, binder_sms_incoming, self);
|
||||
self->radio_event[SMS_RADIO_EVENT_NEW_SMS_ON_SIM] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_MESSAGING_IND_NEW_SMS_ON_SIM, binder_sms_on_sim, self);
|
||||
}
|
||||
|
||||
if (self->sms_ext) {
|
||||
/* Extension */
|
||||
@@ -970,6 +1220,7 @@ binder_sms_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderSms* self = g_new0(BinderSms, 1);
|
||||
|
||||
@@ -980,7 +1231,8 @@ binder_sms_probe(
|
||||
self->watch = ofono_watch_new(binder_modem_get_path(modem));
|
||||
self->sim_context = ofono_sim_context_create(self->watch->sim);
|
||||
self->ims_reg = binder_ims_reg_ref(modem->ims);
|
||||
self->g = radio_request_group_new(modem->client); /* Keeps ref to client */
|
||||
self->g = radio_request_group_new(modem->messaging_client); /* Keeps ref to client */
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->messaging_client);
|
||||
|
||||
if (modem->ext && (self->sms_ext = binder_ext_slot_get_interface(modem->ext,
|
||||
BINDER_EXT_TYPE_SMS)) != NULL) {
|
||||
@@ -999,6 +1251,7 @@ void
|
||||
binder_sms_remove(
|
||||
struct ofono_sms* sms)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderSms* self = binder_sms_get_data(sms);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -1044,12 +1297,14 @@ static const struct ofono_sms_driver binder_sms_driver = {
|
||||
void
|
||||
binder_sms_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_sms_driver_register(&binder_sms_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_sms_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_sms_driver_unregister(&binder_sms_driver);
|
||||
}
|
||||
|
||||
|
||||
147
src/binder_stk.c
147
src/binder_stk.c
@@ -24,6 +24,8 @@
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_request_group.h>
|
||||
#include <radio_sim_types.h>
|
||||
#include <radio_voice_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -39,6 +41,8 @@ typedef struct binder_stk {
|
||||
struct ofono_stk* stk;
|
||||
char* log_prefix;
|
||||
RadioRequestGroup* g;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
RadioClient* voice_client;
|
||||
gulong event_id[STK_EVENT_COUNT];
|
||||
guint register_id;
|
||||
} BinderStk;
|
||||
@@ -65,6 +69,7 @@ binder_stk_cbd_new(
|
||||
BinderCallback cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStkCbData* cbd = g_slice_new0(BinderStkCbData);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -78,6 +83,7 @@ void
|
||||
binder_stk_cbd_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderStkCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -89,13 +95,17 @@ static void binder_stk_envelope_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStkCbData* cbd = user_data;
|
||||
ofono_stk_envelope_cb_t cb = cbd->cb.envelope;
|
||||
struct ofono_error err;
|
||||
|
||||
DBG_(cbd->self, "");
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SEND_ENVELOPE) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_RESP_SEND_ENVELOPE :
|
||||
RADIO_RESP_SEND_ENVELOPE;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cb(binder_error_ok(&err), NULL, 0, cbd->data);
|
||||
return;
|
||||
@@ -119,19 +129,29 @@ binder_stk_envelope(
|
||||
ofono_stk_envelope_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = binder_stk_get_data(stk);
|
||||
char* hex = binder_encode_hex(cmd, length);
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_REQ_SEND_ENVELOPE :
|
||||
RADIO_REQ_SEND_ENVELOPE;
|
||||
|
||||
/* sendEnvelope(int32 serial, string command); */
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SEND_ENVELOPE, &writer,
|
||||
code, &writer,
|
||||
binder_stk_envelope_cb, binder_stk_cbd_free,
|
||||
binder_stk_cbd_new(self, BINDER_CB(cb), data));
|
||||
|
||||
DBG("envelope %s", hex);
|
||||
gbinder_writer_add_cleanup(&writer, g_free, hex);
|
||||
gbinder_writer_append_hidl_string(&writer, hex);
|
||||
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
gbinder_writer_append_hidl_string(&writer, hex);
|
||||
} else {
|
||||
gbinder_writer_append_string16(&writer, hex);
|
||||
}
|
||||
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
}
|
||||
@@ -146,13 +166,17 @@ binder_stk_terminal_response_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStkCbData* cbd = user_data;
|
||||
ofono_stk_generic_cb_t cb = cbd->cb.generic;
|
||||
struct ofono_error err;
|
||||
|
||||
DBG_(cbd->self, "");
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SEND_TERMINAL_RESPONSE_TO_SIM) {
|
||||
guint32 code = cbd->self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_RESP_SEND_TERMINAL_RESPONSE_TO_SIM :
|
||||
RADIO_RESP_SEND_TERMINAL_RESPONSE_TO_SIM;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cb(binder_error_ok(&err), cbd->data);
|
||||
return;
|
||||
@@ -177,19 +201,27 @@ binder_stk_terminal_response(
|
||||
ofono_stk_generic_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = binder_stk_get_data(stk);
|
||||
char* hex = binder_encode_hex(resp, length);
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_SIM_INTERFACE ?
|
||||
RADIO_SIM_REQ_SEND_TERMINAL_RESPONSE_TO_SIM :
|
||||
RADIO_REQ_SEND_TERMINAL_RESPONSE_TO_SIM;
|
||||
|
||||
/* sendTerminalResponseToSim(int32 serial, string commandResponse); */
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_SEND_TERMINAL_RESPONSE_TO_SIM, &writer,
|
||||
code, &writer,
|
||||
binder_stk_terminal_response_cb, binder_stk_cbd_free,
|
||||
binder_stk_cbd_new(self, BINDER_CB(cb), data));
|
||||
|
||||
DBG_(self, "terminal response: %s", hex);
|
||||
gbinder_writer_add_cleanup(&writer, g_free, hex);
|
||||
gbinder_writer_append_hidl_string(&writer, hex);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
gbinder_writer_append_hidl_string(&writer, hex);
|
||||
} else {
|
||||
gbinder_writer_append_string16(&writer, hex);
|
||||
}
|
||||
radio_request_submit(req);
|
||||
radio_request_unref(req);
|
||||
}
|
||||
@@ -200,12 +232,17 @@ binder_stk_user_confirmation(
|
||||
struct ofono_stk* stk,
|
||||
ofono_bool_t confirm)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = binder_stk_get_data(stk);
|
||||
GBinderWriter writer;
|
||||
guint32 code =
|
||||
radio_client_aidl_interface(self->voice_client) == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_HANDLE_STK_CALL_SETUP_REQUEST_FROM_SIM :
|
||||
RADIO_REQ_HANDLE_STK_CALL_SETUP_REQUEST_FROM_SIM;
|
||||
|
||||
/* handleStkCallSetupRequestFromSim(int32 serial, bool accept); */
|
||||
RadioRequest* req = radio_request_new2(self->g,
|
||||
RADIO_REQ_HANDLE_STK_CALL_SETUP_REQUEST_FROM_SIM, &writer,
|
||||
RadioRequest* req = radio_request_new(self->voice_client,
|
||||
code, &writer,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
DBG_(self, "%d", confirm);
|
||||
@@ -222,9 +259,10 @@ binder_stk_proactive_command(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = user_data;
|
||||
GBinderReader reader;
|
||||
const char* pcmd;
|
||||
char* pcmd;
|
||||
void* pdu;
|
||||
guint len;
|
||||
|
||||
@@ -237,7 +275,11 @@ binder_stk_proactive_command(
|
||||
* Refer to ETSI TS 102.223 section 9.4 for command types.
|
||||
*/
|
||||
gbinder_reader_copy(&reader, args);
|
||||
pcmd = gbinder_reader_read_hidl_string_c(&reader);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
pcmd = gbinder_reader_read_hidl_string(&reader);
|
||||
} else {
|
||||
pcmd = gbinder_reader_read_string16(&reader);
|
||||
}
|
||||
pdu = binder_decode_hex(pcmd, -1, &len);
|
||||
if (pdu) {
|
||||
DBG_(self, "pcmd: %s", pcmd);
|
||||
@@ -246,6 +288,8 @@ binder_stk_proactive_command(
|
||||
} else {
|
||||
ofono_warn("Failed to parse STK command %s", pcmd);
|
||||
}
|
||||
|
||||
g_free(pcmd);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -256,9 +300,10 @@ binder_stk_event_notify(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = user_data;
|
||||
GBinderReader reader;
|
||||
const char* pcmd;
|
||||
char* pcmd;
|
||||
void* pdu;
|
||||
guint len;
|
||||
|
||||
@@ -272,7 +317,11 @@ binder_stk_event_notify(
|
||||
* Refer to ETSI TS 102.223 section 9.4 for command types.
|
||||
*/
|
||||
gbinder_reader_copy(&reader, args);
|
||||
pcmd = gbinder_reader_read_hidl_string_c(&reader);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
pcmd = gbinder_reader_read_hidl_string(&reader);
|
||||
} else {
|
||||
pcmd = gbinder_reader_read_string16(&reader);
|
||||
}
|
||||
pdu = binder_decode_hex(pcmd, -1, &len);
|
||||
if (pdu) {
|
||||
DBG_(self, "pcmd: %s", pcmd);
|
||||
@@ -281,6 +330,7 @@ binder_stk_event_notify(
|
||||
} else {
|
||||
ofono_warn("Failed to parse STK event %s", pcmd);
|
||||
}
|
||||
g_free(pcmd);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -291,6 +341,7 @@ binder_stk_session_end_notify(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = user_data;
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -303,32 +354,58 @@ void
|
||||
binder_stk_agent_ready(
|
||||
struct ofono_stk* stk)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = binder_stk_get_data(stk);
|
||||
RadioClient* client = self->g->client;
|
||||
|
||||
DBG_(self, "");
|
||||
|
||||
if (!self->event_id[STK_EVENT_PROACTIVE_COMMAND]) {
|
||||
DBG_(self, "Subscribing for notifications");
|
||||
self->event_id[STK_EVENT_PROACTIVE_COMMAND] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_STK_PROACTIVE_COMMAND,
|
||||
binder_stk_proactive_command, self);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
if (!self->event_id[STK_EVENT_PROACTIVE_COMMAND]) {
|
||||
DBG_(self, "Subscribing for notifications");
|
||||
self->event_id[STK_EVENT_PROACTIVE_COMMAND] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_STK_PROACTIVE_COMMAND,
|
||||
binder_stk_proactive_command, self);
|
||||
|
||||
GASSERT(!self->event_id[STK_EVENT_SESSION_END]);
|
||||
self->event_id[STK_EVENT_SESSION_END] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_STK_SESSION_END,
|
||||
binder_stk_session_end_notify, self);
|
||||
GASSERT(!self->event_id[STK_EVENT_SESSION_END]);
|
||||
self->event_id[STK_EVENT_SESSION_END] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_STK_SESSION_END,
|
||||
binder_stk_session_end_notify, self);
|
||||
|
||||
GASSERT(!self->event_id[STK_EVENT_NOTIFY]);
|
||||
self->event_id[STK_EVENT_NOTIFY] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_STK_EVENT_NOTIFY,
|
||||
binder_stk_event_notify, self);
|
||||
GASSERT(!self->event_id[STK_EVENT_NOTIFY]);
|
||||
self->event_id[STK_EVENT_NOTIFY] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_IND_STK_EVENT_NOTIFY,
|
||||
binder_stk_event_notify, self);
|
||||
|
||||
/* reportStkServiceIsRunning(int32 serial); */
|
||||
binder_submit_request(self->g, RADIO_REQ_REPORT_STK_SERVICE_IS_RUNNING);
|
||||
/* reportStkServiceIsRunning(int32 serial); */
|
||||
binder_submit_request(self->g, RADIO_REQ_REPORT_STK_SERVICE_IS_RUNNING);
|
||||
}
|
||||
} else {
|
||||
if (!self->event_id[STK_EVENT_PROACTIVE_COMMAND]) {
|
||||
DBG_(self, "Subscribing for notifications");
|
||||
self->event_id[STK_EVENT_PROACTIVE_COMMAND] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_SIM_IND_STK_PROACTIVE_COMMAND,
|
||||
binder_stk_proactive_command, self);
|
||||
|
||||
GASSERT(!self->event_id[STK_EVENT_SESSION_END]);
|
||||
self->event_id[STK_EVENT_SESSION_END] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_SIM_IND_STK_SESSION_END,
|
||||
binder_stk_session_end_notify, self);
|
||||
|
||||
GASSERT(!self->event_id[STK_EVENT_NOTIFY]);
|
||||
self->event_id[STK_EVENT_NOTIFY] =
|
||||
radio_client_add_indication_handler(client,
|
||||
RADIO_SIM_IND_STK_EVENT_NOTIFY,
|
||||
binder_stk_event_notify, self);
|
||||
|
||||
/* reportStkServiceIsRunning(int32 serial); */
|
||||
binder_submit_request(self->g, RADIO_SIM_REQ_REPORT_STK_SERVICE_IS_RUNNING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,6 +413,7 @@ static
|
||||
gboolean binder_stk_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = user_data;
|
||||
|
||||
DBG("");
|
||||
@@ -354,11 +432,14 @@ binder_stk_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderStk* self = g_new0(BinderStk, 1);
|
||||
|
||||
self->stk = stk;
|
||||
self->g = radio_request_group_new(modem->client); /* Keeps ref to client */
|
||||
self->g = radio_request_group_new(modem->sim_client); /* Keeps ref to client */
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->sim_client);
|
||||
self->voice_client = radio_client_ref(modem->voice_client);
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
self->register_id = g_idle_add(binder_stk_register, self);
|
||||
|
||||
@@ -372,6 +453,7 @@ void
|
||||
binder_stk_remove(
|
||||
struct ofono_stk* stk)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderStk* self = binder_stk_get_data(stk);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -383,6 +465,7 @@ binder_stk_remove(
|
||||
radio_client_remove_all_handlers(self->g->client, self->event_id);
|
||||
radio_request_group_cancel(self->g);
|
||||
radio_request_group_unref(self->g);
|
||||
radio_client_unref(self->voice_client);
|
||||
|
||||
g_free(self->log_prefix);
|
||||
g_free(self);
|
||||
@@ -407,12 +490,14 @@ static const struct ofono_stk_driver binder_stk_driver = {
|
||||
void
|
||||
binder_stk_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_stk_driver_register(&binder_stk_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_stk_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_stk_driver_unregister(&binder_stk_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@ typedef struct binder_slot_config {
|
||||
gboolean empty_pin_query;
|
||||
gboolean radio_power_cycle;
|
||||
gboolean confirm_radio_power_on;
|
||||
gboolean use_network_scan;
|
||||
gboolean replace_strange_oper;
|
||||
gboolean force_gsm_when_radio_off;
|
||||
BinderDataProfileConfig data_profile_config;
|
||||
@@ -88,10 +89,13 @@ typedef struct binder_slot_config {
|
||||
typedef void (*BinderCallback)(void);
|
||||
#define BINDER_CB(f) ((BinderCallback)(f))
|
||||
|
||||
#define OFONO_RADIO_ACCESS_MODE_COUNT (4)
|
||||
|
||||
#define OFONO_RADIO_ACCESS_MODE_ALL (\
|
||||
OFONO_RADIO_ACCESS_MODE_GSM |\
|
||||
OFONO_RADIO_ACCESS_MODE_UMTS |\
|
||||
OFONO_RADIO_ACCESS_MODE_LTE)
|
||||
OFONO_RADIO_ACCESS_MODE_LTE |\
|
||||
OFONO_RADIO_ACCESS_MODE_NR)
|
||||
|
||||
#define OFONO_RADIO_ACCESS_MODE_NONE \
|
||||
((enum ofono_radio_access_mode) 0)
|
||||
@@ -102,6 +106,24 @@ typedef void (*BinderCallback)(void);
|
||||
(OFONO_RADIO_ACCESS_MODE_UMTS | (OFONO_RADIO_ACCESS_MODE_UMTS - 1))
|
||||
#define OFONO_RADIO_ACCESS_LTE_MASK \
|
||||
(OFONO_RADIO_ACCESS_MODE_LTE | (OFONO_RADIO_ACCESS_MODE_LTE - 1))
|
||||
#define OFONO_RADIO_ACCESS_NR_MASK \
|
||||
(OFONO_RADIO_ACCESS_MODE_NR | (OFONO_RADIO_ACCESS_MODE_NR - 1))
|
||||
|
||||
/* Some values copied from ofono's internal common.h */
|
||||
|
||||
/* 27.007 Section 7.11 */
|
||||
enum bearer_class {
|
||||
BEARER_CLASS_VOICE = 1,
|
||||
BEARER_CLASS_DATA = 2,
|
||||
BEARER_CLASS_FAX = 4,
|
||||
BEARER_CLASS_DEFAULT = 7,
|
||||
BEARER_CLASS_SMS = 8,
|
||||
BEARER_CLASS_DATA_SYNC = 16,
|
||||
BEARER_CLASS_DATA_ASYNC = 32,
|
||||
BEARER_CLASS_SS_DEFAULT = 61,
|
||||
BEARER_CLASS_PACKET = 64,
|
||||
BEARER_CLASS_PAD = 128
|
||||
};
|
||||
|
||||
#endif /* BINDER_TYPES_H */
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include <radio_client.h>
|
||||
#include <radio_request.h>
|
||||
#include <radio_voice_types.h>
|
||||
|
||||
#include <gbinder_reader.h>
|
||||
#include <gbinder_writer.h>
|
||||
@@ -37,6 +38,7 @@ typedef struct binder_ussd {
|
||||
struct ofono_ussd *ussd;
|
||||
char* log_prefix;
|
||||
RadioClient* client;
|
||||
RADIO_AIDL_INTERFACE interface_aidl;
|
||||
RadioRequest* send_req;
|
||||
RadioRequest* cancel_req;
|
||||
gulong event_id;
|
||||
@@ -61,6 +63,7 @@ binder_ussd_cbd_new(
|
||||
ofono_ussd_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssdCbData* cbd = g_slice_new(struct binder_ussd_cbd);
|
||||
|
||||
cbd->self = self;
|
||||
@@ -74,6 +77,7 @@ void
|
||||
binder_ussd_cbd_free(
|
||||
gpointer cbd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
g_slice_free(BinderUssdCbData, cbd);
|
||||
}
|
||||
|
||||
@@ -87,6 +91,7 @@ binder_ussd_cancel_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssdCbData* cbd = user_data;
|
||||
BinderUssd* self = cbd->self;
|
||||
struct ofono_error err;
|
||||
@@ -96,7 +101,10 @@ binder_ussd_cancel_cb(
|
||||
self->cancel_req = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_CANCEL_PENDING_USSD) {
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_CANCEL_PENDING_USSD :
|
||||
RADIO_RESP_CANCEL_PENDING_USSD;
|
||||
if (resp == code) {
|
||||
if (error != RADIO_ERROR_NONE) {
|
||||
ofono_warn("Error cancelling USSD: %s",
|
||||
binder_radio_error_string(error));
|
||||
@@ -125,6 +133,7 @@ binder_ussd_send_cb(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssdCbData* cbd = user_data;
|
||||
BinderUssd* self = cbd->self;
|
||||
struct ofono_error err;
|
||||
@@ -134,7 +143,9 @@ binder_ussd_send_cb(
|
||||
self->send_req = NULL;
|
||||
|
||||
if (status == RADIO_TX_STATUS_OK) {
|
||||
if (resp == RADIO_RESP_SEND_USSD) {
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_RESP_SEND_USSD : RADIO_RESP_SEND_USSD;
|
||||
if (resp == code) {
|
||||
if (error == RADIO_ERROR_NONE) {
|
||||
cbd->cb(binder_error_ok(&err), cbd->data);
|
||||
return;
|
||||
@@ -161,6 +172,7 @@ binder_ussd_request(
|
||||
ofono_ussd_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssd* self = binder_ussd_get_data(ussd);
|
||||
char* text = ofono_ussd_decode(dcs, pdu, len);
|
||||
struct ofono_error err;
|
||||
@@ -173,13 +185,19 @@ binder_ussd_request(
|
||||
if (text) {
|
||||
/* sendUssd(int32 serial, string ussd); */
|
||||
GBinderWriter writer;
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_SEND_USSD : RADIO_REQ_SEND_USSD;
|
||||
RadioRequest* req = radio_request_new(self->client,
|
||||
RADIO_REQ_SEND_USSD, &writer,
|
||||
code, &writer,
|
||||
binder_ussd_send_cb, binder_ussd_cbd_free,
|
||||
binder_ussd_cbd_new(self, cb, data));
|
||||
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
gbinder_writer_append_hidl_string(&writer, text);
|
||||
} else {
|
||||
gbinder_writer_append_string16(&writer, text);
|
||||
}
|
||||
/* USSD text will be deallocated together with the request */
|
||||
gbinder_writer_append_hidl_string(&writer, text);
|
||||
gbinder_writer_add_cleanup(&writer, (GDestroyNotify)
|
||||
ofono_ussd_decode_free, text);
|
||||
|
||||
@@ -204,6 +222,7 @@ binder_ussd_cancel(
|
||||
ofono_ussd_cb_t cb,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssd* self = binder_ussd_get_data(ussd);
|
||||
|
||||
ofono_info("sending ussd cancel");
|
||||
@@ -211,8 +230,10 @@ binder_ussd_cancel(
|
||||
radio_request_drop(self->cancel_req);
|
||||
|
||||
/* cancelPendingUssd(int32 serial); */
|
||||
guint32 code = self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_REQ_CANCEL_PENDING_USSD : RADIO_REQ_CANCEL_PENDING_USSD;
|
||||
self->cancel_req = radio_request_new(self->client,
|
||||
RADIO_REQ_CANCEL_PENDING_USSD, NULL,
|
||||
code, NULL,
|
||||
binder_ussd_cancel_cb, binder_ussd_cbd_free,
|
||||
binder_ussd_cbd_new(self, cb, data));
|
||||
|
||||
@@ -234,6 +255,7 @@ binder_ussd_notify(
|
||||
const GBinderReader* args,
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssd* self = user_data;
|
||||
GBinderReader reader;
|
||||
gint32 type = 0;
|
||||
@@ -241,16 +263,36 @@ binder_ussd_notify(
|
||||
ofono_info("ussd received");
|
||||
|
||||
/* onUssd(RadioIndicationType, UssdModeType modeType, string msg); */
|
||||
GASSERT(code == RADIO_IND_ON_USSD);
|
||||
GASSERT(code == (self->interface_aidl == RADIO_VOICE_INTERFACE ?
|
||||
RADIO_VOICE_IND_ON_USSD : RADIO_IND_ON_USSD));
|
||||
gbinder_reader_copy(&reader, args);
|
||||
if (gbinder_reader_read_int32(&reader, &type)) {
|
||||
const char* msg = gbinder_reader_read_hidl_string_c(&reader);
|
||||
char* msg;
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
msg = gbinder_reader_read_hidl_string(&reader);
|
||||
} else {
|
||||
msg = gbinder_reader_read_string16(&reader);
|
||||
}
|
||||
|
||||
if (msg && msg[0]) {
|
||||
const int len = (int) strlen(msg);
|
||||
|
||||
DBG_(self, "ussd length %d", len);
|
||||
|
||||
/*
|
||||
* If sendUssd request is pending, consider it to be successfully
|
||||
* completed, otherwise ofono core may get confused.
|
||||
*/
|
||||
if (self->send_req) {
|
||||
struct ofono_error err;
|
||||
RadioRequest* req = self->send_req;
|
||||
BinderUssdCbData* cbd = radio_request_user_data(req);
|
||||
|
||||
self->send_req = NULL;
|
||||
cbd->cb(binder_error_ok(&err), cbd->data);
|
||||
radio_request_drop(req); /* Frees BinderUssdCbData */
|
||||
}
|
||||
|
||||
/*
|
||||
* Message is freed by core if dcs is 0xff, we have to
|
||||
* duplicate it.
|
||||
@@ -260,6 +302,8 @@ binder_ussd_notify(
|
||||
} else {
|
||||
ofono_ussd_notify(self->ussd, type, 0, NULL, 0);
|
||||
}
|
||||
|
||||
g_free(msg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,6 +312,7 @@ gboolean
|
||||
binder_ussd_register(
|
||||
gpointer user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssd* self = user_data;
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -277,8 +322,13 @@ binder_ussd_register(
|
||||
ofono_ussd_register(self->ussd);
|
||||
|
||||
/* Register for USSD events */
|
||||
self->event_id = radio_client_add_indication_handler(self->client,
|
||||
RADIO_IND_ON_USSD, binder_ussd_notify, self);
|
||||
if (self->interface_aidl == RADIO_AIDL_INTERFACE_NONE) {
|
||||
self->event_id = radio_client_add_indication_handler(self->client,
|
||||
RADIO_IND_ON_USSD, binder_ussd_notify, self);
|
||||
} else {
|
||||
self->event_id = radio_client_add_indication_handler(self->client,
|
||||
RADIO_VOICE_IND_ON_USSD, binder_ussd_notify, self);
|
||||
}
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
@@ -290,11 +340,13 @@ binder_ussd_probe(
|
||||
unsigned int vendor,
|
||||
void* data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderModem* modem = binder_modem_get_data(data);
|
||||
BinderUssd* self = g_new0(BinderUssd, 1);
|
||||
|
||||
self->ussd = ussd;
|
||||
self->client = radio_client_ref(modem->client);
|
||||
self->client = radio_client_ref(modem->voice_client);
|
||||
self->interface_aidl = radio_client_aidl_interface(modem->voice_client);
|
||||
self->log_prefix = binder_dup_prefix(modem->log_prefix);
|
||||
self->register_id = g_idle_add(binder_ussd_register, self);
|
||||
|
||||
@@ -308,6 +360,7 @@ void
|
||||
binder_ussd_remove(
|
||||
struct ofono_ussd* ussd)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
BinderUssd* self = binder_ussd_get_data(ussd);
|
||||
|
||||
DBG_(self, "");
|
||||
@@ -342,12 +395,14 @@ static const struct ofono_ussd_driver binder_ussd_driver = {
|
||||
void
|
||||
binder_ussd_init()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_ussd_driver_register(&binder_ussd_driver);
|
||||
}
|
||||
|
||||
void
|
||||
binder_ussd_cleanup()
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
ofono_ussd_driver_unregister(&binder_ussd_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
#include "binder_util.h"
|
||||
#include "binder_log.h"
|
||||
|
||||
#include <ofono/misc.h>
|
||||
#include <ofono/netreg.h>
|
||||
@@ -36,15 +37,18 @@ static const char PROTO_IPV4V6_STR[] = "IPV4V6";
|
||||
#define RADIO_ACCESS_FAMILY_GSM \
|
||||
(RAF_GSM|RAF_GPRS|RAF_EDGE)
|
||||
#define RADIO_ACCESS_FAMILY_UMTS \
|
||||
(RAF_UMTS|RAF_HSDPA|RAF_HSUPA|RAF_HSPA|RAF_HSPAP|RAF_TD_SCDMA|RAF_EHRPD)
|
||||
(RAF_UMTS|RAF_HSDPA|RAF_HSUPA|RAF_HSPA|RAF_HSPAP|RAF_TD_SCDMA)
|
||||
#define RADIO_ACCESS_FAMILY_LTE \
|
||||
(RAF_LTE|RAF_LTE_CA|RAF_EHRPD)
|
||||
(RAF_LTE|RAF_LTE_CA)
|
||||
#define RADIO_ACCESS_FAMILY_NR \
|
||||
(RAF_NR)
|
||||
|
||||
static
|
||||
const char*
|
||||
binder_pool_string(
|
||||
char* str)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GUtilIdlePool* pool = gutil_idle_pool_get(&binder_util_pool);
|
||||
|
||||
gutil_idle_pool_add(pool, str, g_free);
|
||||
@@ -55,6 +59,7 @@ RADIO_ACCESS_NETWORK
|
||||
binder_radio_access_network_for_tech(
|
||||
RADIO_TECH tech)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (tech) {
|
||||
case RADIO_TECH_GPRS:
|
||||
case RADIO_TECH_EDGE:
|
||||
@@ -80,6 +85,8 @@ binder_radio_access_network_for_tech(
|
||||
return RADIO_ACCESS_NETWORK_EUTRAN;
|
||||
case RADIO_TECH_IWLAN:
|
||||
return RADIO_ACCESS_NETWORK_IWLAN;
|
||||
case RADIO_TECH_NR:
|
||||
return RADIO_ACCESS_NETWORK_NGRAN;
|
||||
case RADIO_TECH_UNKNOWN:
|
||||
break;
|
||||
}
|
||||
@@ -91,6 +98,7 @@ binder_radio_apn_types_for_profile(
|
||||
guint profile_id,
|
||||
const BinderDataProfileConfig* config)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RADIO_APN_TYPES apn_types = RADIO_APN_TYPE_NONE;
|
||||
|
||||
if (profile_id == config->mms_profile_id) {
|
||||
@@ -134,6 +142,7 @@ RADIO_PDP_PROTOCOL_TYPE
|
||||
binder_proto_from_ofono_proto(
|
||||
enum ofono_gprs_proto proto)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (proto) {
|
||||
case OFONO_GPRS_PROTO_IP:
|
||||
return RADIO_PDP_PROTOCOL_IP;
|
||||
@@ -149,6 +158,7 @@ const char*
|
||||
binder_proto_str_from_ofono_proto(
|
||||
enum ofono_gprs_proto proto)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (proto) {
|
||||
case OFONO_GPRS_PROTO_IP:
|
||||
return PROTO_IP_STR;
|
||||
@@ -164,6 +174,7 @@ enum ofono_gprs_proto
|
||||
binder_ofono_proto_from_proto_type(
|
||||
RADIO_PDP_PROTOCOL_TYPE type)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (type) {
|
||||
case RADIO_PDP_PROTOCOL_IP:
|
||||
return OFONO_GPRS_PROTO_IP;
|
||||
@@ -185,6 +196,7 @@ enum ofono_gprs_proto
|
||||
binder_ofono_proto_from_proto_str(
|
||||
const char* type)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (type) {
|
||||
if (!g_ascii_strcasecmp(type, PROTO_IP_STR)) {
|
||||
return OFONO_GPRS_PROTO_IP;
|
||||
@@ -202,6 +214,7 @@ RADIO_APN_AUTH_TYPE
|
||||
binder_radio_auth_from_ofono_method(
|
||||
enum ofono_gprs_auth_method auth)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (auth) {
|
||||
case OFONO_GPRS_AUTH_METHOD_NONE:
|
||||
return RADIO_APN_AUTH_NONE;
|
||||
@@ -221,9 +234,13 @@ RADIO_PREF_NET_TYPE
|
||||
binder_pref_from_raf(
|
||||
RADIO_ACCESS_FAMILY raf)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (raf & RADIO_ACCESS_FAMILY_GSM) {
|
||||
if (raf & RADIO_ACCESS_FAMILY_UMTS) {
|
||||
if (raf & RADIO_ACCESS_FAMILY_LTE) {
|
||||
if (raf & RADIO_ACCESS_FAMILY_NR) {
|
||||
return RADIO_PREF_NET_NR_LTE_GSM_WCDMA;
|
||||
}
|
||||
return RADIO_PREF_NET_LTE_GSM_WCDMA;
|
||||
}
|
||||
return RADIO_PREF_NET_GSM_WCDMA;
|
||||
@@ -231,11 +248,19 @@ binder_pref_from_raf(
|
||||
return RADIO_PREF_NET_GSM_ONLY;
|
||||
} else if (raf & RADIO_ACCESS_FAMILY_UMTS) {
|
||||
if (raf & RADIO_ACCESS_FAMILY_LTE) {
|
||||
if (raf & RADIO_ACCESS_FAMILY_NR) {
|
||||
return RADIO_PREF_NET_NR_LTE_WCDMA;
|
||||
}
|
||||
return RADIO_PREF_NET_LTE_WCDMA;
|
||||
}
|
||||
return RADIO_PREF_NET_WCDMA;
|
||||
} else if (raf & RADIO_ACCESS_FAMILY_LTE) {
|
||||
if (raf & RADIO_ACCESS_FAMILY_NR) {
|
||||
return RADIO_PREF_NET_NR_LTE;
|
||||
}
|
||||
return RADIO_PREF_NET_LTE_ONLY;
|
||||
} else if (raf & RADIO_ACCESS_FAMILY_NR) {
|
||||
return RADIO_PREF_NET_NR_ONLY;
|
||||
} else {
|
||||
return RADIO_PREF_NET_INVALID;
|
||||
}
|
||||
@@ -248,8 +273,10 @@ binder_pref_mask(
|
||||
int none,
|
||||
int gsm_mask,
|
||||
int umts_mask,
|
||||
int lte_mask)
|
||||
int lte_mask,
|
||||
int nr_mask)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (pref) {
|
||||
case RADIO_PREF_NET_GSM_ONLY:
|
||||
return gsm_mask;
|
||||
@@ -263,6 +290,12 @@ binder_pref_mask(
|
||||
case RADIO_PREF_NET_LTE_CDMA_EVDO:
|
||||
return lte_mask;
|
||||
|
||||
case RADIO_PREF_NET_NR_ONLY:
|
||||
return nr_mask;
|
||||
|
||||
case RADIO_PREF_NET_NR_LTE:
|
||||
return lte_mask | nr_mask;
|
||||
|
||||
case RADIO_PREF_NET_TD_SCDMA_GSM:
|
||||
case RADIO_PREF_NET_GSM_WCDMA:
|
||||
case RADIO_PREF_NET_GSM_WCDMA_AUTO:
|
||||
@@ -283,6 +316,19 @@ binder_pref_mask(
|
||||
case RADIO_PREF_NET_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA:
|
||||
return gsm_mask | umts_mask | lte_mask;
|
||||
|
||||
case RADIO_PREF_NET_NR_LTE_CDMA_EVDO:
|
||||
case RADIO_PREF_NET_NR_LTE_WCDMA:
|
||||
case RADIO_PREF_NET_NR_LTE_TD_SCDMA:
|
||||
case RADIO_PREF_NET_NR_LTE_TD_SCDMA_WCDMA:
|
||||
return umts_mask | lte_mask | nr_mask;
|
||||
|
||||
case RADIO_PREF_NET_NR_LTE_GSM_WCDMA:
|
||||
case RADIO_PREF_NET_NR_LTE_TD_SCDMA_GSM:
|
||||
case RADIO_PREF_NET_NR_LTE_CDMA_EVDO_GSM_WCDMA:
|
||||
case RADIO_PREF_NET_NR_LTE_TD_SCDMA_GSM_WCDMA:
|
||||
case RADIO_PREF_NET_NR_LTE_TD_SCDMA_CDMA_EVDO_GSM_WCDMA:
|
||||
return gsm_mask | umts_mask | lte_mask | nr_mask;
|
||||
|
||||
case RADIO_PREF_NET_CDMA_ONLY:
|
||||
case RADIO_PREF_NET_EVDO_ONLY:
|
||||
case RADIO_PREF_NET_CDMA_EVDO_AUTO:
|
||||
@@ -298,18 +344,20 @@ RADIO_ACCESS_FAMILY
|
||||
binder_raf_from_pref(
|
||||
RADIO_PREF_NET_TYPE pref)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return binder_pref_mask(pref, RAF_NONE,
|
||||
RADIO_ACCESS_FAMILY_GSM, RADIO_ACCESS_FAMILY_UMTS,
|
||||
RADIO_ACCESS_FAMILY_LTE);
|
||||
RADIO_ACCESS_FAMILY_LTE, RADIO_ACCESS_FAMILY_NR);
|
||||
}
|
||||
|
||||
enum ofono_radio_access_mode
|
||||
binder_access_modes_from_pref(
|
||||
RADIO_PREF_NET_TYPE pref)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
return binder_pref_mask(pref, OFONO_RADIO_ACCESS_MODE_NONE,
|
||||
OFONO_RADIO_ACCESS_MODE_GSM, OFONO_RADIO_ACCESS_MODE_UMTS,
|
||||
OFONO_RADIO_ACCESS_MODE_LTE);
|
||||
OFONO_RADIO_ACCESS_MODE_LTE, OFONO_RADIO_ACCESS_MODE_NR);
|
||||
}
|
||||
|
||||
enum ofono_radio_access_mode
|
||||
@@ -317,6 +365,7 @@ binder_access_modes_from_raf(
|
||||
RADIO_ACCESS_FAMILY raf)
|
||||
{
|
||||
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (raf == RAF_UNKNOWN) {
|
||||
return OFONO_RADIO_ACCESS_MODE_ALL;
|
||||
} else {
|
||||
@@ -331,6 +380,9 @@ binder_access_modes_from_raf(
|
||||
if (raf & RADIO_ACCESS_FAMILY_LTE) {
|
||||
modes |= OFONO_RADIO_ACCESS_MODE_LTE;
|
||||
}
|
||||
if (raf & RADIO_ACCESS_FAMILY_NR) {
|
||||
modes |= OFONO_RADIO_ACCESS_MODE_NR;
|
||||
}
|
||||
return modes;
|
||||
}
|
||||
}
|
||||
@@ -339,6 +391,7 @@ enum ofono_radio_access_mode
|
||||
binder_access_modes_up_to(
|
||||
enum ofono_radio_access_mode mode)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Make sure only one bit is set in max_mode */
|
||||
enum ofono_radio_access_mode max_mode = ofono_radio_access_max_mode(mode);
|
||||
|
||||
@@ -351,6 +404,7 @@ enum ofono_access_technology
|
||||
binder_access_tech_from_radio_tech(
|
||||
RADIO_TECH radio_tech)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (radio_tech) {
|
||||
case RADIO_TECH_UNKNOWN:
|
||||
return OFONO_ACCESS_TECHNOLOGY_NONE;
|
||||
@@ -371,6 +425,8 @@ binder_access_tech_from_radio_tech(
|
||||
case RADIO_TECH_LTE:
|
||||
case RADIO_TECH_LTE_CA:
|
||||
return OFONO_ACCESS_TECHNOLOGY_EUTRAN;
|
||||
case RADIO_TECH_NR:
|
||||
return OFONO_ACCESS_TECHNOLOGY_NR_5GCN;
|
||||
case RADIO_TECH_IWLAN:
|
||||
case RADIO_TECH_IS95B:
|
||||
case RADIO_TECH_ONE_X_RTT:
|
||||
@@ -391,6 +447,7 @@ const char*
|
||||
binder_ofono_access_technology_string(
|
||||
enum ofono_access_technology act)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (act) {
|
||||
case OFONO_ACCESS_TECHNOLOGY_NONE:
|
||||
return "none";
|
||||
@@ -410,6 +467,12 @@ binder_ofono_access_technology_string(
|
||||
return "utran";
|
||||
case OFONO_ACCESS_TECHNOLOGY_EUTRAN:
|
||||
return "eutran";
|
||||
case OFONO_ACCESS_TECHNOLOGY_EUTRA_5GCN:
|
||||
return "eutran";
|
||||
case OFONO_ACCESS_TECHNOLOGY_NR_5GCN:
|
||||
case OFONO_ACCESS_TECHNOLOGY_NG_RAN:
|
||||
case OFONO_ACCESS_TECHNOLOGY_EUTRA_NR:
|
||||
return "nr";
|
||||
}
|
||||
return binder_pool_string(g_strdup_printf("%d (?)", act));
|
||||
}
|
||||
@@ -418,6 +481,7 @@ const char*
|
||||
binder_radio_op_status_string(
|
||||
RADIO_OP_STATUS status)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (status) {
|
||||
case RADIO_OP_AVAILABLE:
|
||||
return "available";
|
||||
@@ -435,6 +499,7 @@ const char*
|
||||
binder_radio_state_string(
|
||||
RADIO_STATE state)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
#define RADIO_STATE_(name) case RADIO_STATE_##name: return #name
|
||||
switch (state) {
|
||||
RADIO_STATE_(OFF);
|
||||
@@ -448,6 +513,7 @@ const char*
|
||||
binder_radio_error_string(
|
||||
RADIO_ERROR error)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
switch (error) {
|
||||
#define RADIO_ERROR_STR_(name) case RADIO_ERROR_##name: return #name
|
||||
RADIO_ERROR_STR_(NONE);
|
||||
@@ -544,6 +610,7 @@ binder_parse_tech(
|
||||
const char* stech,
|
||||
RADIO_TECH* radio_tech)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
int rt = RADIO_TECH_UNKNOWN;
|
||||
const enum ofono_access_technology at = gutil_parse_int(stech, 0, &rt) ?
|
||||
binder_access_tech_from_radio_tech(rt) : OFONO_ACCESS_TECHNOLOGY_NONE;
|
||||
@@ -559,6 +626,7 @@ binder_parse_mcc_mnc(
|
||||
const char* str,
|
||||
struct ofono_network_operator* op)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (str) {
|
||||
int i;
|
||||
const char* ptr = str;
|
||||
@@ -606,6 +674,7 @@ binder_encode_hex(
|
||||
const void* in,
|
||||
guint size)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
char *out = g_new(char, size * 2 + 1);
|
||||
|
||||
ofono_encode_hex(in, size, out);
|
||||
@@ -618,6 +687,7 @@ binder_decode_hex(
|
||||
int len,
|
||||
guint* out_size)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
void* out = NULL;
|
||||
guint size = 0;
|
||||
|
||||
@@ -646,6 +716,7 @@ binder_print_strv(
|
||||
char** strv,
|
||||
const char* sep)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (!strv) {
|
||||
return NULL;
|
||||
} else if (!strv[0]) {
|
||||
@@ -664,6 +735,7 @@ binder_print_hex(
|
||||
const void* data,
|
||||
gsize size)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (data && size) {
|
||||
const guint8* bytes = data;
|
||||
GUtilIdlePool* pool = gutil_idle_pool_get(&binder_util_pool);
|
||||
@@ -690,6 +762,7 @@ binder_submit_request(
|
||||
RadioRequestGroup* g,
|
||||
RADIO_REQ code)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RadioRequest* req = radio_request_new2(g, code, NULL, NULL, NULL, NULL);
|
||||
gboolean ok = radio_request_submit(req);
|
||||
|
||||
@@ -705,6 +778,7 @@ binder_submit_request2(
|
||||
GDestroyNotify destroy,
|
||||
void* user_data)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
RadioRequest* req = radio_request_new2(g, code, NULL, complete, destroy,
|
||||
user_data);
|
||||
gboolean ok = radio_request_submit(req);
|
||||
@@ -717,6 +791,7 @@ const char*
|
||||
binder_read_hidl_string(
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderReader reader;
|
||||
|
||||
/* Read a single string arg */
|
||||
@@ -724,11 +799,24 @@ binder_read_hidl_string(
|
||||
return gbinder_reader_read_hidl_string_c(&reader);
|
||||
}
|
||||
|
||||
char*
|
||||
binder_read_string16(
|
||||
const GBinderReader* args)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderReader reader;
|
||||
|
||||
/* Read a single string arg */
|
||||
gbinder_reader_copy(&reader, args);
|
||||
return gbinder_reader_read_string16(&reader);
|
||||
}
|
||||
|
||||
gboolean
|
||||
binder_read_int32(
|
||||
const GBinderReader* args,
|
||||
gint32* value)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderReader reader;
|
||||
|
||||
/* Read a single int32 arg */
|
||||
@@ -741,6 +829,7 @@ binder_read_hidl_struct1(
|
||||
const GBinderReader* args,
|
||||
gsize size)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderReader reader;
|
||||
|
||||
/* Read a single struct */
|
||||
@@ -748,10 +837,40 @@ binder_read_hidl_struct1(
|
||||
return gbinder_reader_read_hidl_struct1(&reader, size);
|
||||
}
|
||||
|
||||
const void*
|
||||
binder_read_parcelable(
|
||||
const GBinderReader* args,
|
||||
gsize* out_size)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderReader reader;
|
||||
|
||||
/* Read a single AIDL parcelable */
|
||||
gbinder_reader_copy(&reader, args);
|
||||
return gbinder_reader_read_parcelable(&reader, out_size);
|
||||
}
|
||||
|
||||
gsize
|
||||
binder_read_parcelable_size(
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Read a single AIDL parcelable header and return inner data size */
|
||||
guint32 non_null = 0, payload_size = 0;
|
||||
if (gbinder_reader_read_uint32(reader, &non_null) && non_null &&
|
||||
gbinder_reader_read_uint32(reader, &payload_size) &&
|
||||
payload_size >= sizeof(payload_size)) {
|
||||
|
||||
return payload_size - sizeof(payload_size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char**
|
||||
binder_strv_from_hidl_string_vec(
|
||||
const GBinderHidlVec* vec)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (vec) {
|
||||
const GBinderHidlString* strings = vec->data.ptr;
|
||||
char** out = g_new(char*, vec->count + 1);
|
||||
@@ -769,6 +888,48 @@ binder_strv_from_hidl_string_vec(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
binder_read_string16_parse_int(
|
||||
GBinderReader* reader,
|
||||
gint32* value)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
/* Read a string and parse integer value from it */
|
||||
gboolean ret = FALSE;
|
||||
char* str = gbinder_reader_read_string16(reader);
|
||||
|
||||
ret = gutil_parse_int(str, 10, value);
|
||||
g_free(str);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char**
|
||||
binder_strv_from_string16_array(
|
||||
GBinderReader* reader)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
if (reader) {
|
||||
gint32 count;
|
||||
gbinder_reader_read_int32(reader, &count);
|
||||
if (count < 0) {
|
||||
count = 0;
|
||||
}
|
||||
char** out = g_new(char*, count + 1);
|
||||
char** ptr = out;
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < count; i++, ptr++) {
|
||||
char* str = gbinder_reader_read_string16(reader);
|
||||
|
||||
*ptr = str ? str : g_strdup("");
|
||||
}
|
||||
*ptr = NULL;
|
||||
return out;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
guint
|
||||
binder_append_vec_with_data(
|
||||
GBinderWriter* writer,
|
||||
@@ -777,6 +938,7 @@ binder_append_vec_with_data(
|
||||
guint count,
|
||||
const GBinderParent* parent)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderHidlVec* vec = gbinder_writer_new0(writer, GBinderHidlVec);
|
||||
GBinderParent p;
|
||||
|
||||
@@ -799,6 +961,7 @@ binder_copy_hidl_string_impl(
|
||||
const char* src,
|
||||
gssize len)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
dest->owns_buffer = TRUE;
|
||||
if (len > 0) {
|
||||
/* GBinderWriter takes ownership of the string contents */
|
||||
@@ -817,6 +980,7 @@ binder_copy_hidl_string(
|
||||
GBinderHidlString* dest,
|
||||
const char* src)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_copy_hidl_string_impl(writer, dest, src, src ? strlen(src) : 0);
|
||||
}
|
||||
|
||||
@@ -827,6 +991,7 @@ binder_copy_hidl_string_len(
|
||||
const char* src,
|
||||
gssize len)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
binder_copy_hidl_string_impl(writer, dest, src, (src && len < 0) ?
|
||||
strlen(src) : 0);
|
||||
}
|
||||
@@ -838,6 +1003,7 @@ binder_append_hidl_string_with_parent(
|
||||
guint32 index,
|
||||
guint32 offset)
|
||||
{
|
||||
DBG("func:%s,line:%d,file:%s", __func__, __LINE__, __FILE__);
|
||||
GBinderParent parent;
|
||||
|
||||
parent.index = index;
|
||||
|
||||
@@ -44,6 +44,21 @@ struct ofono_network_operator;
|
||||
#define binder_error_sim(err,sw1,sw2) \
|
||||
(binder_error_init_sim_error(err,sw1,sw2), err)
|
||||
|
||||
/* Internal extension for RADIO_PREF_NET_TYPE */
|
||||
typedef enum radio_pref_net_type_internal {
|
||||
RADIO_PREF_NET_NR_ONLY = RADIO_PREF_NET_TD_SCDMA_LTE_CDMA_EVDO_GSM_WCDMA + 1,
|
||||
RADIO_PREF_NET_NR_LTE,
|
||||
RADIO_PREF_NET_NR_LTE_CDMA_EVDO,
|
||||
RADIO_PREF_NET_NR_LTE_GSM_WCDMA,
|
||||
RADIO_PREF_NET_NR_LTE_CDMA_EVDO_GSM_WCDMA,
|
||||
RADIO_PREF_NET_NR_LTE_WCDMA,
|
||||
RADIO_PREF_NET_NR_LTE_TD_SCDMA,
|
||||
RADIO_PREF_NET_NR_LTE_TD_SCDMA_GSM,
|
||||
RADIO_PREF_NET_NR_LTE_TD_SCDMA_WCDMA,
|
||||
RADIO_PREF_NET_NR_LTE_TD_SCDMA_GSM_WCDMA,
|
||||
RADIO_PREF_NET_NR_LTE_TD_SCDMA_CDMA_EVDO_GSM_WCDMA
|
||||
} RADIO_PREF_NET_TYPE_INTERNAL;
|
||||
|
||||
RADIO_ACCESS_NETWORK
|
||||
binder_radio_access_network_for_tech(
|
||||
RADIO_TECH tech)
|
||||
@@ -187,6 +202,11 @@ binder_read_hidl_string(
|
||||
const GBinderReader* args)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
char*
|
||||
binder_read_string16(
|
||||
const GBinderReader* args)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
gboolean
|
||||
binder_read_int32(
|
||||
const GBinderReader* args,
|
||||
@@ -201,11 +221,31 @@ binder_read_hidl_struct1(
|
||||
#define binder_read_hidl_struct(reader,type) \
|
||||
((const type*)binder_read_hidl_struct1(reader, sizeof(type)))
|
||||
|
||||
const void*
|
||||
binder_read_parcelable(
|
||||
const GBinderReader* reader,
|
||||
gsize* out_size);
|
||||
|
||||
gsize
|
||||
binder_read_parcelable_size(
|
||||
GBinderReader* reader);
|
||||
|
||||
char**
|
||||
binder_strv_from_hidl_string_vec(
|
||||
const GBinderHidlVec* vec)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
char**
|
||||
binder_strv_from_string16_array(
|
||||
GBinderReader* reader)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
gboolean
|
||||
binder_read_string16_parse_int(
|
||||
GBinderReader* reader,
|
||||
gint32* value)
|
||||
BINDER_INTERNAL;
|
||||
|
||||
guint
|
||||
binder_append_vec_with_data(
|
||||
GBinderWriter* writer,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,12 +16,15 @@ endif
|
||||
SRC ?= $(EXE).c
|
||||
# COMMON_SRC += test_main.c
|
||||
|
||||
# Allow building against an oFono variant.
|
||||
OFONO_PKG ?= ofono
|
||||
|
||||
#
|
||||
# Required packages
|
||||
#
|
||||
|
||||
LINK_PKGS += libglibutil glib-2.0 gobject-2.0
|
||||
PKGS += $(LINK_PKGS) libgbinder libgbinder-radio
|
||||
PKGS += $(OFONO_PKG) $(LINK_PKGS) libgbinder libgbinder-radio
|
||||
|
||||
#
|
||||
# Default target
|
||||
|
||||
Reference in New Issue
Block a user