[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,7 +2,7 @@
<service name="tar_git">
<param name="url">https://github.com/mer-hybris/libgbinder-radio.git</param>
<param name="branch">master</param>
- <param name="revision">1.4.1</param>
+ <param name="revision">1.5.4</param>
<param name="token"/>
<param name="debian"/>
<param name="dumb"/>
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/.gitignore
^
|
@@ -8,6 +8,8 @@
debian/*.install
debian/tmp
documentation.list
+unit/coverage/*.gcov
+unit/coverage/report
installroot
build
RPMS
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/LICENSE
^
|
@@ -1,5 +1,5 @@
-Copyright (C) 2018-2021 Jolla Ltd.
-Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
+Copyright (C) 2018-2022 Jolla Ltd.
+Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
You may use this file under the terms of the BSD license as follows:
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/Makefile
^
|
@@ -1,7 +1,8 @@
# -*- Mode: makefile-gmake -*-
-.PHONY: clean all debug release coverage
+.PHONY: clean all debug release coverage test
.PHONY: debug_lib release_lib coverage_lib
+.PHONY: print_debug_lib print_release_lib print_coverage_lib
.PHONY: pkgconfig install install-dev
@@ -22,8 +23,8 @@
#
VERSION_MAJOR = 1
-VERSION_MINOR = 4
-VERSION_RELEASE = 1
+VERSION_MINOR = 5
+VERSION_RELEASE = 4
# Version for pkg-config
PCVERSION = $(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_RELEASE)
@@ -46,8 +47,13 @@
#
SRC = \
+ radio_base.c \
+ radio_client.c \
+ radio_config.c \
radio_instance.c \
radio_registry.c \
+ radio_request.c \
+ radio_request_group.c \
radio_util.c
#
@@ -138,7 +144,17 @@
pkgconfig: $(PKGCONFIG)
+print_debug_lib:
+ @echo $(DEBUG_LIB)
+
+print_release_lib:
+ @echo $(RELEASE_LIB)
+
+print_coverage_lib:
+ @echo $(COVERAGE_LIB)
+
clean:
+ make -C unit clean
rm -f *~ $(SRC_DIR)/*~ $(INCLUDE_DIR)/*~
rm -fr $(BUILD_DIR) RPMS installroot
rm -fr debian/tmp debian/libgbinder-radio debian/libgbinder-radio-dev
@@ -146,6 +162,9 @@
rm -f debian/*.debhelper.log debian/*.debhelper debian/*~
rm -f debian/*.install
+test:
+ make -C unit test
+
$(BUILD_DIR):
mkdir -p $@
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/README
^
|
@@ -0,0 +1,2 @@
+A library for communicating with Android IRadio binder services,
+built on top of libgbinder.
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/debian/changelog
^
|
@@ -1,3 +1,101 @@
+libgbinder-radio (1.5.4) unstable; urgency=medium
+
+ * Added NR specific types
+
+ -- Slava Monich <slava.monich@jolla.com> Wed, 30 Nov 2022 19:14:38 +0200
+
+libgbinder-radio (1.5.3) unstable; urgency=medium
+
+ * Added RADIO_ACCESS_NETWORKS enum
+
+ -- Slava Monich <slava.monich@jolla.com> Sat, 19 Nov 2022 17:48:38 +0200
+
+libgbinder-radio (1.5.2) unstable; urgency=medium
+
+ * Added network scan related types
+
+ -- Slava Monich <slava.monich@jolla.com> Thu, 17 Nov 2022 03:12:02 +0200
+
+libgbinder-radio (1.5.1) unstable; urgency=medium
+
+ * Fixed names of IRadio 1.4 and 1.5 responses
+
+ -- Slava Monich <slava.monich@jolla.com> Mon, 14 Nov 2022 22:34:08 +0200
+
+libgbinder-radio (1.5.0) unstable; urgency=medium
+
+ * Added support for IRadio@1.5
+ * Added support for IRadioConfig@1.2
+
+ -- Slava Monich <slava.monich@jolla.com> Fri, 16 Sep 2022 14:13:04 +0300
+
+libgbinder-radio (1.4.12) unstable; urgency=medium
+
+ * Fixed RadioDataRegStateResult_1_4
+
+ -- Slava Monich <slava.monich@jolla.com> Sun, 11 Sep 2022 21:37:23 +0300
+
+libgbinder-radio (1.4.11) unstable; urgency=medium
+
+ * Added radio_request_user_data()
+
+ -- Slava Monich <slava.monich@jolla.com> Wed, 31 Aug 2022 19:10:49 +0300
+
+libgbinder-radio (1.4.10) unstable; urgency=medium
+
+ * Tweaked completion callback criteria
+
+ -- Slava Monich <slava.monich@jolla.com> Fri, 15 Apr 2022 21:58:17 +0300
+
+libgbinder-radio (1.4.9) unstable; urgency=medium
+
+ * Added IMS types
+
+ -- Slava Monich <slava.monich@jolla.com> Thu, 17 Feb 2022 01:47:27 +0200
+
+libgbinder-radio (1.4.8) unstable; urgency=medium
+
+ * Fixed retries of blocking requests
+
+ -- Slava Monich <slava.monich@jolla.com> Wed, 19 Jan 2022 03:32:30 +0200
+
+libgbinder-radio (1.4.7) unstable; urgency=medium
+
+ * Fixed owner queue logic
+
+ -- Slava Monich <slava.monich@jolla.com> Mon, 10 Jan 2022 01:03:28 +0200
+
+libgbinder-radio (1.4.6) unstable; urgency=medium
+
+ * Added RadioConfig API
+
+ -- Slava Monich <slava.monich@jolla.com> Sat, 08 Jan 2022 20:58:06 +0200
+
+libgbinder-radio (1.4.5) unstable; urgency=medium
+
+ * Added radio_req_resp2()
+
+ -- Slava Monich <slava.monich@jolla.com> Thu, 16 Dec 2021 01:18:54 +0200
+
+libgbinder-radio (1.4.4) unstable; urgency=medium
+
+ * Added IRadio@1.2 IndicationFilter bits
+
+ -- Slava Monich <slava.monich@jolla.com> Tue, 14 Dec 2021 18:01:43 +0200
+
+libgbinder-radio (1.4.3) unstable; urgency=medium
+
+ * Added RadioClient and related APIs
+
+ -- Slava Monich <slava.monich@jolla.com> Thu, 02 Dec 2021 19:08:47 +0200
+
+libgbinder-radio (1.4.2) unstable; urgency=medium
+
+ * Don't assume that GBinderServiceManager is a GObject
+ * Added unit tests
+
+ -- Slava Monich <slava.monich@jolla.com> Sun, 12 Sep 2021 18:05:19 +0300
+
libgbinder-radio (1.4.1) unstable; urgency=medium
* Added RADIO_CELL_INFO_TYPE_1_4 enum
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/debian/control
^
|
@@ -1,7 +1,7 @@
Source: libgbinder-radio
Priority: optional
Maintainer: Danct12 <danct12@disroot.org>
-Build-Depends: debhelper (>=9), libgbinder-dev (>= 1.0.9)
+Build-Depends: debhelper (>=9), libgbinder-dev (>= 1.1.14), libglibutil-dev (>= 1.0.49)
Standards-Version: 3.9.6
Package: libgbinder-radio-dev
@@ -13,5 +13,5 @@
Package: libgbinder-radio
Section: libs
Architecture: any
-Depends: libgbinder (>= 1.0.9), ${shlibs:Depends}, ${misc:Depends}
+Depends: libgbinder (>= 1.1.14), libglibutil (>= 1.0.49), ${shlibs:Depends}, ${misc:Depends}
Description: Binder client library for Android radio interfaces
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/debian/copyright
^
|
@@ -1,5 +1,5 @@
-Copyright (C) 2018-2021 Jolla Ltd.
-Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
+Copyright (C) 2018-2022 Jolla Ltd.
+Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
You may use this file under the terms of the BSD license as follows:
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_client.h
^
|
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_CLIENT_H
+#define RADIO_CLIENT_H
+
+/* This API exists since 1.4.3 */
+
+#include <radio_types.h>
+
+G_BEGIN_DECLS
+
+typedef
+void
+(*RadioClientIndicationFunc)(
+ RadioClient* client,
+ RADIO_IND code,
+ const GBinderReader* reader,
+ gpointer user_data);
+
+typedef
+void
+(*RadioClientFunc)(
+ RadioClient* client,
+ gpointer user_data);
+
+RadioClient*
+radio_client_new(
+ RadioInstance* instance)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+RadioClient*
+radio_client_ref(
+ RadioClient* client);
+
+void
+radio_client_unref(
+ RadioClient* client);
+
+RADIO_INTERFACE
+radio_client_interface(
+ RadioClient* client);
+
+const char*
+radio_client_slot(
+ RadioClient* client);
+
+gboolean
+radio_client_dead(
+ RadioClient* client);
+
+gboolean
+radio_client_connected(
+ RadioClient* client);
+
+void
+radio_client_set_default_timeout(
+ RadioClient* client,
+ int milliseconds);
+
+gulong
+radio_client_add_indication_handler(
+ RadioClient* client,
+ RADIO_IND code,
+ RadioClientIndicationFunc func,
+ gpointer user_data);
+
+gulong
+radio_client_add_owner_changed_handler(
+ RadioClient* client,
+ RadioClientFunc func,
+ gpointer user_data);
+
+gulong
+radio_client_add_death_handler(
+ RadioClient* client,
+ RadioClientFunc func,
+ gpointer user_data);
+
+gulong
+radio_client_add_connected_handler(
+ RadioClient* client,
+ RadioClientFunc func,
+ gpointer user_data);
+
+void
+radio_client_remove_handler(
+ RadioClient* client,
+ gulong id);
+
+void
+radio_client_remove_handlers(
+ RadioClient* client,
+ gulong* ids,
+ int count);
+
+#define radio_client_remove_all_handlers(client,ids) \
+ radio_client_remove_handlers(client, ids, G_N_ELEMENTS(ids))
+
+G_END_DECLS
+
+#endif /* RADIO_CLIENT_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_config.h
^
|
@@ -0,0 +1,197 @@
+/*
+ * Copyright (C) 2022 Jolla Ltd.
+ * Copyright (C) 2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_CONFIG_H
+#define RADIO_CONFIG_H
+
+/* This API exists since 1.4.6 */
+
+#include <radio_config_types.h>
+
+G_BEGIN_DECLS
+
+typedef
+void
+(*RadioConfigFunc)(
+ RadioConfig* config,
+ gpointer user_data);
+
+typedef
+void
+(*RadioConfigRequestObserverFunc)(
+ RadioConfig* config,
+ RADIO_CONFIG_REQ code,
+ GBinderLocalRequest* args,
+ gpointer user_data);
+
+typedef
+void
+(*RadioConfigResponseObserverFunc)(
+ RadioConfig* config,
+ RADIO_CONFIG_RESP code,
+ const RadioResponseInfo* info,
+ const GBinderReader* args,
+ gpointer user_data);
+
+typedef
+void
+(*RadioConfigIndicationObserverFunc)(
+ RadioConfig* config,
+ RADIO_CONFIG_IND code,
+ const GBinderReader* args,
+ gpointer user_data);
+
+RadioConfig*
+radio_config_new(void)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+RadioConfig*
+radio_config_new_with_version(
+ RADIO_CONFIG_INTERFACE max_version)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+RadioConfig*
+radio_config_ref(
+ RadioConfig* config);
+
+void
+radio_config_unref(
+ RadioConfig* config);
+
+gboolean
+radio_config_dead(
+ RadioConfig* config);
+
+RADIO_CONFIG_INTERFACE
+radio_config_interface(
+ RadioConfig* config);
+
+gsize
+radio_config_rpc_header_size(
+ RadioConfig* config,
+ RADIO_CONFIG_REQ req);
+
+const char*
+radio_config_req_name(
+ RadioConfig* config,
+ RADIO_CONFIG_REQ req);
+
+const char*
+radio_config_resp_name(
+ RadioConfig* config,
+ RADIO_CONFIG_RESP resp);
+
+const char*
+radio_config_ind_name(
+ RadioConfig* config,
+ RADIO_CONFIG_IND ind);
+
+gulong
+radio_config_add_death_handler(
+ RadioConfig* config,
+ RadioConfigFunc func,
+ gpointer user_data);
+
+gulong
+radio_config_add_request_observer(
+ RadioConfig* config,
+ RADIO_CONFIG_REQ code,
+ RadioConfigRequestObserverFunc func,
+ gpointer user_data);
+
+gulong
+radio_config_add_request_observer_with_priority(
+ RadioConfig* config,
+ RADIO_OBSERVER_PRIORITY priority,
+ RADIO_CONFIG_REQ code,
+ RadioConfigRequestObserverFunc func,
+ gpointer user_data);
+
+gulong
+radio_config_add_response_observer(
+ RadioConfig* config,
+ RADIO_CONFIG_RESP code,
+ RadioConfigResponseObserverFunc func,
+ gpointer user_data);
+
+gulong
+radio_config_add_response_observer_with_priority(
+ RadioConfig* config,
+ RADIO_OBSERVER_PRIORITY priority,
+ RADIO_CONFIG_RESP code,
+ RadioConfigResponseObserverFunc func,
+ gpointer user_data);
+
+gulong
+radio_config_add_indication_observer(
+ RadioConfig* config,
+ RADIO_CONFIG_IND code,
+ RadioConfigIndicationObserverFunc func,
+ gpointer user_data);
+
+gulong
+radio_config_add_indication_observer_with_priority(
+ RadioConfig* config,
+ RADIO_OBSERVER_PRIORITY priority,
+ RADIO_CONFIG_IND code,
+ RadioConfigIndicationObserverFunc func,
+ gpointer user_data);
+
+void
+radio_config_remove_handler(
+ RadioConfig* config,
+ gulong id);
+
+void
+radio_config_remove_handlers(
+ RadioConfig* config,
+ gulong* ids,
+ int count);
+
+#define radio_config_remove_all_handlers(config,ids) \
+ radio_config_remove_handlers(config, ids, G_N_ELEMENTS(ids))
+
+G_END_DECLS
+
+#endif /* RADIO_CONFIG_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_config_types.h
^
|
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2022 Jolla Ltd.
+ * Copyright (C) 2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_CONFIG_TYPES_H
+#define RADIO_CONFIG_TYPES_H
+
+/* This API exists since 1.4.6 */
+
+#include <radio_types.h>
+
+G_BEGIN_DECLS
+
+typedef enum radio_config_interface {
+ RADIO_CONFIG_INTERFACE_NONE = -1,
+ RADIO_CONFIG_INTERFACE_1_0,
+ RADIO_CONFIG_INTERFACE_1_1,
+ RADIO_CONFIG_INTERFACE_1_2, /* Since 1.5.0 */
+ RADIO_CONFIG_INTERFACE_COUNT
+} RADIO_CONFIG_INTERFACE;
+
+#define RADIO_CONFIG_INTERFACE_MAX (RADIO_CONFIG_INTERFACE_COUNT - 1)
+
+#define RADIO_CONFIG_INSTANCE "default"
+#define RADIO_CONFIG_IFACE_PREFIX "android.hardware.radio.config@"
+#define RADIO_CONFIG_IFACE "IRadioConfig"
+#define RADIO_CONFIG_RESPONSE_IFACE "IRadioConfigResponse"
+#define RADIO_CONFIG_INDICATION_IFACE "IRadioConfigIndication"
+#define RADIO_CONFIG_IFACE_1_0(x) RADIO_CONFIG_IFACE_PREFIX "1.0::" x
+#define RADIO_CONFIG_IFACE_1_1(x) RADIO_CONFIG_IFACE_PREFIX "1.1::" x
+#define RADIO_CONFIG_IFACE_1_2(x) RADIO_CONFIG_IFACE_PREFIX "1.2::" x
+#define RADIO_CONFIG_1_0 RADIO_CONFIG_IFACE_1_0(RADIO_CONFIG_IFACE)
+#define RADIO_CONFIG_1_1 RADIO_CONFIG_IFACE_1_1(RADIO_CONFIG_IFACE)
+#define RADIO_CONFIG_1_2 RADIO_CONFIG_IFACE_1_2(RADIO_CONFIG_IFACE)
+#define RADIO_CONFIG_1_0_FQNAME RADIO_CONFIG_1_0 "/" RADIO_CONFIG_INSTANCE
+#define RADIO_CONFIG_1_1_FQNAME RADIO_CONFIG_1_1 "/" RADIO_CONFIG_INSTANCE
+#define RADIO_CONFIG_1_2_FQNAME RADIO_CONFIG_1_2 "/" RADIO_CONFIG_INSTANCE
+#define RADIO_CONFIG_RESPONSE_1_0 \
+ RADIO_CONFIG_IFACE_1_0(RADIO_CONFIG_RESPONSE_IFACE)
+#define RADIO_CONFIG_RESPONSE_1_1 \
+ RADIO_CONFIG_IFACE_1_1(RADIO_CONFIG_RESPONSE_IFACE)
+#define RADIO_CONFIG_RESPONSE_1_2 \
+ RADIO_CONFIG_IFACE_1_2(RADIO_CONFIG_RESPONSE_IFACE)
+#define RADIO_CONFIG_INDICATION_1_0 \
+ RADIO_CONFIG_IFACE_1_0(RADIO_CONFIG_INDICATION_IFACE)
+#define RADIO_CONFIG_INDICATION_1_1 \
+ RADIO_CONFIG_IFACE_1_1(RADIO_CONFIG_INDICATION_IFACE)
+#define RADIO_CONFIG_INDICATION_1_2 \
+ RADIO_CONFIG_IFACE_1_2(RADIO_CONFIG_INDICATION_IFACE)
+
+/* Types defined in types.hal */
+
+/* SlotState */
+typedef enum radio_slot_state {
+ RADIO_SLOT_STATE_INACTIVE,
+ RADIO_SLOT_STATE_ACTIVE
+} RADIO_SLOT_STATE;
+G_STATIC_ASSERT(sizeof(RADIO_SLOT_STATE) == 4);
+
+/* SimSlotStatus */
+typedef struct radio_sim_slot_status {
+ RADIO_CARD_STATE cardState RADIO_ALIGNED(4);
+ RADIO_SLOT_STATE slotState RADIO_ALIGNED(4);
+ GBinderHidlString atr RADIO_ALIGNED(8);
+ guint32 logicalSlotId RADIO_ALIGNED(4);
+ GBinderHidlString iccid RADIO_ALIGNED(8);
+} RADIO_ALIGNED(8) RadioSimSlotStatus;
+G_STATIC_ASSERT(sizeof(RadioSimSlotStatus) == 48);
+
+/* ModemInfo */
+typedef struct radio_modem_info {
+ guint8 modemId RADIO_ALIGNED(1);
+} RADIO_ALIGNED(1) RadioModemInfo;
+G_STATIC_ASSERT(sizeof(RadioModemInfo) == 1);
+
+/* PhoneCapability */
+typedef struct radio_phone_capability {
+ guint8 maxActiveData RADIO_ALIGNED(1);
+ guint8 maxActiveInternetData RADIO_ALIGNED(1);
+ guint8 isInternetLingeringSupported RADIO_ALIGNED(1);
+ GBinderHidlVec logicalModemList RADIO_ALIGNED(8); /* vec<ModemInfo> */
+} RADIO_ALIGNED(8) RadioPhoneCapability;
+G_STATIC_ASSERT(sizeof(RadioPhoneCapability) == 24);
+
+/* ModemsConfig */
+typedef struct radio_modems_config {
+ guint8 numOfLiveModems RADIO_ALIGNED(1);
+} RADIO_ALIGNED(1) RadioModemsConfig;
+G_STATIC_ASSERT(sizeof(RadioModemsConfig) == 1);
+
+/* Transaction codes */
+
+/* c(req,resp,Name,CALL_NAME) */
+#define RADIO_CONFIG_CALL_1_0(c) \
+ c(2,1,getSimSlotsStatus,GET_SIM_SLOTS_STATUS) \
+ c(3,2,setSimSlotsMapping,SET_SIM_SLOTS_MAPPING)
+
+#define RADIO_CONFIG_CALL_1_1(c) \
+ c(4,3,getPhoneCapability,GET_PHONE_CAPABILITY) \
+ c(5,4,setPreferredDataModem,SET_PREFERRED_DATA_MODEM) \
+ c(6,5,setModemsConfig,SET_MODEMS_CONFIG) \
+ c(7,6,getModemsConfig,GET_MODEMS_CONFIG)
+
+/* i(code,Name,IND_NAME) */
+#define RADIO_CONFIG_IND_1_0(i) \
+ i(1,simSlotsStatusChanged,SIM_SLOTS_STATUS_CHANGED)
+
+#define RADIO_CONFIG_IND_1_2(i) \
+ i(2,simSlotsStatusChanged_1_2,SIM_SLOTS_STATUS_CHANGED_1_2) /* Since 1.5.0 */
+
+typedef enum radio_config_req {
+ RADIO_CONFIG_REQ_ANY = 0,
+ RADIO_CONFIG_REQ_NONE = 0,
+#define RADIO_CONFIG_REQ_(req,resp,Name,NAME) RADIO_CONFIG_REQ_##NAME = req,
+
+ /* android.hardware.radio.config@1.0::IRadioConfig */
+ RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS = 1, /* setResponseFunctions */
+ RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_REQ_)
+ RADIO_CONFIG_1_0_REQ_LAST = RADIO_CONFIG_REQ_SET_SIM_SLOTS_MAPPING,
+
+ /* android.hardware.radio.config@1.1::IRadioConfig */
+ RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_REQ_)
+ RADIO_CONFIG_1_1_REQ_LAST = RADIO_CONFIG_REQ_GET_MODEMS_CONFIG
+
+#undef RADIO_CONFIG_REQ_
+} RADIO_CONFIG_REQ;
+G_STATIC_ASSERT(sizeof(RADIO_CONFIG_REQ) == 4);
+
+typedef enum radio_config_resp {
+ RADIO_CONFIG_RESP_ANY = 0,
+ RADIO_CONFIG_RESP_NONE = 0,
+#define RADIO_CONFIG_RESP_(req,resp,Name,NAME) RADIO_CONFIG_RESP_##NAME = resp,
+
+ /* android.hardware.radio.config@1.0::IRadioConfigResponse */
+ RADIO_CONFIG_CALL_1_0(RADIO_CONFIG_RESP_)
+ RADIO_CONFIG_1_0_RESP_LAST = RADIO_CONFIG_RESP_SET_SIM_SLOTS_MAPPING,
+
+ /* android.hardware.radio.config@1.1::IRadioConfigResponse */
+ RADIO_CONFIG_CALL_1_1(RADIO_CONFIG_RESP_)
+ RADIO_CONFIG_1_1_RESP_LAST = RADIO_CONFIG_RESP_GET_MODEMS_CONFIG,
+
+ /* android.hardware.radio.config@1.2::IRadioConfigResponse */
+ RADIO_CONFIG_RESP_GET_SIM_SLOTS_STATUS_1_2 = 7, /* Since 1.5.0 */
+ RADIO_CONFIG_1_2_RESP_LAST = RADIO_CONFIG_RESP_GET_SIM_SLOTS_STATUS_1_2
+#undef RADIO_CONFIG_RESP_
+} RADIO_CONFIG_RESP;
+G_STATIC_ASSERT(sizeof(RADIO_CONFIG_RESP) == 4);
+
+typedef enum radio_config_ind {
+ RADIO_CONFIG_IND_ANY = 0,
+ RADIO_CONFIG_IND_NONE = 0,
+#define RADIO_CONFIG_IND_(code,Name,NAME) RADIO_CONFIG_IND_##NAME = code,
+
+ /* android.hardware.radio.config@1.0::IRadioConfigIndication */
+ RADIO_CONFIG_IND_1_0(RADIO_CONFIG_IND_)
+ RADIO_CONFIG_1_0_IND_LAST = RADIO_CONFIG_IND_SIM_SLOTS_STATUS_CHANGED,
+
+ /* android.hardware.radio.config@1.2::IRadioConfigIndication */
+ RADIO_CONFIG_IND_1_2(RADIO_CONFIG_IND_) /* Since 1.5.0 */
+ RADIO_CONFIG_1_2_IND_LAST = RADIO_CONFIG_IND_SIM_SLOTS_STATUS_CHANGED_1_2
+#undef RADIO_CONFIG_IND_
+} RADIO_CONFIG_IND;
+G_STATIC_ASSERT(sizeof(RADIO_CONFIG_IND) == 4);
+
+G_END_DECLS
+
+#endif /* RADIO_CONFIG_TYPES_H */
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_instance.h
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018-2021 Jolla Ltd.
- * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2022 Jolla Ltd.
+ * Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
@@ -45,15 +45,6 @@
typedef struct radio_instance_priv RadioInstancePriv;
-typedef enum radio_interface {
- RADIO_INTERFACE_1_0,
- RADIO_INTERFACE_1_1,
- RADIO_INTERFACE_1_2,
- RADIO_INTERFACE_1_3,
- RADIO_INTERFACE_1_4,
- RADIO_INTERFACE_COUNT
-} RADIO_INTERFACE; /* Since 1.2.0 */
-
struct radio_instance {
GObject parent;
RadioInstancePriv* priv;
@@ -67,8 +58,16 @@
gboolean enabled;
/* Since 1.2.0 */
RADIO_INTERFACE version;
+ /* Since 1.4.3 */
+ gboolean connected; /* rilConnected received */
};
+/* These were introduced in 1.4.3 and then renamed in 1.4.6 */
+#define RADIO_INSTANCE_PRIORITY_LOWEST RADIO_OBSERVER_PRIORITY_LOWEST
+#define RADIO_INSTANCE_PRIORITY_DEFAULT RADIO_OBSERVER_PRIORITY_DEFAULT
+#define RADIO_INSTANCE_PRIORITY_HIGHEST RADIO_OBSERVER_PRIORITY_HIGHEST
+#define RADIO_INSTANCE_PRIORITY RADIO_OBSERVER_PRIORITY
+
typedef
void
(*RadioInstanceFunc)(
@@ -76,6 +75,14 @@
gpointer user_data);
typedef
+void
+(*RadioRequestObserverFunc)(
+ RadioInstance* radio,
+ RADIO_REQ code,
+ GBinderLocalRequest* args,
+ gpointer user_data); /* Since 1.4.3 */
+
+typedef
gboolean
(*RadioResponseHandlerFunc)(
RadioInstance* radio,
@@ -172,6 +179,11 @@
radio_instance_unref(
RadioInstance* radio);
+gsize
+radio_instance_rpc_header_size(
+ RadioInstance* radio,
+ RADIO_REQ req); /* Since 1.4.3 */
+
const char*
radio_instance_req_name(
RadioInstance* radio,
@@ -208,13 +220,36 @@
gboolean enabled); /* Since 1.0.7 */
gulong
-radio_instance_add_indication_handler(
+radio_instance_add_request_observer(
RadioInstance* radio,
- RADIO_IND code,
- RadioIndicationHandlerFunc func,
+ RADIO_REQ code,
+ RadioRequestObserverFunc func,
+ gpointer user_data); /* Since 1.4.3 */
+
+gulong
+radio_instance_add_request_observer_with_priority(
+ RadioInstance* radio,
+ RADIO_OBSERVER_PRIORITY priority,
+ RADIO_REQ code,
+ RadioRequestObserverFunc func,
+ gpointer user_data); /* Since 1.4.3 */
+
+gulong
+radio_instance_add_response_observer(
+ RadioInstance* radio,
+ RADIO_RESP code,
+ RadioResponseObserverFunc func,
gpointer user_data);
gulong
+radio_instance_add_response_observer_with_priority(
+ RadioInstance* radio,
+ RADIO_OBSERVER_PRIORITY priority,
+ RADIO_RESP code,
+ RadioResponseObserverFunc func,
+ gpointer user_data); /* Since 1.4.3 */
+
+gulong
radio_instance_add_indication_observer(
RadioInstance* radio,
RADIO_IND code,
@@ -222,6 +257,14 @@
gpointer user_data);
gulong
+radio_instance_add_indication_observer_with_priority(
+ RadioInstance* radio,
+ RADIO_OBSERVER_PRIORITY priority,
+ RADIO_IND code,
+ RadioIndicationObserverFunc func,
+ gpointer user_data); /* Since 1.4.3 */
+
+gulong
radio_instance_add_response_handler(
RadioInstance* radio,
RADIO_RESP code,
@@ -229,10 +272,10 @@
gpointer user_data);
gulong
-radio_instance_add_response_observer(
+radio_instance_add_indication_handler(
RadioInstance* radio,
- RADIO_RESP code,
- RadioResponseObserverFunc func,
+ RADIO_IND code,
+ RadioIndicationHandlerFunc func,
gpointer user_data);
gulong
@@ -253,6 +296,12 @@
RadioInstanceFunc func,
gpointer user_data); /* Since 1.0.7 */
+gulong
+radio_instance_add_connected_handler(
+ RadioInstance* radio,
+ RadioInstanceFunc func,
+ gpointer user_data); /* Since 1.4.3 */
+
void
radio_instance_remove_handler(
RadioInstance* radio,
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_request.h
^
|
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_REQUEST_H
+#define RADIO_REQUEST_H
+
+/* This API exists since 1.4.3 */
+
+#include <radio_config_types.h>
+
+/*
+ * Basic workflow
+ *
+ * 1. radio_request_new() or radio_request_new2() creates the request.
+ * That assigns a serial and initializes GBinderWriter for appending
+ * more arguments. GBinderWriter pointer can be NULL if serial is the
+ * only argument.
+ * 2. The caller (optionally) uses GBinderWriter to add more arguments
+ * to the request.
+ * 3. radio_request_submit() submits the request
+ * 4. radio_request_unref() can be called at this point to release the
+ * reference produced by radio_request_new() unless the caller needs
+ * to keep it. In any case, radio_request_unref() has to be called
+ * sooner or later for each request created by radio_request_new().
+ * The library keeps its own internal reference while the request is
+ * being processed.
+ * 5. RadioRequestCompleteFunc receives the response from the radio service.
+ */
+
+G_BEGIN_DECLS
+
+typedef enum radio_tx_status {
+ RADIO_TX_STATUS_OK, /* Successful completion, no error */
+ RADIO_TX_STATUS_FAILED, /* Request transaction failed */
+ RADIO_TX_STATUS_TIMEOUT /* No response transaction received */
+} RADIO_TX_STATUS;
+
+/*
+ * RadioRequestCompleteFunc
+ * RadioConfigRequestCompleteFunc
+ *
+ * Invoked upon completion of each request. If an error occurs,
+ * resp is set to zero (RADIO_RESP_NONE, RADIO_CONFIG_RESP_NONE)
+ * and args is NULL.
+ *
+ * The status argument is the status of the request transaction.
+ * If it's anything other than RADIO_TX_STATUS_OK, the request
+ * transaction failed (or response didn't arrive in time) and
+ * the other arguments can be ignored.
+ *
+ * If status is RADIO_TX_STATUS_OK then the resp, error and args
+ * arguments contain the information received in the response.
+ */
+typedef
+void
+(*RadioRequestCompleteFunc)(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ RADIO_RESP resp,
+ RADIO_ERROR error,
+ const GBinderReader* args,
+ gpointer user_data);
+
+typedef
+void
+(*RadioConfigRequestCompleteFunc)(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ RADIO_CONFIG_RESP resp,
+ RADIO_ERROR error,
+ const GBinderReader* args,
+ gpointer user_data); /* Since 1.4.6 */
+
+/*
+ * RadioRequestRetryFunc
+ *
+ * If retries are enabled with radio_request_set_retry_func(), then this
+ * callback is invoiked to check whether the request should be retried,
+ * based on the status received from the radio service and the contents
+ * of the reply. If such callback returns TRUE, the request is retried
+ * at some point in the future with a new serial, otherwise it gets
+ * completed right away.
+ *
+ * user_data is the pointer passed to radio_request_new() when the request
+ * was created.
+ */
+typedef
+gboolean
+(*RadioRequestRetryFunc)(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ guint32 resp, /* Was RADIO_RESP before 1.4.6 */
+ RADIO_ERROR error,
+ const GBinderReader* args,
+ void* user_data);
+
+RadioRequest*
+radio_request_new(
+ RadioClient* client,
+ RADIO_REQ code,
+ GBinderWriter* args, /* NULL if serial is the only arg */
+ RadioRequestCompleteFunc complete,
+ GDestroyNotify destroy,
+ void* user_data)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+RadioRequest*
+radio_request_new2(
+ RadioRequestGroup* group,
+ RADIO_REQ code,
+ GBinderWriter* args, /* NULL if serial is the only arg */
+ RadioRequestCompleteFunc complete,
+ GDestroyNotify destroy,
+ void* user_data)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+RadioRequest*
+radio_config_request_new(
+ RadioConfig* config,
+ RADIO_CONFIG_REQ code,
+ GBinderWriter* args, /* NULL if serial is the only arg */
+ RadioConfigRequestCompleteFunc complete,
+ GDestroyNotify destroy,
+ void* user_data) /* Since 1.4.6 */
+ G_GNUC_WARN_UNUSED_RESULT;
+
+RadioRequest*
+radio_request_ref(
+ RadioRequest* req);
+
+void
+radio_request_unref(
+ RadioRequest* req);
+
+void
+radio_request_set_blocking(
+ RadioRequest* req,
+ gboolean blocking);
+
+void
+radio_request_set_timeout(
+ RadioRequest* req,
+ guint milliseconds); /* Zero to use the default timeout */
+
+void
+radio_request_set_retry(
+ RadioRequest* req,
+ guint delay_ms, /* Delay before each retry, in milliseconds */
+ int max_count); /* Negative count to keep retrying indefinitely */
+
+void
+radio_request_set_retry_func(
+ RadioRequest* req,
+ RadioRequestRetryFunc retry);
+
+gboolean
+radio_request_submit(
+ RadioRequest* req);
+
+gboolean
+radio_request_retry(
+ RadioRequest* req);
+
+void
+radio_request_cancel(
+ RadioRequest* req);
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_request_group.h
^
|
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_REQUEST_GROUP_H
+#define RADIO_REQUEST_GROUP_H
+
+/* This API exists since 1.4.3 */
+
+#include <radio_types.h>
+
+/*
+ * In addition to being just a group of requests and making it easier
+ * to perform bulk operations (i.e. cancel all), RadioRequestGroup can
+ * be given the "blocker" status by its RadioClient and then only requests
+ * belonging to this group will be submitted until the block is released.
+ */
+
+G_BEGIN_DECLS
+
+struct radio_request_group {
+ RadioClient* client;
+};
+
+RadioRequestGroup*
+radio_request_group_new(
+ RadioClient* client)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+RadioRequestGroup*
+radio_request_group_ref(
+ RadioRequestGroup* group);
+
+void
+radio_request_group_unref(
+ RadioRequestGroup* group);
+
+void
+radio_request_group_cancel(
+ RadioRequestGroup* group);
+
+RADIO_BLOCK
+radio_request_group_block_status(
+ RadioRequestGroup* group);
+
+RADIO_BLOCK
+radio_request_group_block(
+ RadioRequestGroup* group);
+
+void
+radio_request_group_unblock(
+ RadioRequestGroup* group);
+
+G_END_DECLS
+
+#endif /* RADIO_REQUEST_GROUP_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_types.h
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018-2021 Jolla Ltd.
- * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2022 Jolla Ltd.
+ * Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
* Copyright (C) 2021 Open Mobile Platform LLC.
*
* You may use this file under the terms of the BSD license as follows:
@@ -42,8 +42,35 @@
G_BEGIN_DECLS
+typedef struct radio_client RadioClient;
+typedef struct radio_config RadioConfig;
typedef struct radio_instance RadioInstance;
typedef struct radio_registry RadioRegistry;
+typedef struct radio_request RadioRequest;
+typedef struct radio_request_group RadioRequestGroup;
+
+typedef enum radio_block_status {
+ RADIO_BLOCK_NONE,
+ RADIO_BLOCK_QUEUED,
+ RADIO_BLOCK_ACQUIRED
+} RADIO_BLOCK; /* Since 1.4.3 */
+
+typedef enum radio_interface {
+ RADIO_INTERFACE_NONE = -1, /* Since 1.4.3 */
+ RADIO_INTERFACE_1_0,
+ RADIO_INTERFACE_1_1,
+ RADIO_INTERFACE_1_2,
+ RADIO_INTERFACE_1_3,
+ RADIO_INTERFACE_1_4,
+ RADIO_INTERFACE_1_5, /* Since 1.5.0 */
+ RADIO_INTERFACE_COUNT
+} RADIO_INTERFACE; /* Since 1.2.0 */
+
+typedef enum radio_observer_priority {
+ RADIO_OBSERVER_PRIORITY_LOWEST,
+ RADIO_OBSERVER_PRIORITY_DEFAULT = 2,
+ RADIO_OBSERVER_PRIORITY_HIGHEST = 7
+} RADIO_OBSERVER_PRIORITY; /* Since 1.4.6 */
#define RADIO_IFACE_PREFIX "android.hardware.radio@"
#define RADIO_IFACE "IRadio"
@@ -54,21 +81,25 @@
#define RADIO_IFACE_1_2(x) RADIO_IFACE_PREFIX "1.2::" x
#define RADIO_IFACE_1_3(x) RADIO_IFACE_PREFIX "1.3::" x
#define RADIO_IFACE_1_4(x) RADIO_IFACE_PREFIX "1.4::" x
+#define RADIO_IFACE_1_5(x) RADIO_IFACE_PREFIX "1.5::" x
#define RADIO_1_0 RADIO_IFACE_1_0(RADIO_IFACE)
#define RADIO_1_1 RADIO_IFACE_1_1(RADIO_IFACE)
#define RADIO_1_2 RADIO_IFACE_1_2(RADIO_IFACE)
#define RADIO_1_3 RADIO_IFACE_1_3(RADIO_IFACE)
#define RADIO_1_4 RADIO_IFACE_1_4(RADIO_IFACE)
+#define RADIO_1_5 RADIO_IFACE_1_5(RADIO_IFACE)
#define RADIO_RESPONSE_1_0 RADIO_IFACE_1_0(RADIO_RESPONSE_IFACE)
#define RADIO_RESPONSE_1_1 RADIO_IFACE_1_1(RADIO_RESPONSE_IFACE)
#define RADIO_RESPONSE_1_2 RADIO_IFACE_1_2(RADIO_RESPONSE_IFACE)
#define RADIO_RESPONSE_1_3 RADIO_IFACE_1_3(RADIO_RESPONSE_IFACE)
#define RADIO_RESPONSE_1_4 RADIO_IFACE_1_4(RADIO_RESPONSE_IFACE)
+#define RADIO_RESPONSE_1_5 RADIO_IFACE_1_5(RADIO_RESPONSE_IFACE)
#define RADIO_INDICATION_1_0 RADIO_IFACE_1_0(RADIO_INDICATION_IFACE)
#define RADIO_INDICATION_1_1 RADIO_IFACE_1_1(RADIO_INDICATION_IFACE)
#define RADIO_INDICATION_1_2 RADIO_IFACE_1_2(RADIO_INDICATION_IFACE)
#define RADIO_INDICATION_1_3 RADIO_IFACE_1_3(RADIO_INDICATION_IFACE)
#define RADIO_INDICATION_1_4 RADIO_IFACE_1_4(RADIO_INDICATION_IFACE)
+#define RADIO_INDICATION_1_5 RADIO_IFACE_1_5(RADIO_INDICATION_IFACE)
/* Types defined in types.hal */
@@ -87,6 +118,94 @@
} RADIO_IND_TYPE;
G_STATIC_ASSERT(sizeof(RADIO_IND_TYPE) == 4);
+typedef enum radio_error {
+ RADIO_ERROR_NONE = 0,
+ RADIO_ERROR_RADIO_NOT_AVAILABLE = 1,
+ RADIO_ERROR_GENERIC_FAILURE = 2,
+ RADIO_ERROR_PASSWORD_INCORRECT = 3,
+ RADIO_ERROR_SIM_PIN2 = 4,
+ RADIO_ERROR_SIM_PUK2 = 5,
+ RADIO_ERROR_REQUEST_NOT_SUPPORTED = 6,
+ RADIO_ERROR_CANCELLED = 7,
+ RADIO_ERROR_OP_NOT_ALLOWED_DURING_VOICE_CALL = 8,
+ RADIO_ERROR_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9,
+ RADIO_ERROR_SMS_SEND_FAIL_RETRY = 10,
+ RADIO_ERROR_SIM_ABSENT = 11,
+ RADIO_ERROR_SUBSCRIPTION_NOT_AVAILABLE = 12,
+ RADIO_ERROR_MODE_NOT_SUPPORTED = 13,
+ RADIO_ERROR_FDN_CHECK_FAILURE = 14,
+ RADIO_ERROR_ILLEGAL_SIM_OR_ME = 15,
+ RADIO_ERROR_MISSING_RESOURCE = 16,
+ RADIO_ERROR_NO_SUCH_ELEMENT = 17,
+ RADIO_ERROR_DIAL_MODIFIED_TO_USSD = 18,
+ RADIO_ERROR_DIAL_MODIFIED_TO_SS = 19,
+ RADIO_ERROR_DIAL_MODIFIED_TO_DIAL = 20,
+ RADIO_ERROR_USSD_MODIFIED_TO_DIAL = 21,
+ RADIO_ERROR_USSD_MODIFIED_TO_SS = 22,
+ RADIO_ERROR_USSD_MODIFIED_TO_USSD = 23,
+ RADIO_ERROR_SS_MODIFIED_TO_DIAL = 24,
+ RADIO_ERROR_SS_MODIFIED_TO_USSD = 25,
+ RADIO_ERROR_SUBSCRIPTION_NOT_SUPPORTED = 26,
+ RADIO_ERROR_SS_MODIFIED_TO_SS = 27,
+ RADIO_ERROR_LCE_NOT_SUPPORTED = 36,
+ RADIO_ERROR_NO_MEMORY = 37,
+ RADIO_ERROR_INTERNAL_ERR = 38,
+ RADIO_ERROR_SYSTEM_ERR = 39,
+ RADIO_ERROR_MODEM_ERR = 40,
+ RADIO_ERROR_INVALID_STATE = 41,
+ RADIO_ERROR_NO_RESOURCES = 42,
+ RADIO_ERROR_SIM_ERR = 43,
+ RADIO_ERROR_INVALID_ARGUMENTS = 44,
+ RADIO_ERROR_INVALID_SIM_STATE = 45,
+ RADIO_ERROR_INVALID_MODEM_STATE = 46,
+ RADIO_ERROR_INVALID_CALL_ID = 47,
+ RADIO_ERROR_NO_SMS_TO_ACK = 48,
+ RADIO_ERROR_NETWORK_ERR = 49,
+ RADIO_ERROR_REQUEST_RATE_LIMITED = 50,
+ RADIO_ERROR_SIM_BUSY = 51,
+ RADIO_ERROR_SIM_FULL = 52,
+ RADIO_ERROR_NETWORK_REJECT = 53,
+ RADIO_ERROR_OPERATION_NOT_ALLOWED = 54,
+ RADIO_ERROR_EMPTY_RECORD = 55,
+ RADIO_ERROR_INVALID_SMS_FORMAT = 56,
+ RADIO_ERROR_ENCODING_ERR = 57,
+ RADIO_ERROR_INVALID_SMSC_ADDRESS = 58,
+ RADIO_ERROR_NO_SUCH_ENTRY = 59,
+ RADIO_ERROR_NETWORK_NOT_READY = 60,
+ RADIO_ERROR_NOT_PROVISIONED = 61,
+ RADIO_ERROR_NO_SUBSCRIPTION = 62,
+ RADIO_ERROR_NO_NETWORK_FOUND = 63,
+ RADIO_ERROR_DEVICE_IN_USE = 64,
+ RADIO_ERROR_ABORTED = 65,
+ RADIO_ERROR_INVALID_RESPONSE = 66,
+ RADIO_ERROR_OEM_ERROR_1 = 501,
+ RADIO_ERROR_OEM_ERROR_2 = 502,
+ RADIO_ERROR_OEM_ERROR_3 = 503,
+ RADIO_ERROR_OEM_ERROR_4 = 504,
+ RADIO_ERROR_OEM_ERROR_5 = 505,
+ RADIO_ERROR_OEM_ERROR_6 = 506,
+ RADIO_ERROR_OEM_ERROR_7 = 507,
+ RADIO_ERROR_OEM_ERROR_8 = 508,
+ RADIO_ERROR_OEM_ERROR_9 = 509,
+ RADIO_ERROR_OEM_ERROR_10 = 510,
+ RADIO_ERROR_OEM_ERROR_11 = 511,
+ RADIO_ERROR_OEM_ERROR_12 = 512,
+ RADIO_ERROR_OEM_ERROR_13 = 513,
+ RADIO_ERROR_OEM_ERROR_14 = 514,
+ RADIO_ERROR_OEM_ERROR_15 = 515,
+ RADIO_ERROR_OEM_ERROR_16 = 516,
+ RADIO_ERROR_OEM_ERROR_17 = 517,
+ RADIO_ERROR_OEM_ERROR_18 = 518,
+ RADIO_ERROR_OEM_ERROR_19 = 519,
+ RADIO_ERROR_OEM_ERROR_20 = 520,
+ RADIO_ERROR_OEM_ERROR_21 = 521,
+ RADIO_ERROR_OEM_ERROR_22 = 522,
+ RADIO_ERROR_OEM_ERROR_23 = 523,
+ RADIO_ERROR_OEM_ERROR_24 = 524,
+ RADIO_ERROR_OEM_ERROR_25 = 525
+} RADIO_ERROR; /* Since 1.4.3 */
+G_STATIC_ASSERT(sizeof(RADIO_ERROR) == 4);
+
typedef enum radio_state {
RADIO_STATE_OFF = 0,
RADIO_STATE_UNAVAILABLE = 1,
@@ -108,6 +227,12 @@
} RADIO_REG_STATE;
G_STATIC_ASSERT(sizeof(RADIO_REG_STATE) == 4);
+typedef enum radio_reg_access_technology_specific_info_type {
+ RADIO_REG_ACCESS_TECHNOLOGY_SPECIFIC_INFO_NONE = 0,
+ RADIO_REG_ACCESS_TECHNOLOGY_SPECIFIC_INFO_CDMA = 1,
+ RADIO_REG_ACCESS_TECHNOLOGY_SPECIFIC_INFO_EUTRAN = 2
+} RADIO_REG_ACCESS_TECHNOLOGY_SPECIFIC_INFO_TYPE; /* Since 1.5.0 */
+
typedef enum radio_ind_filter {
RADIO_IND_FILTER_NONE = 0,
RADIO_IND_FILTER_SIGNAL_STRENGTH = 0x01,
@@ -116,7 +241,11 @@
RADIO_IND_FILTER_ALL =
RADIO_IND_FILTER_SIGNAL_STRENGTH |
RADIO_IND_FILTER_FULL_NETWORK_STATE |
- RADIO_IND_FILTER_DATA_CALL_DORMANCY
+ RADIO_IND_FILTER_DATA_CALL_DORMANCY,
+ /* Since 1.4.4 (those appeared in IRadio@1.2) */
+ RADIO_IND_FILTER_LINK_CAPACITY_ESTIMATE = 0x08,
+ RADIO_IND_FILTER_PHYSICAL_CHANNEL_CONFIG = 0x10,
+ RADIO_IND_FILTER_ALL_1_2 = ~0
} RADIO_IND_FILTER;
G_STATIC_ASSERT(sizeof(RADIO_IND_FILTER) == 4);
@@ -157,6 +286,51 @@
RADIO_CELL_INFO_1_4_NR
} RADIO_CELL_INFO_TYPE_1_4; /* Since 1.4.1 */
+/* Cast guint8 RadioCellInfo_1_5.cellInfoType to this. */
+typedef enum radio_cell_info_type_1_5 {
+ RADIO_CELL_INFO_1_5_GSM = 0,
+ RADIO_CELL_INFO_1_5_WCDMA,
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/include/radio_util.h
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018-2019 Jolla Ltd.
- * Copyright (C) 2018-2019 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2021 Jolla Ltd.
+ * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
@@ -55,7 +55,13 @@
RADIO_RESP
radio_req_resp(
- RADIO_REQ req);
+ RADIO_REQ req)
+ G_GNUC_DEPRECATED_FOR(radio_req_resp2);
+
+RADIO_RESP
+radio_req_resp2(
+ RADIO_REQ req,
+ RADIO_INTERFACE iface); /* Since 1.4.5 */
G_END_DECLS
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_base.c
^
|
@@ -0,0 +1,1014 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include "radio_base.h"
+#include "radio_request_p.h"
+#include "radio_util.h"
+#include "radio_log.h"
+
+/*
+ * Requests are considered pending for no longer than pending_timeout
+ * because pending requests prevent blocking requests from being
+ * submitted and we don't want to get stuck forever.
+ */
+#define DEFAULT_PENDING_TIMEOUT_MS (30000)
+
+#define KEY(serial) GUINT_TO_POINTER(serial)
+
+struct radio_base_priv {
+ GHashTable* requests; /* All requests (weak references) */
+ GHashTable* active; /* Requests in QUEUED and PENDING states */
+ GHashTable* pending; /* Requests in PENDING state */
+ RadioRequest* queue_first; /* First QUEUED request */
+ RadioRequest* queue_last; /* Last QUEUED request */
+ RadioRequest* block_req;
+ RadioRequestGroup* owner;
+ GSList* owner_queue;
+
+ gint64 next_wakeup; /* When the next timer is scheduled */
+ guint default_timeout_ms; /* Default PENDING timeout, milliseconds */
+ guint timeout_id;
+};
+
+#define PARENT_CLASS radio_base_parent_class
+#define THIS_TYPE RADIO_TYPE_BASE
+#define THIS(obj) RADIO_BASE(obj)
+G_DEFINE_ABSTRACT_TYPE(RadioBase, radio_base, G_TYPE_OBJECT)
+
+enum radio_base_signal {
+ SIGNAL_OWNER,
+ SIGNAL_COUNT
+};
+
+#define SIGNAL_OWNER_NAME "radio-base-owner"
+
+static guint radio_base_signals[SIGNAL_COUNT] = { 0 };
+
+static inline gboolean
+radio_base_can_retry(RadioRequest* req)
+ { return req->max_retries < 0 || req->max_retries > req->retry_count; }
+
+/*==========================================================================*
+ * Implementation
+ *==========================================================================*/
+
+static
+guint32
+radio_base_reserve_serial(
+ RadioBase* self)
+{
+ /*
+ * Using a static counter practically guarantees that different
+ * serials would never be in use simultanously by different
+ * RadioBase-derived objects. And hopefully reduce the chance
+ * of confusion on the service side.
+ */
+ static guint32 last_serial = 0;
+ RadioBasePriv* priv = self->priv;
+
+ do { last_serial++; }
+ while (!last_serial ||
+ g_hash_table_contains(priv->requests, KEY(last_serial)));
+ return last_serial;
+}
+
+static
+void
+radio_base_unlink_request(
+ RadioBasePriv* q,
+ RadioRequest* req,
+ RadioRequest* prev)
+{
+ RadioRequest* next = req->queue_next;
+
+ if (prev) {
+ prev->queue_next = next;
+ } else {
+ q->queue_first = next;
+ }
+ if (next) {
+ req->queue_next = NULL;
+ } else {
+ q->queue_last = prev;
+ }
+}
+
+static
+gboolean
+radio_base_dequeue_request(
+ RadioBasePriv* q,
+ RadioRequest* req)
+{
+ RadioRequest* ptr = q->queue_first;
+ RadioRequest* prev = NULL;
+
+ while (ptr) {
+ if (ptr == req) {
+ radio_base_unlink_request(q, req, prev);
+ return TRUE;
+ }
+ prev = ptr;
+ ptr = ptr->queue_next;
+ }
+ return FALSE;
+}
+
+static
+void
+radio_base_deactivate_request(
+ RadioBase* self,
+ RadioRequest* req)
+{
+ RadioBasePriv* priv = self->priv;
+
+ g_hash_table_remove(priv->pending, KEY(req->serial2));
+ g_hash_table_remove(priv->pending, KEY(req->serial));
+ g_hash_table_remove(priv->active, KEY(req->serial2));
+ g_hash_table_remove(priv->active, KEY(req->serial));
+ if (req->state == RADIO_REQUEST_STATE_QUEUED) {
+ radio_base_dequeue_request(priv, req);
+ }
+ if (priv->block_req == req) {
+ /* Let the life continue */
+ priv->block_req = NULL;
+ GVERBOSE_("block %p => %p", req, priv->block_req);
+ radio_request_unref(req);
+ }
+}
+
+static
+void
+radio_base_drop_req(
+ RadioBase* self,
+ RadioRequest* req)
+{
+ radio_base_cancel_request(self, req);
+ radio_base_deactivate_request(self, req);
+ radio_base_reset_timeout(self);
+ if (req->state < RADIO_REQUEST_STATE_FAILED) {
+ req->state = RADIO_REQUEST_STATE_CANCELLED;
+ }
+}
+
+static
+void
+radio_base_detach_req(
+ gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ RadioRequest* req = value;
+
+ radio_base_cancel_request(THIS(user_data), req);
+ req->object = NULL;
+}
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_base.h
^
|
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_BASE_H
+#define RADIO_BASE_H
+
+#include "radio_types_p.h"
+
+#include <glib-object.h>
+
+/* RadioBaseFunc must be compatible with RadioClientFunc */
+typedef
+void
+(*RadioBaseFunc)(
+ RadioBase* base,
+ gpointer user_data);
+
+typedef
+void
+(*RadioBaseRequestSentFunc)(
+ RadioBase* base,
+ RadioRequest* req,
+ int status);
+
+typedef struct radio_base_priv RadioBasePriv;
+
+struct radio_base {
+ GObject object;
+ RadioBasePriv* priv;
+};
+
+typedef struct radio_base_class {
+ GObjectClass parent;
+ gboolean (*is_dead)(RadioBase* base);
+ gboolean (*can_submit_requests)(RadioBase* base);
+ GBinderLocalRequest* (*new_request)(RadioBase* base, guint32 code);
+ gulong (*send_request)(RadioBase* base, RadioRequest* req,
+ RadioBaseRequestSentFunc sent);
+ void (*cancel_request)(RadioBase* base, gulong id);
+} RadioBaseClass;
+
+GType radio_base_get_type(void) RADIO_INTERNAL;
+#define RADIO_TYPE_BASE radio_base_get_type()
+#define RADIO_BASE(obj) G_TYPE_CHECK_INSTANCE_CAST((obj), \
+ RADIO_TYPE_BASE, RadioBase)
+#define RADIO_BASE_CLASS(klass) G_TYPE_CHECK_CLASS_CAST((klass), \
+ RADIO_TYPE_BASE, RadioBaseClass)
+#define RADIO_BASE_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS((obj), \
+ THIS_TYPE, RadioBaseClass)
+
+void
+radio_base_initialize(
+ RadioBase* base)
+ RADIO_INTERNAL;
+
+void
+radio_base_register_request(
+ RadioBase* base,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+void
+radio_base_unregister_request(
+ RadioBase* base,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+gboolean
+radio_base_submit_request(
+ RadioBase* base,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+gboolean
+radio_base_retry_request(
+ RadioBase* base,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+void
+radio_base_request_dropped(
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+guint
+radio_base_timeout_ms(
+ RadioBase* base,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+void
+radio_base_reset_timeout(
+ RadioBase* base)
+ RADIO_INTERNAL;
+
+RADIO_BLOCK
+radio_base_block_status(
+ RadioBase* base,
+ RadioRequestGroup* group)
+ RADIO_INTERNAL;
+
+RADIO_BLOCK
+radio_base_block(
+ RadioBase* base,
+ RadioRequestGroup* group)
+ RADIO_INTERNAL;
+
+void
+radio_base_unblock(
+ RadioBase* base,
+ RadioRequestGroup* group)
+ RADIO_INTERNAL;
+
+gboolean
+radio_base_handle_resp(
+ RadioBase* base,
+ guint32 code,
+ const RadioResponseInfo* info,
+ const GBinderReader* reader)
+ RADIO_INTERNAL;
+
+void
+radio_base_handle_ack(
+ RadioBase* base,
+ guint32 serial)
+ RADIO_INTERNAL;
+
+void
+radio_base_handle_death(
+ RadioBase* base)
+ RADIO_INTERNAL;
+
+void
+radio_base_submit_requests(
+ RadioBase* base)
+ RADIO_INTERNAL;
+
+void
+radio_base_cancel_request(
+ RadioBase* base,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+void
+radio_base_set_default_timeout(
+ RadioBase* self,
+ int ms)
+ RADIO_INTERNAL;
+
+gulong
+radio_base_add_owner_changed_handler(
+ RadioBase* base,
+ RadioBaseFunc func,
+ gpointer user_data)
+ RADIO_INTERNAL;
+
+#endif /* RADIO_BASE_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_client.c
^
|
@@ -0,0 +1,473 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "radio_base.h"
+#include "radio_client.h"
+#include "radio_instance_p.h"
+#include "radio_request_p.h"
+#include "radio_util.h"
+#include "radio_log.h"
+
+#include <gutil_macros.h>
+#include <gutil_misc.h>
+
+/* This API exists since 1.4.3 */
+
+enum radio_events {
+ RADIO_EVENT_IND,
+ RADIO_EVENT_RESP,
+ RADIO_EVENT_ACK,
+ RADIO_EVENT_DEATH,
+ RADIO_EVENT_CONNECTED,
+ RADIO_EVENT_COUNT
+};
+
+struct radio_client {
+ RadioBase base;
+ RadioInstance* instance;
+ gulong event_ids[RADIO_EVENT_COUNT];
+};
+
+typedef RadioBaseClass RadioClientClass;
+GType radio_client_get_type() RADIO_INTERNAL;
+G_DEFINE_TYPE(RadioClient, radio_client, RADIO_TYPE_BASE)
+
+#define PARENT_CLASS radio_client_parent_class
+#define THIS_TYPE radio_client_get_type()
+#define THIS(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, THIS_TYPE, RadioClient)
+
+typedef struct radio_client_call {
+ RadioRequest* req;
+ RadioBaseRequestSentFunc callback;
+} RadioClientCall;
+
+enum radio_client_signal {
+ SIGNAL_INDICATION,
+ SIGNAL_DEATH,
+ SIGNAL_CONNECTED,
+ SIGNAL_COUNT
+};
+
+#define SIGNAL_INDICATION_NAME "radio-client-indication"
+#define SIGNAL_DEATH_NAME "radio-client-death"
+#define SIGNAL_CONNECTED_NAME "radio-client-connected"
+
+static guint radio_client_signals[SIGNAL_COUNT] = { 0 };
+
+/*==========================================================================*
+ * Implementation
+ *==========================================================================*/
+
+static
+void
+radio_client_call_free(
+ RadioClientCall* call)
+{
+ radio_request_unref(call->req);
+ gutil_slice_free(call);
+}
+
+static
+void
+radio_client_call_destroy(
+ void* user_data1,
+ void* user_data2)
+{
+ radio_client_call_free(user_data2);
+}
+
+static
+void
+radio_client_call_complete(
+ RadioInstance* instance,
+ gulong id,
+ int status,
+ void* user_data1,
+ void* user_data2)
+{
+ RadioClientCall* call = user_data2;
+
+ call->callback(RADIO_BASE(user_data1), call->req, status);
+}
+
+static
+void
+radio_client_handle_death(
+ RadioInstance* instance,
+ gpointer user_data)
+{
+ RadioBase* base = RADIO_BASE(user_data);
+
+ g_object_ref(base);
+ radio_base_handle_death(base);
+ g_signal_emit(base, radio_client_signals[SIGNAL_DEATH], 0);
+ g_object_unref(base);
+}
+
+static
+void
+radio_client_handle_connected(
+ RadioInstance* instance,
+ gpointer user_data)
+{
+ g_signal_emit(THIS(user_data), radio_client_signals[SIGNAL_CONNECTED], 0);
+ radio_base_submit_requests(RADIO_BASE(user_data));
+}
+
+static
+void
+radio_client_handle_ack(
+ RadioInstance* instance,
+ guint32 serial,
+ gpointer user_data)
+{
+ radio_base_handle_ack(RADIO_BASE(user_data), serial);
+}
+
+static
+void
+radio_client_handle_ind(
+ RadioInstance* instance,
+ RADIO_IND code,
+ RADIO_IND_TYPE type,
+ const GBinderReader* reader,
+ gpointer user_data)
+{
+ g_signal_emit(THIS(user_data), radio_client_signals[SIGNAL_INDICATION],
+ radio_instance_ind_quark(instance, code), code, reader);
+}
+
+static
+void
+radio_client_handle_resp(
+ RadioInstance* instance,
+ RADIO_RESP code,
+ const RadioResponseInfo* info,
+ const GBinderReader* reader,
+ gpointer user_data)
+{
+ if (!radio_base_handle_resp(RADIO_BASE(user_data), code, info, reader)) {
+ const char* name = radio_resp_name(code);
+
+ /* Most likely this is a response to a cancelled request */
+ GDEBUG("Ignoring IRadio response [%08x] %u %s", info->serial, code,
+ name ? name : "");
+ }
+}
+
+static
+gulong
+radio_client_add_handler(
+ RadioClient* self,
+ enum radio_client_signal sig,
+ RadioClientFunc fn,
+ gpointer user_data)
+{
+ return (G_LIKELY(self) && G_LIKELY(fn)) ?
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_config.c
^
|
@@ -0,0 +1,1008 @@
+/*
+ * Copyright (C) 2022 Jolla Ltd.
+ * Copyright (C) 2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "radio_base.h"
+#include "radio_config.h"
+#include "radio_log.h"
+#include "radio_request_p.h"
+#include "radio_util_p.h"
+
+#include <gbinder.h>
+
+#include <gutil_idlepool.h>
+#include <gutil_macros.h>
+#include <gutil_misc.h>
+#include <gutil_strv.h>
+
+/* This API exists since 1.4.6 */
+
+typedef struct radio_config {
+ RadioBase base;
+ GUtilIdlePool* pool;
+ GBinderClient* client;
+ GBinderRemoteObject* remote;
+ GBinderLocalObject* response;
+ GBinderLocalObject* indication;
+ RADIO_CONFIG_INTERFACE version;
+ GHashTable* req_quarks;
+ GHashTable* resp_quarks;
+ GHashTable* ind_quarks;
+ gulong death_id;
+ gboolean dead;
+} RadioConfig;
+
+typedef RadioBaseClass RadioConfigClass;
+GType radio_config_get_type() RADIO_INTERNAL;
+G_DEFINE_TYPE(RadioConfig, radio_config, RADIO_TYPE_BASE)
+
+#define PARENT_CLASS radio_config_parent_class
+#define THIS_TYPE radio_config_get_type()
+#define THIS(obj) G_TYPE_CHECK_INSTANCE_CAST(obj, THIS_TYPE, RadioConfig)
+
+typedef enum radio_config_signal {
+ #define SIGNAL_INDEX(x) SIGNAL_OBSERVE_REQUEST_##x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_INDEX)
+ #undef SIGNAL_INDEX
+ #define SIGNAL_INDEX(x) SIGNAL_OBSERVE_RESPONSE_##x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_INDEX)
+ #undef SIGNAL_INDEX
+ #define SIGNAL_INDEX(x) SIGNAL_OBSERVE_INDICATION_##x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_INDEX)
+ #undef SIGNAL_INDEX
+ SIGNAL_INDICATION,
+ SIGNAL_DEATH,
+ SIGNAL_COUNT
+} RADIO_CONFIG_SIGNAL;
+
+static const char* radio_config_signal_observe_request_name[] = {
+ #define SIGNAL_NAME(x) "radio-config-observe-request-" #x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_NAME)
+ #undef SIGNAL_NAME
+ NULL
+};
+
+static const char* radio_config_signal_observe_response_name[] = {
+ #define SIGNAL_NAME(x) "radio-config-observe-response-" #x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_NAME)
+ #undef SIGNAL_NAME
+ NULL
+};
+
+static const char* radio_config_signal_observe_indication_name[] = {
+ #define SIGNAL_NAME(x) "radio-config-observe-indication-" #x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_NAME)
+ #undef SIGNAL_NAME
+ NULL
+};
+
+#define SIGNAL_INDICATION_NAME "radio-config-indication"
+#define SIGNAL_DEATH_NAME "radio-config-death"
+
+static guint radio_config_signals[SIGNAL_COUNT] = { 0 };
+
+static const GBinderClientIfaceInfo radio_config_iface_info[] = {
+ {RADIO_CONFIG_1_1, RADIO_CONFIG_1_1_REQ_LAST },
+ {RADIO_CONFIG_1_1, RADIO_CONFIG_1_1_REQ_LAST },
+ {RADIO_CONFIG_1_0, RADIO_CONFIG_1_0_REQ_LAST }
+};
+G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_iface_info) ==
+ RADIO_CONFIG_INTERFACE_COUNT);
+
+static const char* const radio_config_indication_ifaces[] = {
+ RADIO_CONFIG_INDICATION_1_2,
+ RADIO_CONFIG_INDICATION_1_1,
+ RADIO_CONFIG_INDICATION_1_0,
+ NULL
+};
+G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_indication_ifaces) ==
+ RADIO_CONFIG_INTERFACE_COUNT + 1);
+
+static const char* const radio_config_response_ifaces[] = {
+ RADIO_CONFIG_RESPONSE_1_2,
+ RADIO_CONFIG_RESPONSE_1_1,
+ RADIO_CONFIG_RESPONSE_1_0,
+ NULL
+};
+G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_response_ifaces) ==
+ RADIO_CONFIG_INTERFACE_COUNT + 1);
+
+typedef struct radio_config_interface_desc {
+ RADIO_CONFIG_INTERFACE version;
+ const char* fqname;
+ const char* radio_iface;
+ const char* const* ind_ifaces;
+ const char* const* resp_ifaces;
+} RadioConfigInterfaceDesc;
+
+#define RADIO_CONFIG_INTERFACE_INDEX(x) (RADIO_CONFIG_INTERFACE_COUNT - x - 1)
+
+#define RADIO_CONFIG_INTERFACE_DESC(v) \
+ RADIO_CONFIG_INTERFACE_##v, \
+ RADIO_CONFIG_##v##_FQNAME, \
+ RADIO_CONFIG_##v, \
+ radio_config_indication_ifaces + \
+ RADIO_CONFIG_INTERFACE_INDEX(RADIO_CONFIG_INTERFACE_##v), \
+ radio_config_response_ifaces + \
+ RADIO_CONFIG_INTERFACE_INDEX(RADIO_CONFIG_INTERFACE_##v)
+
+static const RadioConfigInterfaceDesc radio_config_interfaces[] = {
+ { RADIO_CONFIG_INTERFACE_DESC(1_2) },
+ { RADIO_CONFIG_INTERFACE_DESC(1_1) },
+ { RADIO_CONFIG_INTERFACE_DESC(1_0) }
+};
+G_STATIC_ASSERT(G_N_ELEMENTS(radio_config_interfaces) ==
+ RADIO_CONFIG_INTERFACE_COUNT);
+
+/* Must have a separate instance for each interface version */
+static RadioConfig* radio_config_instance[RADIO_CONFIG_INTERFACE_COUNT] =
+ { NULL };
+
+typedef struct radio_config_call {
+ RadioRequest* req;
+ RadioBaseRequestSentFunc callback;
+ RadioBase* object;
+} RadioConfigCall;
+
+/*==========================================================================*
+ * Implementation
+ *==========================================================================*/
+
+static
+void
+radio_config_call_free(
+ RadioConfigCall* call)
+{
+ radio_request_unref(call->req);
+ gutil_slice_free(call);
+}
+
+static
+void
+radio_config_call_complete(
+ GBinderClient* client,
+ GBinderRemoteReply* reply,
+ int status,
+ void* user_data)
+{
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_instance.c
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018-2021 Jolla Ltd.
- * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2022 Jolla Ltd.
+ * Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
@@ -36,14 +36,15 @@
#define GLIB_DISABLE_DEPRECATION_WARNINGS
-#include "radio_instance.h"
+#include "radio_instance_p.h"
#include "radio_registry_p.h"
-#include "radio_util.h"
+#include "radio_util_p.h"
#include "radio_log.h"
#include <gbinder.h>
#include <gutil_idlepool.h>
+#include <gutil_macros.h>
#include <gutil_misc.h>
#include <gutil_strv.h>
@@ -56,6 +57,7 @@
GBinderRemoteObject* remote;
GBinderLocalObject* response;
GBinderLocalObject* indication;
+ GHashTable* req_quarks;
GHashTable* resp_quarks;
GHashTable* ind_quarks;
gulong death_id;
@@ -67,24 +69,52 @@
G_DEFINE_TYPE(RadioInstance, radio_instance, G_TYPE_OBJECT)
-enum radio_instance_signal {
- SIGNAL_HANDLE_INDICATION,
+typedef enum radio_instance_signal {
+ #define SIGNAL_INDEX(x) SIGNAL_OBSERVE_REQUEST_##x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_INDEX)
+ #undef SIGNAL_INDEX
+ #define SIGNAL_INDEX(x) SIGNAL_OBSERVE_RESPONSE_##x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_INDEX)
+ #undef SIGNAL_INDEX
+ #define SIGNAL_INDEX(x) SIGNAL_OBSERVE_INDICATION_##x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_INDEX)
+ #undef SIGNAL_INDEX
SIGNAL_HANDLE_RESPONSE,
- SIGNAL_OBSERVE_INDICATION,
- SIGNAL_OBSERVE_RESPONSE,
+ SIGNAL_HANDLE_INDICATION,
SIGNAL_ACK,
SIGNAL_DEATH,
SIGNAL_ENABLED,
+ SIGNAL_CONNECTED,
SIGNAL_COUNT
+} RADIO_INSTANCE_SIGNAL;
+
+static const char* radio_instance_signal_observe_request_name[] = {
+ #define SIGNAL_NAME(x) "radio-instance-observe-request-" #x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_NAME)
+ #undef SIGNAL_NAME
+ NULL
+};
+
+static const char* radio_instance_signal_observe_response_name[] = {
+ #define SIGNAL_NAME(x) "radio-instance-observe-response-" #x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_NAME)
+ #undef SIGNAL_NAME
+ NULL
+};
+
+static const char* radio_instance_signal_observe_indication_name[] = {
+ #define SIGNAL_NAME(x) "radio-instance-observe-indication-" #x,
+ FOREACH_OBSERVER_PRIORITY(SIGNAL_NAME)
+ #undef SIGNAL_NAME
+ NULL
};
#define SIGNAL_HANDLE_INDICATION_NAME "radio-instance-handle-indication"
#define SIGNAL_HANDLE_RESPONSE_NAME "radio-instance-handle-response"
-#define SIGNAL_OBSERVE_INDICATION_NAME "radio-instance-observe-indication"
-#define SIGNAL_OBSERVE_RESPONSE_NAME "radio-instance-observe-response"
#define SIGNAL_ACK_NAME "radio-instance-ack"
#define SIGNAL_DEATH_NAME "radio-instance-death"
#define SIGNAL_ENABLED_NAME "radio-instance-enabled"
+#define SIGNAL_CONNECTED_NAME "radio-instance-connected"
static guint radio_instance_signals[SIGNAL_COUNT] = { 0 };
@@ -93,6 +123,7 @@
#define DEFAULT_INTERFACE RADIO_INTERFACE_1_0
static const GBinderClientIfaceInfo radio_iface_info[] = {
+ {RADIO_1_5, RADIO_1_5_REQ_LAST },
{RADIO_1_4, RADIO_1_4_REQ_LAST },
{RADIO_1_3, RADIO_1_3_REQ_LAST },
{RADIO_1_2, RADIO_1_2_REQ_LAST },
@@ -102,6 +133,7 @@
G_STATIC_ASSERT(G_N_ELEMENTS(radio_iface_info) == RADIO_INTERFACE_COUNT);
static const char* const radio_indication_ifaces[] = {
+ RADIO_INDICATION_1_5,
RADIO_INDICATION_1_4,
RADIO_INDICATION_1_3,
RADIO_INDICATION_1_2,
@@ -112,6 +144,7 @@
G_STATIC_ASSERT(G_N_ELEMENTS(radio_indication_ifaces) == RADIO_INTERFACE_COUNT + 1);
static const char* const radio_response_ifaces[] = {
+ RADIO_RESPONSE_1_5,
RADIO_RESPONSE_1_4,
RADIO_RESPONSE_1_3,
RADIO_RESPONSE_1_2,
@@ -136,6 +169,7 @@
radio_response_ifaces + RADIO_INTERFACE_INDEX(RADIO_INTERFACE_##v)
static const RadioInterfaceDesc radio_interfaces[] = {
+ { RADIO_INTERFACE_DESC(1_5) },
{ RADIO_INTERFACE_DESC(1_4) },
{ RADIO_INTERFACE_DESC(1_3) },
{ RADIO_INTERFACE_DESC(1_2) },
@@ -144,32 +178,41 @@
};
G_STATIC_ASSERT(G_N_ELEMENTS(radio_interfaces) == RADIO_INTERFACE_COUNT);
+typedef struct radio_instance_tx {
+ RadioInstance* instance;
+ RadioInstanceTxCompleteFunc complete;
+ RadioInstanceTxDestroyFunc destroy;
+ gulong id;
+ void* user_data1;
+ void* user_data2;
+} RadioInstanceTx;
+
/*==========================================================================*
* Implementation
*==========================================================================*/
static
GQuark
-radio_instance_ind_quark(
+radio_instance_req_quark(
RadioInstance* self,
- RADIO_IND ind)
+ RADIO_REQ req)
{
GQuark q = 0;
- if (ind != RADIO_IND_ANY) {
+ if (req != RADIO_REQ_ANY) {
RadioInstancePriv* priv = self->priv;
- gpointer key = GUINT_TO_POINTER(ind);
+ gpointer key = GUINT_TO_POINTER(req);
- q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->ind_quarks, key));
+ q = GPOINTER_TO_UINT(g_hash_table_lookup(priv->req_quarks, key));
if (!q) {
- const char* known = radio_ind_name(ind);
+ const char* known = radio_req_name(req);
if (known) {
q = g_quark_from_static_string(known);
} else {
- q = g_quark_from_string(radio_instance_ind_name(self, ind));
+ q = g_quark_from_string(radio_instance_req_name(self, req));
}
- g_hash_table_insert(priv->ind_quarks, key, GUINT_TO_POINTER(q));
+ g_hash_table_insert(priv->req_quarks, key, GUINT_TO_POINTER(q));
}
}
return q;
@@ -203,6 +246,28 @@
}
static
+void
+radio_instance_notify_request_observers(
+ RadioInstance* self,
+ RADIO_REQ code,
+ GBinderLocalRequest* args)
+{
+ GQuark quark = 0;
+ int i;
+
+ for (i = RADIO_OBSERVER_PRIORITY_COUNT - 1; i >= 0; i--) {
+ guint id = radio_instance_signals[SIGNAL_OBSERVE_REQUEST_0 + i];
+
+ if (id) {
+ if (!quark) {
+ quark = radio_instance_req_quark(self, code);
+ }
+ g_signal_emit(self, id, quark, code, args);
+ }
+ }
+}
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_instance_p.h
^
|
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_INSTANCE_PRIVATE_H
+#define RADIO_INSTANCE_PRIVATE_H
+
+#include "radio_types_p.h"
+#include "radio_instance.h"
+
+typedef
+void
+(*RadioInstanceTxCompleteFunc)(
+ RadioInstance* instance,
+ gulong id,
+ int status,
+ void* user_data1,
+ void* user_data2);
+
+typedef
+void
+(*RadioInstanceTxDestroyFunc)(
+ void* user_data1,
+ void* user_data2);
+
+gulong
+radio_instance_send_request(
+ RadioInstance* instance,
+ RADIO_REQ code,
+ GBinderLocalRequest* args,
+ RadioInstanceTxCompleteFunc complete,
+ RadioInstanceTxDestroyFunc destroy,
+ void* user_data1,
+ void* user_data2)
+ RADIO_INTERNAL;
+
+void
+radio_instance_cancel_request(
+ RadioInstance* instance,
+ gulong id)
+ RADIO_INTERNAL;
+
+GQuark
+radio_instance_ind_quark(
+ RadioInstance* instance,
+ RADIO_IND ind)
+ RADIO_INTERNAL;
+
+#endif /* RADIO_INSTANCE_PRIVATE_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_registry.c
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018-2019 Jolla Ltd.
- * Copyright (C) 2018-2019 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2021 Jolla Ltd.
+ * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
@@ -44,6 +44,7 @@
GObject parent;
};
+GType radio_registry_get_type(void) RADIO_INTERNAL;
G_DEFINE_TYPE(RadioRegistry, radio_registry, G_TYPE_OBJECT)
#define RADIO_TYPE_REGISTRY (radio_registry_get_type())
#define RADIO_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), \
@@ -110,7 +111,7 @@
(gpointer*)(&radio_registry_instance));
}
return radio_registry_instance;
-
+
}
RadioRegistry*
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_registry_p.h
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018-2020 Jolla Ltd.
- * Copyright (C) 2018-2020 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2021 Jolla Ltd.
+ * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
@@ -37,17 +37,18 @@
#ifndef RADIO_REGISTRY_PRIVATE_H
#define RADIO_REGISTRY_PRIVATE_H
+#include "radio_types_p.h"
#include "radio_registry.h"
void
radio_registry_instance_added(
RadioInstance* instance)
- G_GNUC_INTERNAL;
+ RADIO_INTERNAL;
void
radio_registry_instance_removed(
const char* key)
- G_GNUC_INTERNAL;
+ RADIO_INTERNAL;
#endif /* RADIO_REGISTRY_PRIVATE_H */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_request.c
^
|
@@ -0,0 +1,382 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "radio_base.h"
+#include "radio_request_p.h"
+#include "radio_request_group_p.h"
+#include "radio_log.h"
+
+#include <gbinder_local_request.h>
+#include <gbinder_writer.h>
+
+#include <gutil_macros.h>
+
+typedef enum radio_request_flags {
+ RADIO_REQUEST_NO_FLAGS = 0,
+ RADIO_REQUEST_FLAG_DROPPED = 0x01,
+ RADIO_REQUEST_FLAG_SUBMITTED = 0x02
+} RADIO_REQUEST_FLAGS;
+
+typedef struct radio_request_object {
+ RadioRequest pub;
+ GDestroyNotify destroy;
+ gsize serial_offset;
+ RADIO_REQUEST_FLAGS flags;
+ gint refcount;
+} RadioRequestObject;
+
+static inline RadioRequestObject* radio_request_cast(RadioRequest* req)
+ { return req ? G_CAST(req, RadioRequestObject, pub) : NULL; }
+
+/*==========================================================================*
+ * Implementation
+ *==========================================================================*/
+
+static
+void
+radio_request_object_cancel(
+ RadioRequestObject* self)
+{
+ RadioRequest* req = &self->pub;
+
+ radio_base_cancel_request(req->object, req);
+ if (!(self->flags & RADIO_REQUEST_FLAG_DROPPED)) {
+ self->flags |= RADIO_REQUEST_FLAG_DROPPED;
+ radio_request_group_remove(req->group, req);
+ radio_base_request_dropped(req);
+ }
+ radio_base_unregister_request(req->object, req);
+}
+
+static
+void
+radio_request_free(
+ RadioRequestObject* self)
+{
+ RadioRequest* req = &self->pub;
+
+ GVERBOSE_("%u (%08x) %p", req->code, req->serial, req);
+ radio_request_object_cancel(self);
+
+ /* Don't invoke completion routine if the request was never submitted */
+ if (req->complete && (self->flags & RADIO_REQUEST_FLAG_SUBMITTED)) {
+ RadioRequestCompleteFunc complete = req->complete;
+
+ /* Request is being freed too early, before completion */
+ req->complete = NULL;
+ complete(req, RADIO_TX_STATUS_FAILED, RADIO_RESP_NONE,
+ RADIO_ERROR_NONE, NULL, req->user_data);
+ }
+ if (self->destroy) {
+ GDestroyNotify destroy = self->destroy;
+
+ self->destroy = NULL;
+ destroy(req->user_data);
+ }
+ gbinder_local_request_unref(req->args);
+ gutil_slice_free(self);
+}
+
+static
+void
+radio_request_object_unref(
+ RadioRequestObject* self)
+{
+ if (G_LIKELY(self)) {
+ GASSERT(self->refcount > 0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ radio_request_free(self);
+ }
+ }
+}
+
+static
+gboolean
+radio_request_default_retry(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ RADIO_RESP resp,
+ RADIO_ERROR error,
+ const GBinderReader* reader,
+ void* user_data)
+{
+ if (status != RADIO_TX_STATUS_OK) {
+ GVERBOSE_("req %p %u (%08x) status %d", req, req->code, req->serial,
+ status);
+ return TRUE;
+ } else if (error != RADIO_ERROR_NONE) {
+ GVERBOSE_("req %p %u (%08x) error %d", req, req->code, req->serial,
+ error);
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+static
+RadioRequest*
+radio_request_object_new(
+ RadioBase* base,
+ RadioRequestGroup* group,
+ RADIO_REQ code,
+ GBinderWriter* writer,
+ RadioRequestGenericCompleteFunc complete,
+ GDestroyNotify destroy,
+ void* user_data)
+{
+ RadioRequestObject* self = g_slice_new0(RadioRequestObject);
+ RadioRequest* req = &self->pub;
+ GBinderWriter tmp;
+
+ self->destroy = destroy;
+ g_atomic_int_set(&self->refcount, 1);
+
+ req->state = RADIO_REQUEST_STATE_NEW;
+ req->code = code;
+ req->complete = complete;
+ req->user_data = user_data;
+ req->retry = radio_request_default_retry;
+
+ /* Assign serial and add to the group */
+ radio_base_register_request(base, req);
+ radio_request_group_add(group, req);
+ GVERBOSE_("%u (%08x) %p group %p", req->code, req->serial, req, group);
+
+ /* Build the argument list */
+ if (!writer) writer = &tmp;
+ req->args = RADIO_BASE_GET_CLASS(base)->new_request(base, code);
+ gbinder_local_request_init_writer(req->args, writer);
+ self->serial_offset = gbinder_writer_bytes_written(writer);
+ gbinder_writer_append_int32(writer, req->serial);
+ return req;
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+void
+radio_request_unref_func(
+ gpointer req)
+{
+ radio_request_object_unref(radio_request_cast(req));
+}
+
+void
+radio_request_update_serial(
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_request_group.c
^
|
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "radio_base.h"
+#include "radio_client.h"
+#include "radio_request_group_p.h"
+#include "radio_request_p.h"
+#include "radio_log.h"
+
+#include <gutil_macros.h>
+
+typedef struct radio_request_group_object {
+ RadioRequestGroup pub;
+ GHashTable* requests;
+ gint refcount;
+} RadioRequestGroupObject;
+
+static inline RadioRequestGroupObject*
+radio_request_group_cast(RadioRequestGroup* group)
+ { return group ? G_CAST(group, RadioRequestGroupObject, pub) : NULL; }
+
+/*==========================================================================*
+ * Implementation
+ *==========================================================================*/
+
+void
+radio_request_group_unlink_func(
+ gpointer req)
+{
+ ((RadioRequest*)req)->group = NULL;
+}
+
+static
+void
+radio_request_group_free(
+ RadioRequestGroupObject* self)
+{
+ RadioRequestGroup* group = &self->pub;
+
+ radio_base_unblock(RADIO_BASE(group->client), group);
+ g_hash_table_destroy(self->requests);
+ radio_client_unref(group->client);
+ gutil_slice_free(self);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+void
+radio_request_group_add(
+ RadioRequestGroup* group,
+ RadioRequest* req)
+{
+ RadioRequestGroupObject* self = radio_request_group_cast(group);
+
+ /* Request is never NULL but the group may be */
+ if (self) {
+ g_hash_table_insert(self->requests, req, req);
+ req->group = group;
+ }
+}
+
+void
+radio_request_group_remove(
+ RadioRequestGroup* group,
+ RadioRequest* req)
+{
+ RadioRequestGroupObject* self = radio_request_group_cast(group);
+
+ /* Request is never NULL but the group may be */
+ if (self) {
+ g_hash_table_remove(self->requests, req);
+ }
+}
+
+/*==========================================================================*
+ * API
+ *==========================================================================*/
+
+RadioRequestGroup*
+radio_request_group_new(
+ RadioClient* client)
+{
+ if (G_LIKELY(client)) {
+ RadioRequestGroupObject* self = g_slice_new0(RadioRequestGroupObject);
+ RadioRequestGroup* group = &self->pub;
+
+ group->client = radio_client_ref(client);
+ self->requests = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+ NULL, radio_request_group_unlink_func);
+ g_atomic_int_set(&self->refcount, 1);
+ return group;
+ }
+ return NULL;
+}
+
+RadioRequestGroup*
+radio_request_group_ref(
+ RadioRequestGroup* group)
+{
+ RadioRequestGroupObject* self = radio_request_group_cast(group);
+
+ if (G_LIKELY(self)) {
+ GASSERT(self->refcount > 0);
+ g_atomic_int_inc(&self->refcount);
+ }
+ return group;
+}
+
+void
+radio_request_group_unref(
+ RadioRequestGroup* group)
+{
+ RadioRequestGroupObject* self = radio_request_group_cast(group);
+
+ if (G_LIKELY(self)) {
+ GASSERT(self->refcount > 0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ radio_request_group_free(self);
+ }
+ }
+}
+
+void
+radio_request_group_cancel(
+ RadioRequestGroup* group)
+{
+ RadioRequestGroupObject* self = radio_request_group_cast(group);
+
+ if (G_LIKELY(self)) {
+ GHashTableIter it;
+ gpointer value;
+ GSList* list = NULL;
+ GSList* l;
+
+ /*
+ * Move requests to the list and temporarily reference them
+ * before invoking any callbacks.
+ */
+ g_hash_table_iter_init(&it, self->requests);
+ while (g_hash_table_iter_next(&it, NULL, &value)) {
+ list = g_slist_prepend(list, radio_request_ref(value));
+ g_hash_table_iter_remove(&it);
+ }
+
+ /*
+ * Actually cancel the requests. This invokes completion callbacks.
+ * The group is already empty at this point.
+ */
+ for (l = list; l; l = l->next) {
+ radio_request_cancel(l->data);
+ }
+
+ /* Release the temporary references */
+ g_slist_free_full(list, radio_request_unref_func);
+ }
+}
+
+RADIO_BLOCK
+radio_request_group_block_status(
+ RadioRequestGroup* group)
+{
+ return group ? radio_base_block_status(RADIO_BASE(group->client), group) :
+ RADIO_BLOCK_NONE;
+}
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_request_group_p.h
^
|
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_REQUEST_GROUP_PRIVATE_H
+#define RADIO_REQUEST_GROUP_PRIVATE_H
+
+#include "radio_types_p.h"
+#include <radio_request_group.h>
+
+void
+radio_request_group_add(
+ RadioRequestGroup* group,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+void
+radio_request_group_remove(
+ RadioRequestGroup* group,
+ RadioRequest* req)
+ RADIO_INTERNAL;
+
+#endif /* RADIO_REQUEST_GROUP_PRIVATE_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_request_p.h
^
|
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_REQUEST_PRIVATE_H
+#define RADIO_REQUEST_PRIVATE_H
+
+#include "radio_types_p.h"
+#include "radio_request.h"
+
+/*
+ * Request lifecycle
+ * =================
+ *
+ * +=====+
+ * | NEW | ----------------------[cancel]------------+
+ * +=====+ |
+ * | |
+ * [submit] |
+ * | |
+ * | |
+ * +----> +---------------+ |
+ * | | | |
+ * | | (blocked) |
+ * | (unblocked) | |
+ * | | v v
+ * | | +========+ +===========+
+ * (retry) | | QUEUED | ----[cancel]----> | CANCELLED |
+ * | | +========+ +===========+
+ * | | | ^
+ * | | (unblocked) |
+ * | | | |
+ * | | +----------+ |
+ * | | | |
+ * | v v |
+ * | +-------------+ |
+ * | | submit | +========+ |
+ * | | request | ---(error)---> | FAILED | |
+ * | | transaction | +========+ |
+ * | +-------------+ ^ |
+ * | | | |
+ * | (ok) +---(error)---------+ |
+ * | | / |
+ * | v / |
+ * | +=========+ +=========+ |
+ * +--- | PENDING | ---(timeout)---> | TIMEOUT | |
+ * +=========+ +=========+ |
+ * | \ |
+ * | +----------------[cancel]------------+
+ * (response)
+ * |
+ * v
+ * +======+
+ * | DONE |
+ * +======+
+ *
+ * Timeout starts ticking when request enters the PENDING state.
+ * The library maintains an internal reference to the request in
+ * QUEUED and PENDING states.
+ */
+
+typedef enum radio_request_state {
+ RADIO_REQUEST_STATE_INVALID,
+ RADIO_REQUEST_STATE_NEW,
+ RADIO_REQUEST_STATE_QUEUED,
+ RADIO_REQUEST_STATE_PENDING,
+ /*
+ * Reorder states carefully or better don't reorder at all.
+ * States >= RADIO_REQUEST_STATE_FAILED are assumed to be
+ * terminal states in the state machine.
+ */
+ RADIO_REQUEST_STATE_FAILED,
+ RADIO_REQUEST_STATE_CANCELLED,
+ RADIO_REQUEST_STATE_TIMEOUT,
+ RADIO_REQUEST_STATE_DONE
+} RADIO_REQUEST_STATE;
+
+typedef
+void
+(*RadioRequestGenericCompleteFunc)(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ guint32 resp,
+ RADIO_ERROR error,
+ const GBinderReader* args,
+ gpointer user_data);
+
+struct radio_request {
+ RADIO_REQUEST_STATE state;
+ guint32 code;
+ GBinderLocalRequest* args;
+ RadioRequestGenericCompleteFunc complete;
+ RadioRequestRetryFunc retry;
+ void* user_data;
+ guint32 serial; /* Immutable, generated at creation time */
+ guint32 serial2; /* Mutable, used by the last transaction */
+ int max_retries; /* Negative = retry indefinitely */
+ int retry_count; /* Number of times we have already retried */
+ guint retry_delay_ms; /* Delay before each retry, in milliseconds */
+ guint timeout_ms; /* Timeout, in milliseconds (0 = default) */
+ gint64 deadline; /* Monotonic time, in microseconds */
+ gint64 scheduled; /* Monotonic time, in microseconds */
+ gulong tx_id; /* Id of the request transaction */
+ gboolean blocking; /* TRUE if this request blocks all others */
+ gboolean acked;
+ RadioBase* object; /* Not a reference */
+ RadioRequestGroup* group; /* Not a reference */
+ RadioRequest* queue_next;
+};
+
+void
+radio_request_unref_func(
+ gpointer req)
+ RADIO_INTERNAL;
+
+void
+radio_request_update_serial(
+ RadioRequest* req,
+ guint32 serial)
+ RADIO_INTERNAL;
+
+#endif /* RADIO_REQUEST_PRIVATE_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_types_p.h
^
|
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_TYPES_PRIVATE_H
+#define RADIO_TYPES_PRIVATE_H
+
+#include <radio_types.h>
+
+typedef struct radio_base RadioBase;
+
+#define RADIO_INTERNAL G_GNUC_INTERNAL
+
+/* Miliseconds to microseconds */
+#define MICROSEC(ms) (((gint64)(ms)) * 1000)
+
+/* Preprocessor magic related to observers */
+G_STATIC_ASSERT(RADIO_OBSERVER_PRIORITY_LOWEST == 0);
+G_STATIC_ASSERT(RADIO_OBSERVER_PRIORITY_HIGHEST == 7);
+#define FOREACH_OBSERVER_PRIORITY(p) p(0) p(1) p(2) p(3) p(4) p(5) p(6) p(7)
+#define RADIO_OBSERVER_PRIORITY_INDEX(p) ((p) - RADIO_OBSERVER_PRIORITY_LOWEST)
+#define RADIO_OBSERVER_PRIORITY_COUNT \
+ (RADIO_OBSERVER_PRIORITY_INDEX(RADIO_OBSERVER_PRIORITY_HIGHEST) + 1)
+
+/*
+ * A special assert fatal in debug build and non-fatal in release.
+ * Marks truely unavoidable conditions.
+ */
+#ifdef DEBUG
+# define DEBUG_ASSERT(expr) g_assert(expr)
+#else
+# define DEBUG_ASSERT(expr)
+#endif
+
+#endif /* RADIO_TYPES_PRIVATE_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_util.c
^
|
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2018-2021 Jolla Ltd.
- * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
+ * Copyright (C) 2018-2022 Jolla Ltd.
+ * Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
*
* You may use this file under the terms of the BSD license as follows:
*
@@ -34,11 +34,24 @@
* any official policies, either expressed or implied.
*/
-#include "radio_util.h"
+#include "radio_util_p.h"
#include "radio_log.h"
GLOG_MODULE_DEFINE("gbinder-radio");
+guint
+radio_observer_priority_index(
+ RADIO_OBSERVER_PRIORITY priority)
+{
+ if (priority < RADIO_OBSERVER_PRIORITY_LOWEST) {
+ return 0;
+ } else if (priority > RADIO_OBSERVER_PRIORITY_HIGHEST) {
+ return RADIO_OBSERVER_PRIORITY_COUNT - 1;
+ } else {
+ return priority - RADIO_OBSERVER_PRIORITY_LOWEST;
+ }
+}
+
const char*
radio_req_name(
RADIO_REQ req)
@@ -48,17 +61,20 @@
case RADIO_REQ_RESPONSE_ACKNOWLEDGEMENT: return "responseAcknowledgement";
#define RADIO_REQ_(req,resp,Name,NAME) \
case RADIO_REQ_##NAME: return #Name;
+#define RADIO_REQ__(req,resp,Name,NAME,x) \
+ case RADIO_REQ_##NAME##x: return #Name #x;
RADIO_CALL_1_0(RADIO_REQ_)
RADIO_CALL_1_1(RADIO_REQ_)
RADIO_CALL_1_2(RADIO_REQ_)
RADIO_CALL_1_3(RADIO_REQ_)
- RADIO_CALL_1_4(RADIO_REQ_)
+ RADIO_CALL_1_4_(RADIO_REQ__)
+ RADIO_CALL_1_5_(RADIO_REQ__)
#undef RADIO_REQ_
+#undef RADIO_REQ__
case RADIO_REQ_START_NETWORK_SCAN_1_2: return "startNetworkScan_1_2";
case RADIO_REQ_SET_INDICATION_FILTER_1_2: return "setIndicationFilter_1_2";
case RADIO_REQ_SETUP_DATA_CALL_1_2: return "setupDataCall_1_2";
case RADIO_REQ_DEACTIVATE_DATA_CALL_1_2: return "deactivateDataCall_1_2";
- case RADIO_REQ_SETUP_DATA_CALL_1_4: return "setupDataCall_1_4";
case RADIO_REQ_SET_INITIAL_ATTACH_APN_1_4: return "setInitialAttachApn_1_4";
case RADIO_REQ_SET_DATA_PROFILE_1_4: return "setDataProfile_1_4";
case RADIO_REQ_ANY:
@@ -75,12 +91,16 @@
case RADIO_RESP_ACKNOWLEDGE_REQUEST: return "acknowledgeRequest";
#define RADIO_RESP_(req,resp,Name,NAME) \
case RADIO_RESP_##NAME: return #Name "Response";
+#define RADIO_RESP__(req,resp,Name,NAME,x) \
+ case RADIO_RESP_##NAME##x: return #Name "Response" #x;
RADIO_CALL_1_0(RADIO_RESP_)
RADIO_CALL_1_1(RADIO_RESP_)
RADIO_CALL_1_2(RADIO_RESP_)
RADIO_CALL_1_3(RADIO_RESP_)
- RADIO_CALL_1_4(RADIO_RESP_)
+ RADIO_CALL_1_4_(RADIO_RESP__)
+ RADIO_CALL_1_5_(RADIO_RESP__)
#undef RADIO_RESP_
+#undef RADIO_RESP__
case RADIO_RESP_GET_CELL_INFO_LIST_1_2:
return "getCellInfoListResponse_1_2";
case RADIO_RESP_GET_ICC_CARD_STATUS_1_2:
@@ -101,8 +121,12 @@
return "getIccCardStatusResponse_1_4";
case RADIO_RESP_GET_DATA_CALL_LIST_RESPONSE_1_4:
return "getDataCallListResponse_1_4";
- case RADIO_RESP_SETUP_DATA_CALL_RESPONSE_1_4:
- return "setupDataCallResponse_1_4";
+ case RADIO_RESP_GET_DATA_CALL_LIST_1_5:
+ return "getDataCallList_1_5";
+ case RADIO_RESP_GET_CELL_INFO_LIST_1_5:
+ return "getCellInfoListResponse_1_5";
+ case RADIO_RESP_GET_ICC_CARD_STATUS_1_5:
+ return "getIccCardStatus_1_5";
case RADIO_RESP_ANY:
break;
}
@@ -120,6 +144,7 @@
RADIO_EVENT_1_1(RADIO_IND_)
RADIO_EVENT_1_2(RADIO_IND_)
RADIO_EVENT_1_4(RADIO_IND_)
+ RADIO_EVENT_1_5(RADIO_IND_)
#undef RADIO_IND_
case RADIO_IND_ANY:
break;
@@ -143,29 +168,236 @@
RADIO_REQ req)
{
switch (req) {
-#define RADIO_REQ_(req,resp,Name,NAME) \
+#define RADIO_REQ_RESP_(req,resp,Name,NAME) \
case RADIO_REQ_##NAME: return RADIO_RESP_##NAME;
- RADIO_CALL_1_0(RADIO_REQ_)
- RADIO_CALL_1_1(RADIO_REQ_)
- RADIO_CALL_1_2(RADIO_REQ_)
- RADIO_CALL_1_3(RADIO_REQ_)
- RADIO_CALL_1_4(RADIO_REQ_)
-#undef RADIO_REQ_
- case RADIO_REQ_SET_RESPONSE_FUNCTIONS:
- case RADIO_REQ_RESPONSE_ACKNOWLEDGEMENT:
- case RADIO_REQ_START_NETWORK_SCAN_1_2:
- case RADIO_REQ_SET_INDICATION_FILTER_1_2:
+#define RADIO_REQ_RESP__(req,resp,Name,NAME,x) \
+ case RADIO_REQ_##NAME##x: return RADIO_RESP_##NAME##x;
+ RADIO_CALL_1_0(RADIO_REQ_RESP_)
+ RADIO_CALL_1_1(RADIO_REQ_RESP_)
+ RADIO_CALL_1_2(RADIO_REQ_RESP_)
+ RADIO_CALL_1_3(RADIO_REQ_RESP_)
+ RADIO_CALL_1_4_(RADIO_REQ_RESP__)
+ RADIO_CALL_1_5_(RADIO_REQ_RESP__)
+#undef RADIO_REQ_RESP_
+#undef RADIO_REQ_RESP__
case RADIO_REQ_SETUP_DATA_CALL_1_2:
+ return RADIO_RESP_SETUP_DATA_CALL;
case RADIO_REQ_DEACTIVATE_DATA_CALL_1_2:
- case RADIO_REQ_SETUP_DATA_CALL_1_4:
+ return RADIO_RESP_DEACTIVATE_DATA_CALL;
+ case RADIO_REQ_START_NETWORK_SCAN_1_2:
+ return RADIO_RESP_START_NETWORK_SCAN;
case RADIO_REQ_SET_INITIAL_ATTACH_APN_1_4:
+ return RADIO_RESP_SET_INITIAL_ATTACH_APN;
case RADIO_REQ_SET_DATA_PROFILE_1_4:
+ return RADIO_RESP_SET_DATA_PROFILE;
+ case RADIO_REQ_SET_INDICATION_FILTER_1_2:
+ return RADIO_RESP_SET_INDICATION_FILTER;
+
+ /*
+ * All these still need to be listed here to ensure a compilation
+ * warnings when something gets added to RADIO_REQ enum.
+ */
+ case RADIO_REQ_SET_RESPONSE_FUNCTIONS:
+ case RADIO_REQ_RESPONSE_ACKNOWLEDGEMENT:
case RADIO_REQ_ANY:
break;
}
return RADIO_RESP_NONE;
}
+/**
+ * And this is a version of radio_req_resp which takes IRadio interface
+ * version into account. This one is OK to use.
+ */
+RADIO_RESP
+radio_req_resp2(
+ RADIO_REQ req,
+ RADIO_INTERFACE iface) /* Since 1.4.5 */
+{
+ switch (req) {
+ /*
+ * Requests expecting a response from a previous version of the
+ * interface.
+ */
+ case RADIO_REQ_SETUP_DATA_CALL_1_2:
+ return RADIO_RESP_SETUP_DATA_CALL;
+ case RADIO_REQ_DEACTIVATE_DATA_CALL_1_2:
+ return RADIO_RESP_DEACTIVATE_DATA_CALL;
+ case RADIO_REQ_START_NETWORK_SCAN_1_2:
+ return RADIO_RESP_START_NETWORK_SCAN;
+ case RADIO_REQ_SET_INITIAL_ATTACH_APN_1_4:
+ return RADIO_RESP_SET_INITIAL_ATTACH_APN;
+ case RADIO_REQ_SET_DATA_PROFILE_1_4:
+ return RADIO_RESP_SET_DATA_PROFILE;
+ case RADIO_REQ_SET_INDICATION_FILTER_1_2:
+ /* case RADIO_REQ_SET_INDICATION_FILTER_1_5: */
+ return RADIO_RESP_SET_INDICATION_FILTER;
+
+ /*
+ * Requests which may receive a response from a higher version of
+ * the interface.
+ */
+
+ /*
+ * getIccCardStatus
+ * getIccCardStatusResponse
+ * getIccCardStatusResponse_1_2
+ * getIccCardStatusResponse_1_4
+ * getIccCardStatusResponse_1_5
+ * ...
+ */
+ case RADIO_REQ_GET_ICC_CARD_STATUS:
+ switch (iface) {
+ case RADIO_INTERFACE_1_0:
+ case RADIO_INTERFACE_1_1:
+ return RADIO_RESP_GET_ICC_CARD_STATUS;
+ case RADIO_INTERFACE_1_2:
+ case RADIO_INTERFACE_1_3:
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/src/radio_util_p.h
^
|
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#ifndef RADIO_UTIL_PRIVATE_H
+#define RADIO_UTIL_PRIVATE_H
+
+#include "radio_types_p.h"
+#include "radio_util.h"
+
+guint
+radio_observer_priority_index(
+ RADIO_OBSERVER_PRIORITY priority)
+ RADIO_INTERNAL;
+
+#endif /* RADIO_UTIL_PRIVATE_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/Makefile
^
|
@@ -0,0 +1,15 @@
+# -*- Mode: makefile-gmake -*-
+
+.PHONY: clean all
+
+all:
+%:
+ @$(MAKE) -C unit_client $*
+ @$(MAKE) -C unit_config $*
+ @$(MAKE) -C unit_instance $*
+ @$(MAKE) -C unit_registry $*
+ @$(MAKE) -C unit_util $*
+
+clean: unitclean
+ rm -f coverage/*.gcov
+ rm -fr coverage/report
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/Makefile
^
|
@@ -0,0 +1,216 @@
+# -*- Mode: makefile-gmake -*-
+
+.PHONY: clean cleaner unitclean all debug release coverage valgrind
+.PHONY: debug_lib release_lib coverage_lib
+.PHONY: test test_banner
+
+#
+# Real test makefile defines EXE (and possibly SRC) and includes this one.
+#
+
+ifndef EXE
+${error EXE not defined}
+endif
+
+SRC ?= $(EXE).c
+COMMON_SRC ?= \
+ test_gbinder_client.c \
+ test_gbinder_local_object.c \
+ test_gbinder_local_request.c \
+ test_gbinder_local_reply.c \
+ test_gbinder_reader_writer.c \
+ test_gbinder_remote_object.c \
+ test_gbinder_remote_request.c \
+ test_gbinder_remote_reply.c \
+ test_gbinder_servicemanager.c \
+ test_main.c
+
+#
+# Required packages
+#
+
+LINK_PKGS += libglibutil glib-2.0 gobject-2.0
+PKGS += $(LINK_PKGS) libgbinder
+
+#
+# Default target
+#
+
+all: debug release
+
+#
+# Directories
+#
+
+SRC_DIR = .
+LIB_DIR = ../..
+COMMON_DIR = ../common
+BUILD_DIR = build
+DEBUG_BUILD_DIR = $(BUILD_DIR)/debug
+RELEASE_BUILD_DIR = $(BUILD_DIR)/release
+COVERAGE_BUILD_DIR = $(BUILD_DIR)/coverage
+COMMON_BUILD_DIR = $(COMMON_DIR)/build
+COMMON_DEBUG_BUILD_DIR = $(COMMON_BUILD_DIR)/debug
+COMMON_RELEASE_BUILD_DIR = $(COMMON_BUILD_DIR)/release
+COMMON_COVERAGE_BUILD_DIR = $(COMMON_BUILD_DIR)/coverage
+
+#
+# Tools and flags
+#
+
+CC ?= $(CROSS_COMPILE)gcc
+LD = $(CC)
+WARNINGS += -Wall -Wno-deprecated-declarations
+INCLUDES += -I$(COMMON_DIR) -I$(LIB_DIR)/src -I$(LIB_DIR)/include
+BASE_FLAGS = -fPIC
+FULL_CFLAGS = $(BASE_FLAGS) $(CFLAGS) $(DEFINES) $(WARNINGS) $(INCLUDES) \
+ -MMD -MP $(shell pkg-config --cflags $(PKGS))
+FULL_LDFLAGS = $(BASE_FLAGS) $(LDFLAGS)
+LIBS = $(shell pkg-config --libs $(LINK_PKGS)) -lpthread
+QUIET_MAKE = make --no-print-directory
+DEBUG_FLAGS = -g
+RELEASE_FLAGS =
+COVERAGE_FLAGS = -g
+
+DEBUG_LDFLAGS = $(FULL_LDFLAGS) $(DEBUG_FLAGS)
+RELEASE_LDFLAGS = $(FULL_LDFLAGS) $(RELEASE_FLAGS)
+COVERAGE_LDFLAGS = $(FULL_LDFLAGS) $(COVERAGE_FLAGS) --coverage
+
+DEBUG_CFLAGS = $(FULL_CFLAGS) $(DEBUG_FLAGS) -DDEBUG
+RELEASE_CFLAGS = $(FULL_CFLAGS) $(RELEASE_FLAGS) -O2
+COVERAGE_CFLAGS = $(FULL_CFLAGS) $(COVERAGE_FLAGS) --coverage
+
+DEBUG_LIB_FILE := $(shell $(QUIET_MAKE) -C $(LIB_DIR) print_debug_lib)
+RELEASE_LIB_FILE := $(shell $(QUIET_MAKE) -C $(LIB_DIR) print_release_lib)
+COVERAGE_LIB_FILE := $(shell $(QUIET_MAKE) -C $(LIB_DIR) print_coverage_lib)
+
+DEBUG_LIB = $(LIB_DIR)/$(DEBUG_LIB_FILE)
+RELEASE_LIB = $(LIB_DIR)/$(RELEASE_LIB_FILE)
+COVERAGE_LIB = $(LIB_DIR)/$(COVERAGE_LIB_FILE)
+
+DEBUG_LIBS = $(DEBUG_LIB) $(LIBS)
+RELEASE_LIBS = $(RELEASE_LIB) $(LIBS)
+COVERAGE_LIBS = $(COVERAGE_LIB) $(LIBS)
+
+#
+# Files
+#
+
+TEST_DEBUG_OBJS = $(SRC:%.c=$(DEBUG_BUILD_DIR)/%.o)
+TEST_RELEASE_OBJS = $(SRC:%.c=$(RELEASE_BUILD_DIR)/%.o)
+TEST_COVERAGE_OBJS = $(SRC:%.c=$(COVERAGE_BUILD_DIR)/%.o)
+COMMON_DEBUG_OBJS = $(COMMON_SRC:%.c=$(COMMON_DEBUG_BUILD_DIR)/%.o)
+COMMON_RELEASE_OBJS = $(COMMON_SRC:%.c=$(COMMON_RELEASE_BUILD_DIR)/%.o)
+COMMON_COVERAGE_OBJS = $(COMMON_SRC:%.c=$(COMMON_COVERAGE_BUILD_DIR)/%.o)
+DEBUG_OBJS = $(COMMON_DEBUG_OBJS) $(TEST_DEBUG_OBJS)
+RELEASE_OBJS = $(COMMON_RELEASE_OBJS) $(TEST_RELEASE_OBJS)
+COVERAGE_OBJS = $(COMMON_COVERAGE_OBJS) $(TEST_COVERAGE_OBJS)
+
+#
+# Dependencies
+#
+
+DEPS = $(DEBUG_OBJS:%.o=%.d) $(RELEASE_OBJS:%.o=%.d)
+ifneq ($(MAKECMDGOALS),clean)
+ifneq ($(strip $(DEPS)),)
+-include $(DEPS)
+endif
+endif
+
+$(DEBUG_LIB): | debug_lib
+$(RELEASE_LIB): | release_lib
+$(COVERAGE_LIB): | coverage_lib
+
+$(TEST_DEBUG_OBJS): | $(DEBUG_BUILD_DIR)
+$(TEST_RELEASE_OBJS): | $(RELEASE_BUILD_DIR)
+$(TEST_COVERAGE_OBJS): | $(COVERAGE_BUILD_DIR)
+
+$(COMMON_DEBUG_OBJS): | $(COMMON_DEBUG_BUILD_DIR)
+$(COMMON_RELEASE_OBJS): | $(COMMON_RELEASE_BUILD_DIR)
+$(COMMON_COVERAGE_OBJS): | $(COMMON_COVERAGE_BUILD_DIR)
+
+#
+# Rules
+#
+
+DEBUG_EXE = $(DEBUG_BUILD_DIR)/$(EXE)
+RELEASE_EXE = $(RELEASE_BUILD_DIR)/$(EXE)
+COVERAGE_EXE = $(COVERAGE_BUILD_DIR)/$(EXE)
+
+debug: debug_lib $(DEBUG_EXE)
+
+release: release_lib $(RELEASE_EXE)
+
+coverage: coverage_lib $(COVERAGE_EXE)
+
+unitclean:
+ rm -f *~
+ rm -fr $(BUILD_DIR) $(COMMON_BUILD_DIR)
+
+clean: unitclean
+
+cleaner: unitclean
+ @make -C $(LIB_DIR) clean
+
+test_banner:
+ @echo "===========" $(EXE) "=========== "
+
+test: test_banner debug
+ @$(DEBUG_EXE)
+
+valgrind: test_banner debug
+ @G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind --tool=memcheck --leak-check=full --show-possibly-lost=no $(DEBUG_EXE)
+
+$(DEBUG_BUILD_DIR):
+ mkdir -p $@
+
+$(RELEASE_BUILD_DIR):
+ mkdir -p $@
+
+$(COVERAGE_BUILD_DIR):
+ mkdir -p $@
+
+$(COMMON_DEBUG_BUILD_DIR):
+ mkdir -p $@
+
+$(COMMON_RELEASE_BUILD_DIR):
+ mkdir -p $@
+
+$(COMMON_COVERAGE_BUILD_DIR):
+ mkdir -p $@
+
+$(DEBUG_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
+ $(CC) -c $(DEBUG_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
+
+$(RELEASE_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
+ $(CC) -c $(RELEASE_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
+
+$(COVERAGE_BUILD_DIR)/%.o : $(SRC_DIR)/%.c
+ $(CC) -c $(COVERAGE_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
+
+$(COMMON_DEBUG_BUILD_DIR)/%.o : $(COMMON_DIR)/%.c
+ $(CC) -c $(DEBUG_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
+
+$(COMMON_RELEASE_BUILD_DIR)/%.o : $(COMMON_DIR)/%.c
+ $(CC) -c $(RELEASE_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
+
+$(COMMON_COVERAGE_BUILD_DIR)/%.o : $(COMMON_DIR)/%.c
+ $(CC) -c $(COVERAGE_CFLAGS) -MT"$@" -MF"$(@:%.o=%.d)" $< -o $@
+
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_common.h
^
|
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2018-2022 Jolla Ltd.
+ * Copyright (C) 2018-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TEST_COMMON_H
+#define TEST_COMMON_H
+
+#include <radio_types.h>
+
+#define TEST_FLAG_DEBUG (0x01)
+typedef struct test_opt {
+ int flags;
+} TestOpt;
+
+/* Should be invoked after g_test_init */
+void
+test_init(
+ TestOpt* opt,
+ int argc,
+ char* argv[]);
+
+/* Run loop with a timeout */
+void
+test_run(
+ const TestOpt* opt,
+ GMainLoop* loop);
+
+/* Quits the event loop on the next iteration */
+void
+test_quit_later(
+ GMainLoop* loop);
+
+/* Quits the event loop after n iterations */
+void
+test_quit_later_n(
+ GMainLoop* loop,
+ guint n);
+
+#define TEST_TIMEOUT_SEC (20)
+#define TEST_TIMEOUT_MS (1000*TEST_TIMEOUT_SEC)
+
+/* Helper macros */
+
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define TEST_INT16_BYTES(v) \
+ (guint8)(v), (guint8)((v) >> 8)
+# define TEST_INT32_BYTES(v) \
+ (guint8)(v), (guint8)((v) >> 8), \
+ (guint8)((v) >> 16), (guint8)((v) >> 24)
+# define TEST_INT64_BYTES(v) \
+ (guint8)(v), (guint8)((v) >> 8), \
+ (guint8)((v) >> 16), (guint8)((v) >> 24), \
+ (guint8)(((guint64)(v)) >> 32), (guint8)(((guint64)(v)) >> 40), \
+ (guint8)(((guint64)(v)) >> 48), (guint8)(((guint64)(v)) >> 56)
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
+# define TEST_INT16_BYTES(v) \
+ (guint8)((v) >> 8), (guint8)(v)
+# define TEST_INT32_BYTES(v) \
+ (guint8)((v) >> 24), (guint8)((v) >> 16), \
+ (guint8)((v) >> 8), (guint8)(v)
+# define TEST_INT64_BYTES(v) \
+ (guint8)(((guint64)(v)) >> 56), (guint8)(((guint64)(v)) >> 48), \
+ (guint8)(((guint64)(v)) >> 40), (guint8)(((guint64)(v)) >> 32), \
+ (guint8)((v) >> 24), (guint8)((v) >> 16), \
+ (guint8)((v) >> 8), (guint8)(v)
+#else /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+#error unknown ENDIAN type
+#endif /* !G_LITTLE_ENDIAN && !G_BIG_ENDIAN */
+
+#define TEST_ARRAY_AND_COUNT(a) a, G_N_ELEMENTS(a)
+#define TEST_ARRAY_AND_SIZE(a) a, sizeof(a)
+
+#endif /* TEST_COMMON_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder.h
^
|
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TEST_GBINDER_H
+#define TEST_GBINDER_H
+
+#include <gbinder.h>
+
+typedef struct test_gbinder_data TestGBinderData;
+
+/* test_gbinder_reader_writer.c */
+
+TestGBinderData*
+test_gbinder_data_new(
+ const char* iface);
+
+TestGBinderData*
+test_gbinder_data_ref(
+ TestGBinderData* data);
+
+void
+test_gbinder_data_unref(
+ TestGBinderData* data);
+
+void
+test_gbinder_data_add_int32(
+ TestGBinderData* data,
+ guint32 value);
+
+void
+test_gbinder_data_add_hidl_struct(
+ TestGBinderData* data,
+ const void* buf,
+ gsize size);
+
+void
+test_gbinder_data_init_reader(
+ TestGBinderData* data,
+ GBinderReader* reader);
+
+void
+test_gbinder_data_init_writer(
+ TestGBinderData* data,
+ GBinderWriter* writer);
+
+/* test_gbinder_local_request.c */
+
+GBinderLocalRequest*
+test_gbinder_local_request_new(
+ const char* iface);
+
+const char*
+test_gbinder_local_request_interface(
+ GBinderLocalRequest* local);
+
+TestGBinderData*
+test_gbinder_local_request_data(
+ GBinderLocalRequest* local);
+
+/* test_gbinder_local_reply.c */
+
+GBinderLocalReply*
+test_gbinder_local_reply_new(
+ void);
+
+TestGBinderData*
+test_gbinder_local_reply_data(
+ GBinderLocalReply* reply);
+
+/* test_gbinder_remote_request.c */
+
+GBinderRemoteRequest*
+test_gbinder_remote_request_new(
+ GBinderLocalRequest* req);
+
+/* test_gbinder_remote_reply.c */
+
+GBinderRemoteReply*
+test_gbinder_remote_reply_new(
+ GBinderLocalReply* reply);
+
+/* test_gbinder_local_object.c */
+
+GBinderLocalObject*
+test_gbinder_local_object_new(
+ const char* const* ifaces,
+ GBinderLocalTransactFunc txproc,
+ void* user_data);
+
+GBinderLocalReply*
+test_gbinder_local_object_handle_tx(
+ GBinderLocalObject* self,
+ GBinderRemoteRequest* req,
+ guint code,
+ guint flags,
+ int* status);
+
+/* test_gbinder_remote_object.c */
+
+GBinderRemoteObject*
+test_gbinder_remote_object_new(
+ GBinderLocalObject* local);
+
+void
+test_gbinder_remote_object_kill(
+ GBinderRemoteObject* remote);
+
+gboolean
+test_gbinder_remote_object_dead(
+ GBinderRemoteObject* remote);
+
+GBinderLocalObject*
+test_gbinder_remote_object_to_local(
+ GBinderRemoteObject* remote);
+
+/* test_gbinder_client.c */
+
+extern int test_gbinder_client_tx_fail_count;
+
+/* test_gbinder_servicemanager.c */
+
+GBinderRemoteObject*
+test_gbinder_servicemanager_new_service(
+ GBinderServiceManager* manager,
+ const char* name,
+ GBinderLocalObject* local);
+
+#endif /* TEST_GBINDER_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_client.c
^
|
@@ -0,0 +1,402 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+#include <gutil_log.h>
+
+#include <stdlib.h>
+
+typedef struct test_gbinder_client_tx {
+ GBinderClient* client;
+ guint32 code;
+ guint32 flags;
+ GBinderLocalRequest* req;
+ GBinderClientReplyFunc reply;
+ GDestroyNotify destroy;
+ void* user_data;
+} TestGBinderClientTx;
+
+typedef struct test_gbinder_client_iface_range {
+ char* iface;
+ GBytes* header;
+ guint32 last_code;
+} TestGBinderClientIfaceRange;
+
+struct gbinder_client {
+ guint32 refcount;
+ GBinderRemoteObject* remote;
+ TestGBinderClientIfaceRange* ranges;
+ guint nr;
+};
+
+int test_gbinder_client_tx_fail_count = 0;
+
+static
+void
+test_gbinder_client_free(
+ GBinderClient* self)
+{
+ guint i;
+
+ for (i = 0; i < self->nr; i++) {
+ TestGBinderClientIfaceRange* r = self->ranges + i;
+
+ g_bytes_unref(r->header);
+ g_free(r->iface);
+ }
+ g_free(self->ranges);
+ gbinder_remote_object_unref(self->remote);
+ g_free(self);
+}
+
+static
+void
+test_gbinder_client_init_range(
+ TestGBinderClientIfaceRange* r,
+ const GBinderClientIfaceInfo* info)
+{
+ r->header = g_bytes_new(info->iface, strlen(info->iface));
+ r->iface = g_strdup(info->iface);
+ r->last_code = info->last_code;
+}
+
+static
+int
+test_gbinder_client_sort_ranges(
+ const void* p1,
+ const void* p2)
+{
+ const TestGBinderClientIfaceRange* r1 = p1;
+ const TestGBinderClientIfaceRange* r2 = p2;
+
+ return (r1->last_code < r2->last_code) ? (-1) :
+ (r1->last_code > r2->last_code) ? 1 : 0;
+}
+
+static
+const TestGBinderClientIfaceRange*
+test_gbinder_client_find_range(
+ GBinderClient* self,
+ guint32 code)
+{
+ guint i;
+
+ for (i = 0; i < self->nr; i++) {
+ const TestGBinderClientIfaceRange* r = self->ranges + i;
+
+ if (r->last_code >= code) {
+ return r;
+ }
+ }
+ return NULL;
+}
+
+static
+GBinderRemoteReply*
+test_gbinder_client_transact(
+ GBinderClient* self,
+ guint32 code,
+ guint32 flags,
+ GBinderLocalRequest* req,
+ int* status)
+{
+ GBinderLocalObject* obj = test_gbinder_remote_object_to_local(self->remote);
+ GBinderRemoteRequest* remote_req = test_gbinder_remote_request_new(req);
+ GBinderLocalReply* reply = test_gbinder_local_object_handle_tx(obj,
+ remote_req, code, flags, status);
+ GBinderRemoteReply* remote_reply = test_gbinder_remote_reply_new(reply);
+
+ gbinder_remote_request_unref(remote_req);
+ gbinder_local_reply_unref(reply);
+ return remote_reply;
+}
+
+static
+GBinderRemoteReply*
+test_gbinder_client_transact_sync(
+ GBinderClient* self,
+ guint32 code,
+ guint32 flags,
+ GBinderLocalRequest* req,
+ int* status)
+{
+ GBinderRemoteReply* reply = NULL;
+
+ if (self) {
+ GBinderRemoteObject* obj = self->remote;
+
+ if (!test_gbinder_remote_object_dead(obj)) {
+ GBinderLocalRequest* tmp = NULL;
+
+ if (!req) {
+ const TestGBinderClientIfaceRange* r =
+ test_gbinder_client_find_range(self, code);
+
+ if (r) {
+ req = tmp = test_gbinder_local_request_new(r->iface);
+ }
+ }
+ if (req) {
+ reply = test_gbinder_client_transact(self, code, flags, req,
+ status);
+ }
+ gbinder_local_request_unref(tmp);
+ } else {
+ GDEBUG("Refusing to perform transaction with a dead object");
+ }
+ }
+ return reply;
+}
+
+static
+gboolean
+test_gbinder_client_tx_handle(
+ gpointer data)
+{
+ int status = -1;
+ TestGBinderClientTx* tx = data;
+ GBinderRemoteReply* reply = test_gbinder_client_transact
+ (tx->client, tx->code, tx->flags, tx->req, &status);
+
+ if (tx->reply) {
+ tx->reply(tx->client, reply, status, tx->user_data);
+ }
+ gbinder_remote_reply_unref(reply);
+ return G_SOURCE_REMOVE;
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_local_object.c
^
|
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+#include <gutil_strv.h>
+
+struct gbinder_local_object {
+ guint32 refcount;
+ char** ifaces;
+ GBinderLocalTransactFunc txproc;
+ void* user_data;
+};
+
+static const char hidl_base_interface[] = "android.hidl.base@1.0::IBase";
+
+static
+void
+test_gbinder_local_object_free(
+ GBinderLocalObject* self)
+{
+ g_strfreev(self->ifaces);
+ g_free(self);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+GBinderLocalObject*
+test_gbinder_local_object_new(
+ const char* const* ifaces,
+ GBinderLocalTransactFunc txproc,
+ void* user_data)
+{
+ GBinderLocalObject* self = g_new0(GBinderLocalObject, 1);
+ guint i = 0, n = gutil_strv_length((char**)ifaces);
+ gboolean append_base_interface;
+
+ if (g_strcmp0(gutil_strv_last((char**)ifaces), hidl_base_interface)) {
+ append_base_interface = TRUE;
+ n++;
+ } else {
+ append_base_interface = FALSE;
+ }
+
+ self->ifaces = g_new(char*, n + 1);
+ if (ifaces) {
+ while (*ifaces) {
+ self->ifaces[i++] = g_strdup(*ifaces++);
+ }
+ }
+ if (append_base_interface) {
+ self->ifaces[i++] = g_strdup(hidl_base_interface);
+ }
+ self->ifaces[i] = NULL;
+ self->txproc = txproc;
+ self->user_data = user_data;
+ g_atomic_int_set(&self->refcount, 1);
+ return self;
+}
+
+GBinderLocalReply*
+test_gbinder_local_object_handle_tx(
+ GBinderLocalObject* self,
+ GBinderRemoteRequest* req,
+ guint code,
+ guint flags,
+ int* status)
+{
+ return (self && self->txproc) ?
+ self->txproc(self, req, code, flags, status, self->user_data) :
+ NULL;
+}
+
+/*==========================================================================*
+ * libgbinder API
+ *==========================================================================*/
+
+GBinderLocalObject*
+gbinder_local_object_ref(
+ GBinderLocalObject* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ g_atomic_int_inc(&self->refcount);
+ }
+ return self;
+}
+
+void
+gbinder_local_object_unref(
+ GBinderLocalObject* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ test_gbinder_local_object_free(self);
+ }
+ }
+}
+
+void
+gbinder_local_object_drop(
+ GBinderLocalObject* self)
+{
+ if (self) {
+ self->txproc = NULL;
+ self->user_data = NULL;
+ gbinder_local_object_unref(self);
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_local_reply.c
^
|
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+struct gbinder_local_reply {
+ guint32 refcount;
+ TestGBinderData* data;
+ char* iface;
+};
+
+static
+void
+test_gbinder_local_reply_free(
+ GBinderLocalReply* self)
+{
+ test_gbinder_data_unref(self->data);
+ g_free(self->iface);
+ g_free(self);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+GBinderLocalReply*
+test_gbinder_local_reply_new(
+ void)
+{
+ GBinderLocalReply* self = g_new0(GBinderLocalReply, 1);
+
+ g_atomic_int_set(&self->refcount, 1);
+ self->data = test_gbinder_data_new(NULL);
+ return self;
+}
+
+TestGBinderData*
+test_gbinder_local_reply_data(
+ GBinderLocalReply* self)
+{
+ return self ? self->data : NULL;
+}
+
+/*==========================================================================*
+ * libgbinder API
+ *==========================================================================*/
+
+GBinderLocalReply*
+gbinder_local_reply_ref(
+ GBinderLocalReply* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ g_atomic_int_inc(&self->refcount);
+ }
+ return self;
+}
+
+void
+gbinder_local_reply_unref(
+ GBinderLocalReply* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ test_gbinder_local_reply_free(self);
+ }
+ }
+}
+
+void
+gbinder_local_reply_init_writer(
+ GBinderLocalReply* self,
+ GBinderWriter* writer)
+{
+ test_gbinder_data_init_writer(self->data, writer);
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_local_request.c
^
|
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+struct gbinder_local_request {
+ guint32 refcount;
+ TestGBinderData* data;
+ char* iface;
+};
+
+static
+void
+test_gbinder_local_request_free(
+ GBinderLocalRequest* self)
+{
+ test_gbinder_data_unref(self->data);
+ g_free(self->iface);
+ g_free(self);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+GBinderLocalRequest*
+test_gbinder_local_request_new(
+ const char* iface)
+{
+ GBinderLocalRequest* self = g_new0(GBinderLocalRequest, 1);
+
+ g_assert(iface);
+ g_atomic_int_set(&self->refcount, 1);
+ self->data = test_gbinder_data_new(iface);
+ self->iface = g_strdup(iface);
+ return self;
+}
+
+const char*
+test_gbinder_local_request_interface(
+ GBinderLocalRequest* self)
+{
+ return self ? self->iface : NULL;
+}
+
+TestGBinderData*
+test_gbinder_local_request_data(
+ GBinderLocalRequest* self)
+{
+ return self ? self->data : NULL;
+}
+
+/*==========================================================================*
+ * libgbinder API
+ *==========================================================================*/
+
+GBinderLocalRequest*
+gbinder_local_request_ref(
+ GBinderLocalRequest* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ g_atomic_int_inc(&self->refcount);
+ }
+ return self;
+}
+
+void
+gbinder_local_request_unref(
+ GBinderLocalRequest* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ test_gbinder_local_request_free(self);
+ }
+ }
+}
+
+void
+gbinder_local_request_init_writer(
+ GBinderLocalRequest* self,
+ GBinderWriter* writer)
+{
+ test_gbinder_data_init_writer(self->data, writer);
+}
+
+GBinderLocalRequest*
+gbinder_local_request_append_int32(
+ GBinderLocalRequest* self,
+ guint32 value)
+{
+ if (self) {
+ GBinderWriter writer;
+
+ test_gbinder_data_init_writer(self->data, &writer);
+ gbinder_writer_append_int32(&writer, value);
+ }
+ return self;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_reader_writer.c
^
|
@@ -0,0 +1,488 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+#include <gutil_misc.h>
+#include <gutil_idlepool.h>
+
+typedef enum test_gbinder_data_type {
+ DATA_TYPE_BOOLEAN,
+ DATA_TYPE_INT32,
+ DATA_TYPE_BUFFER,
+ DATA_TYPE_LOCAL_OBJ
+} DATA_TYPE;
+
+typedef struct test_gbinder_data_item TestGBinderDataItem;
+struct test_gbinder_data_item {
+ TestGBinderDataItem* next;
+ DATA_TYPE type;
+ union {
+ gboolean b;
+ gint32 i32;
+ struct {
+ void* buf;
+ gsize size;
+ } blob;
+ GBinderLocalObject* obj;
+ } data;
+ void (*destroy)(TestGBinderDataItem*);
+};
+
+struct test_gbinder_data {
+ guint32 refcount;
+ TestGBinderDataItem* items;
+ GUtilIdlePool* pool;
+ char* iface;
+};
+
+typedef struct test_gbinder_reader {
+ TestGBinderDataItem* item;
+} TestGBinderReader;
+
+typedef struct test_gbinder_writer {
+ TestGBinderData* data;
+} TestGBinderWriter;
+
+static inline TestGBinderReader* test_gbinder_reader_cast(GBinderReader* reader)
+ { return (TestGBinderReader*)reader; }
+
+static inline TestGBinderWriter* test_gbinder_writer_cast(GBinderWriter* writer)
+ { return (TestGBinderWriter*)writer; }
+
+static
+void
+test_gbinder_data_item_destroy_local_obj(
+ TestGBinderDataItem* item)
+{
+ g_assert_cmpint(item->type, == ,DATA_TYPE_LOCAL_OBJ);
+ gbinder_local_object_unref(item->data.obj);
+}
+
+static
+void
+test_gbinder_data_item_destroy_buffer(
+ TestGBinderDataItem* item)
+{
+ g_assert_cmpint(item->type, == ,DATA_TYPE_BUFFER);
+ g_free(item->data.blob.buf);
+}
+
+static
+TestGBinderDataItem*
+test_gbinder_data_item_new(
+ DATA_TYPE type)
+{
+ TestGBinderDataItem* item = g_new0(TestGBinderDataItem, 1);
+
+ item->type = type;
+ return item;
+}
+
+static
+void
+test_gbinder_data_item_free(
+ TestGBinderDataItem* item)
+{
+ if (item) {
+ test_gbinder_data_item_free(item->next);
+ if (item->destroy) {
+ item->destroy(item);
+ }
+ g_free(item);
+ }
+}
+
+static
+void
+test_gbinder_data_free(
+ TestGBinderData* data)
+{
+ test_gbinder_data_item_free(data->items);
+ gutil_idle_pool_destroy(data->pool);
+ g_free(data->iface);
+ g_free(data);
+}
+
+static
+guint
+test_gbinder_data_count_buffers(
+ TestGBinderData* data)
+{
+ TestGBinderDataItem* item;
+ guint n;
+
+ for (n = 0, item = data->items; item; item = item->next) {
+ if (item->type == DATA_TYPE_BUFFER) {
+ n++;
+ }
+ }
+ return n;
+}
+
+static
+void
+test_gbinder_data_append(
+ TestGBinderData* data,
+ TestGBinderDataItem* item)
+{
+ TestGBinderDataItem* last = data->items;
+
+ if (last) {
+ while (last->next) {
+ last = last->next;
+ }
+ last->next = item;
+ } else {
+ data->items = item;
+ }
+}
+
+static
+gsize
+test_gbinder_data_item_size(
+ TestGBinderDataItem* item)
+{
+ switch (item->type) {
+ case DATA_TYPE_BOOLEAN:
+ return sizeof(item->data.b);
+ case DATA_TYPE_INT32:
+ return sizeof(item->data.i32);
+ case DATA_TYPE_BUFFER:
+ return sizeof(item->data.blob);
+ case DATA_TYPE_LOCAL_OBJ:
+ return sizeof(item->data.obj);
+ }
+ return 0;
+}
+
+static
+void*
+test_gbinder_data_buffer(
+ TestGBinderData* data,
+ gsize* out_size)
+{
+ gsize size = 0;
+ void* ptr = NULL;
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_remote_object.c
^
|
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+#include <glib-object.h>
+
+struct gbinder_remote_object {
+ GObject parent;
+ GBinderLocalObject* local;
+ gboolean dead;
+};
+
+typedef GObjectClass GBinderRemoteObjectClass;
+G_DEFINE_TYPE(GBinderRemoteObject, gbinder_remote_object, G_TYPE_OBJECT)
+
+#define PARENT_CLASS gbinder_remote_object_parent_class
+#define THIS_TYPE (gbinder_remote_object_get_type())
+#define THIS(obj) G_TYPE_CHECK_INSTANCE_CAST(obj,THIS_TYPE,GBinderRemoteObject)
+
+enum gbinder_remote_object_signal {
+ SIGNAL_DEATH,
+ SIGNAL_COUNT
+};
+
+#define SIGNAL_DEATH_NAME "death"
+
+static guint remote_object_signals[SIGNAL_COUNT] = { 0 };
+
+static
+void
+gbinder_remote_object_init(
+ GBinderRemoteObject* self)
+{
+}
+
+static
+void
+gbinder_remote_object_finalize(
+ GObject* object)
+{
+ GBinderRemoteObject* self = THIS(object);
+
+ gbinder_local_object_unref(self->local);
+ G_OBJECT_CLASS(PARENT_CLASS)->finalize(object);
+}
+
+static
+void
+gbinder_remote_object_class_init(
+ GBinderRemoteObjectClass* klass)
+{
+ G_OBJECT_CLASS(klass)->finalize = gbinder_remote_object_finalize;
+ remote_object_signals[SIGNAL_DEATH] =
+ g_signal_new(SIGNAL_DEATH_NAME, G_OBJECT_CLASS_TYPE(klass),
+ G_SIGNAL_RUN_FIRST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+GBinderRemoteObject*
+test_gbinder_remote_object_new(
+ GBinderLocalObject* local)
+{
+ GBinderRemoteObject* self = g_object_new(THIS_TYPE, NULL);
+
+ g_assert(local);
+ self->local = gbinder_local_object_ref(local);
+ return self;
+}
+
+void
+test_gbinder_remote_object_kill(
+ GBinderRemoteObject* self)
+{
+ if (self && !self->dead) {
+ self->dead = TRUE;
+ g_signal_emit(self, remote_object_signals[SIGNAL_DEATH], 0);
+ }
+}
+
+gboolean
+test_gbinder_remote_object_dead(
+ GBinderRemoteObject* self)
+{
+ return !self || self->dead;
+}
+
+GBinderLocalObject*
+test_gbinder_remote_object_to_local(
+ GBinderRemoteObject* self)
+{
+ return self ? self->local : NULL;
+}
+
+/*==========================================================================*
+ * libgbinder API
+ *==========================================================================*/
+
+GBinderRemoteObject*
+gbinder_remote_object_ref(
+ GBinderRemoteObject* self)
+{
+ if (self) {
+ g_object_ref(THIS(self));
+ }
+ return self;
+}
+
+void
+gbinder_remote_object_unref(
+ GBinderRemoteObject* self)
+{
+ if (self) {
+ g_object_unref(THIS(self));
+ }
+}
+
+gulong
+gbinder_remote_object_add_death_handler(
+ GBinderRemoteObject* self,
+ GBinderRemoteObjectNotifyFunc fn,
+ void* data)
+{
+ return (self && fn) ? g_signal_connect(self, SIGNAL_DEATH_NAME,
+ G_CALLBACK(fn), data) : 0;
+}
+
+void
+gbinder_remote_object_remove_handler(
+ GBinderRemoteObject* self,
+ gulong id)
+{
+ if (self && id) {
+ g_signal_handler_disconnect(self, id);
+ }
+}
+
+/*
+ * Remote Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_remote_reply.c
^
|
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+struct gbinder_remote_reply {
+ guint32 refcount;
+ TestGBinderData* data;
+};
+
+static
+void
+test_gbinder_remote_reply_free(
+ GBinderRemoteReply* self)
+{
+ test_gbinder_data_unref(self->data);
+ g_free(self);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+GBinderRemoteReply*
+test_gbinder_remote_reply_new(
+ GBinderLocalReply* reply)
+{
+ if (reply) {
+ GBinderRemoteReply* self = g_new0(GBinderRemoteReply, 1);
+ TestGBinderData* data = test_gbinder_local_reply_data(reply);
+
+ g_atomic_int_set(&self->refcount, 1);
+ self->data = test_gbinder_data_ref(data);
+ return self;
+ } else {
+ return NULL;
+ }
+}
+
+/*==========================================================================*
+ * libgbinder API
+ *==========================================================================*/
+
+GBinderRemoteReply*
+gbinder_remote_reply_ref(
+ GBinderRemoteReply* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ g_atomic_int_inc(&self->refcount);
+ }
+ return self;
+}
+
+void
+gbinder_remote_reply_unref(
+ GBinderRemoteReply* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ test_gbinder_remote_reply_free(self);
+ }
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_remote_request.c
^
|
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+struct gbinder_remote_request {
+ guint32 refcount;
+ TestGBinderData* data;
+ char* iface;
+};
+
+static
+void
+test_gbinder_remote_request_free(
+ GBinderRemoteRequest* self)
+{
+ test_gbinder_data_unref(self->data);
+ g_free(self->iface);
+ g_free(self);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+GBinderRemoteRequest*
+test_gbinder_remote_request_new(
+ GBinderLocalRequest* req)
+{
+ GBinderRemoteRequest* self = g_new0(GBinderRemoteRequest, 1);
+
+ g_atomic_int_set(&self->refcount, 1);
+ self->data = test_gbinder_data_ref(test_gbinder_local_request_data(req));
+ self->iface = g_strdup(test_gbinder_local_request_interface(req));
+ return self;
+}
+
+/*==========================================================================*
+ * libgbinder API
+ *==========================================================================*/
+
+GBinderRemoteRequest*
+gbinder_remote_request_ref(
+ GBinderRemoteRequest* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ g_atomic_int_inc(&self->refcount);
+ }
+ return self;
+}
+
+void
+gbinder_remote_request_unref(
+ GBinderRemoteRequest* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ test_gbinder_remote_request_free(self);
+ }
+ }
+}
+
+const char*
+gbinder_remote_request_interface(
+ GBinderRemoteRequest* self)
+{
+ return self ? self->iface : NULL;
+}
+
+void
+gbinder_remote_request_init_reader(
+ GBinderRemoteRequest* self,
+ GBinderReader* reader)
+{
+ test_gbinder_data_init_reader(self->data, reader);
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_gbinder_servicemanager.c
^
|
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_gbinder.h"
+
+#include <gutil_idlepool.h>
+#include <gutil_log.h>
+
+struct gbinder_servicemanager {
+ guint32 refcount;
+ GHashTable* services;
+ GUtilIdlePool* pool;
+ char* dev;
+};
+
+static GHashTable* test_servermanagers = NULL;
+
+static
+void
+test_gbinder_servicemanager_free(
+ GBinderServiceManager* self)
+{
+ /* Update the global table */
+ g_assert(test_servermanagers);
+ g_assert(g_hash_table_contains(test_servermanagers, self->dev));
+ g_hash_table_remove(test_servermanagers, self->dev); /* Frees self->dev */
+ if (g_hash_table_size(test_servermanagers) == 0) {
+ g_hash_table_unref(test_servermanagers);
+ test_servermanagers = NULL;
+ }
+
+ gutil_idle_pool_destroy(self->pool);
+ g_hash_table_destroy(self->services);
+ g_free(self);
+}
+
+/*==========================================================================*
+ * Internal API
+ *==========================================================================*/
+
+GBinderRemoteObject*
+test_gbinder_servicemanager_new_service(
+ GBinderServiceManager* self,
+ const char* name,
+ GBinderLocalObject* local)
+{
+ GBinderRemoteObject* remote = test_gbinder_remote_object_new(local);
+
+ g_hash_table_replace(self->services, g_strdup(name), remote);
+ return gbinder_remote_object_ref(remote);
+}
+
+/*==========================================================================*
+ * libgbinder API
+ *==========================================================================*/
+
+GBinderServiceManager*
+gbinder_servicemanager_new(
+ const char* dev)
+{
+ GBinderServiceManager* self = NULL;
+
+ g_assert(dev && dev[0]);
+ if (test_servermanagers) {
+ self = g_hash_table_lookup(test_servermanagers, dev);
+ }
+
+ if (self) {
+ gbinder_servicemanager_ref(self);
+ } else {
+ self = g_new0(GBinderServiceManager, 1);
+ g_atomic_int_set(&self->refcount, 1);
+ self->pool = gutil_idle_pool_new();
+ self->dev = g_strdup(dev); /* Owned by test_servermanagers */
+ self->services = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
+ (GDestroyNotify) gbinder_remote_object_unref);
+
+ /* Update the global table */
+ if (!test_servermanagers) {
+ test_servermanagers = g_hash_table_new_full(g_str_hash, g_str_equal,
+ g_free, NULL);
+ }
+ g_hash_table_replace(test_servermanagers, self->dev, self);
+ }
+ return self;
+}
+
+GBinderServiceManager*
+gbinder_servicemanager_ref(
+ GBinderServiceManager* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ g_atomic_int_inc(&self->refcount);
+ }
+ return self;
+}
+
+void
+gbinder_servicemanager_unref(
+ GBinderServiceManager* self)
+{
+ if (self) {
+ g_assert_cmpint(self->refcount, > ,0);
+ if (g_atomic_int_dec_and_test(&self->refcount)) {
+ test_gbinder_servicemanager_free(self);
+ }
+ }
+}
+
+GBinderRemoteObject* /* autoreleased */
+gbinder_servicemanager_get_service_sync(
+ GBinderServiceManager* self,
+ const char* name,
+ int* status)
+{
+ if (self && name) {
+ GBinderRemoteObject* obj = g_hash_table_lookup(self->services, name);
+
+ if (obj) {
+ gutil_idle_pool_add(self->pool, gbinder_remote_object_ref(obj),
+ (GDestroyNotify) gbinder_remote_object_unref);
+ return obj;
+ } else {
+ GDEBUG("Name %s not found", name);
+ }
+ }
+ return NULL;
+}
+
+GBinderLocalObject*
+gbinder_servicemanager_new_local_object2(
+ GBinderServiceManager* self,
+ const char* const* ifaces,
+ GBinderLocalTransactFunc fn,
+ void* user_data)
+{
+ return self ? test_gbinder_local_object_new(ifaces, fn, user_data) : NULL;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/common/test_main.c
^
|
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2018-2021 Jolla Ltd.
+ * Copyright (C) 2018-2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "test_common.h"
+
+#include <gutil_log.h>
+
+typedef struct test_quit_later_data{
+ GMainLoop* loop;
+ guint n;
+} TestQuitLaterData;
+
+typedef struct test_context_data{
+ GMainLoop* loop;
+ GTestFunc func;
+} TestContextData;
+
+static
+gboolean
+test_timeout_expired(
+ gpointer data)
+{
+ g_assert(!"TIMEOUT");
+ return G_SOURCE_REMOVE;
+}
+
+static
+void
+test_quit_later_n_free(
+ gpointer user_data)
+{
+ TestQuitLaterData* data = user_data;
+
+ g_main_loop_unref(data->loop);
+ g_free(data);
+}
+
+static
+gboolean
+test_quit_later_n_func(
+ gpointer user_data)
+{
+ TestQuitLaterData* data = user_data;
+
+ if (data->n > 0) {
+ data->n--;
+ return G_SOURCE_CONTINUE;
+ } else {
+ g_main_loop_quit(data->loop);
+ return G_SOURCE_REMOVE;
+ }
+}
+
+void
+test_quit_later_n(
+ GMainLoop* loop,
+ guint n)
+{
+ TestQuitLaterData* data = g_new0(TestQuitLaterData, 1);
+
+ data->loop = g_main_loop_ref(loop);
+ data->n = n;
+ g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, test_quit_later_n_func, data,
+ test_quit_later_n_free);
+}
+
+static
+gboolean
+test_quit_later_cb(
+ gpointer data)
+{
+ g_main_loop_quit((GMainLoop*)data);
+ return G_SOURCE_REMOVE;
+}
+
+void
+test_quit_later(
+ GMainLoop* loop)
+{
+ g_idle_add(test_quit_later_cb, loop);
+}
+
+void
+test_run(
+ const TestOpt* opt,
+ GMainLoop* loop)
+{
+ if (opt->flags & TEST_FLAG_DEBUG) {
+ g_main_loop_run(loop);
+ } else {
+ const guint timeout_id = g_timeout_add_seconds(TEST_TIMEOUT_SEC,
+ test_timeout_expired, NULL);
+ g_main_loop_run(loop);
+ g_source_remove(timeout_id);
+ }
+}
+
+void
+test_init(
+ TestOpt* opt,
+ int argc,
+ char* argv[])
+{
+ const char* sep1;
+ const char* sep2;
+ int i;
+
+ memset(opt, 0, sizeof(*opt));
+ for (i=1; i<argc; i++) {
+ const char* arg = argv[i];
+ if (!strcmp(arg, "-d") || !strcmp(arg, "--debug")) {
+ opt->flags |= TEST_FLAG_DEBUG;
+ } else if (!strcmp(arg, "-v")) {
+ GTestConfig* config = (GTestConfig*)g_test_config_vars;
+ config->test_verbose = TRUE;
+ } else {
+ GWARN("Unsupported command line option %s", arg);
+ }
+ }
+
+ /* Setup logging */
+ sep1 = strrchr(argv[0], '/');
+ sep2 = strrchr(argv[0], '\\');
+ gutil_log_default.name = (sep1 && sep2) ? (MAX(sep1, sep2) + 1) :
+ sep1 ? (sep1 + 1) : sep2 ? (sep2 + 1) : argv[0];
+ gutil_log_default.level = g_test_verbose() ?
+ GLOG_LEVEL_VERBOSE : GLOG_LEVEL_NONE;
+ gutil_log_timestamp = FALSE;
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/coverage/run
^
|
@@ -0,0 +1,56 @@
+#!/bin/bash
+#
+# This script requires lcov, dirname
+#
+
+TESTS="\
+unit_client \
+unit_config \
+unit_instance \
+unit_registry \
+unit_util"
+
+function err() {
+ echo "*** ERROR!" $1
+ exit 1
+}
+
+# Check the required tools
+which lcov >> /dev/null || err "Please install lcov"
+which dirname >> /dev/null || err "Please install dirname"
+
+# LCOV 1.10 has branch coverage disabled per default
+# Previous versions didn't have the --rc option
+if [ ! -z "$(lcov --help | grep ' --rc ')" ] ; then
+ LCOV_OPT="--rc lcov_branch_coverage=1"
+ GENHTML_OPT="--branch-coverage"
+fi
+
+pushd `dirname $0` > /dev/null
+COV_DIR="$PWD"
+pushd .. > /dev/null
+TEST_DIR="$PWD"
+pushd .. > /dev/null
+TOP_DIR="$PWD"
+popd > /dev/null
+popd > /dev/null
+popd > /dev/null
+
+make -C "$TOP_DIR" clean
+for t in $TESTS ; do
+ pushd "$TEST_DIR/$t"
+ make -C "$TEST_DIR/$t" clean coverage || exit 1
+ build/coverage/$t || exit 1
+ popd
+done
+
+# Sometimes you need this, sometimes that :S
+BASE_DIR="$TOP_DIR"
+#BASE_DIR="$TOP_DIR/src"
+
+FULL_COV="$COV_DIR/full.gcov"
+LIB_COV="$COV_DIR/lib.gcov"
+rm -f "$FULL_COV" "$LIB_COV"
+lcov $LCOV_OPT -c -d "$TOP_DIR/build/coverage" -b "$BASE_DIR" -o "$FULL_COV" || exit 1
+lcov $LCOV_OPT -e "$FULL_COV" "$BASE_DIR/*" -o "$LIB_COV" || exit 1
+genhtml $GENHTML_OPT "$LIB_COV" -t "libgbinder-radio" --output-directory "$COV_DIR/report" || exit 1
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_client/Makefile
^
|
@@ -0,0 +1,5 @@
+# -*- Mode: makefile-gmake -*-
+
+EXE = unit_client
+
+include ../common/Makefile
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_client/unit_client.c
^
|
@@ -0,0 +1,2106 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_common.h"
+#include "test_gbinder.h"
+
+#include "radio_client.h"
+#include "radio_instance.h"
+#include "radio_request_p.h"
+#include "radio_request_group_p.h"
+#include "radio_util.h"
+
+#include <gutil_strv.h>
+#include <gutil_log.h>
+
+#define DEFAULT_INTERFACE RADIO_INTERFACE_1_0
+#define DEV GBINDER_DEFAULT_HWBINDER
+
+static TestOpt test_opt;
+
+static const GBinderClientIfaceInfo radio_ind_iface_info[] = {
+ {RADIO_INDICATION_1_4, RADIO_1_4_IND_LAST },
+ {RADIO_INDICATION_1_3, RADIO_1_3_IND_LAST },
+ {RADIO_INDICATION_1_2, RADIO_1_2_IND_LAST },
+ {RADIO_INDICATION_1_1, RADIO_1_1_IND_LAST },
+ {RADIO_INDICATION_1_0, RADIO_1_0_IND_LAST }
+};
+
+static const GBinderClientIfaceInfo radio_resp_iface_info[] = {
+ {RADIO_RESPONSE_1_4, RADIO_1_4_RESP_LAST },
+ {RADIO_RESPONSE_1_3, RADIO_1_3_RESP_LAST },
+ {RADIO_RESPONSE_1_2, RADIO_1_2_RESP_LAST },
+ {RADIO_RESPONSE_1_1, RADIO_1_1_RESP_LAST },
+ {RADIO_RESPONSE_1_0, RADIO_1_0_RESP_LAST }
+};
+
+static const char* const radio_req_ifaces[] = {
+ RADIO_1_4,
+ RADIO_1_3,
+ RADIO_1_2,
+ RADIO_1_1,
+ RADIO_1_0,
+ NULL
+};
+
+static
+void
+test_ind_not_reached(
+ RadioClient* client,
+ RADIO_IND code,
+ const GBinderReader* reader,
+ gpointer user_data)
+{
+ g_assert_not_reached();
+}
+
+static
+void
+test_complete_not_reached(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ RADIO_RESP resp,
+ RADIO_ERROR error,
+ const GBinderReader* reader,
+ gpointer user_data)
+{
+ g_assert_not_reached();
+}
+
+static
+gboolean
+test_retry_not_reached(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ RADIO_RESP resp,
+ RADIO_ERROR error,
+ const GBinderReader* reader,
+ void* user_data)
+{
+ g_assert_not_reached();
+ return FALSE;
+}
+
+static
+void
+test_destroy_once(
+ gpointer user_data)
+{
+ gboolean* destroyed = user_data;
+
+ g_assert(!*destroyed);
+ *destroyed = TRUE;
+}
+
+static
+void
+test_inc_cb(
+ gpointer user_data)
+{
+ (*((int*)user_data))++;
+}
+
+static
+void
+test_client_inc_cb(
+ RadioClient* client,
+ gpointer user_data)
+{
+ (*((int*)user_data))++;
+}
+
+static
+gboolean
+test_unref_request_later(
+ gpointer user_data)
+{
+ radio_request_unref((RadioRequest*)user_data);
+ return G_SOURCE_REMOVE;
+}
+
+/*==========================================================================*
+ * Test IRadio service
+ *==========================================================================*/
+
+typedef struct test_radio_service {
+ GBinderLocalObject* obj;
+ GBinderClient* resp_client;
+ GBinderClient* ind_client;
+ GHashTable* req_count;
+ gboolean mute;
+} TestRadioService;
+
+#define FAIL_REQ RADIO_REQ_GET_ICC_CARD_STATUS
+#define ERROR_REQ RADIO_REQ_GET_IMS_REGISTRATION_STATE
+#define ERROR_RESP RADIO_RESP_GET_IMS_REGISTRATION_STATE
+#define IGNORE_REQ RADIO_REQ_GET_SIGNAL_STRENGTH
+
+static
+int
+test_service_req_count(
+ TestRadioService* service,
+ RADIO_REQ req)
+{
+ return GPOINTER_TO_INT(g_hash_table_lookup(service->req_count,
+ GINT_TO_POINTER(req)));
+}
+
+static
+GBinderLocalReply*
+test_service_txproc(
+ GBinderLocalObject* obj,
+ GBinderRemoteRequest* req,
+ guint code,
+ guint flags,
+ int* status,
+ void* user_data)
+{
+ TestRadioService* service = user_data;
+ const char* iface = gbinder_remote_request_interface(req);
+
+ if (gutil_strv_contains((const GStrV*)radio_req_ifaces, iface)) {
+ const int count = test_service_req_count(service, code) + 1;
+ GBinderReader reader;
+
+ GDEBUG("%s %s %d", iface, radio_req_name(code), count);
+ g_hash_table_insert(service->req_count, GINT_TO_POINTER(code),
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_config/Makefile
^
|
@@ -0,0 +1,5 @@
+# -*- Mode: makefile-gmake -*-
+
+EXE = unit_config
+
+include ../common/Makefile
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_config/unit_config.c
^
|
@@ -0,0 +1,918 @@
+/*
+ * Copyright (C) 2022 Jolla Ltd.
+ * Copyright (C) 2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_common.h"
+#include "test_gbinder.h"
+
+#include "radio_config.h"
+#include "radio_request_p.h"
+
+#include <gutil_strv.h>
+#include <gutil_log.h>
+
+#define DEV GBINDER_DEFAULT_HWBINDER
+
+static TestOpt test_opt;
+
+static const GBinderClientIfaceInfo radio_config_ind_iface_info[] = {
+ {RADIO_CONFIG_INDICATION_1_0, RADIO_CONFIG_1_0_IND_LAST }
+};
+
+static const GBinderClientIfaceInfo radio_config_resp_iface_info[] = {
+ {RADIO_CONFIG_RESPONSE_1_2, RADIO_CONFIG_1_2_RESP_LAST },
+ {RADIO_CONFIG_RESPONSE_1_1, RADIO_CONFIG_1_1_RESP_LAST },
+ {RADIO_CONFIG_RESPONSE_1_0, RADIO_CONFIG_1_0_RESP_LAST }
+};
+
+static const char* const radio_config_req_ifaces[] = {
+ RADIO_CONFIG_1_2,
+ RADIO_CONFIG_1_1,
+ RADIO_CONFIG_1_0,
+ NULL
+};
+
+static const char* const radio_config_fqnames[] = {
+ RADIO_CONFIG_1_0_FQNAME,
+ RADIO_CONFIG_1_1_FQNAME,
+ RADIO_CONFIG_1_2_FQNAME
+};
+
+static
+void
+test_complete_not_reached(
+ RadioRequest* req,
+ RADIO_TX_STATUS status,
+ RADIO_CONFIG_RESP resp,
+ RADIO_ERROR error,
+ const GBinderReader* reader,
+ gpointer user_data)
+{
+ g_assert_not_reached();
+}
+
+static
+void
+test_destroy_once(
+ gpointer user_data)
+{
+ gboolean* destroyed = user_data;
+
+ g_assert(!*destroyed);
+ *destroyed = TRUE;
+}
+
+static
+void
+test_ind_not_reached(
+ RadioConfig* config,
+ RADIO_CONFIG_IND code,
+ const GBinderReader* args,
+ gpointer user_data)
+{
+ g_assert_not_reached();
+}
+
+static
+void
+test_inc_cb(
+ gpointer user_data)
+{
+ (*((int*)user_data))++;
+}
+
+static
+void
+test_config_inc_cb(
+ RadioConfig* config,
+ gpointer user_data)
+{
+ (*((int*)user_data))++;
+}
+
+static
+RADIO_CONFIG_RESP
+test_config_req_resp(
+ RADIO_CONFIG_REQ req)
+{
+ switch (req) {
+#define REQ_RESP_(req,resp,Name,NAME) \
+ case RADIO_CONFIG_REQ_##NAME: return RADIO_CONFIG_RESP_##NAME;
+ RADIO_CONFIG_CALL_1_0(REQ_RESP_)
+ RADIO_CONFIG_CALL_1_1(REQ_RESP_)
+#undef REQ_RESP_
+ case RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS:
+ return RADIO_CONFIG_RESP_NONE;
+ case RADIO_CONFIG_REQ_ANY:
+ break;
+ }
+ g_assert_not_reached();
+ return RADIO_CONFIG_RESP_NONE;
+}
+
+/*==========================================================================*
+ * Test IRadioConfig service
+ *==========================================================================*/
+
+typedef struct test_config_service {
+ GBinderLocalObject* obj;
+ GBinderClient* resp_client;
+ GBinderClient* ind_client;
+ GHashTable* req_count;
+} TestConfigService;
+
+#define FAIL_REQ RADIO_CONFIG_REQ_GET_PHONE_CAPABILITY
+#define ERROR_REQ RADIO_CONFIG_REQ_SET_SIM_SLOTS_MAPPING
+#define ERROR_RESP RADIO_CONFIG_RESP_SET_SIM_SLOTS_MAPPING
+#define IGNORE_REQ RADIO_CONFIG_REQ_SET_MODEMS_CONFIG
+
+static
+int
+test_config_service_req_count(
+ TestConfigService* service,
+ RADIO_CONFIG_REQ req)
+{
+ return GPOINTER_TO_INT(g_hash_table_lookup(service->req_count,
+ GINT_TO_POINTER(req)));
+}
+
+static
+GBinderLocalReply*
+test_config_service_txproc(
+ GBinderLocalObject* obj,
+ GBinderRemoteRequest* req,
+ guint code,
+ guint flags,
+ int* status,
+ void* user_data)
+{
+ TestConfigService* service = user_data;
+ const char* iface = gbinder_remote_request_interface(req);
+
+ if (gutil_strv_contains((const GStrV*)radio_config_req_ifaces, iface)) {
+ const int count = test_config_service_req_count(service, code) + 1;
+ GBinderReader reader;
+
+ GDEBUG("%s %s %d", iface, radio_config_req_name(NULL, code), count);
+ g_hash_table_insert(service->req_count, GINT_TO_POINTER(code),
+ GINT_TO_POINTER(count));
+
+ gbinder_remote_request_init_reader(req, &reader);
+ if (code == RADIO_CONFIG_REQ_SET_RESPONSE_FUNCTIONS) {
+ GBinderRemoteObject* resp_obj = gbinder_reader_read_object(&reader);
+ GBinderRemoteObject* ind_obj = gbinder_reader_read_object(&reader);
+
+ g_assert(resp_obj);
+ g_assert(ind_obj);
+ gbinder_client_unref(service->resp_client);
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_instance/Makefile
^
|
@@ -0,0 +1,5 @@
+# -*- Mode: makefile-gmake -*-
+
+EXE = unit_instance
+
+include ../common/Makefile
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_instance/unit_instance.c
^
|
@@ -0,0 +1,1207 @@
+/*
+ * Copyright (C) 2021-2022 Jolla Ltd.
+ * Copyright (C) 2021-2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_common.h"
+#include "test_gbinder.h"
+
+#include "radio_instance_p.h"
+#include "radio_util.h"
+
+#include <gutil_strv.h>
+#include <gutil_log.h>
+
+#define DEFAULT_INTERFACE RADIO_INTERFACE_1_0
+#define DEV GBINDER_DEFAULT_BINDER
+
+#define UNKNOWN_VALUE (0x7fffffff)
+#define UNKNOWN_VALUE_STR "2147483647" /* 0x7fffffff */
+#define UNKNOWN_REQ ((RADIO_REQ)UNKNOWN_VALUE)
+#define UNKNOWN_REQ_STR UNKNOWN_VALUE_STR
+#define UNKNOWN_IND ((RADIO_IND)UNKNOWN_VALUE)
+#define UNKNOWN_IND_STR UNKNOWN_VALUE_STR
+#define UNKNOWN_RESP ((RADIO_RESP)UNKNOWN_VALUE)
+#define UNKNOWN_RESP_STR UNKNOWN_VALUE_STR
+#define INVALID_IND_TYPE ((RADIO_IND_TYPE)UNKNOWN_VALUE)
+
+RadioInstance*
+radio_instance_get_with_interface(
+ const char* dev,
+ const char* name,
+ RADIO_INTERFACE version); /* Deprecated and removed from the .h file */
+
+gboolean
+radio_instance_is_dead(
+ RadioInstance* self); /* No sure why this one is missing */
+
+typedef struct test_radio_service {
+ GBinderLocalObject* obj;
+ GBinderRemoteObject* resp_obj;
+ GBinderRemoteObject* ind_obj;
+ GHashTable* req_count;
+} TestRadioService;
+
+static TestOpt test_opt;
+
+static const GBinderClientIfaceInfo radio_ind_iface_info[] = {
+ {RADIO_INDICATION_1_4, RADIO_1_4_IND_LAST },
+ {RADIO_INDICATION_1_3, RADIO_1_3_IND_LAST },
+ {RADIO_INDICATION_1_2, RADIO_1_2_IND_LAST },
+ {RADIO_INDICATION_1_1, RADIO_1_1_IND_LAST },
+ {RADIO_INDICATION_1_0, RADIO_1_0_IND_LAST }
+};
+
+static const GBinderClientIfaceInfo radio_resp_iface_info[] = {
+ {RADIO_RESPONSE_1_4, RADIO_1_4_RESP_LAST },
+ {RADIO_RESPONSE_1_3, RADIO_1_3_RESP_LAST },
+ {RADIO_RESPONSE_1_2, RADIO_1_2_RESP_LAST },
+ {RADIO_RESPONSE_1_1, RADIO_1_1_RESP_LAST },
+ {RADIO_RESPONSE_1_0, RADIO_1_0_RESP_LAST }
+};
+
+static const char* const radio_req_ifaces[] = {
+ RADIO_1_4,
+ RADIO_1_3,
+ RADIO_1_2,
+ RADIO_1_1,
+ RADIO_1_0,
+ NULL
+};
+
+static
+gboolean
+test_response_not_handled(
+ RadioInstance* radio,
+ RADIO_RESP code,
+ const RadioResponseInfo* info,
+ const GBinderReader* reader,
+ gpointer user_data)
+{
+ g_assert_not_reached();
+ return FALSE;
+}
+
+static
+void
+test_response_not_observed(
+ RadioInstance* radio,
+ RADIO_RESP code,
+ const RadioResponseInfo* info,
+ const GBinderReader* reader,
+ gpointer user_data)
+{
+ g_assert_not_reached();
+}
+
+/*==========================================================================*
+ * Test IRadio service
+ *==========================================================================*/
+
+static
+int
+test_service_req_count(
+ TestRadioService* service,
+ RADIO_REQ req)
+{
+ return GPOINTER_TO_INT(g_hash_table_lookup(service->req_count,
+ GINT_TO_POINTER(req)));
+}
+
+static
+GBinderLocalReply*
+test_service_txproc(
+ GBinderLocalObject* obj,
+ GBinderRemoteRequest* req,
+ guint code,
+ guint flags,
+ int* status,
+ void* user_data)
+{
+ TestRadioService* service = user_data;
+ const char* iface = gbinder_remote_request_interface(req);
+
+ if (gutil_strv_contains((const GStrV*)radio_req_ifaces, iface)) {
+ const int count = test_service_req_count(service, code) + 1;
+ GBinderReader reader;
+
+ GDEBUG("%s %s %d", iface, radio_req_name(code), count);
+ g_hash_table_insert(service->req_count, GINT_TO_POINTER(code),
+ GINT_TO_POINTER(count));
+
+ gbinder_remote_request_init_reader(req, &reader);
+ switch (code) {
+ case RADIO_REQ_SET_RESPONSE_FUNCTIONS:
+ gbinder_remote_object_unref(service->resp_obj);
+ gbinder_remote_object_unref(service->ind_obj);
+ service->resp_obj = gbinder_reader_read_object(&reader);
+ service->ind_obj = gbinder_reader_read_object(&reader);
+ g_assert(service->resp_obj);
+ g_assert(service->ind_obj);
+ break;
+ }
+ *status = GBINDER_STATUS_OK;
+ return NULL;
+ } else {
+ GDEBUG("%s %u", iface, code);
+ *status = GBINDER_STATUS_FAILED;
+ return NULL;
+ }
+}
+
+static
+void
+test_service_init(
+ TestRadioService* service)
+{
+ memset(service, 0, sizeof(*service));
+ service->obj = test_gbinder_local_object_new(NULL,
+ test_service_txproc, service);
+ service->req_count = g_hash_table_new(g_direct_hash, g_direct_equal);
+}
+
+static
+void
+test_service_cleanup(
+ TestRadioService* service)
+{
+ g_hash_table_destroy(service->req_count);
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_registry/Makefile
^
|
@@ -0,0 +1,5 @@
+# -*- Mode: makefile-gmake -*-
+
+EXE = unit_registry
+
+include ../common/Makefile
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_registry/unit_registry.c
^
|
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2021 Jolla Ltd.
+ * Copyright (C) 2021 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_common.h"
+
+#include "radio_instance.h"
+#include "radio_registry_p.h"
+
+#include <glib-object.h>
+
+static TestOpt test_opt;
+
+/*==========================================================================*
+ * null
+ *==========================================================================*/
+
+static
+void
+test_null(
+ void)
+{
+ radio_registry_instance_added(NULL);
+ radio_registry_instance_removed(NULL);
+ radio_registry_remove_handler(NULL, 0);
+ radio_registry_remove_handlers(NULL, NULL, 0);
+ radio_registry_unref(NULL);
+ g_assert(!radio_registry_ref(NULL));
+ g_assert(!radio_registry_add_instance_added_handler(NULL,NULL,NULL,NULL));
+ g_assert(!radio_registry_add_instance_removed_handler(NULL,NULL,NULL,NULL));
+}
+
+/*==========================================================================*
+ * basic
+ *==========================================================================*/
+
+static const char* test_basic_key = "foo";
+static const char* test_basic_bad_key = "bar";
+
+static
+void
+test_basic_add_cb(
+ RadioRegistry* registry,
+ RadioInstance* radio,
+ gpointer user_data)
+{
+ (*((int*)user_data))++;
+}
+
+static
+void
+test_basic_remove_cb(
+ RadioRegistry* registry,
+ const char* str,
+ gpointer user_data)
+{
+ g_assert_cmpstr(str, == ,test_basic_key);
+ (*((int*)user_data))++;
+}
+
+static
+void
+test_basic(
+ void)
+{
+ RadioRegistry* reg = radio_registry_new();
+ int add_count = 0, remove_count = 0;
+ gulong id[6];
+ GObject* instance;
+
+ g_assert(reg);
+ g_assert(reg == radio_registry_new()); /* New ref to the same instance */
+ radio_registry_unref(reg);
+
+ g_assert(!radio_registry_add_instance_added_handler(reg,NULL,NULL,NULL));
+ g_assert(!radio_registry_add_instance_removed_handler(reg,NULL,NULL,NULL));
+
+ /* Add/remove handlers */
+ id[0] = radio_registry_add_instance_added_handler(reg, "",
+ test_basic_add_cb, &add_count);
+ radio_registry_remove_handler(reg, id[0]);
+ id[0] = radio_registry_add_instance_added_handler(reg, NULL,
+ test_basic_add_cb, &add_count);
+ id[1] = radio_registry_add_instance_added_handler(reg, test_basic_bad_key,
+ test_basic_add_cb, &add_count); /* won't get called */
+
+ id[2] = radio_registry_add_instance_removed_handler(reg, NULL,
+ test_basic_remove_cb, &remove_count);
+ id[3] = radio_registry_add_instance_removed_handler(reg, "",
+ test_basic_remove_cb, &remove_count);
+ id[4] = radio_registry_add_instance_removed_handler(reg, test_basic_key,
+ test_basic_remove_cb, &remove_count);
+ id[5] = radio_registry_add_instance_removed_handler(reg, test_basic_bad_key,
+ test_basic_remove_cb, &remove_count); /* won't get called */
+
+ /* Well, this wouldn't be a real functional instance but we don't care */
+ instance = g_object_new(RADIO_TYPE_INSTANCE, NULL);
+ radio_registry_instance_added(RADIO_INSTANCE(instance));
+ g_assert_cmpint(add_count, == ,1); /* 1 out of 2 is called */
+ g_assert_cmpint(remove_count, == ,0);
+
+ radio_registry_instance_removed(test_basic_key);
+ g_assert_cmpint(add_count, == ,1);
+ g_assert_cmpint(remove_count, == ,3); /* 3 our of 4 are called */
+ g_object_unref(instance);
+
+ /* remove_all zeros the ids */
+ radio_registry_remove_all_handlers(reg, id);
+ g_assert(!id[0]);
+ g_assert(!id[4]);
+
+ radio_registry_remove_handler(reg, 0); /* No effect */
+ radio_registry_unref(reg);
+}
+
+/*==========================================================================*
+ * Common
+ *==========================================================================*/
+
+#define TEST_PREFIX "/registry/"
+#define TEST_(t) TEST_PREFIX t
+
+int main(int argc, char* argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+ g_test_add_func(TEST_("null"), test_null);
+ g_test_add_func(TEST_("basic"), test_basic);
+ test_init(&test_opt, argc, argv);
+ return g_test_run();
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_util/Makefile
^
|
@@ -0,0 +1,5 @@
+# -*- Mode: makefile-gmake -*-
+
+EXE = unit_util
+
+include ../common/Makefile
|
[-]
[+]
|
Added |
_service:tar_git:libgbinder-radio-1.5.4.tar.bz2/unit/unit_util/unit_util.c
^
|
@@ -0,0 +1,370 @@
+/*
+ * Copyright (C) 2022 Jolla Ltd.
+ * Copyright (C) 2022 Slava Monich <slava.monich@jolla.com>
+ *
+ * You may use this file under the terms of the BSD license as follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the names of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation
+ * are those of the authors and should not be interpreted as representing
+ * any official policies, either expressed or implied.
+ */
+
+#include "test_common.h"
+
+#include "radio_util.h"
+
+#define UNKNOWN_VALUE (0x7fffffff)
+#define UNKNOWN_REQ ((RADIO_REQ)UNKNOWN_VALUE)
+#define UNKNOWN_IND ((RADIO_REQ)UNKNOWN_VALUE)
+#define UNKNOWN_RESP ((RADIO_RESP)UNKNOWN_VALUE)
+
+static TestOpt test_opt;
+
+/*==========================================================================*
+ * req_name
+ *==========================================================================*/
+
+static
+void
+test_req_name(
+ void)
+{
+ g_assert(!radio_req_name(UNKNOWN_REQ));
+ g_assert(!radio_req_name(RADIO_REQ_ANY));
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_GET_ICC_CARD_STATUS),==,
+ "getIccCardStatus");
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_START_NETWORK_SCAN),==,
+ "startNetworkScan");
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA),==,
+ "setSignalStrengthReportingCriteria");
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_SET_SYSTEM_SELECTION_CHANNELS),==,
+ "setSystemSelectionChannels");
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_EMERGENCY_DIAL),==,
+ "emergencyDial");
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_ENABLE_UICC_APPLICATIONS),==,
+ "enableUiccApplications");
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_START_NETWORK_SCAN_1_4),==,
+ "startNetworkScan_1_4");
+ g_assert_cmpstr(radio_req_name(RADIO_REQ_START_NETWORK_SCAN_1_5),==,
+ "startNetworkScan_1_5");
+}
+
+/*==========================================================================*
+ * resp_name
+ *==========================================================================*/
+
+static
+void
+test_resp_name(
+ void)
+{
+ g_assert(!radio_resp_name(UNKNOWN_RESP));
+ g_assert(!radio_resp_name(RADIO_RESP_ANY));
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_GET_ICC_CARD_STATUS),==,
+ "getIccCardStatusResponse");
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_START_NETWORK_SCAN),==,
+ "startNetworkScanResponse");
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA),==,
+ "setSignalStrengthReportingCriteriaResponse");
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_SET_SYSTEM_SELECTION_CHANNELS),==,
+ "setSystemSelectionChannelsResponse");
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_EMERGENCY_DIAL),==,
+ "emergencyDialResponse");
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_ENABLE_UICC_APPLICATIONS),==,
+ "enableUiccApplicationsResponse");
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_START_NETWORK_SCAN_1_4),==,
+ "startNetworkScanResponse_1_4");
+ g_assert_cmpstr(radio_resp_name(RADIO_RESP_START_NETWORK_SCAN_1_5),==,
+ "startNetworkScanResponse_1_5");
+}
+
+/*==========================================================================*
+ * ind_name
+ *==========================================================================*/
+
+static
+void
+test_ind_name(
+ void)
+{
+ g_assert(!radio_ind_name(UNKNOWN_IND));
+ g_assert(!radio_ind_name(RADIO_IND_ANY));
+ g_assert_cmpstr(radio_ind_name(RADIO_IND_RADIO_STATE_CHANGED),==,
+ "radioStateChanged");
+ g_assert_cmpstr(radio_ind_name(RADIO_IND_NETWORK_SCAN_RESULT),==,
+ "networkScanResult");
+ g_assert_cmpstr(radio_ind_name(RADIO_IND_CURRENT_LINK_CAPACITY_ESTIMATE),==,
+ "currentLinkCapacityEstimate");
+ g_assert_cmpstr(radio_ind_name(RADIO_IND_CURRENT_EMERGENCY_NUMBER_LIST),==,
+ "currentEmergencyNumberList");
+ g_assert_cmpstr(radio_ind_name(RADIO_IND_REGISTRATION_FAILED),==,
+ "registrationFailed");
+}
+
+/*==========================================================================*
+ * req_resp
+ *==========================================================================*/
+
+static
+void
+test_req_resp(
+ void)
+{
+ static const struct radio_req_resp_data {
+ RADIO_REQ req;
+ RADIO_RESP resp;
+ } tests[] = {
+ { UNKNOWN_REQ, RADIO_RESP_NONE },
+ { RADIO_REQ_ANY, RADIO_RESP_NONE },
+ { RADIO_REQ_SETUP_DATA_CALL_1_2, RADIO_RESP_SETUP_DATA_CALL },
+ { RADIO_REQ_DEACTIVATE_DATA_CALL_1_2, RADIO_RESP_DEACTIVATE_DATA_CALL },
+ { RADIO_REQ_START_NETWORK_SCAN_1_2, RADIO_RESP_START_NETWORK_SCAN },
+ { RADIO_REQ_SET_INITIAL_ATTACH_APN_1_4,
+ RADIO_RESP_SET_INITIAL_ATTACH_APN },
+ { RADIO_REQ_SET_DATA_PROFILE_1_4, RADIO_RESP_SET_DATA_PROFILE },
+ { RADIO_REQ_SET_INDICATION_FILTER_1_2,
+ RADIO_RESP_SET_INDICATION_FILTER },
+ { RADIO_REQ_GET_ICC_CARD_STATUS, RADIO_RESP_GET_ICC_CARD_STATUS },
+ { RADIO_REQ_START_NETWORK_SCAN, RADIO_RESP_START_NETWORK_SCAN },
+ { RADIO_REQ_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA,
+ RADIO_RESP_SET_SIGNAL_STRENGTH_REPORTING_CRITERIA },
+ { RADIO_REQ_SET_SYSTEM_SELECTION_CHANNELS,
+ RADIO_RESP_SET_SYSTEM_SELECTION_CHANNELS },
+ { RADIO_REQ_EMERGENCY_DIAL, RADIO_RESP_EMERGENCY_DIAL }
+ };
+
+ int i;
+
+ for (i = 0; i < G_N_ELEMENTS(tests); i++) {
+ g_assert_cmpint(radio_req_resp(tests[i].req), ==, tests[i].resp);
+ }
+}
+
+/*==========================================================================*
+ * req_resp2
+ *==========================================================================*/
+
+static
+void
+test_req_resp2(
+ void)
+{
+ static const struct radio_req_resp2_data {
+ RADIO_REQ req;
+ RADIO_INTERFACE iface;
+ RADIO_RESP resp;
+ } tests[] = {
+ { UNKNOWN_REQ, RADIO_INTERFACE_NONE, RADIO_RESP_NONE },
+ { RADIO_REQ_SUPPLY_ICC_PIN_FOR_APP, RADIO_INTERFACE_1_0,
+ RADIO_RESP_SUPPLY_ICC_PIN_FOR_APP },
+ { RADIO_REQ_SUPPLY_ICC_PUK_FOR_APP, RADIO_INTERFACE_1_1,
+ RADIO_RESP_SUPPLY_ICC_PUK_FOR_APP },
+ { RADIO_REQ_SUPPLY_ICC_PIN2_FOR_APP, RADIO_INTERFACE_1_2,
+ RADIO_RESP_SUPPLY_ICC_PIN2_FOR_APP },
+ { RADIO_REQ_SUPPLY_ICC_PUK2_FOR_APP, RADIO_INTERFACE_1_3,
+ RADIO_RESP_SUPPLY_ICC_PUK2_FOR_APP },
+ { RADIO_REQ_CHANGE_ICC_PIN_FOR_APP, RADIO_INTERFACE_1_4,
+ RADIO_RESP_CHANGE_ICC_PIN_FOR_APP },
+ { RADIO_REQ_CHANGE_ICC_PIN2_FOR_APP, RADIO_INTERFACE_COUNT,
+ RADIO_RESP_CHANGE_ICC_PIN2_FOR_APP },
+
+ { RADIO_REQ_SETUP_DATA_CALL_1_2, RADIO_INTERFACE_1_2,
+ RADIO_RESP_SETUP_DATA_CALL },
+ { RADIO_REQ_SETUP_DATA_CALL_1_2, RADIO_INTERFACE_1_4,
+ RADIO_RESP_SETUP_DATA_CALL },
|