forked from sailfishos/ofono
Compare commits
10 Commits
mer/1.23+g
...
mer/1.23+g
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3eb9b868b | ||
|
|
4e067fa827 | ||
|
|
2ee5e4c827 | ||
|
|
1366e426be | ||
|
|
586c9b9262 | ||
|
|
83554e071a | ||
|
|
dc41c2d003 | ||
|
|
550d41ae37 | ||
|
|
60e4246d93 | ||
|
|
50619607b0 |
@@ -24,6 +24,7 @@ struct ril_cbs {
|
||||
GRilIoChannel *io;
|
||||
GRilIoQueue *q;
|
||||
char *log_prefix;
|
||||
guint register_id;
|
||||
gulong event_id;
|
||||
};
|
||||
|
||||
@@ -51,6 +52,12 @@ static struct ril_cbs_cbd *ril_cbs_cbd_new(struct ril_cbs *cd,
|
||||
return cbd;
|
||||
}
|
||||
|
||||
static gboolean ril_cbs_retry(GRilIoRequest *request, int ril_status,
|
||||
const void *resp_data, guint resp_len, void *user_data)
|
||||
{
|
||||
return ril_status == RIL_E_INVALID_STATE;
|
||||
}
|
||||
|
||||
static void ril_cbs_request_activation(struct ril_cbs *cd,
|
||||
gboolean activate, GRilIoChannelResponseFunc response,
|
||||
GDestroyNotify destroy, void* user_data)
|
||||
@@ -61,6 +68,9 @@ static void ril_cbs_request_activation(struct ril_cbs *cd,
|
||||
grilio_request_append_int32(req, activate ? 0 :1);
|
||||
|
||||
DBG_(cd, "%sactivating CB", activate ? "" : "de");
|
||||
grilio_request_set_retry_func(req, ril_cbs_retry);
|
||||
grilio_request_set_retry(req, RIL_CBS_CHECK_RETRY_MS,
|
||||
RIL_CBS_CHECK_RETRY_COUNT);
|
||||
grilio_queue_send_request_full(cd->q, req,
|
||||
RIL_REQUEST_GSM_SMS_BROADCAST_ACTIVATION,
|
||||
response, destroy, user_data);
|
||||
@@ -97,6 +107,9 @@ static void ril_cbs_set_config(struct ril_cbs *cd, const char *topics,
|
||||
}
|
||||
|
||||
DBG_(cd, "configuring CB");
|
||||
grilio_request_set_retry_func(req, ril_cbs_retry);
|
||||
grilio_request_set_retry(req, RIL_CBS_CHECK_RETRY_MS,
|
||||
RIL_CBS_CHECK_RETRY_COUNT);
|
||||
grilio_queue_send_request_full(cd->q, req,
|
||||
RIL_REQUEST_GSM_SET_BROADCAST_SMS_CONFIG,
|
||||
response, destroy, user_data);
|
||||
@@ -152,28 +165,33 @@ static void ril_cbs_notify(GRilIoChannel *io, guint code,
|
||||
if (grilio_parser_get_uint32(&rilp, &pdu_len)) {
|
||||
const void* pdu = grilio_parser_get_bytes(&rilp, pdu_len);
|
||||
|
||||
if (pdu) {
|
||||
/*
|
||||
* By default assume that it's a length followed by the
|
||||
* binary PDU data.
|
||||
*/
|
||||
if (pdu && grilio_parser_bytes_remaining(&rilp) < 4) {
|
||||
DBG_(cd, "%u bytes", pdu_len);
|
||||
ofono_cbs_notify(cd->cbs, pdu, pdu_len);
|
||||
} else {
|
||||
/*
|
||||
* But I've seen cell broadcasts arriving without
|
||||
* the length, simply as a blob.
|
||||
*/
|
||||
ofono_cbs_notify(cd->cbs, data, len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ril_cbs_probe_done_cb(GRilIoChannel *io, int status,
|
||||
const void *data, guint len, void *user_data)
|
||||
static gboolean ril_cbs_register(void *user_data)
|
||||
{
|
||||
struct ril_cbs *cd = user_data;
|
||||
|
||||
if (status == RIL_E_SUCCESS) {
|
||||
DBG_(cd, "registering for CB");
|
||||
cd->event_id = grilio_channel_add_unsol_event_handler(cd->io,
|
||||
ril_cbs_notify, RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS,
|
||||
cd);
|
||||
ofono_cbs_register(cd->cbs);
|
||||
} else {
|
||||
DBG_(cd, "failed to query CB config");
|
||||
ofono_cbs_remove(cd->cbs);
|
||||
}
|
||||
DBG_(cd, "registering for CB");
|
||||
cd->register_id = 0;
|
||||
cd->event_id = grilio_channel_add_unsol_event_handler(cd->io,
|
||||
ril_cbs_notify, RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS, cd);
|
||||
ofono_cbs_register(cd->cbs);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static int ril_cbs_probe(struct ofono_cbs *cbs, unsigned int vendor,
|
||||
@@ -181,7 +199,6 @@ static int ril_cbs_probe(struct ofono_cbs *cbs, unsigned int vendor,
|
||||
{
|
||||
struct ril_modem *modem = data;
|
||||
struct ril_cbs *cd = g_try_new0(struct ril_cbs, 1);
|
||||
GRilIoRequest* req = grilio_request_new();
|
||||
|
||||
ofono_cbs_set_data(cbs, cd);
|
||||
cd->log_prefix = (modem->log_prefix && modem->log_prefix[0]) ?
|
||||
@@ -191,20 +208,7 @@ static int ril_cbs_probe(struct ofono_cbs *cbs, unsigned int vendor,
|
||||
DBG_(cd, "");
|
||||
cd->io = grilio_channel_ref(ril_modem_io(modem));
|
||||
cd->q = grilio_queue_new(cd->io);
|
||||
|
||||
/*
|
||||
* RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG often fails at startup
|
||||
* especially if other RIL requests are running in parallel. We may
|
||||
* have to retry a few times. Also, make it blocking in order to
|
||||
* improve the chance of success.
|
||||
*/
|
||||
grilio_request_set_retry(req, RIL_CBS_CHECK_RETRY_MS,
|
||||
RIL_CBS_CHECK_RETRY_COUNT);
|
||||
grilio_request_set_blocking(req, TRUE);
|
||||
grilio_queue_send_request_full(cd->q, req,
|
||||
RIL_REQUEST_GSM_GET_BROADCAST_SMS_CONFIG,
|
||||
ril_cbs_probe_done_cb, NULL, cd);
|
||||
grilio_request_unref(req);
|
||||
cd->register_id = g_idle_add(ril_cbs_register, cd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -213,6 +217,9 @@ static void ril_cbs_remove(struct ofono_cbs *cbs)
|
||||
struct ril_cbs *cd = ofono_cbs_get_data(cbs);
|
||||
|
||||
DBG_(cd, "");
|
||||
if (cd->register_id) {
|
||||
g_source_remove(cd->register_id);
|
||||
}
|
||||
ofono_cbs_set_data(cbs, NULL);
|
||||
grilio_channel_remove_handler(cd->io, cd->event_id);
|
||||
grilio_channel_unref(cd->io);
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
#include "ofono.h"
|
||||
|
||||
#pragma message("PLUGINDIR="PLUGINDIR)
|
||||
|
||||
static GSList *plugins = NULL;
|
||||
|
||||
struct ofono_plugin {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2015-2020 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
|
||||
@@ -1757,7 +1758,7 @@ gboolean sms_udh_iter_init_from_cbs(const struct cbs *cbs,
|
||||
return FALSE;
|
||||
|
||||
hdr = cbs->ud;
|
||||
max_ud_len = 82;
|
||||
max_ud_len = cbs->udlen;
|
||||
|
||||
/* Must have at least one information-element if udhi is true */
|
||||
if (hdr[0] < 2)
|
||||
@@ -3856,8 +3857,8 @@ gboolean cbs_dcs_decode(guint8 dcs, gboolean *udhi, enum sms_class *cls,
|
||||
|
||||
gboolean cbs_decode(const unsigned char *pdu, int len, struct cbs *out)
|
||||
{
|
||||
/* CBS is always a fixed length of 88 bytes */
|
||||
if (len != 88)
|
||||
/* CBS is (almost) always a fixed length of 88 bytes */
|
||||
if (len < 6 || len > 88)
|
||||
return FALSE;
|
||||
|
||||
out->gs = (enum cbs_geo_scope) ((pdu[0] >> 6) & 0x03);
|
||||
@@ -3868,6 +3869,10 @@ gboolean cbs_decode(const unsigned char *pdu, int len, struct cbs *out)
|
||||
out->max_pages = pdu[5] & 0xf;
|
||||
out->page = (pdu[5] >> 4) & 0xf;
|
||||
|
||||
/* Allow the last fragment to be truncated */
|
||||
if (len != 88 && out->max_pages != out->page)
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
* If a mobile receives the code 0000 in either the first field or
|
||||
* the second field then it shall treat the CBS message exactly the
|
||||
@@ -3879,7 +3884,10 @@ gboolean cbs_decode(const unsigned char *pdu, int len, struct cbs *out)
|
||||
out->page = 1;
|
||||
}
|
||||
|
||||
memcpy(out->ud, pdu + 6, 82);
|
||||
out->udlen = (guint8)(len - 6);
|
||||
memcpy(out->ud, pdu + 6, out->udlen);
|
||||
if (out->udlen < 82)
|
||||
memset(out->ud + out->udlen, 0, 82 - out->udlen);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -4072,7 +4080,7 @@ char *cbs_decode_text(GSList *cbs_list, char *iso639_lang)
|
||||
if (iso639)
|
||||
bufsize -= 3;
|
||||
} else {
|
||||
bufsize += 82;
|
||||
bufsize += cbs->udlen;
|
||||
|
||||
if (iso639)
|
||||
bufsize -= 2;
|
||||
@@ -4089,7 +4097,7 @@ char *cbs_decode_text(GSList *cbs_list, char *iso639_lang)
|
||||
if (sms_udh_iter_init_from_cbs(cbs, &iter))
|
||||
taken = sms_udh_iter_get_udh_length(&iter) + 1;
|
||||
|
||||
unpack_7bit_own_buf(cbs->ud + taken, 82 - taken,
|
||||
unpack_7bit_own_buf(cbs->ud + taken, cbs->udlen - taken,
|
||||
taken, FALSE, 2,
|
||||
NULL, 0,
|
||||
(unsigned char *)iso639_lang);
|
||||
@@ -4122,7 +4130,7 @@ char *cbs_decode_text(GSList *cbs_list, char *iso639_lang)
|
||||
max_chars =
|
||||
sms_text_capacity_gsm(CBS_MAX_GSM_CHARS, taken);
|
||||
|
||||
unpack_7bit_own_buf(ud + taken, 82 - taken,
|
||||
unpack_7bit_own_buf(ud + taken, cbs->udlen - taken,
|
||||
taken, FALSE, max_chars,
|
||||
&written, 0, unpacked);
|
||||
|
||||
@@ -4156,7 +4164,7 @@ char *cbs_decode_text(GSList *cbs_list, char *iso639_lang)
|
||||
* the check here since the specification isn't clear
|
||||
*/
|
||||
} else {
|
||||
int num_ucs2_chars = (82 - taken) >> 1;
|
||||
int num_ucs2_chars = (cbs->udlen - taken) >> 1;
|
||||
int i = taken;
|
||||
int max_offset = taken + num_ucs2_chars * 2;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* oFono - Open Source Telephony
|
||||
*
|
||||
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
|
||||
* Copyright (C) 2015-2020 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
|
||||
@@ -398,6 +399,7 @@ struct cbs {
|
||||
guint8 dcs; /* 8 bits */
|
||||
guint8 max_pages; /* 4 bits */
|
||||
guint8 page; /* 4 bits */
|
||||
guint8 udlen;
|
||||
guint8 ud[82];
|
||||
};
|
||||
|
||||
|
||||
@@ -349,12 +349,12 @@ static int tone_queue(struct ofono_voicecall *vc, const char *tone_str,
|
||||
|
||||
/*
|
||||
* Tones can be 0-9, *, #, A-D according to 27.007 C.2.11,
|
||||
* and p for Pause.
|
||||
* and p for Pause (also , for Pause as per ITU-T V.250 6.3.1.2).
|
||||
*/
|
||||
for (i = 0; tone_str[i]; i++)
|
||||
if (!g_ascii_isdigit(tone_str[i]) && tone_str[i] != 'p' &&
|
||||
tone_str[i] != 'P' && tone_str[i] != '*' &&
|
||||
tone_str[i] != '.' && tone_str[i] != ',' &&
|
||||
tone_str[i] != ',' &&
|
||||
tone_str[i] != '#' && (tone_str[i] < 'A' ||
|
||||
tone_str[i] > 'D'))
|
||||
return -EINVAL;
|
||||
@@ -4389,7 +4389,7 @@ static void tone_request_cb(const struct ofono_error *error, void *data)
|
||||
goto done;
|
||||
}
|
||||
|
||||
len = strspn(entry->left, "pP.,");
|
||||
len = strspn(entry->left, "pP,");
|
||||
entry->left += len;
|
||||
|
||||
done:
|
||||
@@ -4423,7 +4423,7 @@ static gboolean tone_request_run(gpointer user_data)
|
||||
if (entry == NULL)
|
||||
return FALSE;
|
||||
|
||||
len = strcspn(entry->left, "pP.,");
|
||||
len = strcspn(entry->left, "pP,");
|
||||
|
||||
if (len) {
|
||||
if (len > 8) /* Arbitrary length limit per request */
|
||||
|
||||
@@ -2,7 +2,6 @@ Name: ofono
|
||||
Summary: Open Source Telephony
|
||||
Version: 1.23
|
||||
Release: 1
|
||||
Group: Communications/Connectivity Adaptation
|
||||
License: GPLv2
|
||||
URL: https://git.sailfishos.org/mer-core/ofono
|
||||
Source: %{name}-%{version}.tar.bz2
|
||||
@@ -38,13 +37,13 @@ BuildRequires: pkgconfig(mobile-broadband-provider-info)
|
||||
BuildRequires: libtool
|
||||
BuildRequires: automake
|
||||
BuildRequires: autoconf
|
||||
BuildRequires: systemd
|
||||
|
||||
%description
|
||||
Telephony stack
|
||||
|
||||
%package devel
|
||||
Summary: Headers for oFono
|
||||
Group: Development/Libraries
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
|
||||
%description devel
|
||||
@@ -52,7 +51,6 @@ Development headers and libraries for oFono
|
||||
|
||||
%package tests
|
||||
Summary: Test Scripts for oFono
|
||||
Group: Development/Libraries
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
Requires: dbus-python3
|
||||
Requires: python3-gobject
|
||||
@@ -64,7 +62,6 @@ Scripts for testing oFono and its functionality
|
||||
|
||||
%package configs-mer
|
||||
Summary: Package to provide default configs for ofono
|
||||
Group: Development/Tools
|
||||
Provides: ofono-configs
|
||||
|
||||
%description configs-mer
|
||||
@@ -72,7 +69,6 @@ This package provides default configs for ofono
|
||||
|
||||
%package doc
|
||||
Summary: Documentation for %{name}
|
||||
Group: Documentation
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
|
||||
%description doc
|
||||
@@ -98,9 +94,9 @@ autoreconf --force --install
|
||||
--disable-add-remove-context \
|
||||
--disable-isimodem \
|
||||
--disable-qmimodem \
|
||||
--with-systemdunitdir="/%{_lib}/systemd/system"
|
||||
--with-systemdunitdir=%{_unitdir}
|
||||
|
||||
make %{_smp_mflags}
|
||||
%make_build
|
||||
|
||||
%check
|
||||
# run unit tests
|
||||
@@ -111,9 +107,9 @@ rm -rf %{buildroot}
|
||||
%make_install
|
||||
|
||||
mkdir -p %{buildroot}/%{_sysconfdir}/ofono/push_forwarder.d
|
||||
mkdir -p %{buildroot}/%{_lib}/systemd/system/network.target.wants
|
||||
mkdir -p %{buildroot}%{_unitdir}/network.target.wants
|
||||
mkdir -p %{buildroot}/var/lib/ofono
|
||||
ln -s ../ofono.service %{buildroot}/%{_lib}/systemd/system/network.target.wants/ofono.service
|
||||
ln -s ../ofono.service %{buildroot}%{_unitdir}/network.target.wants/ofono.service
|
||||
|
||||
mkdir -p %{buildroot}%{_docdir}/%{name}-%{version}
|
||||
install -m0644 -t %{buildroot}%{_docdir}/%{name}-%{version} \
|
||||
@@ -139,8 +135,8 @@ systemctl daemon-reload ||:
|
||||
%license COPYING
|
||||
%config %{_sysconfdir}/dbus-1/system.d/*.conf
|
||||
%{_sbindir}/*
|
||||
/%{_lib}/systemd/system/network.target.wants/ofono.service
|
||||
/%{_lib}/systemd/system/ofono.service
|
||||
%{_unitdir}/network.target.wants/ofono.service
|
||||
%{_unitdir}/ofono.service
|
||||
%dir %{_sysconfdir}/ofono/
|
||||
%dir %{_sysconfdir}/ofono/push_forwarder.d
|
||||
# This file is part of phonesim and not needed with ofono.
|
||||
|
||||
Reference in New Issue
Block a user