[-]
[+]
|
Changed |
_service:tar_git:ofono.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:ofono.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -1,7 +1,7 @@
<services>
<service name="tar_git">
<param name="url">https://git.merproject.org/slava/ofono.git</param>
- <param name="branch">lte_back</param>
- <param name="revision">2053b0d</param>
+ <param name="branch">master</param>
+ <param name="revision">mer/1.21+git32</param>
</service>
</services>
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/.gitignore
^
|
@@ -32,6 +32,8 @@
dundee/dundee
dundee/dundee.service
+test-driver
+test-suite.log
unit/test-common
unit/test-util
unit/test-idmap
@@ -46,6 +48,7 @@
unit/test-gprs-filter
unit/test-ril_config
unit/test-ril_util
+unit/test-ril-transport
unit/test-rilmodem-cb
unit/test-rilmodem-cs
unit/test-rilmodem-gprs
@@ -57,6 +60,7 @@
unit/test-sailfish_sim_info_dbus
unit/test-sailfish_watch
unit/test-sms-filter
+unit/test-voicecall-filter
unit/test-*.log
unit/test-*.trs
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/Makefile.am
^
|
@@ -24,6 +24,8 @@
include/sim-mnclength.h \
include/handsfree-audio.h include/siri.h \
include/sms-filter.h include/gprs-filter.h \
+ include/voicecall-filter.h \
+ include/ril-constants.h include/ril-transport.h \
include/netmon.h include/lte.h \
include/storage.h \
gdbus/gdbus.h
@@ -737,6 +739,7 @@
src/handsfree-audio.c src/bluetooth.h \
src/sim-mnclength.c src/voicecallagent.c \
src/sms-filter.c src/gprs-filter.c src/dbus-queue.c \
+ src/voicecall-filter.c src/ril-transport.c \
src/hfp.h src/siri.c \
src/netmon.c src/lte.c \
src/netmonagent.c src/netmonagent.h
@@ -749,7 +752,8 @@
BUILT_SOURCES = $(local_headers) src/builtin.h
-CLEANFILES = $(BUILT_SOURCES) $(rules_DATA)
+CLEANFILES = $(BUILT_SOURCES) $(rules_DATA) \
+ $(shell find . -name "*.gcda") $(shell find . -name "*.gcno")
plugindir = $(pkglibdir)/plugins
@@ -1093,6 +1097,13 @@
unit_objects += $(unit_test_provision_OBJECTS)
unit_tests += unit/test-provision
+unit_test_ril_transport_SOURCES = unit/test-ril-transport.c \
+ src/ril-transport.c src/log.c
+unit_test_ril_transport_CFLAGS = $(COVERAGE_OPT) $(AM_CFLAGS)
+unit_test_ril_transport_LDADD = @GLIB_LIBS@ -ldl
+unit_objects += $(unit_test_ril_transport_OBJECTS)
+unit_tests += unit/test-ril-transport
+
unit_test_sms_filter_SOURCES = unit/test-sms-filter.c \
src/sms-filter.c src/log.c
unit_test_sms_filter_CFLAGS = $(COVERAGE_OPT) $(AM_CFLAGS)
@@ -1107,6 +1118,14 @@
unit_objects += $(unit_test_gprs_filter_OBJECTS)
unit_tests += unit/test-gprs-filter
+unit_test_voicecall_filter_SOURCES = unit/test-voicecall-filter.c \
+ src/voicecall-filter.c src/log.c \
+ src/common.c src/util.c
+unit_test_voicecall_filter_CFLAGS = $(COVERAGE_OPT) $(AM_CFLAGS)
+unit_test_voicecall_filter_LDADD = @GLIB_LIBS@ -ldl
+unit_objects += $(unit_test_voicecall_filter_OBJECTS)
+unit_tests += unit/test-voicecall-filter
+
test_rilmodem_sources = $(gril_sources) src/log.c src/common.c src/util.c \
gatchat/ringbuffer.h gatchat/ringbuffer.c \
unit/rilmodem-test-server.h \
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/configure.ac
^
|
@@ -184,10 +184,10 @@
AM_CONDITIONAL(SAILFISH_RILMODEM, test "${enable_sailfish_rilmodem}" != "no")
if (test "${enable_sailfish_rilmodem}" = "yes"); then
- PKG_CHECK_MODULES(GRILIO, libgrilio >= 1.0.21, dummy=yes,
- AC_MSG_ERROR(libgrilio >= 1.0.21 is required))
- PKG_CHECK_MODULES(GLIBUTIL, libglibutil >= 1.0.23, dummy=yes,
- AC_MSG_ERROR(libglibutil >= 1.0.23 is required))
+ PKG_CHECK_MODULES(GRILIO, libgrilio >= 1.0.25, dummy=yes,
+ AC_MSG_ERROR(libgrilio >= 1.0.25 is required))
+ PKG_CHECK_MODULES(GLIBUTIL, libglibutil >= 1.0.30, dummy=yes,
+ AC_MSG_ERROR(libglibutil >= 1.0.30 is required))
PKG_CHECK_MODULES(LIBMCE, libmce-glib >= 1.0.5, dummy=yes,
AC_MSG_ERROR(libmce-glib >= 1.0.5 is required))
CFLAGS="$CFLAGS $GRILIO_CFLAGS $LIBMCE_CFLAGS"
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_call_barring.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2017 Jolla Ltd.
+ * Copyright (C) 2015-2018 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -14,6 +14,7 @@
*/
#include "ril_plugin.h"
+#include "ril_sim_card.h"
#include "ril_util.h"
#include "ril_log.h"
@@ -26,11 +27,11 @@
* ril.h does not state that string count must be given, but that is
* still expected by the modem
*/
-#define RIL_QUERY_STRING_COUNT 4
#define RIL_SET_STRING_COUNT 5
#define RIL_SET_PW_STRING_COUNT 3
struct ril_call_barring {
+ struct ril_sim_card *card;
GRilIoQueue *q;
guint timer_id;
};
@@ -106,7 +107,7 @@
{
struct ril_call_barring *bd = ofono_call_barring_get_data(b);
char cls_textual[RIL_MAX_SERVICE_LENGTH];
- GRilIoRequest *req = grilio_request_new();
+ GRilIoRequest *req;
DBG("lock: %s, services to query: %d", lock, cls);
@@ -123,15 +124,9 @@
/*
* See 3GPP 27.007 7.4 for parameter descriptions.
- * According to ril.h password should be empty string "" when not
- * needed, but in reality we only need to give string length as 0
*/
- grilio_request_append_int32(req, RIL_QUERY_STRING_COUNT);
- grilio_request_append_utf8(req, lock); /* Facility code */
- grilio_request_append_int32(req, 0); /* Password length */
- grilio_request_append_utf8(req, cls_textual);
- grilio_request_append_utf8(req, NULL); /* AID (not yet supported) */
-
+ req = grilio_request_array_utf8_new(4, lock, "", cls_textual,
+ ril_sim_card_app_aid(bd->card));
ril_call_barring_submit_request(bd, req,
RIL_REQUEST_QUERY_FACILITY_LOCK,
ril_call_barring_query_cb, cb, data);
@@ -182,7 +177,7 @@
RIL_FACILITY_UNLOCK);
grilio_request_append_utf8(req, passwd);
grilio_request_append_utf8(req, cls_textual);
- grilio_request_append_utf8(req, NULL); /* AID (not yet supported) */
+ grilio_request_append_utf8(req, ril_sim_card_app_aid(bd->card));
ril_call_barring_submit_request(bd, req,
RIL_REQUEST_SET_FACILITY_LOCK,
@@ -243,6 +238,7 @@
struct ril_call_barring *bd = g_new0(struct ril_call_barring, 1);
DBG("");
+ bd->card = ril_sim_card_ref(modem->sim_card);
bd->q = grilio_queue_new(ril_modem_io(modem));
bd->timer_id = g_idle_add(ril_call_barring_register, b);
ofono_call_barring_set_data(b, bd);
@@ -260,6 +256,7 @@
g_source_remove(bd->timer_id);
}
+ ril_sim_card_unref(bd->card);
grilio_queue_cancel_all(bd->q, FALSE);
grilio_queue_unref(bd->q);
g_free(bd);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_cell_info.c
^
|
@@ -23,6 +23,7 @@
#include <grilio_request.h>
#include <grilio_parser.h>
+#include <gutil_idlepool.h>
#include <gutil_misc.h>
#define DISPLAY_ON_UPDATE_RATE (1000) /* 1 sec */
@@ -75,6 +76,20 @@
ril_cell_free(cell);
}
+static const char *ril_cell_info_int_format(int value, const char *format)
+{
+ if (value == SAILFISH_CELL_INVALID_VALUE) {
+ return "";
+ } else {
+ static GUtilIdlePool *ril_cell_info_pool = NULL;
+ GUtilIdlePool *pool = gutil_idle_pool_get(&ril_cell_info_pool);
+ char *str = g_strdup_printf(format, value);
+
+ gutil_idle_pool_add(pool, str, g_free);
+ return str;
+ }
+}
+
static gboolean ril_cell_info_list_identical(GSList *l1, GSList *l2)
{
while (l1 && l2) {
@@ -123,11 +138,17 @@
grilio_parser_get_int32(rilp, &gsm->bitErrorRate) &&
(version < 12 || /* RIL_GSM_SignalStrength_v12 part */
grilio_parser_get_int32(rilp, &gsm->timingAdvance))) {
- DBG("[gsm] reg=%d,mcc=%d,mnc=%d,lac=%d,cid=%d,arfcn=%d,"
- "bsic=%d,strength=%d,err=%d,t=%d", registered,
- gsm->mcc, gsm->mnc, gsm->lac, gsm->cid, gsm->arfcn,
- gsm->bsic, gsm->signalStrength, gsm->bitErrorRate,
- gsm->timingAdvance);
+ DBG("[gsm] reg=%d%s%s%s%s%s%s%s%s%s", registered,
+ ril_cell_info_int_format(gsm->mcc, ",mcc=%d"),
+ ril_cell_info_int_format(gsm->mnc, ",mnc=%d"),
+ ril_cell_info_int_format(gsm->lac, ",lac=%d"),
+ ril_cell_info_int_format(gsm->cid, ",cid=%d"),
+ ril_cell_info_int_format(gsm->arfcn, ",arfcn=%d"),
+ ril_cell_info_int_format(gsm->bsic, ",bsic=%d"),
+ ril_cell_info_int_format(gsm->signalStrength,
+ ",strength=%d"),
+ ril_cell_info_int_format(gsm->bitErrorRate, ",err=%d"),
+ ril_cell_info_int_format(gsm->timingAdvance, ",t=%d"));
cell->type = SAILFISH_CELL_TYPE_GSM;
cell->registered = registered;
return cell;
@@ -155,10 +176,16 @@
grilio_parser_get_int32(rilp, &wcdma->uarfcn)) &&
grilio_parser_get_int32(rilp, &wcdma->signalStrength) &&
grilio_parser_get_int32(rilp, &wcdma->bitErrorRate)) {
- DBG("[wcdma] reg=%d,mcc=%d,mnc=%d,lac=%d,cid=%d,psc=%d,"
- "strength=%d,err=%d", registered, wcdma->mcc,
- wcdma->mnc, wcdma->lac, wcdma->cid, wcdma->psc,
- wcdma->signalStrength, wcdma->bitErrorRate);
+ DBG("[wcdma] reg=%d%s%s%s%s%s%s%s", registered,
+ ril_cell_info_int_format(wcdma->mcc, ",mcc=%d"),
+ ril_cell_info_int_format(wcdma->mnc, ",mnc=%d"),
+ ril_cell_info_int_format(wcdma->lac, ",lac=%d"),
+ ril_cell_info_int_format(wcdma->cid, ",cid=%d"),
+ ril_cell_info_int_format(wcdma->psc, ",psc=%d"),
+ ril_cell_info_int_format(wcdma->signalStrength,
+ ",strength=%d"),
+ ril_cell_info_int_format(wcdma->bitErrorRate,
+ ",err=%d"));
cell->type = SAILFISH_CELL_TYPE_WCDMA;
cell->registered = registered;
return cell;
@@ -190,11 +217,19 @@
grilio_parser_get_int32(rilp, <e->rssnr) &&
grilio_parser_get_int32(rilp, <e->cqi) &&
grilio_parser_get_int32(rilp, <e->timingAdvance)) {
- DBG("[lte] reg=%d,mcc=%d,mnc=%d,ci=%d,pci=%d,tac=%d,"
- "strength=%d,rsrp=%d,rsrq=%d,rssnr=%d,cqi=%d,"
- "t=0x%x", registered, lte->mcc, lte->mnc, lte->ci,
- lte->pci, lte->tac, lte->signalStrength, lte->rsrp,
- lte->rsrq, lte->rssnr, lte->cqi, lte->timingAdvance);
+ DBG("[lte] reg=%d%s%s%s%s%s%s%s%s%s%s%s", registered,
+ ril_cell_info_int_format(lte->mcc, ",mcc=%d"),
+ ril_cell_info_int_format(lte->mnc, ",mnc=%d"),
+ ril_cell_info_int_format(lte->ci, ",ci=%d"),
+ ril_cell_info_int_format(lte->pci, ",pci=%d"),
+ ril_cell_info_int_format(lte->tac, ",tac=%d"),
+ ril_cell_info_int_format(lte->signalStrength,
+ ",strength=%d"),
+ ril_cell_info_int_format(lte->rsrp, ",rsrp=%d"),
+ ril_cell_info_int_format(lte->rsrq, ",rsrq=%d"),
+ ril_cell_info_int_format(lte->rssnr, ",rssnr=%d"),
+ ril_cell_info_int_format(lte->cqi, ",cqi=%d"),
+ ril_cell_info_int_format(lte->timingAdvance, ",t=%d"));
cell->type = SAILFISH_CELL_TYPE_LTE;
cell->registered = registered;
return cell;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_config.c
^
|
@@ -19,6 +19,7 @@
#include <gutil_intarray.h>
#include <gutil_ints.h>
+#include <gutil_misc.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -206,7 +207,7 @@
while (*ptr) {
int val;
- if (ril_parse_int(*ptr++, 0, &val)) {
+ if (gutil_parse_int(*ptr++, 0, &val)) {
gutil_int_array_append(array, val);
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_constants.h
^
|
@@ -1,10 +1,6 @@
/*
- * RIL constants adopted from AOSP's header:
- *
- * /hardware/ril/reference_ril/ril.h
- *
* Copyright (C) 2013 Canonical Ltd.
- * Copyright (C) 2013-2017 Jolla Ltd.
+ * Copyright (C) 2013-2018 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -19,80 +15,9 @@
#ifndef __RIL_CONSTANTS_H
#define __RIL_CONSTANTS_H 1
-#define RIL_MAX_UUID_LENGTH 64
+#include <ofono/ril-constants.h>
-/* Error Codes */
-enum ril_status {
- RIL_E_SUCCESS = 0,
- RIL_E_RADIO_NOT_AVAILABLE = 1,
- RIL_E_GENERIC_FAILURE = 2,
- RIL_E_PASSWORD_INCORRECT = 3,
- RIL_E_SIM_PIN2 = 4,
- RIL_E_SIM_PUK2 = 5,
- RIL_E_REQUEST_NOT_SUPPORTED = 6,
- RIL_E_CANCELLED = 7,
- RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL = 8,
- RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9,
- RIL_E_SMS_SEND_FAIL_RETRY = 10,
- RIL_E_SIM_ABSENT = 11,
- RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12,
- RIL_E_MODE_NOT_SUPPORTED = 13,
- RIL_E_FDN_CHECK_FAILURE = 14,
- RIL_E_ILLEGAL_SIM_OR_ME = 15,
- RIL_E_MISSING_RESOURCE = 16,
- RIL_E_NO_SUCH_ELEMENT = 17,
- RIL_E_DIAL_MODIFIED_TO_USSD = 18,
- RIL_E_DIAL_MODIFIED_TO_SS = 19,
- RIL_E_DIAL_MODIFIED_TO_DIAL = 20,
- RIL_E_USSD_MODIFIED_TO_DIAL = 21,
- RIL_E_USSD_MODIFIED_TO_SS = 22,
- RIL_E_USSD_MODIFIED_TO_USSD = 23,
- RIL_E_SS_MODIFIED_TO_DIAL = 24,
- RIL_E_SS_MODIFIED_TO_USSD = 25,
- RIL_E_SUBSCRIPTION_NOT_SUPPORTED = 26,
- RIL_E_SS_MODIFIED_TO_SS = 27,
- RIL_E_LCE_NOT_SUPPORTED = 36,
- RIL_E_NO_MEMORY = 37,
- RIL_E_INTERNAL_ERR = 38,
- RIL_E_SYSTEM_ERR = 39,
- RIL_E_MODEM_ERR = 40,
- RIL_E_INVALID_STATE = 41,
- RIL_E_NO_RESOURCES = 42,
- RIL_E_SIM_ERR = 43,
- RIL_E_INVALID_ARGUMENTS = 44,
- RIL_E_INVALID_SIM_STATE = 45,
- RIL_E_INVALID_MODEM_STATE = 46,
- RIL_E_INVALID_CALL_ID = 47,
- RIL_E_NO_SMS_TO_ACK = 48,
- RIL_E_NETWORK_ERR = 49,
- RIL_E_REQUEST_RATE_LIMITED = 50,
- RIL_E_SIM_BUSY = 51,
- RIL_E_SIM_FULL = 52,
- RIL_E_NETWORK_REJECT = 53,
- RIL_E_OPERATION_NOT_ALLOWED = 54,
- RIL_E_EMPTY_RECORD = 55,
- RIL_E_INVALID_SMS_FORMAT = 56,
- RIL_E_ENCODING_ERR = 57,
- RIL_E_INVALID_SMSC_ADDRESS = 58,
- RIL_E_NO_SUCH_ENTRY = 59,
- RIL_E_NETWORK_NOT_READY = 60,
- RIL_E_NOT_PROVISIONED = 61,
- RIL_E_NO_SUBSCRIPTION = 62,
- RIL_E_NO_NETWORK_FOUND = 63,
- RIL_E_DEVICE_IN_USE = 64,
- RIL_E_ABORTED = 65,
- RIL_E_INVALID_RESPONSE = 66
-};
-
-/* call states */
-enum ril_call_state {
- RIL_CALL_ACTIVE = 0,
- RIL_CALL_HOLDING = 1,
- RIL_CALL_DIALING = 2,
- RIL_CALL_ALERTING = 3,
- RIL_CALL_INCOMING = 4,
- RIL_CALL_WAITING = 5
-};
+#define RIL_MAX_UUID_LENGTH 64
/* Radio state */
enum ril_radio_state {
@@ -267,30 +192,30 @@
};
enum ril_data_call_fail_cause {
- PDP_FAIL_NONE = 0,
- PDP_FAIL_OPERATOR_BARRED = 0x08,
- PDP_FAIL_INSUFFICIENT_RESOURCES = 0x1A,
- PDP_FAIL_MISSING_UKNOWN_APN = 0x1B,
- PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE = 0x1C,
- PDP_FAIL_USER_AUTHENTICATION = 0x1D,
- PDP_FAIL_ACTIVATION_REJECT_GGSN = 0x1E,
- PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED = 0x1F,
- PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED = 0x20,
- PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED = 0x21,
- PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER = 0x22,
- PDP_FAIL_NSAPI_IN_USE = 0x23,
- PDP_FAIL_REGULAR_DEACTIVATION = 0x24,
- PDP_FAIL_ONLY_IPV4_ALLOWED = 0x32,
- PDP_FAIL_ONLY_IPV6_ALLOWED = 0x33,
- PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED = 0x34,
- PDP_FAIL_PROTOCOL_ERRORS = 0x6F,
- PDP_FAIL_VOICE_REGISTRATION_FAIL = -1,
- PDP_FAIL_DATA_REGISTRATION_FAIL = -2,
- PDP_FAIL_SIGNAL_LOST = -3,
- PDP_FAIL_PREF_RADIO_TECH_CHANGED = -4,
- PDP_FAIL_RADIO_POWER_OFF = -5,
- PDP_FAIL_TETHERED_CALL_ACTIVE = -6,
- PDP_FAIL_ERROR_UNSPECIFIED = 0xffff
+ PDP_FAIL_NONE = 0,
+ PDP_FAIL_OPERATOR_BARRED = 0x08,
+ PDP_FAIL_INSUFFICIENT_RESOURCES = 0x1A,
+ PDP_FAIL_MISSING_UKNOWN_APN = 0x1B,
+ PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE = 0x1C,
+ PDP_FAIL_USER_AUTHENTICATION = 0x1D,
+ PDP_FAIL_ACTIVATION_REJECT_GGSN = 0x1E,
+ PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED = 0x1F,
+ PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED = 0x20,
+ PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED = 0x21,
+ PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER = 0x22,
+ PDP_FAIL_NSAPI_IN_USE = 0x23,
+ PDP_FAIL_REGULAR_DEACTIVATION = 0x24,
+ PDP_FAIL_ONLY_IPV4_ALLOWED = 0x32,
+ PDP_FAIL_ONLY_IPV6_ALLOWED = 0x33,
+ PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED = 0x34,
+ PDP_FAIL_PROTOCOL_ERRORS = 0x6F,
+ PDP_FAIL_VOICE_REGISTRATION_FAIL = -1,
+ PDP_FAIL_DATA_REGISTRATION_FAIL = -2,
+ PDP_FAIL_SIGNAL_LOST = -3,
+ PDP_FAIL_PREF_RADIO_TECH_CHANGED = -4,
+ PDP_FAIL_RADIO_POWER_OFF = -5,
+ PDP_FAIL_TETHERED_CALL_ACTIVE = -6,
+ PDP_FAIL_ERROR_UNSPECIFIED = 0xffff
};
/* RIL_REQUEST_DEACTIVATE_DATA_CALL parameter */
@@ -395,191 +320,13 @@
RIL_CELL_INFO_TYPE_TD_SCDMA = 5
};
-/* RIL Request Messages, ofono -> rild */
-#define RIL_REQUEST_GET_SIM_STATUS 1
-#define RIL_REQUEST_ENTER_SIM_PIN 2
-#define RIL_REQUEST_ENTER_SIM_PUK 3
-#define RIL_REQUEST_ENTER_SIM_PIN2 4
-#define RIL_REQUEST_ENTER_SIM_PUK2 5
-#define RIL_REQUEST_CHANGE_SIM_PIN 6
-#define RIL_REQUEST_CHANGE_SIM_PIN2 7
-#define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION 8
-#define RIL_REQUEST_GET_CURRENT_CALLS 9
-#define RIL_REQUEST_DIAL 10
-#define RIL_REQUEST_GET_IMSI 11
-#define RIL_REQUEST_HANGUP 12
-#define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND 13
-#define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND 14
-#define RIL_REQUEST_SWITCH_HOLDING_AND_ACTIVE 15
-#define RIL_REQUEST_CONFERENCE 16
-#define RIL_REQUEST_UDUB 17
-#define RIL_REQUEST_LAST_CALL_FAIL_CAUSE 18
-#define RIL_REQUEST_SIGNAL_STRENGTH 19
-#define RIL_REQUEST_VOICE_REGISTRATION_STATE 20
-#define RIL_REQUEST_DATA_REGISTRATION_STATE 21
-#define RIL_REQUEST_OPERATOR 22
-#define RIL_REQUEST_RADIO_POWER 23
-#define RIL_REQUEST_DTMF 24
-#define RIL_REQUEST_SEND_SMS 25
-#define RIL_REQUEST_SEND_SMS_EXPECT_MORE 26
-#define RIL_REQUEST_SETUP_DATA_CALL 27
-#define RIL_REQUEST_SIM_IO 28
-#define RIL_REQUEST_SEND_USSD 29
-#define RIL_REQUEST_CANCEL_USSD 30
-#define RIL_REQUEST_GET_CLIR 31
-#define RIL_REQUEST_SET_CLIR 32
-#define RIL_REQUEST_QUERY_CALL_FORWARD_STATUS 33
-#define RIL_REQUEST_SET_CALL_FORWARD 34
-#define RIL_REQUEST_QUERY_CALL_WAITING 35
-#define RIL_REQUEST_SET_CALL_WAITING 36
-#define RIL_REQUEST_SMS_ACKNOWLEDGE 37
-#define RIL_REQUEST_GET_IMEI 38
-#define RIL_REQUEST_GET_IMEISV 39
-#define RIL_REQUEST_ANSWER 40
-#define RIL_REQUEST_DEACTIVATE_DATA_CALL 41
-#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
-#define RIL_REQUEST_SET_FACILITY_LOCK 43
-#define RIL_REQUEST_CHANGE_BARRING_PASSWORD 44
-#define RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE 45
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_data.c
^
|
@@ -76,6 +76,12 @@
typedef GObjectClass RilDataClass;
typedef struct ril_data RilData;
+enum ril_data_io_event_id {
+ IO_EVENT_DATA_CALL_LIST_CHANGED,
+ IO_EVENT_RESTRICTED_STATE_CHANGED,
+ IO_EVENT_COUNT
+};
+
enum ril_data_settings_event_id {
SETTINGS_EVENT_IMSI_CHANGED,
SETTINGS_EVENT_PREF_MODE,
@@ -94,9 +100,11 @@
struct ril_radio *radio;
struct ril_network *network;
struct ril_data_manager *dm;
- enum ril_data_priv_flags flags;
struct ril_vendor_hook *vendor_hook;
+ enum ril_data_priv_flags flags;
+ enum ril_restricted_state restricted_state;
+
struct ril_data_request *req_queue;
struct ril_data_request *pending_req;
@@ -104,7 +112,7 @@
guint slot;
char *log_prefix;
guint query_id;
- gulong io_event_id;
+ gulong io_event_id[IO_EVENT_COUNT];
gulong settings_event_id[SETTINGS_EVENT_COUNT];
};
@@ -547,6 +555,37 @@
}
}
+static void ril_data_check_allowed(struct ril_data *self, gboolean was_allowed)
+{
+ if (ril_data_allowed(self) != was_allowed) {
+ ril_data_signal_emit(self, SIGNAL_ALLOW_CHANGED);
+ }
+}
+
+static void ril_data_restricted_state_changed_cb(GRilIoChannel *io, guint event,
+ const void *data, guint len, void *user_data)
+{
+ struct ril_data *self = RIL_DATA(user_data);
+ GRilIoParser rilp;
+ guint32 count, state;
+
+ GASSERT(event == RIL_UNSOL_RESTRICTED_STATE_CHANGED);
+ grilio_parser_init(&rilp, data, len);
+ if (grilio_parser_get_uint32(&rilp, &count) && count == 1 &&
+ grilio_parser_get_uint32(&rilp, &state) &&
+ grilio_parser_at_end(&rilp)) {
+ struct ril_data_priv *priv = self->priv;
+
+ if (priv->restricted_state != state) {
+ const gboolean was_allowed = ril_data_allowed(self);
+
+ DBG_(self, "restricted state 0x%02x", state);
+ priv->restricted_state = state;
+ ril_data_check_allowed(self, was_allowed);
+ }
+ }
+}
+
static void ril_data_call_list_changed_cb(GRilIoChannel *io, guint event,
const void *data, guint len, void *user_data)
{
@@ -1070,9 +1109,7 @@
DBG_(data, "data off");
}
- if (ril_data_allowed(data) != was_allowed) {
- ril_data_signal_emit(data, SIGNAL_ALLOW_CHANGED);
- }
+ ril_data_check_allowed(data, was_allowed);
}
ril_data_request_finish(req);
@@ -1188,9 +1225,15 @@
priv->radio = ril_radio_ref(radio);
priv->network = ril_network_ref(network);
priv->vendor_hook = ril_vendor_hook_ref(vendor_hook);
- priv->io_event_id = grilio_channel_add_unsol_event_handler(io,
+
+ priv->io_event_id[IO_EVENT_DATA_CALL_LIST_CHANGED] =
+ grilio_channel_add_unsol_event_handler(io,
ril_data_call_list_changed_cb,
RIL_UNSOL_DATA_CALL_LIST_CHANGED, self);
+ priv->io_event_id[IO_EVENT_RESTRICTED_STATE_CHANGED] =
+ grilio_channel_add_unsol_event_handler(io,
+ ril_data_restricted_state_changed_cb,
+ RIL_UNSOL_RESTRICTED_STATE_CHANGED, self);
priv->settings_event_id[SETTINGS_EVENT_IMSI_CHANGED] =
ril_sim_settings_add_imsi_changed_handler(settings,
@@ -1264,6 +1307,8 @@
gboolean ril_data_allowed(struct ril_data *self)
{
return G_LIKELY(self) &&
+ (self->priv->restricted_state &
+ RIL_RESTRICTED_STATE_PS_ALL) == 0 &&
(self->priv->flags &
(RIL_DATA_FLAG_ALLOWED | RIL_DATA_FLAG_ON)) ==
(RIL_DATA_FLAG_ALLOWED | RIL_DATA_FLAG_ON);
@@ -1348,9 +1393,7 @@
ril_data_power_update(self);
}
- if (ril_data_allowed(self) != was_allowed) {
- ril_data_signal_emit(self, SIGNAL_ALLOW_CHANGED);
- }
+ ril_data_check_allowed(self, was_allowed);
}
static void ril_data_max_speed_cb(gpointer data, gpointer max_speed)
@@ -1468,7 +1511,7 @@
ril_sim_settings_remove_handlers(settings, priv->settings_event_id,
G_N_ELEMENTS(priv->settings_event_id));
- grilio_channel_remove_handlers(priv->io, &priv->io_event_id, 1);
+ grilio_channel_remove_all_handlers(priv->io, priv->io_event_id);
grilio_queue_cancel_all(priv->q, FALSE);
priv->query_id = 0;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_modem.c
^
|
@@ -454,8 +454,10 @@
ofono_modem_set_data(ofono, md);
err = ofono_modem_register(ofono);
if (!err) {
- ril_radio_power_cycle(modem->radio);
GASSERT(io->connected);
+ if (config->radio_power_cycle) {
+ ril_radio_power_cycle(modem->radio);
+ }
/*
* ofono_modem_reset sets Powered to TRUE without
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_netreg.c
^
|
@@ -61,6 +61,8 @@
#define ril_netreg_cbd_free g_free
+#define DBG_(nd,fmt,args...) DBG("%s" fmt, (nd)->log_prefix, ##args)
+
static inline struct ril_netreg *ril_netreg_get_data(struct ofono_netreg *ofono)
{
return ofono ? ofono_netreg_get_data(ofono) : NULL;
@@ -109,7 +111,7 @@
struct ril_netreg *nd = user_data;
const struct ril_registration_state *reg = &nd->network->voice;
- DBG("%s", nd->log_prefix);
+ DBG_(nd, "");
GASSERT(nd->notify_id);
nd->notify_id = 0;
ofono_netreg_status_notify(nd->netreg,
@@ -124,9 +126,9 @@
/* Coalesce multiple notifications into one */
if (nd->notify_id) {
- DBG("%snotification aready queued", nd->log_prefix);
+ DBG_(nd, "notification aready queued");
} else {
- DBG("%squeuing notification", nd->log_prefix);
+ DBG_(nd, "queuing notification");
nd->notify_id = g_idle_add(ril_netreg_status_notify_cb, nd);
}
}
@@ -138,7 +140,7 @@
const struct ril_registration_state *reg = &nd->network->voice;
struct ofono_error error;
- DBG("%s", nd->log_prefix);
+ DBG_(nd, "");
cb(ril_error_ok(&error),
ril_netreg_check_status(nd, reg->status),
reg->lac, reg->ci, reg->access_tech, data);
@@ -151,7 +153,7 @@
ofono_netreg_operator_cb_t cb = cbd->cb.operator;
struct ofono_error error;
- DBG("%s", nd->log_prefix);
+ DBG_(nd, "");
GASSERT(nd->current_operator_id);
nd->current_operator_id = 0;
@@ -397,7 +399,7 @@
GASSERT(ril_event == RIL_UNSOL_SIGNAL_STRENGTH);
strength = ril_netreg_get_signal_strength(data, len);
- DBG("%d", strength);
+ DBG_(nd, "%d", strength);
ofono_netreg_strength_notify(nd->netreg, strength);
}
@@ -445,7 +447,7 @@
grilio_parser_init(&rilp, data, len);
nitz = grilio_parser_get_utf8(&rilp);
- DBG("%s", nitz);
+ DBG_(nd, "%s", nitz);
/*
* Format: yy/mm/dd,hh:mm:ss(+/-)tz[,ds]
@@ -512,10 +514,11 @@
{
struct ril_modem *modem = data;
struct ril_netreg *nd = g_new0(struct ril_netreg, 1);
- guint slot = ril_modem_slot(modem);
- DBG("[%u] %p", slot, netreg);
- nd->log_prefix = g_strdup_printf("%s_%u ", RILMODEM_DRIVER, slot);
+ nd->log_prefix = (modem->log_prefix && modem->log_prefix[0]) ?
+ g_strconcat(modem->log_prefix, " ", NULL) : g_strdup("");
+
+ DBG_(nd, "%p", netreg);
nd->io = grilio_channel_ref(ril_modem_io(modem));
nd->q = grilio_queue_new(nd->io);
nd->network = ril_network_ref(modem->network);
@@ -529,9 +532,8 @@
static void ril_netreg_remove(struct ofono_netreg *netreg)
{
struct ril_netreg *nd = ril_netreg_get_data(netreg);
- unsigned int i;
- DBG("%p", netreg);
+ DBG_(nd, "%p", netreg);
grilio_queue_cancel_all(nd->q, FALSE);
ofono_netreg_set_data(netreg, NULL);
@@ -547,14 +549,10 @@
g_source_remove(nd->current_operator_id);
}
- for (i=0; i<G_N_ELEMENTS(nd->network_event_id); i++) {
- ril_network_remove_handler(nd->network, nd->network_event_id[i]);
- }
+ ril_network_remove_all_handlers(nd->network, nd->network_event_id);
ril_network_unref(nd->network);
- grilio_channel_remove_handlers(nd->io, nd->ril_event_id,
- G_N_ELEMENTS(nd->ril_event_id));
-
+ grilio_channel_remove_all_handlers(nd->io, nd->ril_event_id);
grilio_channel_unref(nd->io);
grilio_queue_unref(nd->q);
g_free(nd->log_prefix);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_network.c
^
|
@@ -47,6 +47,12 @@
RADIO_EVENT_COUNT
};
+enum ril_network_sim_events {
+ SIM_EVENT_STATUS_CHANGED,
+ SIM_EVENT_IO_ACTIVE_CHANGED,
+ SIM_EVENT_COUNT
+};
+
enum ril_network_unsol_event {
UNSOL_EVENT_NETWORK_STATE,
UNSOL_EVENT_RADIO_CAPABILITY,
@@ -57,8 +63,10 @@
GRilIoChannel *io;
GRilIoQueue *q;
struct ril_radio *radio;
- struct ril_sim_card *sim_card;
+ struct ril_sim_card *simcard;
int rat;
+ int lte_network_mode;
+ int network_mode_timeout;
char *log_prefix;
guint operator_poll_id;
guint voice_poll_id;
@@ -68,8 +76,8 @@
gulong set_rat_id;
gulong unsol_event_id[UNSOL_EVENT_COUNT];
gulong settings_event_id;
- gulong sim_status_event_id;
gulong radio_event_id[RADIO_EVENT_COUNT];
+ gulong simcard_event_id[SIM_EVENT_COUNT];
struct ofono_network_operator operator;
gboolean assert_rat;
};
@@ -111,7 +119,8 @@
G_STATIC_ASSERT(OFONO_RADIO_ACCESS_MODE_LTE > OFONO_RADIO_ACCESS_MODE_UMTS);
static void ril_network_query_pref_mode(struct ril_network *self);
-static void ril_network_set_pref_mode(struct ril_network *self, int rat);
+static void ril_network_check_pref_mode(struct ril_network *self,
+ gboolean immediate);
static void ril_network_emit(struct ril_network *self,
enum ril_network_signal sig)
@@ -208,11 +217,11 @@
reg->max_calls = 2;
}
- if (!ril_parse_int(slac, 16, ®->lac)) {
+ if (!gutil_parse_int(slac, 16, ®->lac)) {
reg->lac = -1;
}
- if (!ril_parse_int(sci, 16, ®->ci)) {
+ if (!gutil_parse_int(sci, 16, ®->ci)) {
reg->ci = -1;
}
@@ -448,7 +457,7 @@
case OFONO_RADIO_ACCESS_MODE_ANY:
case OFONO_RADIO_ACCESS_MODE_LTE:
if (self->settings->techs & OFONO_RADIO_ACCESS_MODE_LTE) {
- return PREF_NET_TYPE_LTE_GSM_WCDMA;
+ return self->priv->lte_network_mode;
}
/* no break */
default:
@@ -497,37 +506,28 @@
{
struct ril_network_priv *priv = self->priv;
- return priv->radio->online && ril_sim_card_ready(priv->sim_card);
+ /*
+ * With some modems an attempt to set rat significantly slows
+ * down SIM I/O, let's avoid that.
+ */
+ return priv->radio->online && ril_sim_card_ready(priv->simcard) &&
+ !priv->simcard->sim_io_active &&
+ !priv->timer[TIMER_SET_RAT_HOLDOFF] ;
}
static gboolean ril_network_set_rat_holdoff_cb(gpointer user_data)
{
struct ril_network *self = RIL_NETWORK(user_data);
struct ril_network_priv *priv = self->priv;
- const int rat = ril_network_pref_mode_expected(self);
- DBG_(self, "rat mode %d, expected %d", priv->rat, rat);
GASSERT(priv->timer[TIMER_SET_RAT_HOLDOFF]);
priv->timer[TIMER_SET_RAT_HOLDOFF] = 0;
- /*
- * Don't retry the request if modem is offline or SIM card isn't
- * ready, to avoid spamming system log with error messages. Radio
- * and SIM card state change callbacks will schedule a new check
- * when it's appropriate.
- */
- if (priv->rat != rat || priv->assert_rat) {
- if (ril_network_can_set_pref_mode(self)) {
- ril_network_set_pref_mode(self, rat);
- } else {
- DBG_(self, "giving up");
- }
- }
-
+ ril_network_check_pref_mode(self, FALSE);
return G_SOURCE_REMOVE;
}
-static void ril_network_set_pref_mode_cb(GRilIoChannel *io, int status,
+static void ril_network_set_rat_cb(GRilIoChannel *io, int status,
const void *data, guint len, void *user_data)
{
struct ril_network *self = RIL_NETWORK(user_data);
@@ -542,32 +542,53 @@
ril_network_query_pref_mode(self);
}
-static void ril_network_set_pref_mode(struct ril_network *self, int rat)
+static void ril_network_set_rat(struct ril_network *self, int rat)
{
struct ril_network_priv *priv = self->priv;
- GRilIoRequest *req = grilio_request_sized_new(8);
- DBG_(self, "setting rat mode %d", rat);
- grilio_request_append_int32(req, 1); /* Number of params */
- grilio_request_append_int32(req, rat);
-
- grilio_queue_cancel_request(priv->q, priv->set_rat_id, FALSE);
- priv->set_rat_id = grilio_queue_send_request_full(priv->q, req,
- RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,
- ril_network_set_pref_mode_cb, NULL, self);
- grilio_request_unref(req);
+ if (!priv->set_rat_id && priv->radio->online &&
+ ril_sim_card_ready(priv->simcard) &&
+ /*
+ * With some modems an attempt to set rat significantly
+ * slows down SIM I/O, let's avoid that.
+ */
+ !priv->simcard->sim_io_active &&
+ !priv->timer[TIMER_SET_RAT_HOLDOFF]) {
+ GRilIoRequest *req = grilio_request_sized_new(8);
+
+ DBG_(self, "setting rat mode %d", rat);
+ grilio_request_append_int32(req, 1); /* count */
+ grilio_request_append_int32(req, rat);
+
+ grilio_request_set_timeout(req, priv->network_mode_timeout);
+ priv->set_rat_id = grilio_queue_send_request_full(priv->q, req,
+ RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,
+ ril_network_set_rat_cb, NULL, self);
+ grilio_request_unref(req);
- /* We have submitted the request, clear the assertion flag */
- priv->assert_rat = FALSE;
+ /* We have submitted the request, clear the assertion flag */
+ priv->assert_rat = FALSE;
- /* Don't do it too often */
- GASSERT(!priv->timer[TIMER_SET_RAT_HOLDOFF]);
- priv->timer[TIMER_SET_RAT_HOLDOFF] =
- g_timeout_add_seconds(SET_PREF_MODE_HOLDOFF_SEC,
- ril_network_set_rat_holdoff_cb, self);
+ /* And don't do it too often */
+ priv->timer[TIMER_SET_RAT_HOLDOFF] =
+ g_timeout_add_seconds(SET_PREF_MODE_HOLDOFF_SEC,
+ ril_network_set_rat_holdoff_cb, self);
+ } else {
+ DBG_(self, "need to set rat mode %d", rat);
+ }
+}
+
+static void ril_network_set_pref_mode(struct ril_network *self, int rat)
+{
+ struct ril_network_priv *priv = self->priv;
+
+ if (priv->rat != rat || priv->assert_rat) {
+ ril_network_set_rat(self, rat);
+ }
}
-void ril_network_check_pref_mode(struct ril_network *self, gboolean force)
+static void ril_network_check_pref_mode(struct ril_network *self,
+ gboolean immediate)
{
struct ril_network_priv *priv = self->priv;
const int rat = ril_network_pref_mode_expected(self);
@@ -579,10 +600,14 @@
* ril_network_pref_mode_changed_cb and is meant
* to force radio tech check right now.
*/
- force = TRUE;
+ immediate = TRUE;
+ }
+
+ if (priv->rat != rat) {
+ DBG_(self, "rat mode %d, expected %d", priv->rat, rat);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_network.h
^
|
@@ -48,14 +48,14 @@
struct ril_network *ril_network_new(const char *path, GRilIoChannel *io,
const char *log_prefix, struct ril_radio *radio,
struct ril_sim_card *sim_card,
- struct ril_sim_settings *settings);
+ struct ril_sim_settings *settings,
+ const struct ril_slot_config *ril_slot_config);
struct ril_network *ril_network_ref(struct ril_network *net);
void ril_network_unref(struct ril_network *net);
void ril_network_set_max_pref_mode(struct ril_network *net,
enum ofono_radio_access_mode max_pref_mode,
gboolean force_check);
-void ril_network_check_pref_mode(struct ril_network *net, gboolean immediate);
void ril_network_assert_pref_mode(struct ril_network *net, gboolean immediate);
void ril_network_query_registration_state(struct ril_network *net);
gulong ril_network_add_operator_changed_handler(struct ril_network *net,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_plugin.c
^
|
@@ -30,8 +30,11 @@
#include <sailfish_manager.h>
#include <sailfish_watch.h>
+#include <grilio_transport.h>
+
#include <gutil_ints.h>
#include <gutil_macros.h>
+#include <gutil_misc.h>
#include <mce_display.h>
#include <mce_log.h>
@@ -48,6 +51,7 @@
#define OFONO_API_SUBJECT_TO_CHANGE
#include <ofono/plugin.h>
#include <ofono/storage.h>
+#include <ofono/ril-transport.h>
#define OFONO_RADIO_ACCESS_MODE_ALL (OFONO_RADIO_ACCESS_MODE_GSM |\
OFONO_RADIO_ACCESS_MODE_UMTS |\
@@ -63,6 +67,8 @@
#define RILMODEM_DEFAULT_SOCK2 "/dev/socket/rild2"
#define RILMODEM_DEFAULT_SUB "SUB1"
#define RILMODEM_DEFAULT_TECHS OFONO_RADIO_ACCESS_MODE_ALL
+#define RILMODEM_DEFAULT_LTE_MODE PREF_NET_TYPE_LTE_GSM_WCDMA
+#define RILMODEM_DEFAULT_NETWORK_MODE_TIMEOUT (20*1000) /* ms */
#define RILMODEM_DEFAULT_ENABLE_VOICECALL TRUE
#define RILMODEM_DEFAULT_ENABLE_CBS TRUE
#define RILMODEM_DEFAULT_SLOT 0xffffffff
@@ -77,6 +83,13 @@
#define RILMODEM_DEFAULT_EMPTY_PIN_QUERY TRUE /* optimistic */
#define RILMODEM_DEFAULT_QUERY_AVAILABLE_BAND_MODE TRUE /* Qualcomm */
#define RILMODEM_DEFAULT_LEGACY_IMEI_QUERY FALSE
+#define RILMODEM_DEFAULT_RADIO_POWER_CYCLE TRUE
+#define RILMODEM_DEFAULT_CONFIRM_RADIO_POWER_ON TRUE
+
+/* RIL socket transport name and parameters */
+#define RIL_TRANSPORT_SOCKET "socket"
+#define RIL_TRANSPORT_SOCKET_PATH "path"
+#define RIL_TRANSPORT_SOCKET_SUB "sub"
/*
* The convention is that the keys which can only appear in the [Settings]
@@ -84,38 +97,43 @@
* modem section (OR in the [Settings] if they apply to all modems) start
* with lower case.
*/
-#define RILCONF_SETTINGS_EMPTY "EmptyConfig"
-#define RILCONF_SETTINGS_IDENTITY "Identity"
-#define RILCONF_SETTINGS_3GHANDOVER "3GLTEHandover"
-#define RILCONF_SETTINGS_SET_RADIO_CAP "SetRadioCapability"
-
-#define RILCONF_DEV_PREFIX "ril_"
-#define RILCONF_PATH_PREFIX "/" RILCONF_DEV_PREFIX
-#define RILCONF_NAME "name"
-#define RILCONF_SOCKET "socket"
-#define RILCONF_SLOT "slot"
-#define RILCONF_SUB "sub"
-#define RILCONF_START_TIMEOUT "startTimeout"
-#define RILCONF_TIMEOUT "timeout"
-#define RILCONF_4G "enable4G" /* Deprecated */
-#define RILCONF_ENABLE_VOICECALL "enableVoicecall"
-#define RILCONF_ENABLE_CBS "enableCellBroadcast"
-#define RILCONF_TECHNOLOGIES "technologies"
-#define RILCONF_UICC_WORKAROUND "uiccWorkaround"
-#define RILCONF_ECCLIST_FILE "ecclistFile"
-#define RILCONF_ALLOW_DATA_REQ "allowDataReq"
-#define RILCONF_EMPTY_PIN_QUERY "emptyPinQuery"
-#define RILCONF_DATA_CALL_FORMAT "dataCallFormat"
-#define RILCONF_VENDOR_DRIVER "vendorDriver"
-#define RILCONF_DATA_CALL_RETRY_LIMIT "dataCallRetryLimit"
-#define RILCONF_DATA_CALL_RETRY_DELAY "dataCallRetryDelay"
-#define RILCONF_LOCAL_HANGUP_REASONS "localHangupReasons"
-#define RILCONF_REMOTE_HANGUP_REASONS "remoteHangupReasons"
-#define RILCONF_DEFAULT_LEGACY_IMEI_QUERY "legacyImeiQuery"
+#define RILCONF_SETTINGS_EMPTY "EmptyConfig"
+#define RILCONF_SETTINGS_IDENTITY "Identity"
+#define RILCONF_SETTINGS_3GHANDOVER "3GLTEHandover"
+#define RILCONF_SETTINGS_SET_RADIO_CAP "SetRadioCapability"
+
+#define RILCONF_MODEM_PREFIX "ril_"
+#define RILCONF_PATH_PREFIX "/" RILCONF_MODEM_PREFIX
+#define RILCONF_TRANSPORT "transport"
+#define RILCONF_NAME "name"
+#define RILCONF_SOCKET "socket"
+#define RILCONF_SLOT "slot"
+#define RILCONF_SUB "sub"
+#define RILCONF_START_TIMEOUT "startTimeout"
+#define RILCONF_TIMEOUT "timeout"
+#define RILCONF_4G "enable4G" /* Deprecated */
+#define RILCONF_ENABLE_VOICECALL "enableVoicecall"
+#define RILCONF_ENABLE_CBS "enableCellBroadcast"
+#define RILCONF_TECHNOLOGIES "technologies"
+#define RILCONF_LTE_MODE "lteNetworkMode"
+#define RILCONF_NETWORK_MODE_TIMEOUT "networkModeTimeout"
+#define RILCONF_UICC_WORKAROUND "uiccWorkaround"
+#define RILCONF_ECCLIST_FILE "ecclistFile"
+#define RILCONF_ALLOW_DATA_REQ "allowDataReq"
+#define RILCONF_EMPTY_PIN_QUERY "emptyPinQuery"
+#define RILCONF_DATA_CALL_FORMAT "dataCallFormat"
+#define RILCONF_VENDOR_DRIVER "vendorDriver"
+#define RILCONF_DATA_CALL_RETRY_LIMIT "dataCallRetryLimit"
+#define RILCONF_DATA_CALL_RETRY_DELAY "dataCallRetryDelay"
+#define RILCONF_LOCAL_HANGUP_REASONS "localHangupReasons"
+#define RILCONF_REMOTE_HANGUP_REASONS "remoteHangupReasons"
+#define RILCONF_LEGACY_IMEI_QUERY "legacyImeiQuery"
+#define RILCONF_RADIO_POWER_CYCLE "radioPowerCycle"
+#define RILCONF_CONFIRM_RADIO_POWER_ON "confirmRadioPowerOn"
/* Modem error ids */
-#define RIL_ERROR_ID_RILD_RESTART "rild-restart"
-#define RIL_ERROR_ID_CAPS_SWITCH_ABORTED "ril-caps-switch-aborted"
+#define RIL_ERROR_ID_RILD_RESTART "rild-restart"
+#define RIL_ERROR_ID_CAPS_SWITCH_ABORTED "ril-caps-switch-aborted"
enum ril_plugin_io_events {
IO_EVENT_CONNECTED,
@@ -174,8 +192,8 @@
char *imei;
char *imeisv;
char *name;
- char *sockpath;
- char *sub;
+ char *transport_name;
+ GHashTable *transport_params;
char *ecclist_file;
int timeout; /* RIL timeout, in milliseconds */
int index;
@@ -964,10 +982,12 @@
slot->radio = ril_radio_new(slot->io);
GASSERT(!slot->io_event_id[IO_EVENT_RADIO_STATE_CHANGED]);
- slot->io_event_id[IO_EVENT_RADIO_STATE_CHANGED] =
- grilio_channel_add_unsol_event_handler(slot->io,
+ if (slot->config.confirm_radio_power_on) {
+ slot->io_event_id[IO_EVENT_RADIO_STATE_CHANGED] =
+ grilio_channel_add_unsol_event_handler(slot->io,
ril_plugin_radio_state_changed,
RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED, slot);
+ }
GASSERT(!slot->sim_card);
slot->sim_card = ril_sim_card_new(slot->io, slot->config.slot,
@@ -981,7 +1001,8 @@
GASSERT(!slot->network);
slot->network = ril_network_new(slot->path, slot->io, log_prefix,
- slot->radio, slot->sim_card, slot->sim_settings);
+ slot->radio, slot->sim_card, slot->sim_settings,
+ &slot->config);
GASSERT(!slot->vendor_hook);
slot->vendor_hook = ril_vendor_create_hook(slot->vendor, slot->io,
@@ -1043,8 +1064,8 @@
static void ril_plugin_init_io(ril_slot *slot)
{
if (!slot->io) {
- DBG("%s %s", slot->sockpath, slot->sub);
- slot->io = grilio_channel_new_socket(slot->sockpath, slot->sub);
+ slot->io = grilio_channel_new(ofono_ril_transport_connect
+ (slot->transport_name, slot->transport_params));
if (slot->io) {
ril_debug_trace_update(slot);
ril_debug_dump_update(slot);
@@ -1100,7 +1121,7 @@
g_source_remove(slot->retry_id);
}
- DBG("%s %s", slot->sockpath, slot->sub);
+ DBG("%s", slot->path);
slot->retry_id = g_timeout_add_seconds(RIL_RETRY_SECS,
ril_plugin_retry_init_io_cb, slot);
}
@@ -1128,7 +1149,7 @@
{
ril_plugin* plugin = slot->plugin;
- DBG("%s", slot->sockpath);
+ DBG("%s", slot->path);
ril_plugin_shutdown_slot(slot, TRUE);
plugin->slots = g_slist_remove(plugin->slots, slot);
mce_display_remove_all_handlers(slot->display, slot->display_event_id);
@@ -1142,8 +1163,8 @@
g_free(slot->imei);
g_free(slot->imeisv);
g_free(slot->name);
- g_free(slot->sockpath);
- g_free(slot->sub);
+ g_free(slot->transport_name);
+ g_hash_table_destroy(slot->transport_params);
g_free(slot->ecclist_file);
g_free(slot);
}
@@ -1153,7 +1174,7 @@
ril_slot *slot = user_data;
ril_plugin* plugin = slot->plugin;
- DBG("%s", slot->sockpath);
+ DBG("%s", slot->path);
plugin->slots = g_slist_remove(plugin->slots, slot);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_radio.c
^
|
@@ -71,14 +71,16 @@
#define RIL_RADIO_TYPE (ril_radio_get_type())
#define RIL_RADIO(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj,RIL_RADIO_TYPE,RilRadio))
+#define DBG_(self,fmt,args...) DBG("%s" fmt, (self)->priv->log_prefix, ##args)
+
static void ril_radio_submit_power_request(struct ril_radio *self, gboolean on);
static inline gboolean ril_radio_power_should_be_on(struct ril_radio *self)
{
struct ril_radio_priv *priv = self->priv;
- return self->online && !priv->power_cycle &&
- g_hash_table_size(priv->req_table) > 0;
+ return (self->online || g_hash_table_size(priv->req_table) > 0) &&
+ !priv->power_cycle;
}
static inline gboolean ril_radio_state_off(enum ril_radio_state radio_state)
@@ -102,7 +104,7 @@
struct ril_radio *self = RIL_RADIO(user_data);
struct ril_radio_priv *priv = self->priv;
- DBG("%s", priv->log_prefix);
+ DBG_(self, "");
GASSERT(priv->retry_id);
priv->retry_id = 0;
ril_radio_submit_power_request(self,
@@ -116,7 +118,7 @@
struct ril_radio_priv *priv = self->priv;
if (priv->retry_id) {
- DBG("%sretry cancelled", priv->log_prefix);
+ DBG_(self, "retry cancelled");
g_source_remove(priv->retry_id);
priv->retry_id = 0;
}
@@ -129,8 +131,8 @@
if (!priv->pending_id) {
gboolean should_be_on = ril_radio_power_should_be_on(self);
- if (ril_radio_state_on(self->priv->last_known_state) ==
- should_be_on) {
+ if (ril_radio_state_on(priv->last_known_state) ==
+ should_be_on) {
/* All is good, cancel pending retry if there is one */
ril_radio_cancel_retry(self);
} else if (priv->state_changed_while_request_pending) {
@@ -138,7 +140,7 @@
ril_radio_submit_power_request(self, should_be_on);
} else if (!priv->retry_id) {
/* There has been no reaction so far, wait a bit */
- DBG("%sretry scheduled", priv->log_prefix);
+ DBG_(self, "retry scheduled");
priv->retry_id = g_timeout_add_seconds(POWER_RETRY_SECS,
ril_radio_power_request_retry_cb, self);
}
@@ -147,28 +149,20 @@
/* Don't update public state while something is pending */
if (!priv->pending_id && !priv->retry_id &&
self->state != priv->last_known_state) {
- DBG("%s%s -> %s", priv->log_prefix,
- ril_radio_state_to_string(self->state),
+ DBG_(self, "%s -> %s", ril_radio_state_to_string(self->state),
ril_radio_state_to_string(priv->last_known_state));
self->state = priv->last_known_state;
ril_radio_emit_signal(self, SIGNAL_STATE_CHANGED);
}
}
-static void ril_radio_power_request_cb(GRilIoChannel *channel, int ril_status,
- const void *data, guint len, void *user_data)
+static void ril_radio_power_request_done(struct ril_radio *self)
{
- struct ril_radio *self = RIL_RADIO(user_data);
struct ril_radio_priv *priv = self->priv;
GASSERT(priv->pending_id);
priv->pending_id = 0;
- if (ril_status != RIL_E_SUCCESS) {
- ofono_error("Power request failed: %s",
- ril_error_to_string(ril_status));
- }
-
if (priv->next_state_valid) {
ril_radio_submit_power_request(self, priv->next_state);
} else {
@@ -176,6 +170,19 @@
}
}
+static void ril_radio_power_request_cb(GRilIoChannel *channel, int ril_status,
+ const void *data, guint len, void *user_data)
+{
+ struct ril_radio *self = RIL_RADIO(user_data);
+
+ if (ril_status != RIL_E_SUCCESS) {
+ ofono_error("Power request failed: %s",
+ ril_error_to_string(ril_status));
+ }
+
+ ril_radio_power_request_done(self);
+}
+
static void ril_radio_submit_power_request(struct ril_radio *self, gboolean on)
{
/*
@@ -214,13 +221,18 @@
/* Wait for the pending request to complete */
priv->next_state_valid = TRUE;
priv->next_state = on;
- DBG("%s%s (queued)", priv->log_prefix, on_off);
+ DBG_(self, "%s (queued)", on_off);
} else {
- DBG("%s%s (ignored)", priv->log_prefix, on_off);
+ DBG_(self, "%s (ignored)", on_off);
}
} else {
- DBG("%s%s", priv->log_prefix, on_off);
- ril_radio_submit_power_request(self, on);
+ if (ril_radio_state_on(priv->last_known_state) == on) {
+ DBG_(self, "%s (already)", on_off);
+ ril_radio_check_state(self);
+ } else {
+ DBG_(self, "%s", on_off);
+ ril_radio_submit_power_request(self, on);
+ }
}
}
@@ -237,12 +249,12 @@
struct ril_radio_priv *priv = self->priv;
if (ril_radio_state_off(priv->last_known_state)) {
- DBG("%spower is already off", priv->log_prefix);
+ DBG_(self, "power is already off");
GASSERT(!priv->power_cycle);
} else if (priv->power_cycle) {
- DBG("%salready in progress", priv->log_prefix);
+ DBG_(self, "already in progress");
} else {
- DBG("%sinitiated", priv->log_prefix);
+ DBG_(self, "initiated");
priv->power_cycle = TRUE;
if (!priv->pending_id) {
ril_radio_submit_power_request(self, FALSE);
@@ -259,7 +271,7 @@
if (!g_hash_table_contains(priv->req_table, tag)) {
gboolean was_on = ril_radio_power_should_be_on(self);
- DBG("%s%p", priv->log_prefix, tag);
+ DBG_(self, "%p", tag);
g_hash_table_insert(priv->req_table, tag, tag);
if (!was_on && ril_radio_power_should_be_on(self)) {
ril_radio_power_request(self, TRUE, FALSE);
@@ -274,7 +286,7 @@
struct ril_radio_priv *priv = self->priv;
if (g_hash_table_remove(priv->req_table, tag)) {
- DBG("%s%p", priv->log_prefix, tag);
+ DBG_(self, "%p", tag);
if (!ril_radio_power_should_be_on(self)) {
/* The last one turns the lights off */
ril_radio_power_request(self, FALSE, FALSE);
@@ -346,20 +358,41 @@
if (radio_state != RADIO_STATE_UNAVAILABLE) {
struct ril_radio_priv *priv = self->priv;
- DBG("%s%s", priv->log_prefix,
- ril_radio_state_to_string(radio_state));
+ DBG_(self, "%s", ril_radio_state_to_string(radio_state));
GASSERT(!priv->pending_id || !priv->retry_id);
if (priv->power_cycle && ril_radio_state_off(radio_state)) {
- DBG("%sswitched off for power cycle", priv->log_prefix);
+ DBG_(self, "switched off for power cycle");
priv->power_cycle = FALSE;
}
+ priv->last_known_state = radio_state;
+
if (priv->pending_id) {
- priv->state_changed_while_request_pending++;
+ if (ril_radio_state_on(radio_state) ==
+ ril_radio_power_should_be_on(self)) {
+ DBG_(self, "dropping pending request");
+ /*
+ * All right, the modem has switched to the
+ * desired state, drop the request.
+ */
+ grilio_queue_cancel_request(priv->q,
+ priv->pending_id, FALSE);
+
+ /*
+ * This will zero pending_id and call
+ * ril_radio_check_state() if necesary:
+ */
+ ril_radio_power_request_done(self);
+
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_radio_caps.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2017 Jolla Ltd.
+ * Copyright (C) 2017-2018 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -71,6 +71,7 @@
gulong max_pref_mode_event_id;
gulong radio_event_id;
int tx_id;
+ int tx_pending;
struct ril_data *data;
struct ril_radio *radio;
struct ril_network *network;
@@ -85,7 +86,6 @@
GObject object;
GPtrArray *caps_list;
guint check_id;
- int tx_pending;
int tx_id;
int tx_phase_index;
gboolean tx_failed;
@@ -453,7 +453,7 @@
struct ril_radio_caps *self =
g_slice_new0(struct ril_radio_caps);
- self->ref_count = 1;
+ g_atomic_int_set(&self->ref_count, 1);
self->slot = config->slot;
self->log_prefix = (log_prefix && log_prefix[0]) ?
g_strconcat(log_prefix, " ", NULL) : g_strdup("");
@@ -471,13 +471,16 @@
self->simcard_event_id[SIM_EVENT_STATE_CHANGED] =
ril_sim_card_add_state_changed_handler(sim,
ril_radio_caps_simcard_event, self);
+ self->simcard_event_id[SIM_EVENT_IO_ACTIVE_CHANGED] =
+ ril_sim_card_add_sim_io_active_changed_handler(sim,
+ ril_radio_caps_simcard_event, self);
self->network = ril_network_ref(net);
self->settings_event_id[SETTINGS_EVENT_PREF_MODE] =
ril_sim_settings_add_pref_mode_changed_handler(
settings, ril_radio_caps_settings_event, self);
self->settings_event_id[SETTINGS_EVENT_IMSI] =
- ril_sim_settings_add_pref_mode_changed_handler(
+ ril_sim_settings_add_imsi_changed_handler(
settings, ril_radio_caps_settings_event, self);
self->max_pref_mode_event_id =
@@ -560,6 +563,24 @@
}
}
+static gboolean ril_radio_caps_manager_tx_pending
+ (struct ril_radio_caps_manager *self)
+{
+ guint i;
+ const GPtrArray *list = self->caps_list;
+
+ for (i = 0; i < list->len; i++) {
+ const struct ril_radio_caps *caps = list->pdata[i];
+
+ /* Ignore the modems not associated with this transaction */
+ if (caps->tx_id == self->tx_id && caps->tx_pending > 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
/**
* Checks that all radio caps have been initialized (i.e. all the initial
* GET_RADIO_CAPABILITY requests have completed) and there's no transaction
@@ -568,7 +589,7 @@
static gboolean ril_radio_caps_manager_can_check
(struct ril_radio_caps_manager *self)
{
- if (self->caps_list && !self->tx_pending) {
+ if (self->caps_list && !ril_radio_caps_manager_tx_pending(self)) {
const GPtrArray *list = self->caps_list;
const struct ril_radio_caps *prev_caps = NULL;
gboolean all_modes_equal = TRUE;
@@ -753,6 +774,10 @@
phase->send_new_cap ? &caps->new_cap :
&caps->old_cap;
+ /* Count it */
+ caps->tx_pending++;
+ DBG_(caps, "tx_pending=%d", caps->tx_pending);
+
/* Encode and send the request */
grilio_request_append_int32(req,
RIL_RADIO_CAPABILITY_VERSION);
@@ -766,9 +791,6 @@
RIL_REQUEST_SET_RADIO_CAPABILITY,
handler, NULL, caps);
grilio_request_unref(req);
-
- /* Count it */
- self->tx_pending++;
}
}
}
@@ -791,7 +813,6 @@
{
ril_radio_caps_manager_foreach(self,
ril_radio_caps_manager_next_transaction_cb);
- self->tx_pending = 0;
self->tx_failed = FALSE;
self->tx_phase_index = -1;
self->tx_id++;
@@ -829,8 +850,10 @@
struct ril_radio_caps *caps = user_data;
struct ril_radio_caps_manager *self = caps->mgr;
- GASSERT(self->tx_pending > 0);
- if (!(--self->tx_pending)) {
+ GASSERT(caps->tx_pending > 0);
+ caps->tx_pending--;
+ DBG_(caps, "tx_pending=%d", caps->tx_pending);
+ if (!ril_radio_caps_manager_tx_pending(self)) {
DBG("transaction aborted");
ril_radio_caps_manager_transaction_done(self);
}
@@ -875,7 +898,7 @@
struct ril_radio_caps_manager *self = caps->mgr;
gboolean ok = FALSE;
- GASSERT(self->tx_pending > 0);
+ GASSERT(caps->tx_pending > 0);
if (ril_status == RIL_E_SUCCESS) {
struct ril_radio_capability cap;
if (ril_radio_caps_parse(caps->log_prefix, data, len, &cap) &&
@@ -892,7 +915,9 @@
}
}
- if (!(--self->tx_pending)) {
+ caps->tx_pending--;
+ DBG_(caps, "tx_pending=%d", caps->tx_pending);
+ if (!ril_radio_caps_manager_tx_pending(self)) {
if (self->tx_failed) {
ril_radio_caps_manager_abort_transaction(self);
} else {
@@ -907,7 +932,7 @@
/* Note: -1 > 2 if 2 is unsigned (which turns -1 into 4294967295) */
const int max_index = G_N_ELEMENTS(ril_radio_caps_tx_phase) - 1;
- GASSERT(!self->tx_pending);
+ GASSERT(!ril_radio_caps_manager_tx_pending(self));
if (self->tx_phase_index >= max_index) {
DBG("transaction %d is done", self->tx_id);
ril_radio_caps_manager_transaction_done(self);
@@ -924,14 +949,16 @@
static void ril_radio_caps_manager_data_off_done(GRilIoChannel *io,
int status, const void *req_data, guint len, void *user_data)
{
- struct ril_radio_caps_manager *self = RADIO_CAPS_MANAGER(user_data);
+ struct ril_radio_caps *caps = user_data;
+ struct ril_radio_caps_manager *self = caps->mgr;
- DBG("%d", self->tx_pending);
- GASSERT(self->tx_pending > 0);
+ GASSERT(caps->tx_pending > 0);
if (status != GRILIO_STATUS_OK) {
self->tx_failed = TRUE;
}
- if (!(--self->tx_pending)) {
+ caps->tx_pending--;
+ DBG_(caps, "tx_pending=%d", caps->tx_pending);
+ if (!ril_radio_caps_manager_tx_pending(self)) {
if (self->tx_failed) {
DBG("failed to start the transaction");
ril_data_manager_assert_data_on(self->data_manager);
@@ -951,13 +978,13 @@
{
GRilIoRequest *req = ril_request_allow_data_new(FALSE);
- self->tx_pending++;
- DBG_(caps, "disallowing data");
+ caps->tx_pending++;
+ DBG_(caps, "tx_pending=%d", caps->tx_pending);
grilio_request_set_timeout(req, DATA_OFF_TIMEOUT_MS);
grilio_queue_send_request_full(caps->q, req,
RIL_REQUEST_ALLOW_DATA,
ril_radio_caps_manager_data_off_done,
- NULL, self);
+ NULL, caps);
grilio_request_unref(req);
}
@@ -967,14 +994,16 @@
struct ril_radio_caps *caps = user_data;
struct ril_radio_caps_manager *self = caps->mgr;
- GASSERT(self->tx_pending > 0);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_sim.c
^
|
@@ -108,8 +108,9 @@
guint data_len;
};
-struct ril_sim_cbd {
+struct ril_sim_cbd_io {
struct ril_sim *sd;
+ struct ril_sim_card *card;
union _ofono_sim_cb {
ofono_sim_file_info_cb_t file_info;
ofono_sim_read_cb_t read;
@@ -179,24 +180,43 @@
#define DBG_(sd,fmt,args...) DBG("%s" fmt, (sd)->log_prefix, ##args)
-#define ril_sim_cbd_free g_free
-
static inline struct ril_sim *ril_sim_get_data(struct ofono_sim *sim)
{
return ofono_sim_get_data(sim);
}
-static struct ril_sim_cbd *ril_sim_cbd_new(struct ril_sim *sd, void *cb,
+static struct ril_sim_cbd_io *ril_sim_cbd_io_new(struct ril_sim *sd, void *cb,
void *data)
{
- struct ril_sim_cbd *cbd = g_new0(struct ril_sim_cbd, 1);
+ struct ril_sim_cbd_io *cbd = g_new0(struct ril_sim_cbd_io, 1);
cbd->sd = sd;
cbd->cb.ptr = cb;
cbd->data = data;
+ cbd->card = ril_sim_card_ref(sd->card);
return cbd;
}
+static void ril_sim_cbd_io_free(void *data)
+{
+
+ struct ril_sim_cbd_io *cbd = data;
+
+ ril_sim_card_sim_io_finished(cbd->card, cbd->req_id);
+ ril_sim_card_unref(cbd->card);
+ g_free(cbd);
+}
+
+static void ril_sim_cbd_io_start(struct ril_sim_cbd_io *cbd, GRilIoRequest* req,
+ guint code, GRilIoChannelResponseFunc cb)
+{
+ struct ril_sim *sd = cbd->sd;
+
+ cbd->req_id = grilio_queue_send_request_full(sd->q, req, code,
+ cb, ril_sim_cbd_io_free, cbd);
+ ril_sim_card_sim_io_started(cbd->card, cbd->req_id);
+}
+
static void ril_sim_pin_cbd_state_event_count_cb(struct ril_sim_card *sc,
void *user_data)
{
@@ -255,11 +275,6 @@
}
}
-static const char *ril_sim_app_id(struct ril_sim *sd)
-{
- return sd->card->app ? sd->card->app->aid : NULL;
-}
-
int ril_sim_app_type(struct ofono_sim *sim)
{
struct ril_sim *sd = ril_sim_get_data(sim);
@@ -429,14 +444,13 @@
static void ril_sim_file_info_cb(GRilIoChannel *io, int status,
const void *data, guint len, void *user_data)
{
- struct ril_sim_cbd *cbd = user_data;
+ struct ril_sim_cbd_io *cbd = user_data;
ofono_sim_file_info_cb_t cb = cbd->cb.file_info;
struct ril_sim *sd = cbd->sd;
struct ril_sim_io_response *res = NULL;
struct ofono_error error;
DBG_(sd, "");
- ril_sim_card_sim_io_finished(sd->card, cbd->req_id);
ril_error_init_failure(&error);
res = ril_sim_parse_io_response(data, len);
@@ -480,12 +494,13 @@
static void ril_sim_request_io(struct ril_sim *sd, guint cmd, int fileid,
guint p1, guint p2, guint p3, const char *hex_data,
const guchar *path, guint path_len,
- GRilIoChannelResponseFunc cb, struct ril_sim_cbd *cbd)
+ GRilIoChannelResponseFunc cb, struct ril_sim_cbd_io *cbd)
{
GRilIoRequest *req = grilio_request_new();
DBG_(sd, "cmd=0x%.2X,efid=0x%.4X,%d,%d,%d,%s,pin2=(null),aid=%s",
- cmd, fileid, p1, p2, p3, hex_data, ril_sim_app_id(sd));
+ cmd, fileid, p1, p2, p3, hex_data,
+ ril_sim_card_app_aid(sd->card));
grilio_request_append_int32(req, cmd);
grilio_request_append_int32(req, fileid);
@@ -495,13 +510,11 @@
grilio_request_append_int32(req, p3); /* P3 */
grilio_request_append_utf8(req, hex_data); /* data; only for writes */
grilio_request_append_utf8(req, NULL); /* pin2; only for writes */
- grilio_request_append_utf8(req, ril_sim_app_id(sd));
+ grilio_request_append_utf8(req, ril_sim_card_app_aid(sd->card));
grilio_request_set_blocking(req, TRUE);
grilio_request_set_timeout(req, SIM_IO_TIMEOUT_SECS * 1000);
- cbd->req_id = grilio_queue_send_request_full(sd->q, req,
- RIL_REQUEST_SIM_IO, cb, ril_sim_cbd_free, cbd);
- ril_sim_card_sim_io_started(sd->card, cbd->req_id);
+ ril_sim_cbd_io_start(cbd, req, RIL_REQUEST_SIM_IO, cb);
grilio_request_unref(req);
}
@@ -511,19 +524,19 @@
{
struct ril_sim *sd = ril_sim_get_data(sim);
ril_sim_request_io(sd, CMD_GET_RESPONSE, fileid, 0, 0, 15, NULL,
- path, len, ril_sim_file_info_cb, ril_sim_cbd_new(sd, cb, data));
+ path, len, ril_sim_file_info_cb,
+ ril_sim_cbd_io_new(sd, cb, data));
}
static void ril_sim_read_cb(GRilIoChannel *io, int status,
const void *data, guint len, void *user_data)
{
- struct ril_sim_cbd *cbd = user_data;
+ struct ril_sim_cbd_io *cbd = user_data;
ofono_sim_read_cb_t cb = cbd->cb.read;
struct ril_sim_io_response *res;
struct ofono_error err;
DBG_(cbd->sd, "");
- ril_sim_card_sim_io_finished(cbd->sd->card, cbd->req_id);
res = ril_sim_parse_io_response(data, len);
if (ril_sim_io_response_ok(res) && status == RIL_E_SUCCESS) {
@@ -542,7 +555,7 @@
{
struct ril_sim *sd = ril_sim_get_data(sim);
ril_sim_request_io(sd, cmd, fileid, p1, p2, p3, NULL, path, path_len,
- ril_sim_read_cb, ril_sim_cbd_new(sd, cb, data));
+ ril_sim_read_cb, ril_sim_cbd_io_new(sd, cb, data));
}
static void ril_sim_ofono_read_file_transparent(struct ofono_sim *sim,
@@ -572,13 +585,12 @@
static void ril_sim_write_cb(GRilIoChannel *io, int status,
const void *data, guint len, void *user_data)
{
- struct ril_sim_cbd *cbd = user_data;
+ struct ril_sim_cbd_io *cbd = user_data;
ofono_sim_write_cb_t cb = cbd->cb.write;
struct ril_sim_io_response *res;
struct ofono_error err;
DBG_(cbd->sd, "");
- ril_sim_card_sim_io_finished(cbd->sd->card, cbd->req_id);
res = ril_sim_parse_io_response(data, len);
if (ril_sim_io_response_ok(res) && status == RIL_E_SUCCESS) {
@@ -599,7 +611,7 @@
struct ril_sim *sd = ril_sim_get_data(sim);
char *hex_data = encode_hex(value, length, 0);
ril_sim_request_io(sd, cmd, fileid, p1, p2, length, hex_data, path,
- path_len, ril_sim_write_cb, ril_sim_cbd_new(sd, cb, data));
+ path_len, ril_sim_write_cb, ril_sim_cbd_io_new(sd, cb, data));
g_free(hex_data);
}
@@ -636,12 +648,10 @@
static void ril_sim_get_imsi_cb(GRilIoChannel *io, int status,
const void *data, guint len, void *user_data)
{
- struct ril_sim_cbd *cbd = user_data;
+ struct ril_sim_cbd_io *cbd = user_data;
ofono_sim_imsi_cb_t cb = cbd->cb.imsi;
struct ofono_error error;
- ril_sim_card_sim_io_finished(cbd->sd->card, cbd->req_id);
-
if (status == RIL_E_SUCCESS) {
gchar *imsi;
GRilIoParser rilp;
@@ -666,8 +676,8 @@
void *data)
{
struct ril_sim *sd = ril_sim_get_data(sim);
- const char *app_id = ril_sim_app_id(sd);
- struct ril_sim_cbd *cbd = ril_sim_cbd_new(sd, cb, data);
+ const char *app_id = ril_sim_card_app_aid(sd->card);
+ struct ril_sim_cbd_io *cbd = ril_sim_cbd_io_new(sd, cb, data);
GRilIoRequest *req = grilio_request_array_utf8_new(1, app_id);
DBG_(sd, "%s", app_id);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_sim_card.h
^
|
@@ -77,9 +77,13 @@
void ril_sim_card_remove_handlers(struct ril_sim_card *sc, gulong *ids, int n);
/* Inline wrappers */
-static inline enum ril_app_type
-ril_sim_card_app_type(struct ril_sim_card *sc)
+static inline enum ril_app_type ril_sim_card_app_type(struct ril_sim_card *sc)
{ return (sc && sc->app) ? sc->app->app_type : RIL_APPTYPE_UNKNOWN; }
+static inline const char *ril_sim_card_app_aid(struct ril_sim_card *sc)
+ { return (sc && sc->app) ? sc->app->aid : NULL; }
+
+#define ril_sim_card_remove_all_handlers(net, ids) \
+ ril_sim_card_remove_handlers(net, ids, G_N_ELEMENTS(ids))
#endif /* RIL_SIM_CARD_H */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_subscription.conf
^
|
@@ -209,3 +209,34 @@
# Default is false (use RIL_REQUEST_DEVICE_IDENTITY)
#
#legacyImeiQuery=false
+
+# Some devices don't support LTE RAT mode PREF_NET_TYPE_LTE_GSM_WCDMA.
+# This option allows to set a custom LTE mode.
+#
+# The default is 9 (PREF_NET_TYPE_LTE_GSM_WCDMA)
+#
+#lteNetworkMode=9
+
+# Timeout for RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE, in milliseconds.
+#
+# The default is 20000 (20 seconds)
+#
+#networkModeTimeout=20000
+
+# Cycle radio power at startup.
+#
+# The default is true (cycle the power)
+#
+#radioPowerCycle=true
+
+# With some RILs it seems to be necessary to kick (RIL_REQUEST_RADIO_POWER)
+# the modems with power on after one of the modems has been powered off.
+# Otherwise bad things may happen (like the modem never registering
+# on the network).
+#
+# On the other hand, with some RILs it's causing some trouble (like this
+# extra RIL_REQUEST_RADIO_POWER getting stuck indefinitely).
+#
+# The default is true for historical reasons
+#
+#confirmRadioPowerOn=true
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_types.h
^
|
@@ -51,8 +51,12 @@
struct ril_slot_config {
guint slot;
enum ofono_radio_access_mode techs;
+ int lte_network_mode;
+ int network_mode_timeout;
gboolean query_available_band_mode;
gboolean empty_pin_query;
+ gboolean radio_power_cycle;
+ gboolean confirm_radio_power_on;
gboolean enable_voicecall;
gboolean enable_cbs;
GUtilInts *local_hangup_reasons;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_ussd.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2017 Jolla Ltd.
+ * Copyright (C) 2015-2018 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -20,6 +20,8 @@
#include "smsutil.h"
#include "util.h"
+#define USSD_CANCEL_TIMEOUT_SEC (20)
+
struct ril_ussd {
struct ofono_ussd *ussd;
GRilIoChannel *io;
@@ -114,11 +116,14 @@
ofono_ussd_cb_t cb, void *data)
{
struct ril_ussd *ud = ril_ussd_get_data(ussd);
+ GRilIoRequest *req = grilio_request_new();
ofono_info("send ussd cancel");
- grilio_queue_send_request_full(ud->q, NULL, RIL_REQUEST_CANCEL_USSD,
+ grilio_request_set_timeout(req, USSD_CANCEL_TIMEOUT_SEC * 1000);
+ grilio_queue_send_request_full(ud->q, req, RIL_REQUEST_CANCEL_USSD,
ril_ussd_cancel_cb, ril_ussd_cbd_free,
ril_ussd_cbd_new(cb, data));
+ grilio_request_unref(req);
}
static void ril_ussd_notify(GRilIoChannel *io, guint code,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_util.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2017 Jolla Ltd.
+ * Copyright (C) 2015-2018 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -18,10 +18,10 @@
#include <grilio_channel.h>
+#include <gutil_misc.h>
+
#include <sys/socket.h>
#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
#include "common.h"
#include "netreg.h"
@@ -326,7 +326,7 @@
{
int access_tech = -1;
int tech = -1;
- if (ril_parse_int(stech, 0, &tech)) {
+ if (gutil_parse_int(stech, 0, &tech)) {
switch (tech) {
case RADIO_TECH_GPRS:
case RADIO_TECH_GSM:
@@ -411,26 +411,6 @@
return FALSE;
}
-gboolean ril_parse_int(const char *str, int base, int *value)
-{
- gboolean ok = FALSE;
-
- if (str && str[0]) {
- char *str2 = g_strstrip(g_strdup(str));
- char *end = str2;
- long l;
-
- errno = 0;
- l = strtol(str2, &end, base);
- ok = !*end && errno != ERANGE && l >= INT_MIN && l <= INT_MAX;
- if (ok && value) {
- *value = (int)l;
- }
- g_free(str2);
- }
- return ok;
-}
-
/*
* Local Variables:
* mode: C
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_util.h
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2015-2017 Jolla Ltd.
+ * Copyright (C) 2015-2018 Jolla Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -26,7 +26,6 @@
const char *ril_radio_state_to_string(int radio_state);
int ril_parse_tech(const char *stech, int *ril_tech);
gboolean ril_parse_mcc_mnc(const char *str, struct ofono_network_operator *op);
-gboolean ril_parse_int(const char *str, int base, int *value);
#define ril_error_init_ok(err) \
((err)->error = 0, (err)->type = OFONO_ERROR_TYPE_NO_ERROR)
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_vendor_mtk.c
^
|
@@ -27,6 +27,7 @@
#include <grilio_queue.h>
#include <gutil_macros.h>
+#include <gutil_misc.h>
#include "ofono.h"
@@ -83,6 +84,7 @@
struct ril_mtk_msg {
gboolean attach_apn_has_roaming_protocol;
guint request_resume_registration;
+ guint request_set_call_indication;
/* See ril_vendor_mtk_auto_detect_event */
#define unsol_msgs unsol_ps_network_state_changed
@@ -97,6 +99,7 @@
static const struct ril_mtk_msg msg_mtk1 = {
.attach_apn_has_roaming_protocol = TRUE,
.request_resume_registration = 2050,
+ .request_set_call_indication = 2065,
.unsol_ps_network_state_changed = 3012,
.unsol_registration_suspended = 3021,
.unsol_incoming_call_indication = 3037,
@@ -106,6 +109,7 @@
static const struct ril_mtk_msg msg_mtk2 = {
.attach_apn_has_roaming_protocol = FALSE,
.request_resume_registration = 2065,
+ .request_set_call_indication = 2086,
.unsol_ps_network_state_changed = 3015,
.unsol_registration_suspended = 3024,
.unsol_incoming_call_indication = 3042,
@@ -132,6 +136,8 @@
if (request == msg->request_resume_registration) {
return "MTK_RESUME_REGISTRATION";
+ } else if (request == msg->request_set_call_indication) {
+ return "MTK_SET_CALL_INDICATION";
} else {
return NULL;
}
@@ -340,12 +346,55 @@
ril_network_query_registration_state(self->network);
}
-static void ril_vendor_mtk_call_state_changed(GRilIoChannel *io,
- guint id, const void *data, guint len, void *user_data)
+static void ril_vendor_mtk_incoming_call_indication(GRilIoChannel *io, guint id,
+ const void *data, guint len, void *user_data)
{
- /* Ignore the payload, let ril_voicecall.c do its normal stuff */
- grilio_channel_inject_unsol_event(io,
- RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
+ struct ril_vendor_hook_mtk *self = user_data;
+ const struct ril_mtk_msg *msg = self->msg;
+ GRilIoRequest* req = NULL;
+
+ GASSERT(id == msg->unsol_incoming_call_indication);
+
+ if (msg->request_set_call_indication) {
+ int nparams, cid, seq;
+ gchar *call_id = NULL, *seq_no = NULL;
+ GRilIoParser rilp;
+
+ grilio_parser_init(&rilp, data, len);
+
+ if (grilio_parser_get_int32(&rilp, &nparams) && nparams >= 5 &&
+ (call_id = grilio_parser_get_utf8(&rilp)) != NULL &&
+ grilio_parser_skip_string(&rilp) /* number */ &&
+ grilio_parser_skip_string(&rilp) /* type */ &&
+ grilio_parser_skip_string(&rilp) /* call_mode */ &&
+ (seq_no = grilio_parser_get_utf8(&rilp)) != NULL &&
+ gutil_parse_int(call_id, 10, &cid) &&
+ gutil_parse_int(seq_no, 10, &seq)) {
+
+ DBG("slot=%u,cid=%d,seq=%d", self->slot, cid, seq);
+ req = grilio_request_new();
+ grilio_request_append_int32(req, 3); /* Param count */
+ /* mode - IMS_ALLOW_INCOMING_CALL_INDICATION: */
+ grilio_request_append_int32(req, 0);
+ grilio_request_append_int32(req, cid);
+ grilio_request_append_int32(req, seq);
+ } else {
+ DBG("failed to parse INCOMING_CALL_INDICATION");
+ }
+
+ g_free(call_id);
+ g_free(seq_no);
+ }
+
+ if (req) {
+ grilio_queue_send_request(self->q, req,
+ msg->request_set_call_indication);
+ grilio_request_unref(req);
+ } else {
+ /* Let ril_voicecall.c know that something happened */
+ grilio_channel_inject_unsol_event(io,
+ RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
+ }
}
static GRilIoRequest *ril_vendor_mtk_data_call_req
@@ -443,7 +492,7 @@
if (msg->unsol_incoming_call_indication) {
self->ril_event_id[MTK_EVENT_INCOMING_CALL_INDICATION] =
grilio_channel_add_unsol_event_handler(self->io,
- ril_vendor_mtk_call_state_changed,
+ ril_vendor_mtk_incoming_call_indication,
msg->unsol_incoming_call_indication, self);
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/drivers/ril/ril_voicecall.c
^
|
@@ -15,7 +15,6 @@
#include "ril_plugin.h"
#include "ril_ecclist.h"
-#include "ril_network.h"
#include "ril_util.h"
#include "ril_log.h"
@@ -43,7 +42,6 @@
GRilIoQueue *q;
struct ofono_voicecall *vc;
struct ril_ecclist *ecclist;
- struct ril_network *network;
unsigned char flags;
ofono_voicecall_cb_t cb;
void *data;
@@ -123,19 +121,6 @@
return 0;
}
-static void ril_voicecall_disconnected(struct ril_voicecall *vd, int id,
- enum ofono_disconnect_reason reason, gboolean last_call)
-{
- ofono_voicecall_disconnected(vd->vc, id, reason, NULL);
-
- /* In case if modem dropped to 3G for the voice call, remind it
- * that we want our 4G back after the call has disconnected */
- if (last_call) {
- DBG("checking preferred mode");
- ril_network_check_pref_mode(vd->network, FALSE);
- }
-}
-
static GSList *ril_voicecall_parse_clcc(const void *data, guint len)
{
GRilIoParser rilp;
@@ -336,7 +321,7 @@
ofono_info("Call %d ended with RIL cause %d -> ofono reason %d",
id, last_cause, reason);
- ril_voicecall_disconnected(vd, id, reason, !vd->calls);
+ ofono_voicecall_disconnected(vc, id, reason, NULL);
}
static void ril_voicecall_clcc_poll_cb(GRilIoChannel *io, int status,
@@ -373,9 +358,9 @@
/* old call is gone */
if (gutil_int_array_remove_all_fast(
vd->local_release_ids, oc->id)) {
- ril_voicecall_disconnected(vd, oc->id,
+ ofono_voicecall_disconnected(vd->vc, oc->id,
OFONO_DISCONNECT_REASON_LOCAL_HANGUP,
- !calls);
+ NULL);
} else {
/* Get disconnect cause before informing
* oFono core */
@@ -602,39 +587,75 @@
grilio_request_unref(ioreq);
}
-static void ril_voicecall_hangup_all(struct ofono_voicecall *vc,
+static void ril_voicecall_hangup(struct ofono_voicecall *vc,
+ gboolean (*filter)(struct ofono_call *call),
ofono_voicecall_cb_t cb, void *data)
{
struct ril_voicecall *vd = ril_voicecall_get_data(vc);
+ struct ril_voicecall_request_data *req = NULL;
+ GSList *l;
- if (vd->calls) {
- GSList *l;
- struct ril_voicecall_request_data *req =
- ril_voicecall_request_data_new(vc, cb, data);
+ /*
+ * Here the idea is that we submit (potentially) multiple
+ * hangup requests to RIL and invoke the callback after
+ * the last request has completed (pending call count
+ * becomes zero).
+ */
+ for (l = vd->calls; l; l = l->next) {
+ struct ofono_call *call = l->data;
- /*
- * Here the idea is that we submit (potentially) multiple
- * hangup requests to RIL and invoke the callback after
- * the last request has completed (pending call count
- * becomes zero).
- */
- for (l = vd->calls; l; l = l->next) {
- struct ofono_call *call = l->data;
+ if (!filter || filter(call)) {
+ if (!req) {
+ req = ril_voicecall_request_data_new(vc, cb,
+ data);
+ }
/* Send request to RIL */
DBG("Hanging up call with id %d", call->id);
ril_voicecall_submit_hangup_req(vc, call->id, req);
+ } else {
+ DBG("Skipping call with id %d", call->id);
}
+ }
- /* Release our reference */
+ if (req) {
+ /* Release our reference (if any) */
ril_voicecall_request_data_unref(req);
} else {
- /* No calls */
+ /* No requests were submitted */
struct ofono_error error;
cb(ril_error_ok(&error), data);
}
}
+static gboolean ril_voicecall_hangup_active_filter(struct ofono_call *call)
+{
+ switch (call->status) {
+ case CALL_STATUS_ACTIVE:
+ case CALL_STATUS_DIALING:
+ case CALL_STATUS_ALERTING:
+ case CALL_STATUS_INCOMING:
+ return TRUE;
+ case CALL_STATUS_HELD:
+ case CALL_STATUS_WAITING:
+ case CALL_STATUS_DISCONNECTED:
+ break;
+ }
+ return FALSE;
+}
+
+static void ril_voicecall_hangup_active(struct ofono_voicecall *vc,
+ ofono_voicecall_cb_t cb, void *data)
+{
+ ril_voicecall_hangup(vc, ril_voicecall_hangup_active_filter, cb, data);
+}
+
+static void ril_voicecall_hangup_all(struct ofono_voicecall *vc,
+ ofono_voicecall_cb_t cb, void *data)
+{
+ ril_voicecall_hangup(vc, NULL, cb, data);
+}
+
static void ril_voicecall_release_specific(struct ofono_voicecall *vc,
int id, ofono_voicecall_cb_t cb, void *data)
{
@@ -672,7 +693,7 @@
grilio_parser_get_int32(&rilp, &type);
grilio_parser_get_int32(&rilp, &code);
grilio_parser_get_int32(&rilp, &index);
- grilio_parser_get_int32(&rilp, NULL);
+ grilio_parser_get_int32(&rilp, &phone.type);
tmp = grilio_parser_get_utf8(&rilp);
if (tmp) {
@@ -826,8 +847,7 @@
ofono_voicecall_cb_t cb, void *data)
{
DBG("");
- ril_voicecall_request(RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND,
- vc, NULL, cb, data);
+ ril_voicecall_request(RIL_REQUEST_UDUB, vc, NULL, cb, data);
}
static void ril_voicecall_enable_supp_svc(struct ril_voicecall *vd)
@@ -922,7 +942,6 @@
vd->local_release_ids = gutil_int_array_new();
vd->idleq = gutil_idle_queue_new();
vd->vc = vc;
- vd->network = ril_network_ref(modem->network);
if (modem->ecclist_file) {
vd->ecclist = ril_ecclist_new(modem->ecclist_file);
}
@@ -942,9 +961,9 @@
ril_ecclist_remove_handler(vd->ecclist, vd->ecclist_change_id);
ril_ecclist_unref(vd->ecclist);
- ril_network_unref(vd->network);
- grilio_channel_remove_all_handlers(vd->io, vd->event_id);
+ grilio_channel_remove_handlers(vd->io, vd->event_id,
+ G_N_ELEMENTS(vd->event_id));
grilio_channel_unref(vd->io);
grilio_queue_cancel_all(vd->q, FALSE);
grilio_queue_unref(vd->q);
@@ -962,6 +981,7 @@
.remove = ril_voicecall_remove,
.dial = ril_voicecall_dial,
.answer = ril_voicecall_answer,
+ .hangup_active = ril_voicecall_hangup_active,
.hangup_all = ril_voicecall_hangup_all,
.release_specific = ril_voicecall_release_specific,
.send_tones = ril_voicecall_send_dtmf,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/gprs-filter.h
^
|
@@ -22,12 +22,14 @@
#include <ofono/types.h>
+struct ofono_gprs;
struct ofono_gprs_context;
struct ofono_gprs_primary_context;
/* If ctx is NULL then activation gets cancelled */
typedef void (*ofono_gprs_filter_activate_cb_t)
(const struct ofono_gprs_primary_context *ctx, void *data);
+typedef void (*ofono_gprs_filter_check_cb_t)(ofono_bool_t allow, void *data);
#define OFONO_GPRS_FILTER_PRIORITY_LOW (-100)
#define OFONO_GPRS_FILTER_PRIORITY_DEFAULT (0)
@@ -38,7 +40,7 @@
* even if struct ofono_gprs_filter gets extended with new callbacks.
*/
-#define OFONO_GPRS_FILTER_API_VERSION (0)
+#define OFONO_GPRS_FILTER_API_VERSION (1)
/*
* The filter callbacks either invoke the completion callback directly
@@ -59,6 +61,9 @@
const struct ofono_gprs_primary_context *ctx,
ofono_gprs_filter_activate_cb_t cb,
void *data);
+ /* API version 1 */
+ unsigned int (*filter_check)(struct ofono_gprs *gprs,
+ ofono_gprs_filter_check_cb_t cb, void *data);
};
int ofono_gprs_filter_register(const struct ofono_gprs_filter *filter);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/gprs.h
^
|
@@ -83,6 +83,8 @@
void ofono_gprs_cid_activated(struct ofono_gprs *gprs, unsigned int cid,
const char *apn);
+void ofono_gprs_attached_update(struct ofono_gprs *gprs);
+
#ifdef __cplusplus
}
#endif
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/modem.h
^
|
@@ -29,7 +29,9 @@
#include <ofono/types.h>
struct ofono_modem;
+struct ofono_gprs;
struct ofono_sim;
+struct ofono_voicecall;
enum ofono_modem_type {
OFONO_MODEM_TYPE_HARDWARE = 0,
@@ -82,6 +84,8 @@
const char *ofono_modem_get_path(struct ofono_modem *modem);
struct ofono_sim *ofono_modem_get_sim(struct ofono_modem *modem);
+struct ofono_gprs *ofono_modem_get_gprs(struct ofono_modem *modem);
+struct ofono_voicecall *ofono_modem_get_voicecall(struct ofono_modem *modem);
void ofono_modem_set_data(struct ofono_modem *modem, void *data);
void *ofono_modem_get_data(struct ofono_modem *modem);
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/ril-constants.h
^
|
@@ -0,0 +1,284 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2018 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __OFONO_RIL_CONSTANTS_H
+#define __OFONO_RIL_CONSTANTS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Error Codes */
+enum ril_status {
+ RIL_E_SUCCESS = 0,
+ RIL_E_RADIO_NOT_AVAILABLE = 1,
+ RIL_E_GENERIC_FAILURE = 2,
+ RIL_E_PASSWORD_INCORRECT = 3,
+ RIL_E_SIM_PIN2 = 4,
+ RIL_E_SIM_PUK2 = 5,
+ RIL_E_REQUEST_NOT_SUPPORTED = 6,
+ RIL_E_CANCELLED = 7,
+ RIL_E_OP_NOT_ALLOWED_DURING_VOICE_CALL = 8,
+ RIL_E_OP_NOT_ALLOWED_BEFORE_REG_TO_NW = 9,
+ RIL_E_SMS_SEND_FAIL_RETRY = 10,
+ RIL_E_SIM_ABSENT = 11,
+ RIL_E_SUBSCRIPTION_NOT_AVAILABLE = 12,
+ RIL_E_MODE_NOT_SUPPORTED = 13,
+ RIL_E_FDN_CHECK_FAILURE = 14,
+ RIL_E_ILLEGAL_SIM_OR_ME = 15,
+ RIL_E_MISSING_RESOURCE = 16,
+ RIL_E_NO_SUCH_ELEMENT = 17,
+ RIL_E_DIAL_MODIFIED_TO_USSD = 18,
+ RIL_E_DIAL_MODIFIED_TO_SS = 19,
+ RIL_E_DIAL_MODIFIED_TO_DIAL = 20,
+ RIL_E_USSD_MODIFIED_TO_DIAL = 21,
+ RIL_E_USSD_MODIFIED_TO_SS = 22,
+ RIL_E_USSD_MODIFIED_TO_USSD = 23,
+ RIL_E_SS_MODIFIED_TO_DIAL = 24,
+ RIL_E_SS_MODIFIED_TO_USSD = 25,
+ RIL_E_SUBSCRIPTION_NOT_SUPPORTED = 26,
+ RIL_E_SS_MODIFIED_TO_SS = 27,
+ RIL_E_LCE_NOT_SUPPORTED = 36,
+ RIL_E_NO_MEMORY = 37,
+ RIL_E_INTERNAL_ERR = 38,
+ RIL_E_SYSTEM_ERR = 39,
+ RIL_E_MODEM_ERR = 40,
+ RIL_E_INVALID_STATE = 41,
+ RIL_E_NO_RESOURCES = 42,
+ RIL_E_SIM_ERR = 43,
+ RIL_E_INVALID_ARGUMENTS = 44,
+ RIL_E_INVALID_SIM_STATE = 45,
+ RIL_E_INVALID_MODEM_STATE = 46,
+ RIL_E_INVALID_CALL_ID = 47,
+ RIL_E_NO_SMS_TO_ACK = 48,
+ RIL_E_NETWORK_ERR = 49,
+ RIL_E_REQUEST_RATE_LIMITED = 50,
+ RIL_E_SIM_BUSY = 51,
+ RIL_E_SIM_FULL = 52,
+ RIL_E_NETWORK_REJECT = 53,
+ RIL_E_OPERATION_NOT_ALLOWED = 54,
+ RIL_E_EMPTY_RECORD = 55,
+ RIL_E_INVALID_SMS_FORMAT = 56,
+ RIL_E_ENCODING_ERR = 57,
+ RIL_E_INVALID_SMSC_ADDRESS = 58,
+ RIL_E_NO_SUCH_ENTRY = 59,
+ RIL_E_NETWORK_NOT_READY = 60,
+ RIL_E_NOT_PROVISIONED = 61,
+ RIL_E_NO_SUBSCRIPTION = 62,
+ RIL_E_NO_NETWORK_FOUND = 63,
+ RIL_E_DEVICE_IN_USE = 64,
+ RIL_E_ABORTED = 65,
+ RIL_E_INVALID_RESPONSE = 66
+};
+
+/* RIL Request Messages, ofono -> rild */
+#define RIL_REQUEST_GET_SIM_STATUS 1
+#define RIL_REQUEST_ENTER_SIM_PIN 2
+#define RIL_REQUEST_ENTER_SIM_PUK 3
+#define RIL_REQUEST_ENTER_SIM_PIN2 4
+#define RIL_REQUEST_ENTER_SIM_PUK2 5
+#define RIL_REQUEST_CHANGE_SIM_PIN 6
+#define RIL_REQUEST_CHANGE_SIM_PIN2 7
+#define RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION 8
+#define RIL_REQUEST_GET_CURRENT_CALLS 9
+#define RIL_REQUEST_DIAL 10
+#define RIL_REQUEST_GET_IMSI 11
+#define RIL_REQUEST_HANGUP 12
+#define RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND 13
+#define RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND 14
+#define RIL_REQUEST_SWITCH_HOLDING_AND_ACTIVE 15
+#define RIL_REQUEST_CONFERENCE 16
+#define RIL_REQUEST_UDUB 17
+#define RIL_REQUEST_LAST_CALL_FAIL_CAUSE 18
+#define RIL_REQUEST_SIGNAL_STRENGTH 19
+#define RIL_REQUEST_VOICE_REGISTRATION_STATE 20
+#define RIL_REQUEST_DATA_REGISTRATION_STATE 21
+#define RIL_REQUEST_OPERATOR 22
+#define RIL_REQUEST_RADIO_POWER 23
+#define RIL_REQUEST_DTMF 24
+#define RIL_REQUEST_SEND_SMS 25
+#define RIL_REQUEST_SEND_SMS_EXPECT_MORE 26
+#define RIL_REQUEST_SETUP_DATA_CALL 27
+#define RIL_REQUEST_SIM_IO 28
+#define RIL_REQUEST_SEND_USSD 29
+#define RIL_REQUEST_CANCEL_USSD 30
+#define RIL_REQUEST_GET_CLIR 31
+#define RIL_REQUEST_SET_CLIR 32
+#define RIL_REQUEST_QUERY_CALL_FORWARD_STATUS 33
+#define RIL_REQUEST_SET_CALL_FORWARD 34
+#define RIL_REQUEST_QUERY_CALL_WAITING 35
+#define RIL_REQUEST_SET_CALL_WAITING 36
+#define RIL_REQUEST_SMS_ACKNOWLEDGE 37
+#define RIL_REQUEST_GET_IMEI 38
+#define RIL_REQUEST_GET_IMEISV 39
+#define RIL_REQUEST_ANSWER 40
+#define RIL_REQUEST_DEACTIVATE_DATA_CALL 41
+#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
+#define RIL_REQUEST_SET_FACILITY_LOCK 43
+#define RIL_REQUEST_CHANGE_BARRING_PASSWORD 44
+#define RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE 45
+#define RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC 46
+#define RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL 47
+#define RIL_REQUEST_QUERY_AVAILABLE_NETWORKS 48
+#define RIL_REQUEST_DTMF_START 49
+#define RIL_REQUEST_DTMF_STOP 50
+#define RIL_REQUEST_BASEBAND_VERSION 51
+#define RIL_REQUEST_SEPARATE_CONNECTION 52
+#define RIL_REQUEST_SET_MUTE 53
+#define RIL_REQUEST_GET_MUTE 54
+#define RIL_REQUEST_QUERY_CLIP 55
+#define RIL_REQUEST_LAST_DATA_CALL_FAIL_CAUSE 56
+#define RIL_REQUEST_DATA_CALL_LIST 57
+#define RIL_REQUEST_RESET_RADIO 58
+#define RIL_REQUEST_OEM_HOOK_RAW 59
+#define RIL_REQUEST_OEM_HOOK_STRINGS 60
+#define RIL_REQUEST_SCREEN_STATE 61
+#define RIL_REQUEST_SET_SUPP_SVC_NOTIFICATION 62
+#define RIL_REQUEST_WRITE_SMS_TO_SIM 63
+#define RIL_REQUEST_DELETE_SMS_ON_SIM 64
+#define RIL_REQUEST_SET_BAND_MODE 65
+#define RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE 66
+#define RIL_REQUEST_STK_GET_PROFILE 67
+#define RIL_REQUEST_STK_SET_PROFILE 68
+#define RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND 69
+#define RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE 70
+#define RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM 71
+#define RIL_REQUEST_EXPLICIT_CALL_TRANSFER 72
+#define RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE 73
+#define RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE 74
+#define RIL_REQUEST_GET_NEIGHBORING_CELL_IDS 75
+#define RIL_REQUEST_SET_LOCATION_UPDATES 76
+#define RIL_REQUEST_CDMA_SET_SUBSCRIPTION_SOURCE 77
+#define RIL_REQUEST_CDMA_SET_ROAMING_PREFERENCE 78
+#define RIL_REQUEST_CDMA_QUERY_ROAMING_PREFERENCE 79
+#define RIL_REQUEST_SET_TTY_MODE 80
+#define RIL_REQUEST_QUERY_TTY_MODE 81
+#define RIL_REQUEST_CDMA_SET_PREFERRED_VOICE_PRIVACY_MODE 82
+#define RIL_REQUEST_CDMA_QUERY_PREFERRED_VOICE_PRIVACY_MODE 83
+#define RIL_REQUEST_CDMA_FLASH 84
+#define RIL_REQUEST_CDMA_BURST_DTMF 85
+#define RIL_REQUEST_CDMA_VALIDATE_AND_WRITE_AKEY 86
+#define RIL_REQUEST_CDMA_SEND_SMS 87
+#define RIL_REQUEST_CDMA_SMS_ACKNOWLEDGE 88
+#define RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG 89
+#define RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG 90
+#define RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION 91
+#define RIL_REQUEST_CDMA_GET_BROADCAST_SMS_CONFIG 92
+#define RIL_REQUEST_CDMA_SET_BROADCAST_SMS_CONFIG 93
+#define RIL_REQUEST_CDMA_SMS_BROADCAST_ACTIVATION 94
+#define RIL_REQUEST_CDMA_SUBSCRIPTION 95
+#define RIL_REQUEST_CDMA_WRITE_SMS_TO_RUIM 96
+#define RIL_REQUEST_CDMA_DELETE_SMS_ON_RUIM 97
+#define RIL_REQUEST_DEVICE_IDENTITY 98
+#define RIL_REQUEST_EXIT_EMERGENCY_CALLBACK_MODE 99
+#define RIL_REQUEST_GET_SMSC_ADDRESS 100
+#define RIL_REQUEST_SET_SMSC_ADDRESS 101
+#define RIL_REQUEST_REPORT_SMS_MEMORY_STATUS 102
+#define RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING 103
+#define RIL_REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE 104
+#define RIL_REQUEST_ISIM_AUTHENTICATION 105
+#define RIL_REQUEST_ACKNOWLEDGE_INCOMING_GSM_SMS_WITH_PDU 106
+#define RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS 107
+#define RIL_REQUEST_VOICE_RADIO_TECH 108
+#define RIL_REQUEST_GET_CELL_INFO_LIST 109
+#define RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE 110
+#define RIL_REQUEST_SET_INITIAL_ATTACH_APN 111
+#define RIL_REQUEST_IMS_REGISTRATION_STATE 112
+#define RIL_REQUEST_IMS_SEND_SMS 113
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/ril-transport.h
^
|
@@ -0,0 +1,64 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2018 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __OFONO_RIL_TRANSPORT_H
+#define __OFONO_RIL_TRANSPORT_H
+
+#include <ofono/types.h>
+#include <glib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct grilio_transport;
+
+/*
+ * The api_version field makes it possible to keep using old plugins
+ * even if struct ofono_ril_transport gets extended with new callbacks.
+ */
+
+#define OFONO_RIL_TRANSPORT_API_VERSION (0)
+
+/*
+ * The connect callback takes a (char*) -> (char*) hashtable containing
+ * transport-specific connection parameters. The caller receives a reference
+ * i.e. it has to unref the returned object.
+ */
+struct ofono_ril_transport {
+ const char *name;
+ int api_version; /* OFONO_RIL_TRANSPORT_API_VERSION */
+ struct grilio_transport *(*connect)(GHashTable *params);
+};
+
+int ofono_ril_transport_register(const struct ofono_ril_transport *t);
+void ofono_ril_transport_unregister(const struct ofono_ril_transport *t);
+
+struct grilio_transport *ofono_ril_transport_connect(const char *name,
+ GHashTable *params);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __OFONO_RIL_TRANSPORT_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/types.h
^
|
@@ -56,6 +56,7 @@
OFONO_ERROR_TYPE_CEER,
OFONO_ERROR_TYPE_SIM,
OFONO_ERROR_TYPE_FAILURE,
+ OFONO_ERROR_TYPE_ERRNO
};
enum ofono_disconnect_reason {
@@ -70,16 +71,6 @@
int error;
};
-#define OFONO_EINVAL(error) do { \
- error->type = OFONO_ERROR_TYPE_FAILURE; \
- error->error = -EINVAL; \
-} while (0)
-
-#define OFONO_NO_ERROR(error) do { \
- error->type = OFONO_ERROR_TYPE_NO_ERROR; \
- error->error = 0; \
-} while (0)
-
#define OFONO_MAX_PHONE_NUMBER_LENGTH 80
#define OFONO_MAX_CALLER_NAME_LENGTH 80
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/voicecall-filter.h
^
|
@@ -0,0 +1,128 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2018 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __OFONO_VOICECALL_FILTER_H
+#define __OFONO_VOICECALL_FILTER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <ofono/voicecall.h>
+
+/* 27.007 Section 7.6 */
+enum ofono_clip_validity {
+ OFONO_CLIP_VALIDITY_VALID = 0,
+ OFONO_CLIP_VALIDITY_WITHHELD,
+ OFONO_CLIP_VALIDITY_NOT_AVAILABLE
+};
+
+/* 27.007 Section 7.18 */
+enum ofono_call_status {
+ OFONO_CALL_STATUS_ACTIVE = 0,
+ OFONO_CALL_STATUS_HELD,
+ OFONO_CALL_STATUS_DIALING,
+ OFONO_CALL_STATUS_ALERTING,
+ OFONO_CALL_STATUS_INCOMING,
+ OFONO_CALL_STATUS_WAITING,
+ OFONO_CALL_STATUS_DISCONNECTED
+};
+
+/* 27.007 Section 7.18 */
+enum ofono_call_direction {
+ OFONO_CALL_DIRECTION_MOBILE_ORIGINATED = 0,
+ OFONO_CALL_DIRECTION_MOBILE_TERMINATED
+};
+
+/* 27.007 Section 7.30 */
+enum ofono_cnap_validity {
+ OFONO_CNAP_VALIDITY_VALID = 0,
+ OFONO_CNAP_VALIDITY_WITHHELD,
+ OFONO_CNAP_VALIDITY_NOT_AVAILABLE
+};
+
+enum ofono_voicecall_filter_dial_result {
+ OFONO_VOICECALL_FILTER_DIAL_CONTINUE, /* Run the next filter */
+ OFONO_VOICECALL_FILTER_DIAL_BLOCK /* Don't dial*/
+};
+
+enum ofono_voicecall_filter_incoming_result {
+ OFONO_VOICECALL_FILTER_INCOMING_CONTINUE, /* Run the next filter */
+ OFONO_VOICECALL_FILTER_INCOMING_HANGUP, /* Hangup incoming call */
+ OFONO_VOICECALL_FILTER_INCOMING_IGNORE /* Ignore incoming call */
+};
+
+typedef void (*ofono_voicecall_filter_dial_cb_t)
+ (enum ofono_voicecall_filter_dial_result result,
+ void *data);
+
+typedef void (*ofono_voicecall_filter_incoming_cb_t)
+ (enum ofono_voicecall_filter_incoming_result result,
+ void *data);
+
+#define OFONO_VOICECALL_FILTER_PRIORITY_LOW (-100)
+#define OFONO_VOICECALL_FILTER_PRIORITY_DEFAULT (0)
+#define OFONO_VOICECALL_FILTER_PRIORITY_HIGH (100)
+
+/*
+ * The api_version field makes it possible to keep using old plugins
+ * even if struct ofono_voicecall_filter gets extended with new callbacks.
+ */
+
+#define OFONO_VOICECALL_FILTER_API_VERSION (0)
+
+/*
+ * The filter callbacks either invoke the completion callback directly
+ * or return the id of the cancellable asynchronous operation (but never
+ * both). If non-zero value is returned, the completion callback has to
+ * be invoked later on a fresh stack. Once the asynchronous filtering
+ * operation is cancelled, the associated completion callback must not
+ * be invoked.
+ *
+ * Please avoid making blocking D-Bus calls from the filter callbacks.
+ */
+struct ofono_voicecall_filter {
+ const char *name;
+ int api_version; /* OFONO_VOICECALL_FILTER_API_VERSION */
+ int priority;
+ void (*filter_cancel)(unsigned int id);
+ unsigned int (*filter_dial)(struct ofono_voicecall *vc,
+ const struct ofono_phone_number *number,
+ enum ofono_clir_option clir,
+ ofono_voicecall_filter_dial_cb_t cb,
+ void *data);
+ unsigned int (*filter_incoming)(struct ofono_voicecall *vc,
+ const struct ofono_call *call,
+ ofono_voicecall_filter_incoming_cb_t cb,
+ void *data);
+};
+
+void ofono_voicecall_filter_notify(struct ofono_voicecall *vc);
+int ofono_voicecall_filter_register(const struct ofono_voicecall_filter *f);
+void ofono_voicecall_filter_unregister(const struct ofono_voicecall_filter *f);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __OFONO_VOICECALL_FILTER_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/include/voicecall.h
^
|
@@ -153,6 +153,8 @@
*/
void ofono_voicecall_mpty_hint(struct ofono_voicecall *vc, unsigned int ids);
+struct ofono_modem *ofono_voicecall_get_modem(struct ofono_voicecall *vc);
+
int ofono_voicecall_driver_register(const struct ofono_voicecall_driver *d);
void ofono_voicecall_driver_unregister(const struct ofono_voicecall_driver *d);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/dbus.c
^
|
@@ -24,6 +24,7 @@
#endif
#include <glib.h>
+#include <errno.h>
#include <gdbus.h>
#include "ofono.h"
@@ -37,7 +38,7 @@
DBusMessage *(*ofono_error_func)(DBusMessage *);
};
-struct error_mapping_entry cme_errors_mapping[] = {
+static const struct error_mapping_entry cme_errors_mapping[] = {
{ 3, __ofono_error_not_allowed },
{ 4, __ofono_error_not_supported },
{ 16, __ofono_error_incorrect_password },
@@ -45,6 +46,16 @@
{ 31, __ofono_error_timed_out },
{ 32, __ofono_error_access_denied },
{ 50, __ofono_error_invalid_args },
+ { }
+};
+
+static const struct error_mapping_entry errno_errors_mapping[] = {
+ { EACCES, __ofono_error_access_denied },
+ { EOPNOTSUPP, __ofono_error_not_supported },
+ { ENOSYS, __ofono_error_not_implemented },
+ { ETIMEDOUT, __ofono_error_timed_out },
+ { EINPROGRESS, __ofono_error_busy },
+ { }
};
static void append_variant(DBusMessageIter *iter,
@@ -419,26 +430,31 @@
" network");
}
+static DBusMessage *__ofono_map_error(const struct error_mapping_entry *map,
+ int error, DBusMessage *msg)
+{
+ const struct error_mapping_entry *e;
+
+ for (e = map; e->ofono_error_func; e++)
+ if (e->error == error)
+ return e->ofono_error_func(msg);
+
+ return __ofono_error_failed(msg);
+}
+
DBusMessage *__ofono_error_from_error(const struct ofono_error *error,
DBusMessage *msg)
{
- struct error_mapping_entry *e;
- int maxentries;
- int i;
-
switch (error->type) {
case OFONO_ERROR_TYPE_CME:
- e = cme_errors_mapping;
- maxentries = sizeof(cme_errors_mapping) /
- sizeof(struct error_mapping_entry);
- for (i = 0; i < maxentries; i++)
- if (e[i].error == error->error)
- return e[i].ofono_error_func(msg);
- break;
+ return __ofono_map_error(cme_errors_mapping, error->error, msg);
case OFONO_ERROR_TYPE_CMS:
return __ofono_error_failed(msg);
case OFONO_ERROR_TYPE_CEER:
return __ofono_error_failed(msg);
+ case OFONO_ERROR_TYPE_ERRNO:
+ return __ofono_map_error(errno_errors_mapping,
+ ABS(error->error), msg);
default:
return __ofono_error_failed(msg);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/emulator.c
^
|
@@ -1347,6 +1347,7 @@
case OFONO_ERROR_TYPE_CEER:
case OFONO_ERROR_TYPE_SIM:
case OFONO_ERROR_TYPE_FAILURE:
+ case OFONO_ERROR_TYPE_ERRNO:
failure:
g_at_server_send_final(em->server, G_AT_SERVER_RESULT_ERROR);
break;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/gprs-filter.c
^
|
@@ -18,57 +18,65 @@
#include <errno.h>
#include <string.h>
+struct gprs_filter_request;
+struct gprs_filter_request_fn {
+ const char *name;
+ gboolean (*can_process)(const struct ofono_gprs_filter *filter);
+ guint (*process)(const struct ofono_gprs_filter *filter,
+ struct gprs_filter_request *req);
+ void (*complete)(struct gprs_filter_request *req, gboolean allow);
+ void (*free)(struct gprs_filter_request *req);
+};
+
struct gprs_filter_request {
+ int refcount;
struct gprs_filter_chain *chain;
+ struct ofono_gprs_context *gc;
+ const struct gprs_filter_request_fn *fn;
GSList *filter_link;
guint pending_id;
guint next_id;
- struct ofono_gprs_primary_context ctx;
- gprs_filter_activate_cb_t act;
ofono_destroy_func destroy;
void* user_data;
};
-/* There's no need to support more than one request at a time */
+struct gprs_filter_request_activate {
+ struct gprs_filter_request req;
+ struct ofono_gprs_primary_context ctx;
+ gprs_filter_activate_cb_t cb;
+};
+
+struct gprs_filter_request_check {
+ struct gprs_filter_request req;
+ ofono_gprs_filter_check_cb_t cb;
+};
struct gprs_filter_chain {
- struct ofono_gprs_context *gc;
- struct gprs_filter_request *req;
+ struct ofono_gprs *gprs;
+ GSList *req_list;
};
static GSList *gprs_filter_list = NULL;
-static void gprs_filter_request_process(struct gprs_filter_request *req);
-
-static void gprs_filter_copy_context(struct ofono_gprs_primary_context *dest,
- const struct ofono_gprs_primary_context *src)
+static void gprs_filter_request_init(struct gprs_filter_request *req,
+ const struct gprs_filter_request_fn *fn,
+ struct gprs_filter_chain *chain, struct ofono_gprs_context *gc,
+ ofono_destroy_func destroy, void *user_data)
{
- dest->cid = src->cid;
- dest->proto = src->proto;
- dest->auth_method = src->auth_method;
- strncpy(dest->apn, src->apn, OFONO_GPRS_MAX_APN_LENGTH);
- strncpy(dest->username, src->username, OFONO_GPRS_MAX_USERNAME_LENGTH);
- strncpy(dest->password, src->password, OFONO_GPRS_MAX_PASSWORD_LENGTH);
- dest->apn[OFONO_GPRS_MAX_APN_LENGTH] = 0;
- dest->username[OFONO_GPRS_MAX_USERNAME_LENGTH] = 0;
- dest->password[OFONO_GPRS_MAX_PASSWORD_LENGTH] = 0;
-}
-
-static struct gprs_filter_request *gprs_filter_request_new
- (struct gprs_filter_chain *chain,
- const struct ofono_gprs_primary_context *ctx,
- gprs_filter_activate_cb_t act,
- ofono_destroy_func destroy, void *user_data)
-{
- struct gprs_filter_request *req = g_new0(struct gprs_filter_request, 1);
-
req->chain = chain;
+ req->fn = fn;
+ req->gc = gc;
req->filter_link = gprs_filter_list;
- gprs_filter_copy_context(&req->ctx, ctx);
- req->act = act;
req->destroy = destroy;
req->user_data = user_data;
- return req;
+
+ /*
+ * The list holds an implicit reference to the message. The reference
+ * is released by gprs_filter_request_free when the message is removed
+ * from the list.
+ */
+ req->refcount = 1;
+ chain->req_list = g_slist_append(chain->req_list, req);
}
static void gprs_filter_request_cancel(struct gprs_filter_request *req)
@@ -89,21 +97,94 @@
}
}
-static void gprs_filter_request_free(struct gprs_filter_request *req)
+static void gprs_filter_request_dispose(struct gprs_filter_request *req)
{
+ /* May be invoked several times per request */
if (req->destroy) {
- req->destroy(req->user_data);
+ ofono_destroy_func destroy = req->destroy;
+
+ req->destroy = NULL;
+ destroy(req->user_data);
+ }
+}
+
+static void gprs_filter_request_free(struct gprs_filter_request *req)
+{
+ gprs_filter_request_dispose(req);
+ req->fn->free(req);
+}
+
+#define gprs_filter_request_ref(req) ((req)->refcount++, req)
+
+static int gprs_filter_request_unref(struct gprs_filter_request *req)
+{
+ const int refcount = --(req->refcount);
+
+ if (!refcount) {
+ gprs_filter_request_free(req);
+ }
+ return refcount;
+}
+
+static void gprs_filter_request_free1(gpointer data)
+{
+ struct gprs_filter_request *req = data;
+
+ /*
+ * This is a g_slist_free_full() callback for use by
+ * __ofono_gprs_filter_chain_free(), meaning that the
+ * chain is no more. Zero the pointer to it in case if
+ * this is not the last reference.
+ */
+ req->chain = NULL;
+ gprs_filter_request_unref(req);
+}
+
+static void gprs_filter_request_dequeue(struct gprs_filter_request *req)
+{
+ struct gprs_filter_chain *chain = req->chain;
+ GSList *l;
+
+ /*
+ * Single-linked list is not particularly good at searching
+ * and removing the elements but since it should be pretty
+ * short (typically just one request), it's not worth optimization.
+ */
+ if (chain && (l = g_slist_find(chain->req_list, req)) != NULL) {
+ gprs_filter_request_free1(l->data);
+ chain->req_list = g_slist_delete_link(chain->req_list, l);
}
- g_free(req);
}
static void gprs_filter_request_complete(struct gprs_filter_request *req,
gboolean allow)
{
- req->chain->req = NULL;
- gprs_filter_request_cancel(req);
- req->act(allow ? &req->ctx : NULL, req->user_data);
- gprs_filter_request_free(req);
+ gprs_filter_request_ref(req);
+ req->fn->complete(req, allow);
+ gprs_filter_request_dispose(req);
+ gprs_filter_request_dequeue(req);
+ gprs_filter_request_unref(req);
+}
+
+static void gprs_filter_request_process(struct gprs_filter_request *req)
+{
+ GSList *l = req->filter_link;
+ const struct ofono_gprs_filter *f = l->data;
+ const struct gprs_filter_request_fn *fn = req->fn;
+
+ while (f && !fn->can_process(f)) {
+ l = l->next;
+ f = l ? l->data : NULL;
+ }
+
+ gprs_filter_request_ref(req);
+ if (f) {
+ req->filter_link = l;
+ req->pending_id = fn->process(f, req);
+ } else {
+ gprs_filter_request_complete(req, TRUE);
+ }
+ gprs_filter_request_unref(req);
}
static void gprs_filter_request_next(struct gprs_filter_request *req,
@@ -113,7 +194,7 @@
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/gprs.c
^
|
@@ -85,6 +85,7 @@
void *driver_data;
struct ofono_atom *atom;
unsigned int spn_watch;
+ struct gprs_filter_chain *filters;
};
struct ipv4_settings {
@@ -117,7 +118,6 @@
void *driver_data;
struct context_settings *settings;
struct ofono_atom *atom;
- struct gprs_filter_chain *filters;
};
struct pri_context {
@@ -137,7 +137,13 @@
struct ofono_gprs *gprs;
};
-static void gprs_attached_update(struct ofono_gprs *gprs);
+/*
+ * In Sailfish OS fork gprs_attached_update() is exported to plugins
+ * as ofono_gprs_attached_update(). Exported functions must start
+ * with ofono_ prefix.
+ */
+#define gprs_attached_update(gprs) ofono_gprs_attached_update(gprs)
+
static void gprs_netreg_update(struct ofono_gprs *gprs);
static void gprs_deactivate_next(struct ofono_gprs *gprs);
static void write_context_settings(struct ofono_gprs *gprs,
@@ -369,7 +375,9 @@
if (ctx == NULL || ctx->gprs == NULL || ctx->context_driver == NULL)
return;
- __ofono_gprs_filter_chain_cancel(ctx->context_driver->filters);
+ __ofono_gprs_filter_chain_cancel(ctx->gprs->filters,
+ ctx->context_driver);
+
gprs_cid_release(ctx->gprs, ctx->context.cid);
ctx->context.cid = 0;
ctx->context_driver->inuse = FALSE;
@@ -1049,16 +1057,17 @@
for (i = 0; i < count; i++) {
const struct ofono_gprs_provision_data *ap = settings + i;
if (ap->type == ctx->type && ap_valid(ap)) {
- if ((!ctx->active &&
- !ctx->pending && !ctx->gprs->pending) ||
- !pri_deactivation_required(ctx, ap)) {
+ if (ctx->pending || ctx->gprs->pending) {
+ /* Context is being messed with */
+ reply = __ofono_error_busy(msg);
+ } else if (ctx->active &&
+ pri_deactivation_required(ctx, ap)) {
+ /* Context needs to be deactivated first */
+ reply = __ofono_error_busy(msg);
+ } else {
/* Re-provision the context */
pri_reset_context_properties(ctx, ap);
reply = dbus_message_new_method_return(msg);
- } else {
- /* Context should be inactive */
- if (ctx->gprs->pending || ctx->pending)
- reply = __ofono_error_busy(msg);
}
break;
}
@@ -1548,11 +1557,40 @@
return NULL;
}
-static void gprs_context_activate(const struct ofono_gprs_primary_context *ctx,
- void *data)
+struct pri_request_data {
+ struct pri_context *pri;
+ DBusMessage *msg;
+};
+
+static struct pri_request_data *pri_request_new(struct pri_context *pri)
+{
+ struct pri_request_data *data = g_new0(struct pri_request_data, 1);
+
+ data->pri = pri;
+ data->msg = pri->pending;
+ return data;
+}
+
+static void pri_request_free(void *user_data)
+{
+ struct pri_request_data *data = user_data;
+ struct pri_context *pri = data->pri;
+
+ if (pri->pending && pri->pending == data->msg) {
+ __ofono_dbus_pending_reply(&pri->pending,
+ __ofono_error_canceled(pri->pending));
+ }
+
+ g_free(data);
+}
+
+static void pri_activate_filt(const struct ofono_gprs_primary_context *ctx,
+ void *user_data)
{
- struct pri_context *pri = data;
+ struct pri_request_data *data = user_data;
+ struct pri_context *pri = data->pri;
+ data->msg = NULL;
if (ctx) {
struct ofono_gprs_context *gc = pri->context_driver;
@@ -1619,9 +1657,9 @@
ctx->pending = dbus_message_ref(msg);
if (value)
- __ofono_gprs_filter_chain_activate(gc->filters,
- &ctx->context, gprs_context_activate,
- NULL, ctx);
+ __ofono_gprs_filter_chain_activate(gc->gprs->filters,
+ gc, &ctx->context, pri_activate_filt,
+ pri_request_free, pri_request_new(ctx));
else
gc->driver->deactivate_primary(gc, ctx->context.cid,
pri_deactivate_callback, ctx);
@@ -1905,14 +1943,8 @@
}
}
-static void gprs_attached_update(struct ofono_gprs *gprs)
+static void gprs_set_attached(struct ofono_gprs *gprs, ofono_bool_t attached)
{
- ofono_bool_t attached;
-
- attached = gprs->driver_attached &&
- (gprs->status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
- gprs->status == NETWORK_REGISTRATION_STATUS_ROAMING);
-
if (attached == gprs->attached)
return;
@@ -1939,6 +1971,32 @@
gprs_set_attached_property(gprs, attached);
}
+static void gprs_attached_check_cb(ofono_bool_t allow, void *user_data)
+{
+ gprs_set_attached((struct ofono_gprs *)user_data, allow);
+}
+
+void gprs_attached_update(struct ofono_gprs *gprs)
+{
+ ofono_bool_t attached = gprs->driver_attached &&
+ (gprs->status == NETWORK_REGISTRATION_STATUS_REGISTERED ||
+ gprs->status == NETWORK_REGISTRATION_STATUS_ROAMING);
+
+ if (!attached) {
+ /* Cancel all other checks - nothing is allowed if we are
+ * not attached */
+ __ofono_gprs_filter_chain_cancel(gprs->filters, NULL);
+
+ /* We are done synchronously */
+ gprs_set_attached(gprs, FALSE);
+ } else {
+ /* This implicitely cancels the previous check if it's still
+ * running, so that we never have two simultanous checks. */
+ __ofono_gprs_filter_chain_check(gprs->filters,
+ gprs_attached_check_cb, NULL, gprs);
+ }
+}
+
static void registration_status_cb(const struct ofono_error *error,
int status, void *data)
{
@@ -3094,7 +3152,9 @@
if (gc->driver && gc->driver->remove)
gc->driver->remove(gc);
- __ofono_gprs_filter_chain_free(gc->filters);
+ if (gc->gprs)
+ __ofono_gprs_filter_chain_cancel(gc->gprs->filters, gc);
+
g_free(gc);
}
@@ -3126,7 +3186,6 @@
if (drv->probe(gc, vendor, data) < 0)
continue;
- gc->filters = __ofono_gprs_filter_chain_new(gc);
gc->driver = drv;
break;
}
@@ -3411,6 +3470,7 @@
if (gprs->driver && gprs->driver->remove)
gprs->driver->remove(gprs);
+ __ofono_gprs_filter_chain_free(gprs->filters);
g_free(gprs);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/modem.c
^
|
@@ -190,6 +190,16 @@
return __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
}
+struct ofono_gprs *ofono_modem_get_gprs(struct ofono_modem *modem)
+{
+ return __ofono_atom_find(OFONO_ATOM_TYPE_GPRS, modem);
+}
+
+struct ofono_voicecall *ofono_modem_get_voicecall(struct ofono_modem *modem)
+{
+ return __ofono_atom_find(OFONO_ATOM_TYPE_VOICECALL, modem);
+}
+
struct ofono_atom *__ofono_modem_add_atom(struct ofono_modem *modem,
enum ofono_atom_type type,
void (*destruct)(struct ofono_atom *),
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/ofono.h
^
|
@@ -596,15 +596,44 @@
typedef void (*gprs_filter_activate_cb_t)
(const struct ofono_gprs_primary_context *ctx, void *user_data);
-struct gprs_filter_chain *__ofono_gprs_filter_chain_new
- (struct ofono_gprs_context *gc);
+typedef void (*gprs_filter_check_cb_t)(ofono_bool_t allow, void *user_data);
+struct gprs_filter_chain *__ofono_gprs_filter_chain_new(struct ofono_gprs *gp);
void __ofono_gprs_filter_chain_free(struct gprs_filter_chain *chain);
-void __ofono_gprs_filter_chain_cancel(struct gprs_filter_chain *chain);
-
+void __ofono_gprs_filter_chain_cancel(struct gprs_filter_chain *chain,
+ struct ofono_gprs_context *gc);
void __ofono_gprs_filter_chain_activate(struct gprs_filter_chain *chain,
+ struct ofono_gprs_context *gc,
const struct ofono_gprs_primary_context *ctx,
gprs_filter_activate_cb_t act, ofono_destroy_func destroy,
void *user_data);
+void __ofono_gprs_filter_chain_check(struct gprs_filter_chain *chain,
+ gprs_filter_check_cb_t cb, ofono_destroy_func destroy,
+ void *user_data);
+
+#include <ofono/voicecall-filter.h>
+
+struct voicecall_filter_chain;
+
+struct voicecall_filter_chain *__ofono_voicecall_filter_chain_new
+ (struct ofono_voicecall *vc);
+void __ofono_voicecall_filter_chain_cancel(struct voicecall_filter_chain *c,
+ const struct ofono_call *call);
+void __ofono_voicecall_filter_chain_restart(struct voicecall_filter_chain *c,
+ const struct ofono_call *call);
+void __ofono_voicecall_filter_chain_free(struct voicecall_filter_chain *c);
+void __ofono_voicecall_filter_chain_dial(struct voicecall_filter_chain *c,
+ const struct ofono_phone_number *number,
+ enum ofono_clir_option clir,
+ ofono_voicecall_filter_dial_cb_t cb,
+ ofono_destroy_func destroy, void *user_data);
+void __ofono_voicecall_filter_chain_dial_check(struct voicecall_filter_chain *c,
+ const struct ofono_call *call,
+ ofono_voicecall_filter_dial_cb_t cb,
+ ofono_destroy_func destroy, void *user_data);
+void __ofono_voicecall_filter_chain_incoming(struct voicecall_filter_chain *c,
+ const struct ofono_call *call,
+ ofono_voicecall_filter_incoming_cb_t cb,
+ ofono_destroy_func destroy, void *user_data);
#include <ofono/sim-mnclength.h>
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/plugin.c
^
|
@@ -211,17 +211,26 @@
DBG("");
+ /*
+ * Terminate the plugins but don't unload the libraries yet.
+ * Plugins may reference data structures allocated by each other.
+ */
for (list = plugins; list; list = list->next) {
struct ofono_plugin *plugin = list->data;
if (plugin->active == TRUE && plugin->desc->exit)
plugin->desc->exit();
+ }
+
+ /* Second pass - unload the libraries */
+ for (list = plugins; list; list = list->next) {
+ struct ofono_plugin *plugin = list->data;
if (plugin->handle)
dlclose(plugin->handle);
-
- g_free(plugin);
}
- g_slist_free(plugins);
+ /* Finally, free the memory */
+ g_slist_free_full(plugins, g_free);
+ plugins = NULL;
}
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/ril-transport.c
^
|
@@ -0,0 +1,78 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2018 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <ofono/ril-transport.h>
+#include <ofono/log.h>
+
+#include <string.h>
+#include <errno.h>
+
+static GSList *ril_transports = NULL;
+
+struct grilio_transport *ofono_ril_transport_connect(const char *name,
+ GHashTable *params)
+{
+ if (name) {
+ GSList *l;
+
+ for (l = ril_transports; l; l = l->next) {
+ const struct ofono_ril_transport *t = l->data;
+
+ if (!strcmp(name, t->name)) {
+ return t->connect ? t->connect(params) : NULL;
+ }
+ }
+ ofono_error("Unknown RIL transport: %s", name);
+ }
+ return NULL;
+}
+
+int ofono_ril_transport_register(const struct ofono_ril_transport *t)
+{
+ if (!t || !t->name) {
+ return -EINVAL;
+ } else {
+ GSList *l;
+
+ for (l = ril_transports; l; l = l->next) {
+ const struct ofono_ril_transport *t1 = l->data;
+
+ if (!strcmp(t->name, t1->name)) {
+ DBG("%s already registered", t->name);
+ return -EALREADY;
+ }
+ }
+
+ DBG("%s", t->name);
+ ril_transports = g_slist_append(ril_transports, (void*)t);
+ return 0;
+ }
+}
+
+void ofono_ril_transport_unregister(const struct ofono_ril_transport *t)
+{
+ if (t && t->name) {
+ DBG("%s", t->name);
+ ril_transports = g_slist_remove(ril_transports, t);
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/ussd.c
^
|
@@ -813,6 +813,22 @@
DBusConnection *conn = ofono_dbus_get_connection();
struct ofono_modem *modem = __ofono_atom_get_modem(atom);
const char *path = __ofono_atom_get_path(atom);
+ DBusMessage *reply;
+
+ if (ussd->pending) {
+ reply = __ofono_error_canceled(ussd->pending);
+ __ofono_dbus_pending_reply(&ussd->pending, reply);
+ }
+
+ if (ussd->cancel) {
+ reply = dbus_message_new_method_return(ussd->cancel);
+ __ofono_dbus_pending_reply(&ussd->cancel, reply);
+ }
+
+ if (ussd->req)
+ ussd_request_finish(ussd, -ECANCELED, 0, NULL, 0);
+
+ ussd_change_state(ussd, USSD_STATE_IDLE);
g_slist_free_full(ussd->ss_control_list, ssc_entry_destroy);
ussd->ss_control_list = NULL;
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/voicecall-filter.c
^
|
@@ -0,0 +1,662 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2018 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "ofono.h"
+#include "common.h"
+
+#include <errno.h>
+#include <string.h>
+
+struct voicecall_filter_request;
+struct voicecall_filter_request_fn {
+ const char *name;
+ gboolean (*can_process)(const struct ofono_voicecall_filter *filter);
+ guint (*process)(const struct ofono_voicecall_filter *filter,
+ struct voicecall_filter_request *req);
+ void (*allow)(struct voicecall_filter_request *req);
+ void (*free)(struct voicecall_filter_request *req);
+};
+
+struct voicecall_filter_request {
+ int refcount;
+ const struct voicecall_filter_request_fn *fn;
+ const struct ofono_call *call;
+ struct voicecall_filter_chain *chain;
+ GSList *filter_link;
+ guint pending_id;
+ guint next_id;
+ ofono_destroy_func destroy;
+ void* user_data;
+};
+
+struct voicecall_filter_request_dial {
+ struct voicecall_filter_request req;
+ const struct ofono_phone_number *number;
+ enum ofono_clir_option clir;
+ ofono_voicecall_filter_dial_cb_t cb;
+};
+
+struct voicecall_filter_request_incoming {
+ struct voicecall_filter_request req;
+ ofono_voicecall_filter_incoming_cb_t cb;
+};
+
+struct voicecall_filter_chain {
+ struct ofono_voicecall *vc;
+ GSList *req_list;
+};
+
+static GSList *voicecall_filters = NULL;
+
+static void voicecall_filter_request_init(struct voicecall_filter_request *req,
+ const struct voicecall_filter_request_fn *fn,
+ struct voicecall_filter_chain *chain, const struct ofono_call *call,
+ ofono_destroy_func destroy, void *user_data)
+{
+ req->fn = fn;
+ req->chain = chain;
+ req->call = call;
+ req->filter_link = voicecall_filters;
+ req->destroy = destroy;
+ req->user_data = user_data;
+
+ /*
+ * The list holds an implicit reference to the message. The reference
+ * is released by voicecall_filter_request_free when the message is
+ * removed from the list.
+ */
+ req->refcount = 1;
+ chain->req_list = g_slist_append(chain->req_list, req);
+}
+
+static void voicecall_filter_request_cancel
+ (struct voicecall_filter_request *req)
+{
+ if (req->pending_id) {
+ const struct ofono_voicecall_filter *f = req->filter_link->data;
+
+ /*
+ * If the filter returns id of the pending operation,
+ * then it must provide the cancel callback
+ */
+ f->filter_cancel(req->pending_id);
+ req->pending_id = 0;
+ }
+ if (req->next_id) {
+ g_source_remove(req->next_id);
+ req->next_id = 0;
+ }
+}
+
+static void voicecall_filter_request_dispose
+ (struct voicecall_filter_request *req)
+{
+ /* May be invoked several times per request */
+ if (req->destroy) {
+ ofono_destroy_func destroy = req->destroy;
+
+ req->destroy = NULL;
+ destroy(req->user_data);
+ }
+}
+
+static void voicecall_filter_request_free(struct voicecall_filter_request *req)
+{
+ voicecall_filter_request_dispose(req);
+ req->fn->free(req);
+}
+
+#define voicecall_filter_request_ref(req) ((req)->refcount++, req)
+
+static int voicecall_filter_request_unref(struct voicecall_filter_request *req)
+{
+ const int refcount = --(req->refcount);
+
+ if (!refcount) {
+ voicecall_filter_request_free(req);
+ }
+ return refcount;
+}
+
+static void voicecall_filter_request_done(struct voicecall_filter_request *req)
+{
+ /* Zero the pointer to it in case if this is not the last reference. */
+ req->chain = NULL;
+ voicecall_filter_request_unref(req);
+}
+
+static void voicecall_filter_request_dequeue
+ (struct voicecall_filter_request *req)
+{
+ struct voicecall_filter_chain *chain = req->chain;
+ GSList *l;
+
+ /*
+ * Single-linked list is not particularly good at searching
+ * and removing the elements but since it should be pretty
+ * short (typically just one request), it's not worth optimization.
+ */
+ if (chain && (l = g_slist_find(chain->req_list, req)) != NULL) {
+ voicecall_filter_request_done(l->data);
+ chain->req_list = g_slist_delete_link(chain->req_list, l);
+ }
+}
+
+static void voicecall_filter_request_complete
+ (struct voicecall_filter_request *req,
+ void (*complete)(struct voicecall_filter_request *req))
+{
+ voicecall_filter_request_ref(req);
+ complete(req);
+ voicecall_filter_request_dispose(req);
+ voicecall_filter_request_dequeue(req);
+ voicecall_filter_request_unref(req);
+}
+
+static void voicecall_filter_request_process
+ (struct voicecall_filter_request *req)
+{
+ GSList *l = req->filter_link;
+ const struct ofono_voicecall_filter *f = l->data;
+ const struct voicecall_filter_request_fn *fn = req->fn;
+
+ while (f && !fn->can_process(f)) {
+ l = l->next;
+ f = l ? l->data : NULL;
+ }
+
+ voicecall_filter_request_ref(req);
+ if (f) {
+ req->filter_link = l;
+ req->pending_id = fn->process(f, req);
+ } else {
+ voicecall_filter_request_complete(req, fn->allow);
+ }
+ voicecall_filter_request_unref(req);
+}
+
+static void voicecall_filter_request_next(struct voicecall_filter_request *req,
+ GSourceFunc fn)
+{
+ req->pending_id = 0;
+ req->next_id = g_idle_add(fn, req);
+}
+
+static gboolean voicecall_filter_request_continue_cb(gpointer data)
+{
+ struct voicecall_filter_request *req = data;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/src/voicecall.c
^
|
@@ -78,6 +78,8 @@
struct ofono_emulator *pending_em;
unsigned int pending_id;
struct voicecall_agent *vc_agent;
+ struct voicecall_filter_chain *filters;
+ GSList *incoming_filter_list;
};
struct voicecall {
@@ -118,6 +120,14 @@
int status;
};
+struct dial_filter_req {
+ struct ofono_voicecall *vc;
+ struct ofono_phone_number pn;
+ enum ofono_clir_option clir;
+ ofono_voicecall_cb_t cb;
+ void *data;
+};
+
static const char *default_en_list[] = { "911", "112", NULL };
static const char *default_en_list_no_sim[] = { "119", "118", "999", "110",
"08", "000", NULL };
@@ -694,6 +704,9 @@
{
struct voicecall *voicecall = (struct voicecall *)userdata;
+ __ofono_voicecall_filter_chain_cancel(voicecall->vc->filters,
+ voicecall->call);
+
g_free(voicecall->call);
g_free(voicecall->message);
@@ -1496,7 +1509,7 @@
}
- reply = __ofono_error_failed(vc->pending);
+ reply = __ofono_error_from_error(error, vc->pending);
}
__ofono_dbus_pending_reply(&vc->pending, reply);
@@ -1505,6 +1518,168 @@
voicecalls_emit_call_added(vc, v);
}
+static void dummy_callback(const struct ofono_error *error, void *data)
+{
+ if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
+ DBG("command failed with error: %s",
+ telephony_error_to_str(error));
+}
+
+static void filter_hangup(struct voicecall *v)
+{
+ struct ofono_voicecall *vc = v->vc;
+ const struct ofono_call *call = v->call;
+ const struct ofono_voicecall_driver *driver = vc->driver;
+
+ switch (call->status) {
+ case OFONO_CALL_STATUS_WAITING:
+ if (driver->set_udub) {
+ driver->set_udub(vc, dummy_callback, vc);
+ return;
+ } else if (driver->release_specific) {
+ driver->release_specific(vc, call->id,
+ dummy_callback, vc);
+ return;
+ }
+ break;
+ case OFONO_CALL_STATUS_ACTIVE:
+ case OFONO_CALL_STATUS_DIALING:
+ case OFONO_CALL_STATUS_ALERTING:
+ if (driver->hangup_active) {
+ driver->hangup_active(vc, dummy_callback, vc);
+ return;
+ }
+ /* no break */
+ default:
+ if (driver->release_specific) {
+ driver->release_specific(vc, call->id,
+ dummy_callback, vc);
+ return;
+ }
+ break;
+ }
+
+ ofono_warn("Couldn't disconnect %s call %d",
+ call_status_to_string(call->status), call->id);
+}
+
+static void filter_dial_check_cb(enum ofono_voicecall_filter_dial_result result,
+ void *data)
+{
+ struct voicecall *v = data;
+
+ if (result == OFONO_VOICECALL_FILTER_DIAL_CONTINUE) {
+ DBG("No need to release %s call %d",
+ call_status_to_string(v->call->status), v->call->id);
+ } else {
+ DBG("Need to release %s call %d",
+ call_status_to_string(v->call->status), v->call->id);
+ filter_hangup(v);
+ }
+}
+
+static void filter_incoming_check_cb
+ (enum ofono_voicecall_filter_incoming_result result, void *data)
+{
+ struct voicecall *v = data;
+
+ if (result == OFONO_VOICECALL_FILTER_INCOMING_CONTINUE) {
+ DBG("No need to release %s call %d",
+ call_status_to_string(v->call->status), v->call->id);
+ } else {
+ DBG("Need to release %s call %d",
+ call_status_to_string(v->call->status), v->call->id);
+ filter_hangup(v);
+ }
+}
+
+static void filter_incoming_cb(enum ofono_voicecall_filter_incoming_result res,
+ void *data)
+{
+ struct voicecall *v = data;
+ struct ofono_voicecall *vc = v->vc;
+
+ vc->incoming_filter_list = g_slist_remove(vc->incoming_filter_list, v);
+ if (res == OFONO_VOICECALL_FILTER_INCOMING_HANGUP) {
+ if (vc->driver->release_specific) {
+ vc->driver->release_specific(vc, v->call->id,
+ dummy_callback, vc);
+ }
+ voicecall_destroy(v);
+ } else if (res == OFONO_VOICECALL_FILTER_INCOMING_IGNORE) {
+ voicecall_destroy(v);
+ } else if (voicecall_dbus_register(v)) {
+ struct ofono_voicecall *vc = v->vc;
+
+ vc->call_list = g_slist_insert_sorted(vc->call_list, v,
+ call_compare);
+ voicecalls_emit_call_added(vc, v);
+ }
+}
+
+void ofono_voicecall_filter_notify(struct ofono_voicecall *vc)
+{
+ GSList *l;
+ struct voicecall *v;
+
+ /* Cancel all active filtering requests */
+ __ofono_voicecall_filter_chain_cancel(vc->filters, NULL);
+
+ /* Re-check incoming_filter_list */
+ for (l = vc->incoming_filter_list; l; l = l->next) {
+ v = l->data;
+ __ofono_voicecall_filter_chain_incoming(vc->filters, v->call,
+ filter_incoming_cb, NULL, v);
+ }
+
+ /* Re-check the calls that have already passed the filter */
+ for (l = vc->call_list; l; l = l->next) {
+ v = l->data;
+ if (v->call->direction == CALL_DIRECTION_MOBILE_ORIGINATED) {
+ __ofono_voicecall_filter_chain_dial_check(vc->filters,
+ v->call, filter_dial_check_cb, NULL, v);
+ } else {
+ __ofono_voicecall_filter_chain_incoming(vc->filters,
+ v->call, filter_incoming_check_cb, NULL, v);
+ }
+ }
+}
+
+static void dial_filter_cb(enum ofono_voicecall_filter_dial_result result,
+ void *req_data)
+{
+ struct dial_filter_req *req = req_data;
+
+ if (result == OFONO_VOICECALL_FILTER_DIAL_BLOCK) {
+ struct ofono_error error;
+
+ error.type = OFONO_ERROR_TYPE_ERRNO;
+ error.error = EACCES;
+ req->cb(&error, req->data);
+ } else {
+ struct ofono_voicecall *vc = req->vc;
+
+ /* OFONO_VOICECALL_FILTER_DIAL_CONTINUE */
+ vc->driver->dial(vc, &req->pn, req->clir, req->cb, req->data);
+ }
+}
+
+static void dial_filter(struct ofono_voicecall *vc,
+ const struct ofono_phone_number *pn,
+ enum ofono_clir_option clir,
+ ofono_voicecall_cb_t cb, void *data)
+{
+ struct dial_filter_req *req = g_new0(struct dial_filter_req, 1);
+
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/unit/coverage
^
|
@@ -21,7 +21,9 @@
test-provision \
test-ril_util \
test-ril_config \
+ test-ril-transport \
test-sms-filter \
+ test-voicecall-filter \
test-sailfish_cell_info \
test-sailfish_cell_info_dbus \
test-sailfish_manager \
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/unit/test-gprs-filter.c
^
|
@@ -15,6 +15,7 @@
#include "ofono.h"
+#include <gutil_macros.h>
#include <gutil_log.h>
#include <errno.h>
@@ -24,8 +25,8 @@
static gboolean test_debug = FALSE;
static GMainLoop *test_loop = NULL;
static int test_filter_cancel_count;
-static int test_filter_continue_count;
-static int test_filter_invalid_count;
+static int test_filter_activate_count;
+static int test_filter_check_count;
struct test_later_data {
ofono_gprs_filter_activate_cb_t cb;
@@ -33,11 +34,21 @@
void *user_data;
};
+struct test_check_later_data {
+ ofono_bool_t allow;
+ ofono_gprs_filter_check_cb_t cb;
+ void *user_data;
+};
+
/* Fake data structures */
struct ofono_gprs_context {
- struct gprs_filter_chain *chain;
struct ofono_gprs_primary_context ctx;
+ struct ofono_gprs *gprs;
+};
+
+struct ofono_gprs {
+ struct gprs_filter_chain *chain;
};
/* Code shared by all tests */
@@ -59,14 +70,14 @@
(*(int*)data)++;
}
-static void test_expect_allow
+static void test_activate_expect_allow
(const struct ofono_gprs_primary_context *ctx, void *data)
{
g_assert(ctx);
if (data) (*(int*)data)++;
}
-static void test_expect_allow_and_quit
+static void test_activate_expect_allow_and_quit
(const struct ofono_gprs_primary_context *ctx, void *data)
{
g_assert(ctx);
@@ -74,14 +85,14 @@
g_main_loop_quit(test_loop);
}
-static void test_expect_disallow
+static void test_activate_expect_disallow
(const struct ofono_gprs_primary_context *ctx, void *data)
{
g_assert(!ctx);
if (data) (*(int*)data)++;
}
-static void test_expect_disallow_and_quit
+static void test_activate_expect_disallow_and_quit
(const struct ofono_gprs_primary_context *ctx, void *data)
{
g_assert(!ctx);
@@ -89,11 +100,31 @@
g_main_loop_quit(test_loop);
}
+static void test_check_expect_allow(ofono_bool_t allow, void *data)
+{
+ g_assert(allow);
+ if (data) (*(int*)data)++;
+}
+
+static void test_check_expect_allow_and_quit(ofono_bool_t allow, void *data)
+{
+ g_assert(allow);
+ if (data) (*(int*)data)++;
+ g_main_loop_quit(test_loop);
+}
+
+static void test_check_expect_disallow_and_quit(ofono_bool_t allow, void *data)
+{
+ g_assert(!allow);
+ if (data) (*(int*)data)++;
+ g_main_loop_quit(test_loop);
+}
+
static void test_clear_counts()
{
test_filter_cancel_count = 0;
- test_filter_continue_count = 0;
- test_filter_invalid_count = 0;
+ test_filter_activate_count = 0;
+ test_filter_check_count = 0;
}
static void test_common_init()
@@ -105,6 +136,20 @@
}
}
+static void test_gc_init(struct ofono_gprs *gprs,
+ struct ofono_gprs_context *gc)
+{
+ memset(gc, 0, sizeof(*gc));
+ gc->gprs = gprs;
+}
+
+static void test_gprs_init(struct ofono_gprs *gprs,
+ struct ofono_gprs_context *gc)
+{
+ memset(gprs, 0, sizeof(*gprs));
+ test_gc_init(gprs, gc);
+}
+
static void test_common_deinit()
{
g_main_loop_unref(test_loop);
@@ -161,7 +206,7 @@
const struct ofono_gprs_primary_context *ctx,
ofono_gprs_filter_activate_cb_t cb, void *user_data)
{
- test_filter_continue_count++;
+ test_filter_activate_count++;
cb(ctx, user_data);
return 0;
}
@@ -171,10 +216,55 @@
const struct ofono_gprs_primary_context *ctx,
ofono_gprs_filter_activate_cb_t cb, void *user_data)
{
- test_filter_continue_count++;
+ test_filter_activate_count++;
return filter_later(cb, ctx, user_data);
}
+static gboolean filter_check_later_cb(gpointer user_data)
+{
+ struct test_check_later_data* later = user_data;
+
+ later->cb(later->allow, later->user_data);
+ return G_SOURCE_REMOVE;
+}
+
+static unsigned int filter_check_later(ofono_bool_t allow,
+ ofono_gprs_filter_check_cb_t cb, void *user_data)
+{
+ struct test_check_later_data* later =
+ g_new0(struct test_check_later_data, 1);
+
+ later->allow = allow;
+ later->cb = cb;
+ later->user_data = user_data;
+
+ return g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, filter_check_later_cb,
+ later, g_free);
+}
+
+static unsigned int filter_check_allow(struct ofono_gprs *gprs,
+ ofono_gprs_filter_check_cb_t cb, void *data)
+{
+ test_filter_check_count++;
+ cb(TRUE, data);
+ return 0;
+}
+
+static unsigned int filter_check_disallow(struct ofono_gprs *gprs,
+ ofono_gprs_filter_check_cb_t cb, void *data)
+{
+ test_filter_check_count++;
+ cb(FALSE, data);
+ return 0;
+}
+
+static unsigned int filter_check_disallow_later(struct ofono_gprs *gprs,
+ ofono_gprs_filter_check_cb_t cb, void *data)
+{
+ test_filter_check_count++;
+ return filter_check_later(FALSE, cb, data);
+}
+
static void filter_cancel(unsigned int id)
{
g_source_remove(id);
@@ -204,15 +294,24 @@
g_assert(ofono_gprs_filter_register(&noname) == -EINVAL);
g_assert(ofono_gprs_filter_register(&misc) == 0);
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/unit/test-ril-transport.c
^
|
@@ -0,0 +1,97 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2018 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "ofono.h"
+#include <ofono/ril-transport.h>
+
+#include <string.h>
+#include <errno.h>
+
+static void test_null(void)
+{
+ struct ofono_ril_transport noname;
+
+ memset(&noname, 0, sizeof(noname));
+ g_assert(ofono_ril_transport_register(NULL) == -EINVAL);
+ g_assert(ofono_ril_transport_register(&noname) == -EINVAL);
+ ofono_ril_transport_unregister(NULL);
+ ofono_ril_transport_unregister(&noname);
+ g_assert(!ofono_ril_transport_connect(NULL, NULL));
+}
+
+static void test_register(void)
+{
+ struct ofono_ril_transport foo;
+ struct ofono_ril_transport bar;
+
+ memset(&foo, 0, sizeof(foo));
+ memset(&bar, 0, sizeof(bar));
+
+ foo.name = "foo";
+ bar.name = "bar";
+ g_assert(ofono_ril_transport_register(&foo) == 0);
+ g_assert(ofono_ril_transport_register(&bar) == 0);
+ g_assert(ofono_ril_transport_register(&bar) == (-EALREADY));
+ g_assert(!ofono_ril_transport_connect(foo.name, NULL));
+ g_assert(!ofono_ril_transport_connect("test", NULL));
+ ofono_ril_transport_unregister(&foo);
+ ofono_ril_transport_unregister(&bar);
+}
+
+static struct grilio_transport *test_connect_cb(GHashTable *params)
+{
+ static int dummy;
+
+ return (void*)&dummy;
+}
+
+static void test_connect(void)
+{
+ static const struct ofono_ril_transport test = {
+ .name = "test",
+ .api_version = OFONO_RIL_TRANSPORT_API_VERSION,
+ .connect = test_connect_cb
+ };
+
+ g_assert(ofono_ril_transport_register(&test) == 0);
+ /* The returned pointer points to a static variable, no need to free */
+ g_assert(ofono_ril_transport_connect(test.name, NULL));
+ ofono_ril_transport_unregister(&test);
+}
+
+#define TEST_(name) "/ril-transport/" name
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ __ofono_log_init("test-ril_util",
+ g_test_verbose() ? "*" : NULL,
+ FALSE, FALSE);
+
+ g_test_add_func(TEST_("null"), test_null);
+ g_test_add_func(TEST_("register"), test_register);
+ g_test_add_func(TEST_("connect"), test_connect);
+
+ return g_test_run();
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/unit/test-ril_util.c
^
|
@@ -81,27 +81,6 @@
g_assert(!op.tech);
}
-void test_parse_int(void)
-{
- int value;
-
- g_assert(!ril_parse_int(NULL, 0, NULL));
- g_assert(!ril_parse_int("", 0, NULL));
- g_assert(!ril_parse_int("garbage", 0, NULL));
- g_assert(!ril_parse_int("0 trailing garbage", 0, NULL));
- g_assert(ril_parse_int("0", 0, NULL));
- g_assert(ril_parse_int("0", 0, &value));
- g_assert(value == 0);
- g_assert(!ril_parse_int("0x10000000000000000", 0, &value));
- g_assert(!ril_parse_int("-2147483649", 0, &value));
- g_assert(!ril_parse_int("4294967295", 0, &value));
- g_assert(ril_parse_int(" 0x7fffffff ", 0, &value));
- g_assert(value == 0x7fffffff);
- g_assert(ril_parse_int(" 7fffffff ", 16, &value));
- g_assert(value == 0x7fffffff);
- g_assert(!ril_parse_int("0xffffffff", 0, &value));
-}
-
void test_strings(void)
{
g_assert(!g_strcmp0(ril_error_to_string(RIL_E_SUCCESS), "OK"));
@@ -128,7 +107,6 @@
g_test_add_func(TEST_("parse_tech"), test_parse_tech);
g_test_add_func(TEST_("parse_mcc_mnc"), test_parse_mcc_mnc);
- g_test_add_func(TEST_("parse_int"), test_parse_int);
g_test_add_func(TEST_("strings"), test_strings);
return g_test_run();
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.21+git32.tar.bz2/ofono/unit/test-voicecall-filter.c
^
|
@@ -0,0 +1,1210 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2018 Jolla Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "ofono.h"
+#include "common.h"
+
+#include <gutil_macros.h>
+#include <gutil_log.h>
+
+#include <errno.h>
+
+#define TEST_TIMEOUT_SEC (20)
+
+static gboolean test_debug = FALSE;
+static GMainLoop *test_loop = NULL;
+static int test_filter_dial_count = 0;
+static int test_filter_incoming_count = 0;
+
+/* Fake data structures */
+
+struct ofono_voicecall {
+ struct voicecall_filter_chain *chain;
+};
+
+/* Code shared by all tests */
+
+static gboolean test_timeout_cb(gpointer user_data)
+{
+ g_assert(FALSE);
+ return G_SOURCE_REMOVE;
+}
+
+static gboolean test_quit_cb(gpointer user_data)
+{
+ g_main_loop_quit(test_loop);
+ return G_SOURCE_REMOVE;
+}
+
+static gboolean test_cancel_cb(void* data)
+{
+ struct voicecall_filter_chain *chain = data;
+
+ DBG("");
+ __ofono_voicecall_filter_chain_cancel(chain, NULL);
+ g_idle_add(test_quit_cb, NULL);
+ return G_SOURCE_REMOVE;
+}
+
+static void test_inc(gpointer data)
+{
+ (*(int*)data)++;
+}
+
+static void test_dial_expect_continue_inc
+ (enum ofono_voicecall_filter_dial_result result, void *data)
+{
+ g_assert(result == OFONO_VOICECALL_FILTER_DIAL_CONTINUE);
+ if (data) (*(int*)data)++;
+}
+
+static void test_dial_expect_continue_and_quit
+ (enum ofono_voicecall_filter_dial_result result, void *data)
+{
+ g_assert(result == OFONO_VOICECALL_FILTER_DIAL_CONTINUE);
+ g_main_loop_quit(test_loop);
+}
+
+static void test_dial_expect_block_and_quit
+ (enum ofono_voicecall_filter_dial_result result, void *data)
+{
+ g_assert(result == OFONO_VOICECALL_FILTER_DIAL_BLOCK);
+ g_main_loop_quit(test_loop);
+}
+
+static void test_dial_unexpected
+ (enum ofono_voicecall_filter_dial_result result, void *data)
+{
+ g_assert(FALSE);
+}
+
+static void test_incoming_expect_continue_inc
+ (enum ofono_voicecall_filter_incoming_result result, void *data)
+{
+ g_assert(result == OFONO_VOICECALL_FILTER_INCOMING_CONTINUE);
+ if (data) (*(int*)data)++;
+}
+
+static void test_incoming_expect_continue_and_quit
+ (enum ofono_voicecall_filter_incoming_result result, void *data)
+{
+ g_assert(result == OFONO_VOICECALL_FILTER_INCOMING_CONTINUE);
+ g_main_loop_quit(test_loop);
+}
+
+static void test_incoming_expect_hangup_and_quit
+ (enum ofono_voicecall_filter_incoming_result result, void *data)
+{
+ g_assert(result == OFONO_VOICECALL_FILTER_INCOMING_HANGUP);
+ g_main_loop_quit(test_loop);
+}
+
+static void test_incoming_expect_ignore_and_quit
+ (enum ofono_voicecall_filter_incoming_result result, void *data)
+{
+ g_assert(result == OFONO_VOICECALL_FILTER_INCOMING_IGNORE);
+ g_main_loop_quit(test_loop);
+}
+
+static void test_incoming_unexpected
+ (enum ofono_voicecall_filter_incoming_result result, void *data)
+{
+ g_assert(FALSE);
+}
+
+static void test_clear_counts()
+{
+ test_filter_dial_count = 0;
+ test_filter_incoming_count = 0;
+}
+
+static void test_common_init()
+{
+ test_clear_counts();
+ test_loop = g_main_loop_new(NULL, FALSE);
+ if (!test_debug) {
+ g_timeout_add_seconds(TEST_TIMEOUT_SEC, test_timeout_cb, NULL);
+ }
+}
+
+static void test_voicecall_init(struct ofono_voicecall *vc)
+{
+ memset(vc, 0, sizeof(*vc));
+}
+
+static void test_common_deinit()
+{
+ g_main_loop_unref(test_loop);
+ test_loop = NULL;
+}
+
+struct filter_dial_later_data {
+ ofono_voicecall_filter_dial_cb_t cb;
+ enum ofono_voicecall_filter_dial_result result;
+ void *user_data;
+};
+
+static gboolean filter_dial_later_cb(gpointer user_data)
+{
+ struct filter_dial_later_data* later = user_data;
+
+ test_filter_dial_count++;
+ later->cb(later->result, later->user_data);
+ return G_SOURCE_REMOVE;
+}
+
+static unsigned int filter_dial_later(ofono_voicecall_filter_dial_cb_t cb,
+ enum ofono_voicecall_filter_dial_result result, void *user_data)
+{
+ struct filter_dial_later_data* later =
+ g_new0(struct filter_dial_later_data, 1);
+
+ later->cb = cb;
+ later->result = result;
+ later->user_data = user_data;
+
+ return g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, filter_dial_later_cb,
+ later, g_free);
+}
+
+static unsigned int filter_dial_continue(struct ofono_voicecall *vc,
+ const struct ofono_phone_number *number, enum ofono_clir_option clir,
+ ofono_voicecall_filter_dial_cb_t cb, void *user_data)
+{
+ test_filter_dial_count++;
+ cb(OFONO_VOICECALL_FILTER_DIAL_CONTINUE, user_data);
+ return 0;
+}
+
+static unsigned int filter_dial_continue_later(struct ofono_voicecall *vc,
+ const struct ofono_phone_number *number, enum ofono_clir_option clir,
+ ofono_voicecall_filter_dial_cb_t cb, void *user_data)
+{
+ return filter_dial_later(cb, OFONO_VOICECALL_FILTER_DIAL_CONTINUE,
+ user_data);
+}
+
+static unsigned int filter_dial_block(struct ofono_voicecall *vc,
|