[-]
[+]
|
Changed |
_service:tar_git:ofono.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:ofono.spec
^
|
|
[-]
[+]
|
Changed |
_service
^
|
@@ -2,6 +2,6 @@
<service name="tar_git">
<param name="url">https://git.merproject.org/slava/ofono.git</param>
<param name="branch">master</param>
- <param name="revision">2d18086</param>
+ <param name="revision">mer/1.19+git33</param>
</service>
</services>
|
[-]
[+]
|
Deleted |
_service:tar_git:ofono-1.19+git25.tar.bz2/ofono/drivers/ril/ril_cell_info_dbus.c
^
|
@@ -1,582 +0,0 @@
-/*
- * oFono - Open Source Telephony - RIL-based devices
- *
- * Copyright (C) 2016-2017 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 "ril_plugin.h"
-#include "ril_cell_info.h"
-#include "ril_log.h"
-
-#include <ofono/dbus.h>
-
-#include <gdbus.h>
-
-struct ril_cell_entry {
- guint cell_id;
- char *path;
- struct ril_cell cell;
-};
-
-struct ril_cell_info_dbus {
- struct ril_cell_info *info;
- DBusConnection *conn;
- char *path;
- gulong handler_id;
- guint next_cell_id;
- GSList *entries;
-};
-
-#define RIL_CELL_INFO_DBUS_INTERFACE "org.nemomobile.ofono.CellInfo"
-#define RIL_CELL_INFO_DBUS_CELLS_ADDED_SIGNAL "CellsAdded"
-#define RIL_CELL_INFO_DBUS_CELLS_REMOVED_SIGNAL "CellsRemoved"
-
-#define RIL_CELL_DBUS_INTERFACE_VERSION (1)
-#define RIL_CELL_DBUS_INTERFACE "org.nemomobile.ofono.Cell"
-#define RIL_CELL_DBUS_REGISTERED_CHANGED_SIGNAL "RegisteredChanged"
-#define RIL_CELL_DBUS_PROPERTY_CHANGED_SIGNAL "PropertyChanged"
-#define RIL_CELL_DBUS_REMOVED_SIGNAL "Removed"
-
-struct ril_cell_property {
- const char *name;
- glong off;
- int flag;
-};
-
-#define RIL_CELL_GSM_PROPERTY(value,name) \
- { #name, G_STRUCT_OFFSET(struct ril_cell_info_gsm,name), value }
-#define RIL_CELL_WCDMA_PROPERTY(value,name) \
- { #name, G_STRUCT_OFFSET(struct ril_cell_info_wcdma,name), value }
-#define RIL_CELL_LTE_PROPERTY(value,name) \
- { #name, G_STRUCT_OFFSET(struct ril_cell_info_lte,name), value }
-
-static const struct ril_cell_property ril_cell_gsm_properties [] = {
- RIL_CELL_GSM_PROPERTY(0x01,mcc),
- RIL_CELL_GSM_PROPERTY(0x02,mnc),
- RIL_CELL_GSM_PROPERTY(0x04,lac),
- RIL_CELL_GSM_PROPERTY(0x08,cid),
- RIL_CELL_GSM_PROPERTY(0x10,signalStrength),
- RIL_CELL_GSM_PROPERTY(0x20,bitErrorRate)
-};
-
-static const struct ril_cell_property ril_cell_wcdma_properties [] = {
- RIL_CELL_WCDMA_PROPERTY(0x01,mcc),
- RIL_CELL_WCDMA_PROPERTY(0x02,mnc),
- RIL_CELL_WCDMA_PROPERTY(0x04,lac),
- RIL_CELL_WCDMA_PROPERTY(0x08,cid),
- RIL_CELL_WCDMA_PROPERTY(0x10,psc),
- RIL_CELL_WCDMA_PROPERTY(0x20,signalStrength),
- RIL_CELL_WCDMA_PROPERTY(0x40,bitErrorRate)
-};
-
-static const struct ril_cell_property ril_cell_lte_properties [] = {
- RIL_CELL_LTE_PROPERTY(0x001,mcc),
- RIL_CELL_LTE_PROPERTY(0x002,mnc),
- RIL_CELL_LTE_PROPERTY(0x004,ci),
- RIL_CELL_LTE_PROPERTY(0x008,pci),
- RIL_CELL_LTE_PROPERTY(0x010,tac),
- RIL_CELL_LTE_PROPERTY(0x020,signalStrength),
- RIL_CELL_LTE_PROPERTY(0x040,rsrp),
- RIL_CELL_LTE_PROPERTY(0x080,rsrq),
- RIL_CELL_LTE_PROPERTY(0x100,rssnr),
- RIL_CELL_LTE_PROPERTY(0x200,cqi),
- RIL_CELL_LTE_PROPERTY(0x400,timingAdvance)
-};
-
-#define RIL_CELL_PROPERTY_REGISTERED 0x1000
-
-typedef void (*ril_cell_info_dbus_append_fn)(DBusMessageIter *it,
- const struct ril_cell_entry *entry);
-
-static const char *ril_cell_info_dbus_cell_type_str(enum ril_cell_info_type t)
-{
- switch (t) {
- case RIL_CELL_INFO_TYPE_GSM:
- return "gsm";
- case RIL_CELL_INFO_TYPE_CDMA:
- return "cdma";
- case RIL_CELL_INFO_TYPE_LTE:
- return "lte";
- case RIL_CELL_INFO_TYPE_WCDMA:
- return "wcdma";
- case RIL_CELL_INFO_TYPE_TD_SCDMA:
- return "tdscdma";
- case RIL_CELL_INFO_TYPE_NONE:
- default:
- return "unknown";
- }
-};
-
-static const struct ril_cell_property *ril_cell_info_dbus_cell_properties(
- enum ril_cell_info_type type, int *count)
-{
- switch (type) {
- case RIL_CELL_INFO_TYPE_GSM:
- *count = G_N_ELEMENTS(ril_cell_gsm_properties);
- return ril_cell_gsm_properties;
- case RIL_CELL_INFO_TYPE_WCDMA:
- *count = G_N_ELEMENTS(ril_cell_wcdma_properties);
- return ril_cell_wcdma_properties;
- case RIL_CELL_INFO_TYPE_LTE:
- *count = G_N_ELEMENTS(ril_cell_lte_properties);
- return ril_cell_lte_properties;
- default:
- *count = 0;
- return NULL;
- }
-};
-
-static void ril_cell_info_destroy_entry(struct ril_cell_entry *entry)
-{
- if (entry) {
- g_free(entry->path);
- g_free(entry);
- }
-}
-
-static DBusMessage *ril_cell_info_dbus_reply(DBusMessage *msg,
- const struct ril_cell_entry *entry,
- ril_cell_info_dbus_append_fn append)
-{
- DBusMessage *reply = dbus_message_new_method_return(msg);
- DBusMessageIter it;
-
- dbus_message_iter_init_append(reply, &it);
- append(&it, entry);
- return reply;
-}
-
-static void ril_cell_info_dbus_append_version(DBusMessageIter *it,
- const struct ril_cell_entry *entry)
-{
- dbus_int32_t version = RIL_CELL_DBUS_INTERFACE_VERSION;
-
- dbus_message_iter_append_basic(it, DBUS_TYPE_INT32, &version);
-}
-
-static void ril_cell_info_dbus_append_type(DBusMessageIter *it,
- const struct ril_cell_entry *entry)
-{
- const char *type = ril_cell_info_dbus_cell_type_str(entry->cell.type);
-
- dbus_message_iter_append_basic(it, DBUS_TYPE_STRING, &type);
-}
-
-static void ril_cell_info_dbus_append_registered(DBusMessageIter *it,
- const struct ril_cell_entry *entry)
-{
- dbus_bool_t registered = entry->cell.registered;
-
- dbus_message_iter_append_basic(it, DBUS_TYPE_BOOLEAN, ®istered);
-}
-
-static void ril_cell_info_dbus_append_properties(DBusMessageIter *it,
- const struct ril_cell_entry *entry)
-{
- int i, n;
- DBusMessageIter dict;
- const struct ril_cell *cell = &entry->cell;
- const struct ril_cell_property *prop =
- ril_cell_info_dbus_cell_properties(cell->type, &n);
-
- dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, "{sv}", &dict);
- for (i = 0; i < n; i++) {
- gint32 value = G_STRUCT_MEMBER(int, &cell->info, prop[i].off);
- if (value != INT_MAX) {
- ofono_dbus_dict_append(&dict, prop[i].name,
- DBUS_TYPE_INT32, &value);
- }
- }
- dbus_message_iter_close_container(it, &dict);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/.gitignore
^
|
@@ -46,6 +46,9 @@
unit/test-rilmodem-cs
unit/test-rilmodem-gprs
unit/test-rilmodem-sms
+unit/test-sailfish_cell_info
+unit/test-sailfish_manager
+unit/test-sailfish_sim_info
unit/test-*.log
unit/test-*.trs
@@ -55,6 +58,8 @@
unit/test-provision
unit/html
+plugins/sailfish_manager/*.gcda
+plugins/sailfish_manager/*.gcno
drivers/*/*.gcda
drivers/*/*.gcno
drivers/*/*.gcov
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/Makefile.am
^
|
@@ -28,8 +28,8 @@
nodist_pkginclude_HEADERS = include/version.h
if SAILFISH_MANAGER
-nodist_pkginclude_HEADERS += include/sailfish_manager.h \
- include/sailfish_watch.h
+nodist_pkginclude_HEADERS += include/sailfish_cell_info.h \
+ include/sailfish_manager.h include/sailfish_watch.h
endif
local_headers = $(foreach file,$(pkginclude_HEADERS) \
@@ -123,7 +123,9 @@
if SAILFISH_MANAGER
builtin_modules += sailfish_manager
-builtin_sources += plugins/sailfish_manager/sailfish_manager.c \
+builtin_sources += plugins/sailfish_manager/sailfish_cell_info.c \
+ plugins/sailfish_manager/sailfish_cell_info_dbus.c \
+ plugins/sailfish_manager/sailfish_manager.c \
plugins/sailfish_manager/sailfish_manager_dbus.c \
plugins/sailfish_manager/sailfish_sim_info.c \
plugins/sailfish_manager/sailfish_sim_info_dbus.c \
@@ -139,7 +141,6 @@
drivers/ril/ril_call_settings.c \
drivers/ril/ril_call_volume.c \
drivers/ril/ril_cell_info.c \
- drivers/ril/ril_cell_info_dbus.c \
drivers/ril/ril_config.c \
drivers/ril/ril_cbs.c \
drivers/ril/ril_data.c \
@@ -881,6 +882,14 @@
if SAILFISH_MANAGER
+unit_test_sailfish_cell_info_SOURCES = unit/test-sailfish_cell_info.c \
+ plugins/sailfish_manager/sailfish_cell_info.c
+unit_test_sailfish_cell_info_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
+ -Iplugins/sailfish_cell_info
+unit_test_sailfish_cell_info_LDADD = @GLIB_LIBS@ -ldl
+unit_objects += $(unit_test_sailfish_cell_info_OBJECTS)
+unit_tests += unit/test-sailfish_cell_info
+
unit_test_sailfish_sim_info_SOURCES = unit/test-sailfish_sim_info.c \
unit/fake_sailfish_watch.c \
plugins/sailfish_manager/sailfish_sim_info.c \
@@ -894,6 +903,7 @@
unit_test_sailfish_manager_SOURCES = unit/test-sailfish_manager.c \
unit/fake_sailfish_watch.c \
plugins/sailfish_manager/sailfish_manager.c \
+ plugins/sailfish_manager/sailfish_cell_info.c \
plugins/sailfish_manager/sailfish_sim_info.c \
src/storage.c src/log.c
unit_test_sailfish_manager_CFLAGS = $(AM_CFLAGS) $(COVERAGE_OPT) \
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/configure.ac
^
|
@@ -184,8 +184,8 @@
AM_CONDITIONAL(SAILFISH_RILMODEM, test "${enable_sailfish_rilmodem}" != "no")
if (test "${enable_sailfish_rilmodem}" = "yes"); then
- PKG_CHECK_MODULES(GRILIO, libgrilio >= 1.0.16, dummy=yes,
- AC_MSG_ERROR(libgrilio >= 1.0.16 is required))
+ PKG_CHECK_MODULES(GRILIO, libgrilio >= 1.0.18, dummy=yes,
+ AC_MSG_ERROR(libgrilio >= 1.0.18 is required))
PKG_CHECK_MODULES(GLIBUTIL, libglibutil >= 1.0.23, dummy=yes,
AC_MSG_ERROR(libglibutil >= 1.0.23 is required))
PKG_CHECK_MODULES(LIBMCE, libmce-glib, dummy=yes,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_cell_info.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2016 Jolla Ltd.
+ * Copyright (C) 2016-2017 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
@@ -31,7 +31,9 @@
typedef GObjectClass RilCellInfoClass;
typedef struct ril_cell_info RilCellInfo;
-struct ril_cell_info_priv {
+struct ril_cell_info {
+ GObject object;
+ struct sailfish_cell_info info;
GRilIoChannel *io;
MceDisplay *display;
struct ril_radio *radio;
@@ -60,63 +62,22 @@
#define RIL_CELL_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\
RIL_CELL_INFO_TYPE, RilCellInfo))
-#define DBG_(self,fmt,args...) DBG("%s" fmt, (self)->priv->log_prefix, ##args)
+#define DBG_(self,fmt,args...) DBG("%s" fmt, (self)->log_prefix, ##args)
-gint ril_cell_compare_location(const struct ril_cell *c1,
- const struct ril_cell *c2)
+static inline void ril_cell_free(struct sailfish_cell *cell)
{
- if (c1 && c2) {
- if (c1->type != c2->type) {
- return c1->type - c2->type;
- } else if (c1->type == RIL_CELL_INFO_TYPE_GSM) {
- const struct ril_cell_info_gsm *g1 = &c1->info.gsm;
- const struct ril_cell_info_gsm *g2 = &c2->info.gsm;
-
- if (g1->lac != g2->lac) {
- return g1->lac - g2->lac;
- } else {
- return g1->cid - g2->cid;
- }
- } else if (c2->type == RIL_CELL_INFO_TYPE_WCDMA) {
- const struct ril_cell_info_wcdma *w1 = &c1->info.wcdma;
- const struct ril_cell_info_wcdma *w2 = &c2->info.wcdma;
-
- if (w1->lac != w2->lac) {
- return w1->lac - w2->lac;
- } else {
- return w1->cid - w2->cid;
- }
- } else {
- const struct ril_cell_info_lte *l1 = &c1->info.lte;
- const struct ril_cell_info_lte *l2 = &c2->info.lte;
-
- GASSERT(c1->type == RIL_CELL_INFO_TYPE_LTE);
- if (l1->ci != l2->ci) {
- return l1->ci - l2->ci;
- } else if (l1->pci != l2->pci) {
- return l1->pci - l2->pci;
- } else {
- return l1->tac - l2->tac;
- }
- }
- } else if (c1) {
- return 1;
- } else if (c2) {
- return -1;
- } else {
- return 0;
- }
+ g_slice_free(struct sailfish_cell, cell);
}
-gint ril_cell_compare_func(gconstpointer v1, gconstpointer v2)
+static void ril_cell_free1(gpointer cell)
{
- return ril_cell_compare_location(v1, v2);
+ ril_cell_free(cell);
}
static gboolean ril_cell_info_list_identical(GSList *l1, GSList *l2)
{
while (l1 && l2) {
- if (memcmp(l1->data, l2->data, sizeof(struct ril_cell))) {
+ if (memcmp(l1->data, l2->data, sizeof(struct sailfish_cell))) {
return FALSE;
}
l1 = l1->next;
@@ -127,80 +88,101 @@
static void ril_cell_info_update_cells(struct ril_cell_info *self, GSList *l)
{
- if (!ril_cell_info_list_identical(self->cells, l)) {
- g_slist_free_full(self->cells, g_free);
- self->cells = l;
- g_signal_emit(self, ril_cell_info_signals[
- SIGNAL_CELLS_CHANGED], 0);
+ if (!ril_cell_info_list_identical(self->info.cells, l)) {
+ g_slist_free_full(self->info.cells, ril_cell_free1);
+ self->info.cells = l;
+ g_signal_emit(self, ril_cell_info_signals
+ [SIGNAL_CELLS_CHANGED], 0);
} else {
- g_slist_free_full(l, g_free);
+ g_slist_free_full(l, ril_cell_free1);
}
}
-static struct ril_cell *ril_cell_info_parse_cell_gsm(GRilIoParser *rilp,
- gboolean registered)
+static struct sailfish_cell *ril_cell_info_parse_cell_gsm(GRilIoParser *rilp,
+ guint version, gboolean registered)
{
- struct ril_cell *cell = g_new0(struct ril_cell, 1);
- struct ril_cell_info_gsm *gsm = &cell->info.gsm;
+ struct sailfish_cell *cell = g_slice_new0(struct sailfish_cell);
+ struct sailfish_cell_info_gsm *gsm = &cell->info.gsm;
+ /* Optional RIL_CellIdentityGsm_v12 part */
+ gsm->arfcn = INT_MAX;
+ gsm->bsic = INT_MAX;
+ /* Optional RIL_GSM_SignalStrength_v12 part */
+ gsm->timingAdvance = INT_MAX;
+ /* RIL_CellIdentityGsm */
if (grilio_parser_get_int32(rilp, &gsm->mcc) &&
grilio_parser_get_int32(rilp, &gsm->mnc) &&
grilio_parser_get_int32(rilp, &gsm->lac) &&
grilio_parser_get_int32(rilp, &gsm->cid) &&
+ (version < 12 || /* RIL_CellIdentityGsm_v12 part */
+ (grilio_parser_get_int32(rilp, &gsm->arfcn) &&
+ grilio_parser_get_int32(rilp, &gsm->bsic))) &&
+ /* RIL_GW_SignalStrength */
grilio_parser_get_int32(rilp, &gsm->signalStrength) &&
- grilio_parser_get_int32(rilp, &gsm->bitErrorRate)) {
- DBG("[gsm] reg=%d,mcc=%d,mnc=%d,lac=%d,cid=%d,"
- "strength=%d,err=%d", registered, gsm->mcc, gsm->mnc,
- gsm->lac, gsm->cid, gsm->signalStrength,
- gsm->bitErrorRate);
- cell->type = RIL_CELL_INFO_TYPE_GSM;
+ 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);
+ cell->type = SAILFISH_CELL_TYPE_GSM;
cell->registered = registered;
return cell;
}
ofono_error("failed to parse GSM cell info");
- g_free(cell);
+ ril_cell_free(cell);
return NULL;
}
-static struct ril_cell *ril_cell_info_parse_cell_wcdma(GRilIoParser *rilp,
- gboolean registered)
+static struct sailfish_cell *ril_cell_info_parse_cell_wcdma(GRilIoParser *rilp,
+ guint version, gboolean registered)
{
- struct ril_cell *cell = g_new0(struct ril_cell, 1);
- struct ril_cell_info_wcdma *wcdma = &cell->info.wcdma;
+ struct sailfish_cell *cell = g_slice_new0(struct sailfish_cell);
+ struct sailfish_cell_info_wcdma *wcdma = &cell->info.wcdma;
+ /* Optional RIL_CellIdentityWcdma_v12 part */
+ wcdma->uarfcn = INT_MAX;
if (grilio_parser_get_int32(rilp, &wcdma->mcc) &&
grilio_parser_get_int32(rilp, &wcdma->mnc) &&
grilio_parser_get_int32(rilp, &wcdma->lac) &&
grilio_parser_get_int32(rilp, &wcdma->cid) &&
grilio_parser_get_int32(rilp, &wcdma->psc) &&
+ (version < 12 || /* RIL_CellIdentityWcdma_v12 part */
+ 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);
- cell->type = RIL_CELL_INFO_TYPE_WCDMA;
+ cell->type = SAILFISH_CELL_TYPE_WCDMA;
cell->registered = registered;
return cell;
}
ofono_error("failed to parse WCDMA cell info");
- g_free(cell);
+ ril_cell_free(cell);
return NULL;
}
-static struct ril_cell *ril_cell_info_parse_cell_lte(GRilIoParser *rilp,
- gboolean registered)
+static struct sailfish_cell *ril_cell_info_parse_cell_lte(GRilIoParser *rilp,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_cell_info.h
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2016 Jolla Ltd.
+ * Copyright (C) 2016-2017 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,40 +18,11 @@
#include "ril_types.h"
#include <mce_display.h>
+#include <sailfish_cell_info.h>
-struct ril_cell {
- enum ril_cell_info_type type;
- gboolean registered;
- union {
- struct ril_cell_info_gsm gsm;
- struct ril_cell_info_wcdma wcdma;
- struct ril_cell_info_lte lte;
- } info;
-};
-
-struct ril_cell_info_priv;
-struct ril_cell_info {
- GObject object;
- struct ril_cell_info_priv *priv;
- GSList *cells;
-};
-
-typedef void (*ril_cell_info_cb_t)(struct ril_cell_info *info, void *arg);
-
-gint ril_cell_compare_func(gconstpointer v1, gconstpointer v2);
-gint ril_cell_compare_location(const struct ril_cell *c1,
- const struct ril_cell *c2);
-
-struct ril_cell_info *ril_cell_info_new(GRilIoChannel *io,
+struct sailfish_cell_info *ril_cell_info_new(GRilIoChannel *io,
const char *log_prefix, MceDisplay *display,
struct ril_radio *radio, struct ril_sim_card *sim_card);
-struct ril_cell_info *ril_cell_info_ref(struct ril_cell_info *info);
-void ril_cell_info_unref(struct ril_cell_info *info);
-struct ril_cell *ril_cell_find_cell(struct ril_cell_info *info,
- const struct ril_cell *cell);
-gulong ril_cell_info_add_cells_changed_handler(struct ril_cell_info *info,
- ril_cell_info_cb_t cb, void *arg);
-void ril_cell_info_remove_handler(struct ril_cell_info *info, gulong id);
#endif /* RIL_CELL_INFO_H */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_constants.h
^
|
@@ -395,40 +395,7 @@
RIL_CELL_INFO_TYPE_TD_SCDMA = 5
};
-struct ril_cell_info_gsm {
- int mcc; /* Mobile Country Code (0..999) */
- int mnc; /* Mobile Network Code (0..999) */
- int lac; /* Location Area Code (0..65535) */
- int cid; /* GSM Cell Identity (0..65535) TS 27.007 */
- int signalStrength; /* (0-31, 99) TS 27.007 */
- int bitErrorRate; /* (0-7, 99) TS 27.007 */
-};
-
-struct ril_cell_info_wcdma {
- int mcc; /* Mobile Country Code (0..999) */
- int mnc; /* Mobile Network Code (0..999) */
- int lac; /* Location Area Code (0..65535) */
- int cid; /* UMTS Cell Identity (0..268435455) TS 25.331 */
- int psc; /* Primary Scrambling Code (0..511) TS 25.331) */
- int signalStrength; /* (0-31, 99) TS 27.007 */
- int bitErrorRate; /* (0-7, 99) TS 27.007 */
-};
-
-struct ril_cell_info_lte {
- int mcc; /* Mobile Country Code (0..999) */
- int mnc; /* Mobile Network Code (0..999) */
- int ci; /* Cell Identity */
- int pci; /* Physical cell id (0..503) */
- int tac; /* Tracking area code */
- int signalStrength; /* (0-31, 99) TS 27.007 8.5 */
- int rsrp; /* Reference Signal Receive Power TS 36.133 */
- int rsrq; /* Reference Signal Receive Quality TS 36.133 */
- int rssnr; /* Reference Signal-to-Noise Ratio TS 36.101*/
- int cqi; /* Channel Quality Indicator TS 36.101 */
- int timingAdvance; /* (Distance = 300m/us) TS 36.321 */
-};
-
-/* RIL Request Messages */
+/* 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
@@ -563,7 +530,7 @@
#define RIL_REQUEST_GET_RADIO_CAPABILITY 130
#define RIL_REQUEST_SET_RADIO_CAPABILITY 131
-/* RIL Unsolicited Messages */
+/* RIL Unsolicited Messages, rild -> ofono */
#define RIL_UNSOL_RESPONSE_BASE 1000
#define RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED 1000
#define RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED 1001
@@ -611,6 +578,9 @@
#define RIL_UNSOL_ON_SS 1043
#define RIL_UNSOL_STK_CC_ALPHA_NOTIFY 1044
+/* A special request, ofono -> rild */
+#define RIL_RESPONSE_ACKNOWLEDGEMENT 800
+
/* Suplementary services Service class*/
#define SERVICE_CLASS_NONE 0
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_data.c
^
|
@@ -1227,8 +1227,7 @@
{
struct ril_data_priv *priv = self->priv;
- if (priv->pending_req || priv->req_queue ||
- (priv->flags & RIL_DATA_FLAG_ALLOWED)) {
+ if (priv->pending_req || priv->req_queue) {
ril_radio_power_on(priv->radio, self);
} else {
ril_radio_power_off(priv->radio, self);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_modem.c
^
|
@@ -308,16 +308,18 @@
ofono_modem_online_cb_t cb, void *data)
{
struct ril_modem_data *md = ril_modem_data_from_ofono(modem);
+ struct ril_radio *radio = md->modem.radio;
struct ril_modem_online_request *req;
DBG("%s going %sline", ofono_modem_get_path(modem),
online ? "on" : "off");
+ ril_radio_set_online(radio, online);
if (online) {
- ril_radio_power_on(md->modem.radio, RADIO_POWER_TAG(md));
+ ril_radio_power_on(radio, RADIO_POWER_TAG(md));
req = &md->set_online;
} else {
- ril_radio_power_off(md->modem.radio, RADIO_POWER_TAG(md));
+ ril_radio_power_off(radio, RADIO_POWER_TAG(md));
req = &md->set_offline;
}
@@ -390,8 +392,8 @@
ril_network_unref(modem->network);
ril_sim_card_unref(modem->sim_card);
- ril_cell_info_unref(modem->cell_info);
ril_data_unref(modem->data);
+ sailfish_cell_info_unref(modem->cell_info);
grilio_channel_unref(modem->io);
grilio_queue_cancel_all(md->q, FALSE);
grilio_queue_unref(md->q);
@@ -408,7 +410,7 @@
struct ril_radio *radio, struct ril_network *network,
struct ril_sim_card *card, struct ril_data *data,
struct ril_sim_settings *settings,
- struct ril_cell_info *cell_info)
+ struct sailfish_cell_info *cell_info)
{
/* Skip the slash from the path, it looks like "/ril_0" */
struct ofono_modem *ofono = ofono_modem_create(path + 1,
@@ -438,7 +440,7 @@
modem->network = ril_network_ref(network);
modem->sim_card = ril_sim_card_ref(card);
modem->sim_settings = ril_sim_settings_ref(settings);
- modem->cell_info = ril_cell_info_ref(cell_info);
+ modem->cell_info = sailfish_cell_info_ref(cell_info);
modem->data = ril_data_ref(data);
modem->io = grilio_channel_ref(io);
md->q = grilio_queue_new(io);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_netmon.c
^
|
@@ -1,7 +1,7 @@
/*
* oFono - Open Source Telephony - RIL-based devices
*
- * Copyright (C) 2016 Jolla Ltd.
+ * Copyright (C) 2016-2017 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,15 +14,16 @@
*/
#include "ril_plugin.h"
-#include "ril_cell_info.h"
#include "ril_util.h"
#include "ril_log.h"
+#include <sailfish_cell_info.h>
+
#include "ofono.h"
struct ril_netmon {
struct ofono_netmon *netmon;
- struct ril_cell_info *cell_info;
+ struct sailfish_cell_info *cell_info;
guint register_id;
};
@@ -50,7 +51,7 @@
}
static void ril_netmon_notify_gsm(struct ofono_netmon *netmon,
- const struct ril_cell_info_gsm *gsm)
+ const struct sailfish_cell_info_gsm *gsm)
{
char mcc[OFONO_MAX_MCC_LENGTH + 1];
char mnc[OFONO_MAX_MNC_LENGTH + 1];
@@ -68,7 +69,7 @@
}
static void ril_netmon_notify_wcdma(struct ofono_netmon *netmon,
- const struct ril_cell_info_wcdma *wcdma)
+ const struct sailfish_cell_info_wcdma *wcdma)
{
char mcc[OFONO_MAX_MCC_LENGTH + 1];
char mnc[OFONO_MAX_MNC_LENGTH + 1];
@@ -87,7 +88,7 @@
}
static void ril_netmon_notify_lte(struct ofono_netmon *netmon,
- const struct ril_cell_info_lte *lte)
+ const struct sailfish_cell_info_lte *lte)
{
char mcc[OFONO_MAX_MCC_LENGTH + 1];
char mnc[OFONO_MAX_MNC_LENGTH + 1];
@@ -111,19 +112,19 @@
GSList *l;
for (l = nm->cell_info->cells; l; l = l->next) {
- const struct ril_cell *cell = l->data;
+ const struct sailfish_cell *cell = l->data;
if (cell->registered) {
switch (cell->type) {
- case RIL_CELL_INFO_TYPE_GSM:
+ case SAILFISH_CELL_TYPE_GSM:
ril_netmon_notify_gsm(netmon,
&cell->info.gsm);
break;
- case RIL_CELL_INFO_TYPE_WCDMA:
+ case SAILFISH_CELL_TYPE_WCDMA:
ril_netmon_notify_wcdma(netmon,
&cell->info.wcdma);
break;
- case RIL_CELL_INFO_TYPE_LTE:
+ case SAILFISH_CELL_TYPE_LTE:
ril_netmon_notify_lte(netmon,
&cell->info.lte);
break;
@@ -156,7 +157,7 @@
if (modem->cell_info) {
struct ril_netmon *nm = g_slice_new0(struct ril_netmon);
- nm->cell_info = ril_cell_info_ref(modem->cell_info);
+ nm->cell_info = sailfish_cell_info_ref(modem->cell_info);
nm->netmon = netmon;
ofono_netmon_set_data(netmon, nm);
@@ -182,7 +183,7 @@
g_source_remove(nm->register_id);
}
- ril_cell_info_unref(nm->cell_info);
+ sailfish_cell_info_unref(nm->cell_info);
g_slice_free(struct ril_netmon, nm);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_network.c
^
|
@@ -20,8 +20,6 @@
#include "ril_util.h"
#include "ril_log.h"
-#include "sailfish_watch.h"
-
#include <grilio_queue.h>
#include <grilio_request.h>
#include <grilio_parser.h>
@@ -43,11 +41,6 @@
TIMER_COUNT
};
-enum ril_network_watch_events {
- WATCH_EVENT_ONLINE,
- WATCH_EVENT_COUNT
-};
-
enum ril_network_radio_event {
RADIO_EVENT_STATE_CHANGED,
RADIO_EVENT_ONLINE_CHANGED,
@@ -65,8 +58,6 @@
GRilIoQueue *q;
struct ril_radio *radio;
struct ril_sim_card *sim_card;
- struct sailfish_watch *watch;
- gulong watch_event_id[WATCH_EVENT_COUNT];
int rat;
char *log_prefix;
guint operator_poll_id;
@@ -487,7 +478,7 @@
{
struct ril_network_priv *priv = self->priv;
- return priv->watch->online && ril_sim_card_ready(priv->sim_card);
+ return priv->radio->online && ril_sim_card_ready(priv->sim_card);
}
static gboolean ril_network_set_rat_holdoff_cb(gpointer user_data)
@@ -762,7 +753,7 @@
}
}
-static void ril_network_online_cb(struct sailfish_watch *watch, void *data)
+static void ril_network_radio_online_cb(struct ril_radio *radio, void *data)
{
struct ril_network *self = RIL_NETWORK(data);
@@ -825,7 +816,6 @@
self->settings = ril_sim_settings_ref(settings);
priv->io = grilio_channel_ref(io);
priv->q = grilio_queue_new(priv->io);
- priv->watch = sailfish_watch_new(path);
priv->radio = ril_radio_ref(radio);
priv->sim_card = ril_sim_card_ref(sim_card);
priv->log_prefix = (log_prefix && log_prefix[0]) ?
@@ -842,9 +832,9 @@
priv->radio_event_id[RADIO_EVENT_STATE_CHANGED] =
ril_radio_add_state_changed_handler(priv->radio,
ril_network_radio_state_cb, self);
- priv->watch_event_id[WATCH_EVENT_ONLINE] =
- sailfish_watch_add_modem_changed_handler(priv->watch,
- ril_network_online_cb, self);
+ priv->radio_event_id[RADIO_EVENT_ONLINE_CHANGED] =
+ ril_radio_add_online_changed_handler(priv->radio,
+ ril_network_radio_online_cb, self);
priv->settings_event_id =
ril_sim_settings_add_pref_mode_changed_handler(settings,
ril_network_pref_mode_changed_cb, self);
@@ -901,6 +891,7 @@
enum ril_network_timer tid;
DBG_(self, "");
+
for (tid=0; tid<TIMER_COUNT; tid++) {
ril_network_stop_timer(self, tid);
}
@@ -911,8 +902,6 @@
grilio_channel_unref(priv->io);
grilio_queue_unref(priv->q);
- sailfish_watch_remove_all_handlers(priv->watch, priv->watch_event_id);
- sailfish_watch_unref(priv->watch);
ril_radio_remove_all_handlers(priv->radio, priv->radio_event_id);
ril_radio_unref(priv->radio);
ril_sim_card_remove_handler(priv->sim_card,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_plugin.c
^
|
@@ -48,7 +48,6 @@
OFONO_RADIO_ACCESS_MODE_LTE)
#define RIL_DEVICE_IDENTITY_RETRIES_LAST 2
-#define RIL_START_TIMEOUT_SEC 20 /* seconds */
#define RADIO_GID 1001
#define RADIO_UID 1001
@@ -65,11 +64,18 @@
#define RILMODEM_DEFAULT_SIM_FLAGS RIL_SIM_CARD_V9_UICC_SUBSCRIPTION_WORKAROUND
#define RILMODEM_DEFAULT_DATA_OPT RIL_ALLOW_DATA_AUTO
#define RILMODEM_DEFAULT_DM_FLAGS RIL_DATA_MANAGER_3GLTE_HANDOVER
+#define RILMODEM_DEFAULT_START_TIMEOUT 20000 /* ms */
#define RILMODEM_DEFAULT_DATA_CALL_FORMAT RIL_DATA_CALL_FORMAT_AUTO
#define RILMODEM_DEFAULT_DATA_CALL_RETRY_LIMIT 4
#define RILMODEM_DEFAULT_DATA_CALL_RETRY_DELAY 200 /* ms */
#define RILMODEM_DEFAULT_EMPTY_PIN_QUERY TRUE /* optimistic */
+/*
+ * The convention is that the keys which can only appear in the [Settings]
+ * section start with the upper case, those which appear in the [ril_*]
+ * modem section (OR in the [Settings] if they apply to all modems) start
+ * with lower case.
+ */
#define RILCONF_SETTINGS_EMPTY "EmptyConfig"
#define RILCONF_SETTINGS_3GHANDOVER "3GLTEHandover"
#define RILCONF_SETTINGS_SET_RADIO_CAP "SetRadioCapability"
@@ -80,10 +86,11 @@
#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_TECHS "technologies"
+#define RILCONF_TECHNOLOGIES "technologies"
#define RILCONF_UICC_WORKAROUND "uiccWorkaround"
#define RILCONF_ECCLIST_FILE "ecclistFile"
#define RILCONF_ALLOW_DATA_REQ "allowDataReq"
@@ -141,6 +148,7 @@
typedef struct sailfish_slot_impl {
ril_plugin* plugin;
struct sailfish_slot *handle;
+ struct sailfish_cell_info *cell_info;
struct sailfish_watch *watch;
gulong watch_event_id[WATCH_EVENT_COUNT];
char *path;
@@ -161,10 +169,10 @@
struct ril_network *network;
struct ril_sim_card *sim_card;
struct ril_sim_settings *sim_settings;
- struct ril_cell_info *cell_info;
- struct ril_cell_info_dbus *cell_info_dbus;
struct ril_oem_raw *oem_raw;
struct ril_data *data;
+ guint start_timeout;
+ guint start_timeout_id;
MceDisplay *display;
gboolean display_on;
gulong display_event_id[DISPLAY_EVENT_COUNT];
@@ -339,7 +347,7 @@
}
if (slot->cell_info) {
- ril_cell_info_unref(slot->cell_info);
+ sailfish_cell_info_unref(slot->cell_info);
slot->cell_info = NULL;
}
@@ -410,6 +418,15 @@
}
}
+static void ril_plugin_check_ready(ril_slot *slot)
+{
+ if (slot->serialize_id && slot->imei && slot->sim_card &&
+ slot->sim_card->status) {
+ grilio_channel_deserialize(slot->io, slot->serialize_id);
+ slot->serialize_id = 0;
+ }
+}
+
static void ril_plugin_device_identity_cb(GRilIoChannel *io, int status,
const void *data, guint len, void *user_data)
{
@@ -472,6 +489,7 @@
}
ril_plugin_check_modem(slot);
+ ril_plugin_check_ready(slot);
}
static enum sailfish_sim_state ril_plugin_sim_state(ril_slot *slot)
@@ -540,6 +558,7 @@
}
sailfish_manager_set_sim_state(slot->handle, sim_state);
+ ril_plugin_check_ready(slot);
}
static void ril_plugin_handle_error(ril_slot *slot, const char *message)
@@ -591,11 +610,17 @@
gutil_log(log_module, GLOG_LEVEL_VERBOSE, "%s%c [%08x] %s",
prefix, dir, id, scode);
break;
+ case GRILIO_PACKET_ACK:
+ gutil_log(log_module, GLOG_LEVEL_VERBOSE, "%s%c [%08x] ACK",
+ prefix, dir, id);
+ break;
case GRILIO_PACKET_RESP:
+ case GRILIO_PACKET_RESP_ACK_EXP:
gutil_log(log_module, GLOG_LEVEL_VERBOSE, "%s%c [%08x] %s",
prefix, dir, id, ril_error_to_string(code));
break;
case GRILIO_PACKET_UNSOL:
+ case GRILIO_PACKET_UNSOL_ACK_EXP:
gutil_log(log_module, GLOG_LEVEL_VERBOSE, "%s%c %s",
prefix, dir, ril_unsol_event_to_string(code));
break;
@@ -667,11 +692,6 @@
if (modem) {
slot->modem = modem;
- if (slot->cell_info) {
-#pragma message("Cell info interfaces need to be moved to the common Sailfish OS area")
- slot->cell_info_dbus = ril_cell_info_dbus_new(modem,
- slot->cell_info);
- }
slot->oem_raw = ril_oem_raw_new(modem, log_prefix);
} else {
ril_plugin_shutdown_slot(slot, TRUE);
@@ -739,13 +759,30 @@
}
}
-static void ril_plugin_slot_connected_all(ril_slot *slot, void *param)
+static void ril_plugin_all_slots_started_cb(ril_slot *slot, void *param)
{
if (!slot->handle) {
(*((gboolean*)param)) = FALSE; /* Not all */
}
}
+static void ril_plugin_check_if_started(ril_plugin* plugin)
+{
+ if (plugin->start_timeout_id) {
+ gboolean all = TRUE;
+
+ ril_plugin_foreach_slot_param(plugin,
+ ril_plugin_all_slots_started_cb, &all);
+ if (all) {
+ DBG("Startup done!");
+ g_source_remove(plugin->start_timeout_id);
+ /* id is zeroed by ril_plugin_manager_start_done */
+ GASSERT(!plugin->start_timeout_id);
+ sailfish_slot_manager_started(plugin->handle);
+ }
+ }
+}
+
static void ril_plugin_slot_connected(ril_slot *slot)
{
ril_plugin *plugin = slot->plugin;
@@ -817,31 +854,32 @@
(ps->set_radio_cap == RIL_SET_RADIO_CAP_ENABLED ||
(ps->set_radio_cap == RIL_SET_RADIO_CAP_AUTO &&
slot->io->ril_version >= 11))) {
- /* Check if RIL really support radio capability management */
+ /* Check if RIL really supports radio capability management */
slot->caps_check_id = ril_radio_caps_check(slot->io,
ril_plugin_radio_caps_cb, slot);
}
if (!slot->handle) {
- gboolean all = TRUE;
-
GASSERT(plugin->start_timeout_id);
+ GASSERT(slot->start_timeout_id);
+
+ /* We have made it before the timeout expired */
+ g_source_remove(slot->start_timeout_id);
+ slot->start_timeout_id = 0;
+
+ /* Register this slot with the sailfish manager plugin */
slot->handle = sailfish_manager_slot_add(plugin->handle, slot,
slot->path, slot->config.techs, slot->imei,
slot->imeisv, ril_plugin_sim_state(slot));
+ sailfish_manager_set_cell_info(slot->handle, slot->cell_info);
- ril_plugin_foreach_slot_param(plugin,
- ril_plugin_slot_connected_all, &all);
- if (all && plugin->start_timeout_id) {
- DBG("Startup done!");
- g_source_remove(plugin->start_timeout_id);
- GASSERT(!plugin->start_timeout_id);
- sailfish_slot_manager_started(plugin->handle);
- }
+ /* Check if this was the last slot we were waiting for */
+ ril_plugin_check_if_started(plugin);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_plugin.h
^
|
@@ -51,12 +51,12 @@
const char *log_prefix;
const char *ecclist_file;
struct ofono_modem *ofono;
+ struct sailfish_cell_info *cell_info;
struct ril_radio *radio;
struct ril_data *data;
struct ril_network *network;
struct ril_sim_card *sim_card;
struct ril_sim_settings *sim_settings;
- struct ril_cell_info *cell_info;
struct ril_slot_config config;
};
@@ -65,18 +65,13 @@
const char *log_prefix);
void ril_oem_raw_free(struct ril_oem_raw *raw);
-struct ril_cell_info_dbus;
-struct ril_cell_info_dbus *ril_cell_info_dbus_new(struct ril_modem *md,
- struct ril_cell_info *info);
-void ril_cell_info_dbus_free(struct ril_cell_info_dbus *dbus);
-
struct ril_modem *ril_modem_create(GRilIoChannel *io, const char *log_prefix,
const char *path, const char *imei, const char *imeisv,
const char *ecclist_file, const struct ril_slot_config *config,
struct ril_radio *radio, struct ril_network *network,
struct ril_sim_card *card, struct ril_data *data,
struct ril_sim_settings *settings,
- struct ril_cell_info *cell_info);
+ struct sailfish_cell_info *cell_info);
void ril_modem_delete(struct ril_modem *modem);
struct ofono_sim *ril_modem_ofono_sim(struct ril_modem *modem);
struct ofono_gprs *ril_modem_ofono_gprs(struct ril_modem *modem);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_radio.c
^
|
@@ -50,12 +50,14 @@
enum ril_radio_signal {
SIGNAL_STATE_CHANGED,
+ SIGNAL_ONLINE_CHANGED,
SIGNAL_COUNT
};
#define POWER_RETRY_SECS (1)
#define SIGNAL_STATE_CHANGED_NAME "ril-radio-state-changed"
+#define SIGNAL_ONLINE_CHANGED_NAME "ril-radio-online-changed"
static guint ril_radio_signals[SIGNAL_COUNT] = { 0 };
@@ -75,7 +77,8 @@
{
struct ril_radio_priv *priv = self->priv;
- return !priv->power_cycle && g_hash_table_size(priv->req_table) > 0;
+ return self->online && !priv->power_cycle &&
+ g_hash_table_size(priv->req_table) > 0;
}
static inline gboolean ril_radio_state_off(enum ril_radio_state radio_state)
@@ -280,6 +283,19 @@
}
}
+void ril_radio_set_online(struct ril_radio *self, gboolean online)
+{
+ if (G_LIKELY(self) && self->online != online) {
+ gboolean on, was_on = ril_radio_power_should_be_on(self);
+ self->online = online;
+ on = ril_radio_power_should_be_on(self);
+ if (was_on != on) {
+ ril_radio_power_request(self, on, FALSE);
+ }
+ ril_radio_emit_signal(self, SIGNAL_ONLINE_CHANGED);
+ }
+}
+
gulong ril_radio_add_state_changed_handler(struct ril_radio *self,
ril_radio_cb_t cb, void *arg)
{
@@ -287,6 +303,13 @@
SIGNAL_STATE_CHANGED_NAME, G_CALLBACK(cb), arg) : 0;
}
+gulong ril_radio_add_online_changed_handler(struct ril_radio *self,
+ ril_radio_cb_t cb, void *arg)
+{
+ return (G_LIKELY(self) && G_LIKELY(cb)) ? g_signal_connect(self,
+ SIGNAL_ONLINE_CHANGED_NAME, G_CALLBACK(cb), arg) : 0;
+}
+
void ril_radio_remove_handler(struct ril_radio *self, gulong id)
{
if (G_LIKELY(self) && G_LIKELY(id)) {
@@ -424,6 +447,7 @@
object_class->finalize = ril_radio_finalize;
g_type_class_add_private(klass, sizeof(struct ril_radio_priv));
NEW_SIGNAL(klass, STATE);
+ NEW_SIGNAL(klass, ONLINE);
}
/*
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_radio.h
^
|
@@ -22,6 +22,7 @@
GObject object;
struct ril_radio_priv *priv;
enum ril_radio_state state;
+ gboolean online;
};
typedef void (*ril_radio_cb_t)(struct ril_radio *radio, void *arg);
@@ -34,8 +35,11 @@
void ril_radio_power_off(struct ril_radio *radio, gpointer tag);
void ril_radio_power_cycle(struct ril_radio *radio);
void ril_radio_confirm_power_on(struct ril_radio *radio);
+void ril_radio_set_online(struct ril_radio *radio, gboolean online);
gulong ril_radio_add_state_changed_handler(struct ril_radio *radio,
ril_radio_cb_t cb, void *arg);
+gulong ril_radio_add_online_changed_handler(struct ril_radio *radio,
+ ril_radio_cb_t cb, void *arg);
void ril_radio_remove_handler(struct ril_radio *radio, gulong id);
void ril_radio_remove_handlers(struct ril_radio *radio, gulong *ids, int n);
enum ril_radio_state ril_radio_state_parse(const void *data, guint len);
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_radio_caps.c
^
|
@@ -565,11 +565,13 @@
* GET_RADIO_CAPABILITY requests have completed) and there's no transaction
* in progress.
*/
-static gboolean ril_radio_caps_manager_ready
+static gboolean ril_radio_caps_manager_can_check
(struct ril_radio_caps_manager *self)
{
if (self->caps_list && !self->tx_pending) {
const GPtrArray *list = self->caps_list;
+ const struct ril_radio_caps *prev_caps = NULL;
+ gboolean all_modes_equal = TRUE;
guint i;
for (i = 0; i < list->len; i++) {
@@ -581,6 +583,13 @@
return FALSE;
}
+ if (!prev_caps) {
+ prev_caps = caps;
+ } else if (ril_radio_caps_access_mode(prev_caps) !=
+ ril_radio_caps_access_mode(caps)) {
+ all_modes_equal = FALSE;
+ }
+
DBG_(caps, "radio=%s,sim=%s,imsi=%s,raf=0x%x(%s),"
"uuid=%s,limit=%s", (caps->radio->state ==
RADIO_STATE_ON) ? "on" : "off",
@@ -596,7 +605,7 @@
ofono_radio_access_mode_to_string
(ril_radio_caps_pref_mode_limit(caps)));
}
- return TRUE;
+ return !all_modes_equal;
}
return FALSE;
}
@@ -1286,7 +1295,7 @@
static void ril_radio_caps_manager_check(struct ril_radio_caps_manager *self)
{
DBG("");
- if (ril_radio_caps_manager_ready(self)) {
+ if (ril_radio_caps_manager_can_check(self)) {
const int first = ril_radio_caps_manager_first_mismatch(self);
if (first >= 0) {
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_sms.c
^
|
@@ -254,8 +254,9 @@
DBG("%s", tpdu);
grilio_queue_send_request_full(sd->q, req,
- RIL_REQUEST_SEND_SMS, ril_sms_submit_cb,
- ril_sms_cbd_free, ril_sms_cbd_new(sd, cb, data));
+ mms ? RIL_REQUEST_SEND_SMS_EXPECT_MORE : RIL_REQUEST_SEND_SMS,
+ ril_sms_submit_cb, ril_sms_cbd_free,
+ ril_sms_cbd_new(sd, cb, data));
grilio_request_unref(req);
g_free(tpdu);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_subscription.conf
^
|
@@ -176,3 +176,14 @@
# Default true
#
#enableVoicecall=true
+
+# Timeout for the modem to show up, in milliseconds. Those that don't
+# show up before this timeout expires, will be dropped (ignored).
+#
+# In some fairly rare cases it makes sense to shorten this timeout for
+# optional modems (which may or may not be available), to speed up the
+# boot up process.
+#
+# The default is 20000 (20 seconds)
+#
+#startTimeout=20000
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_types.h
^
|
@@ -45,7 +45,6 @@
struct ril_radio;
struct ril_network;
struct ril_sim_card;
-struct ril_cell_info;
struct ril_slot_config {
guint slot;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_util.c
^
|
@@ -233,6 +233,8 @@
RIL_REQUEST_(SHUTDOWN);
RIL_REQUEST_(GET_RADIO_CAPABILITY);
RIL_REQUEST_(SET_RADIO_CAPABILITY);
+ case RIL_RESPONSE_ACKNOWLEDGEMENT:
+ return "RESPONSE_ACK";
default:
snprintf(unknown, sizeof(unknown), "RIL_REQUEST_%d", request);
return unknown;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/drivers/ril/ril_voicecall.c
^
|
@@ -306,7 +306,8 @@
case CALL_FAIL_ERROR_UNSPECIFIED:
call_status = ril_voicecall_status_with_id(vc, id);
if (call_status == CALL_STATUS_DIALING ||
- call_status == CALL_STATUS_ALERTING) {
+ call_status == CALL_STATUS_ALERTING ||
+ call_status == CALL_STATUS_INCOMING) {
reason = OFONO_DISCONNECT_REASON_REMOTE_HANGUP;
}
break;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/include/log.h
^
|
@@ -71,11 +71,12 @@
.file = __FILE__, .flags = OFONO_DEBUG_FLAG_DEFAULT, \
}; \
if (__ofono_debug_desc.flags & OFONO_DEBUG_FLAG_PRINT) \
- __ofono_dbg(&__ofono_debug_desc, "%s() " fmt, \
+ ofono_dbg(&__ofono_debug_desc, "%s() " fmt, \
__FUNCTION__ , ## arg); \
} while (0)
-void __ofono_dbg(const struct ofono_debug_desc *desc, const char *format, ...)
+extern void ofono_dbg(const struct ofono_debug_desc *desc,
+ const char *format, ...)
__attribute__((format(printf, 2, 3)));
typedef void (*ofono_log_hook_cb_t)(const struct ofono_debug_desc *desc,
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/include/sailfish_cell_info.h
^
|
@@ -0,0 +1,114 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2017 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 SAILFISH_CELL_INFO_H
+#define SAILFISH_CELL_INFO_H
+
+#include <glib.h>
+
+enum sailfish_cell_type {
+ SAILFISH_CELL_TYPE_GSM,
+ SAILFISH_CELL_TYPE_WCDMA,
+ SAILFISH_CELL_TYPE_LTE
+};
+
+struct sailfish_cell_info_gsm {
+ int mcc; /* Mobile Country Code (0..999) */
+ int mnc; /* Mobile Network Code (0..999) */
+ int lac; /* Location Area Code (0..65535) */
+ int cid; /* GSM Cell Identity (0..65535) TS 27.007 */
+ int arfcn; /* 16-bit GSM Absolute RF channel number */
+ int bsic; /* 6-bit Base Station Identity Code */
+ int signalStrength; /* (0-31, 99) TS 27.007 */
+ int bitErrorRate; /* (0-7, 99) TS 27.007 */
+ int timingAdvance; /* Timing Advance. 1 period = 48/13 us */
+};
+
+struct sailfish_cell_info_wcdma {
+ int mcc; /* Mobile Country Code (0..999) */
+ int mnc; /* Mobile Network Code (0..999) */
+ int lac; /* Location Area Code (0..65535) */
+ int cid; /* UMTS Cell Identity (0..268435455) TS 25.331 */
+ int psc; /* Primary Scrambling Code (0..511) TS 25.331) */
+ int uarfcn; /* 16-bit UMTS Absolute RF Channel Number */
+ int signalStrength; /* (0-31, 99) TS 27.007 */
+ int bitErrorRate; /* (0-7, 99) TS 27.007 */
+};
+
+struct sailfish_cell_info_lte {
+ int mcc; /* Mobile Country Code (0..999) */
+ int mnc; /* Mobile Network Code (0..999) */
+ int ci; /* Cell Identity */
+ int pci; /* Physical cell id (0..503) */
+ int tac; /* Tracking area code */
+ int earfcn; /* 18-bit LTE Absolute RC Channel Number */
+ int signalStrength; /* (0-31, 99) TS 27.007 8.5 */
+ int rsrp; /* Reference Signal Receive Power TS 36.133 */
+ int rsrq; /* Reference Signal Receive Quality TS 36.133 */
+ int rssnr; /* Reference Signal-to-Noise Ratio TS 36.101*/
+ int cqi; /* Channel Quality Indicator TS 36.101 */
+ int timingAdvance; /* (Distance = 300m/us) TS 36.321 */
+};
+
+struct sailfish_cell {
+ enum sailfish_cell_type type;
+ gboolean registered;
+ union {
+ struct sailfish_cell_info_gsm gsm;
+ struct sailfish_cell_info_wcdma wcdma;
+ struct sailfish_cell_info_lte lte;
+ } info;
+};
+
+struct sailfish_cell_info {
+ const struct sailfish_cell_info_proc *proc;
+ GSList *cells;
+};
+
+typedef void (*sailfish_cell_info_cb_t)(struct sailfish_cell_info *info,
+ void *arg);
+
+struct sailfish_cell_info_proc {
+ void (*ref)(struct sailfish_cell_info *info);
+ void (*unref)(struct sailfish_cell_info *info);
+ gulong (*add_cells_changed_handler)(struct sailfish_cell_info *info,
+ sailfish_cell_info_cb_t cb, void *arg);
+ void (*remove_handler)(struct sailfish_cell_info *info, gulong id);
+};
+
+/* Utilities */
+gint sailfish_cell_compare_func(gconstpointer v1, gconstpointer v2);
+gint sailfish_cell_compare_location(const struct sailfish_cell *c1,
+ const struct sailfish_cell *c2);
+
+/* Cell info object API */
+struct sailfish_cell_info *sailfish_cell_info_ref
+ (struct sailfish_cell_info *info);
+void sailfish_cell_info_unref(struct sailfish_cell_info *info);
+gulong sailfish_cell_info_add_cells_changed_handler
+ (struct sailfish_cell_info *info,
+ sailfish_cell_info_cb_t cb, void *arg);
+void sailfish_cell_info_remove_handler(struct sailfish_cell_info *info,
+ gulong id);
+
+#endif /* SAILFISH_CELINFO_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/include/sailfish_manager.h
^
|
@@ -13,8 +13,8 @@
* GNU General Public License for more details.
*/
-#ifndef SAILFISHOS_MANAGER_H
-#define SAILFISHOS_MANAGER_H
+#ifndef SAILFISH_MANAGER_H
+#define SAILFISH_MANAGER_H
struct ofono_modem;
@@ -30,6 +30,8 @@
struct sailfish_slot_driver_reg;
struct sailfish_slot_manager;
struct sailfish_slot_manager_impl;
+struct sailfish_cell_info;
+
typedef void (*sailfish_slot_manager_impl_cb_t)
(struct sailfish_slot_manager_impl *impl, void *user_data);
@@ -81,14 +83,16 @@
enum sailfish_sim_state sim_state);
void sailfish_manager_imei_obtained(struct sailfish_slot *s, const char *imei);
void sailfish_manager_imeisv_obtained(struct sailfish_slot *s,
- const char *imeisv);
+ const char *imeisv);
void sailfish_manager_set_sim_state(struct sailfish_slot *s,
- enum sailfish_sim_state state);
+ enum sailfish_sim_state state);
void sailfish_slot_manager_started(struct sailfish_slot_manager *m);
void sailfish_manager_slot_error(struct sailfish_slot *s, const char *key,
- const char *message);
+ const char *message);
void sailfish_manager_error(struct sailfish_slot_manager *m, const char *key,
- const char *message);
+ const char *message);
+void sailfish_manager_set_cell_info(struct sailfish_slot *s,
+ struct sailfish_cell_info *ci);
/* Callbacks provided by slot plugins */
struct sailfish_slot_driver {
@@ -110,7 +114,7 @@
void (*slot_free)(struct sailfish_slot_impl *s);
};
-#endif /* SAILFISHOS_MANAGER_H */
+#endif /* SAILFISH_MANAGER_H */
/*
* Local Variables:
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/plugins/mbpi.c
^
|
@@ -3,6 +3,7 @@
* oFono - Open Source Telephony
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
+ * Copyright (C) 2015-2017 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
@@ -145,6 +146,39 @@
NULL,
};
+static void protocol_start(GMarkupParseContext *context,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ enum ofono_gprs_proto *proto,
+ GError **error)
+{
+ const char *text = NULL;
+ int i;
+
+ for (i = 0; attribute_names[i]; i++)
+ if (g_str_equal(attribute_names[i], "type") == TRUE)
+ text = attribute_values[i];
+
+ if (text == NULL) {
+ mbpi_g_set_error(context, error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_MISSING_ATTRIBUTE,
+ "Missing attribute: type");
+ return;
+ }
+
+ if (strcmp(text, "ip") == 0)
+ *proto = OFONO_GPRS_PROTO_IP;
+ else if (strcmp(text, "ipv6") == 0)
+ *proto = OFONO_GPRS_PROTO_IPV6;
+ else if (strcmp(text, "ipv4v6") == 0)
+ *proto = OFONO_GPRS_PROTO_IPV4V6;
+ else
+ mbpi_g_set_error(context, error, G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
+ "Unknown authentication method: %s",
+ text);
+}
+
static void authentication_start(GMarkupParseContext *context,
const gchar **attribute_names,
const gchar **attribute_values,
@@ -228,6 +262,9 @@
else if (g_str_equal(element_name, "password"))
g_markup_parse_context_push(context, &text_parser,
&apn->password);
+ else if (g_str_equal(element_name, "protocol"))
+ protocol_start(context, attribute_names,
+ attribute_values, &apn->proto, error);
else if (g_str_equal(element_name, "authentication"))
authentication_start(context, attribute_names,
attribute_values, &apn->auth_method, error);
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/plugins/sailfish_manager/sailfish_cell_info.c
^
|
@@ -0,0 +1,129 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2017 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 <sailfish_cell_info.h>
+
+#include <gutil_log.h>
+
+gint sailfish_cell_compare_location(const struct sailfish_cell *c1,
+ const struct sailfish_cell *c2)
+{
+ if (c1 && c2) {
+ if (c1->type != c2->type) {
+ return c1->type - c2->type;
+ } else if (c1->type == SAILFISH_CELL_TYPE_GSM) {
+ const struct sailfish_cell_info_gsm *g1;
+ const struct sailfish_cell_info_gsm *g2;
+
+ g1 = &c1->info.gsm;
+ g2 = &c2->info.gsm;
+ if (g1->mcc != g2->mcc) {
+ return g1->mcc - g2->mcc;
+ } else if (g1->mnc != g2->mnc) {
+ return g1->mnc - g2->mnc;
+ } else if (g1->lac != g2->lac) {
+ return g1->lac - g2->lac;
+ } else {
+ return g1->cid - g2->cid;
+ }
+ } else if (c2->type == SAILFISH_CELL_TYPE_WCDMA) {
+ const struct sailfish_cell_info_wcdma *w1;
+ const struct sailfish_cell_info_wcdma *w2;
+
+ w1 = &c1->info.wcdma;
+ w2 = &c2->info.wcdma;
+ if (w1->mcc != w2->mcc) {
+ return w1->mcc - w2->mcc;
+ } else if (w1->mnc != w2->mnc) {
+ return w1->mnc - w2->mnc;
+ } else if (w1->lac != w2->lac) {
+ return w1->lac - w2->lac;
+ } else {
+ return w1->cid - w2->cid;
+ }
+ } else {
+ const struct sailfish_cell_info_lte *l1 =
+ &c1->info.lte;
+ const struct sailfish_cell_info_lte *l2 =
+ &c2->info.lte;
+
+ GASSERT(c1->type == SAILFISH_CELL_TYPE_LTE);
+ l1 = &c1->info.lte;
+ l2 = &c2->info.lte;
+ if (l1->mcc != l2->mcc) {
+ return l1->mcc - l2->mcc;
+ } else if (l1->mnc != l2->mnc) {
+ return l1->mnc - l2->mnc;
+ } else if (l1->ci != l2->ci) {
+ return l1->ci - l2->ci;
+ } else if (l1->pci != l2->pci) {
+ return l1->pci - l2->pci;
+ } else {
+ return l1->tac - l2->tac;
+ }
+ }
+ } else if (c1) {
+ return 1;
+ } else if (c2) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+gint sailfish_cell_compare_func(gconstpointer v1, gconstpointer v2)
+{
+ return sailfish_cell_compare_location(v1, v2);
+}
+
+struct sailfish_cell_info *sailfish_cell_info_ref
+ (struct sailfish_cell_info *info)
+{
+ if (info) {
+ info->proc->ref(info);
+ return info;
+ }
+ return NULL;
+}
+
+void sailfish_cell_info_unref(struct sailfish_cell_info *info)
+{
+ if (info) {
+ info->proc->unref(info);
+ }
+}
+
+gulong sailfish_cell_info_add_cells_changed_handler
+ (struct sailfish_cell_info *info,
+ sailfish_cell_info_cb_t cb, void *arg)
+{
+ return info ? info->proc->add_cells_changed_handler(info, cb, arg) : 0;
+}
+
+void sailfish_cell_info_remove_handler(struct sailfish_cell_info *info,
+ gulong id)
+{
+ if (info) {
+ info->proc->remove_handler(info, id);
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/plugins/sailfish_manager/sailfish_cell_info_dbus.c
^
|
@@ -0,0 +1,598 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2016-2017 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 "sailfish_cell_info_dbus.h"
+#include "sailfish_cell_info.h"
+
+#include <ofono/modem.h>
+#include <ofono/dbus.h>
+#include <ofono/log.h>
+
+#include <gdbus.h>
+
+struct sailfish_cell_entry {
+ guint cell_id;
+ char *path;
+ struct sailfish_cell cell;
+};
+
+struct sailfish_cell_info_dbus {
+ struct sailfish_cell_info *info;
+ DBusConnection *conn;
+ char *path;
+ gulong handler_id;
+ guint next_cell_id;
+ GSList *entries;
+};
+
+#define CELL_INFO_DBUS_INTERFACE "org.nemomobile.ofono.CellInfo"
+#define CELL_INFO_DBUS_CELLS_ADDED_SIGNAL "CellsAdded"
+#define CELL_INFO_DBUS_CELLS_REMOVED_SIGNAL "CellsRemoved"
+
+#define CELL_DBUS_INTERFACE_VERSION (1)
+#define CELL_DBUS_INTERFACE "org.nemomobile.ofono.Cell"
+#define CELL_DBUS_REGISTERED_CHANGED_SIGNAL "RegisteredChanged"
+#define CELL_DBUS_PROPERTY_CHANGED_SIGNAL "PropertyChanged"
+#define CELL_DBUS_REMOVED_SIGNAL "Removed"
+
+struct sailfish_cell_property {
+ const char *name;
+ glong off;
+ int flag;
+};
+
+#define CELL_GSM_PROPERTY(value,name) \
+ { #name, G_STRUCT_OFFSET(struct sailfish_cell_info_gsm,name), value }
+#define CELL_WCDMA_PROPERTY(value,name) \
+ { #name, G_STRUCT_OFFSET(struct sailfish_cell_info_wcdma,name), value }
+#define CELL_LTE_PROPERTY(value,name) \
+ { #name, G_STRUCT_OFFSET(struct sailfish_cell_info_lte,name), value }
+
+static const struct sailfish_cell_property sailfish_cell_gsm_properties [] = {
+ CELL_GSM_PROPERTY(0x001,mcc),
+ CELL_GSM_PROPERTY(0x002,mnc),
+ CELL_GSM_PROPERTY(0x004,lac),
+ CELL_GSM_PROPERTY(0x008,cid),
+ CELL_GSM_PROPERTY(0x010,arfcn),
+ CELL_GSM_PROPERTY(0x020,bsic),
+ CELL_GSM_PROPERTY(0x040,signalStrength),
+ CELL_GSM_PROPERTY(0x080,bitErrorRate),
+ CELL_GSM_PROPERTY(0x100,timingAdvance)
+};
+
+static const struct sailfish_cell_property sailfish_cell_wcdma_properties [] = {
+ CELL_WCDMA_PROPERTY(0x01,mcc),
+ CELL_WCDMA_PROPERTY(0x02,mnc),
+ CELL_WCDMA_PROPERTY(0x04,lac),
+ CELL_WCDMA_PROPERTY(0x08,cid),
+ CELL_WCDMA_PROPERTY(0x10,psc),
+ CELL_WCDMA_PROPERTY(0x20,uarfcn),
+ CELL_WCDMA_PROPERTY(0x40,signalStrength),
+ CELL_WCDMA_PROPERTY(0x80,bitErrorRate)
+};
+
+static const struct sailfish_cell_property sailfish_cell_lte_properties [] = {
+ CELL_LTE_PROPERTY(0x001,mcc),
+ CELL_LTE_PROPERTY(0x002,mnc),
+ CELL_LTE_PROPERTY(0x004,ci),
+ CELL_LTE_PROPERTY(0x008,pci),
+ CELL_LTE_PROPERTY(0x010,tac),
+ CELL_LTE_PROPERTY(0x020,earfcn),
+ CELL_LTE_PROPERTY(0x040,signalStrength),
+ CELL_LTE_PROPERTY(0x080,rsrp),
+ CELL_LTE_PROPERTY(0x100,rsrq),
+ CELL_LTE_PROPERTY(0x200,rssnr),
+ CELL_LTE_PROPERTY(0x400,cqi),
+ CELL_LTE_PROPERTY(0x800,timingAdvance)
+};
+
+#define SAILFISH_CELL_PROPERTY_REGISTERED 0x1000
+
+typedef void (*sailfish_cell_info_dbus_append_fn)(DBusMessageIter *it,
+ const struct sailfish_cell_entry *entry);
+
+static const char *sailfish_cell_info_dbus_cell_type_str
+ (enum sailfish_cell_type type)
+{
+ switch (type) {
+ case SAILFISH_CELL_TYPE_GSM:
+ return "gsm";
+ case SAILFISH_CELL_TYPE_WCDMA:
+ return "wcdma";
+ case SAILFISH_CELL_TYPE_LTE:
+ return "lte";
+ default:
+ return "unknown";
+ }
+};
+
+static const struct sailfish_cell_property *
+ sailfish_cell_info_dbus_cell_properties(
+ enum sailfish_cell_type type, int *count)
+{
+ switch (type) {
+ case SAILFISH_CELL_TYPE_GSM:
+ *count = G_N_ELEMENTS(sailfish_cell_gsm_properties);
+ return sailfish_cell_gsm_properties;
+ case SAILFISH_CELL_TYPE_WCDMA:
+ *count = G_N_ELEMENTS(sailfish_cell_wcdma_properties);
+ return sailfish_cell_wcdma_properties;
+ case SAILFISH_CELL_TYPE_LTE:
+ *count = G_N_ELEMENTS(sailfish_cell_lte_properties);
+ return sailfish_cell_lte_properties;
+ default:
+ *count = 0;
+ return NULL;
+ }
+};
+
+static void sailfish_cell_info_destroy_entry(struct sailfish_cell_entry *entry)
+{
+ if (entry) {
+ g_free(entry->path);
+ g_free(entry);
+ }
+}
+
+static DBusMessage *sailfish_cell_info_dbus_reply(DBusMessage *msg,
+ const struct sailfish_cell_entry *entry,
+ sailfish_cell_info_dbus_append_fn append)
+{
+ DBusMessage *reply = dbus_message_new_method_return(msg);
+ DBusMessageIter it;
+
+ dbus_message_iter_init_append(reply, &it);
+ append(&it, entry);
+ return reply;
+}
+
+static void sailfish_cell_info_dbus_append_version(DBusMessageIter *it,
+ const struct sailfish_cell_entry *entry)
+{
+ dbus_int32_t version = CELL_DBUS_INTERFACE_VERSION;
+
+ dbus_message_iter_append_basic(it, DBUS_TYPE_INT32, &version);
+}
+
+static void sailfish_cell_info_dbus_append_type(DBusMessageIter *it,
+ const struct sailfish_cell_entry *entry)
+{
+ const char *type =
+ sailfish_cell_info_dbus_cell_type_str(entry->cell.type);
+
+ dbus_message_iter_append_basic(it, DBUS_TYPE_STRING, &type);
+}
+
+static void sailfish_cell_info_dbus_append_registered(DBusMessageIter *it,
+ const struct sailfish_cell_entry *entry)
+{
+ dbus_bool_t registered = entry->cell.registered;
+
+ dbus_message_iter_append_basic(it, DBUS_TYPE_BOOLEAN, ®istered);
+}
+
+static void sailfish_cell_info_dbus_append_properties(DBusMessageIter *it,
+ const struct sailfish_cell_entry *entry)
+{
+ int i, n;
+ DBusMessageIter dict;
+ const struct sailfish_cell *cell = &entry->cell;
+ const struct sailfish_cell_property *prop =
+ sailfish_cell_info_dbus_cell_properties(cell->type, &n);
+
+ dbus_message_iter_open_container(it, DBUS_TYPE_ARRAY, "{sv}", &dict);
+ for (i = 0; i < n; i++) {
+ gint32 value = G_STRUCT_MEMBER(int, &cell->info, prop[i].off);
+ if (value != INT_MAX) {
+ ofono_dbus_dict_append(&dict, prop[i].name,
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/plugins/sailfish_manager/sailfish_cell_info_dbus.h
^
|
@@ -0,0 +1,36 @@
+/*
+ * oFono - Open Source Telephony - RIL-based devices
+ *
+ * Copyright (C) 2016-2017 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 SAILFISH_CELL_INFO_DBUS_H
+#define SAILFISH_CELL_INFO_DBUS_H
+
+struct ofono_modem;
+
+struct sailfish_cell_info;
+struct sailfish_cell_info_dbus;
+
+struct sailfish_cell_info_dbus *sailfish_cell_info_dbus_new
+ (struct ofono_modem *modem, struct sailfish_cell_info *info);
+void sailfish_cell_info_dbus_free(struct sailfish_cell_info_dbus *dbus);
+
+#endif /* SAILFISH_CELL_INFO_DBUS_H */
+
+/*
+ * Local Variables:
+ * mode: C
+ * c-basic-offset: 8
+ * indent-tabs-mode: t
+ * End:
+ */
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/plugins/sailfish_manager/sailfish_manager.c
^
|
@@ -27,7 +27,10 @@
#include "storage.h"
#include <sailfish_manager.h>
+#include <sailfish_cell_info.h>
+
#include "sailfish_manager_dbus.h"
+#include "sailfish_cell_info_dbus.h"
#include "sailfish_sim_info.h"
#include "sailfish_watch.h"
@@ -84,6 +87,8 @@
struct sailfish_watch *watch;
struct sailfish_sim_info *siminfo;
struct sailfish_sim_info_dbus *siminfo_dbus;
+ struct sailfish_cell_info *cellinfo;
+ struct sailfish_cell_info_dbus *cellinfo_dbus;
enum sailfish_sim_state sim_state;
gulong watch_event_id[WATCH_EVENT_COUNT];
char *imei;
@@ -148,14 +153,33 @@
}
/*
- * sailfish_manager_foreach_slot() terminates the loop and returns
- * TRUE if the callback returns TRUE. If all callbacks return FALSE, it
- * returns FALSE. It there are no slots, it returns FALSE too.
+ * sailfish_manager_foreach_driver() and sailfish_manager_foreach_slot()
+ * terminate the loop and return TRUE if the callback returns TRUE. If all
+ * callbacks return FALSE, they returns FALSE. It there are no drivers/slots,
+ * they return FALSE too.
*/
#define SF_LOOP_CONTINUE (FALSE)
#define SF_LOOP_DONE (TRUE)
+static gboolean sailfish_manager_foreach_driver(struct sailfish_manager_priv *p,
+ gboolean (*fn)(struct sailfish_slot_driver_reg *r, void *user_data),
+ void *user_data)
+{
+ struct sailfish_slot_driver_reg *r = p->drivers;
+ gboolean done = FALSE;
+
+ while (r && !done) {
+ struct sailfish_slot_driver_reg *rnext = r->next;
+
+ /* The callback returns TRUE to terminate the loop */
+ done = fn(r, user_data);
+ r = rnext;
+ }
+
+ return done;
+}
+
static gboolean sailfish_manager_foreach_slot
(struct sailfish_manager_priv *p,
gboolean (*fn)(struct sailfish_slot_priv *s, void *user_data),
@@ -189,12 +213,31 @@
return done;
}
+static void sailfish_manager_slot_update_cell_info_dbus
+ (struct sailfish_slot_priv *s)
+{
+ struct ofono_modem *modem = s->watch->modem;
+
+ if (modem && s->cellinfo) {
+ if (!s->cellinfo_dbus) {
+ s->cellinfo_dbus = sailfish_cell_info_dbus_new(modem,
+ s->cellinfo);
+ }
+ } else {
+ if (s->cellinfo_dbus) {
+ sailfish_cell_info_dbus_free(s->cellinfo_dbus);
+ s->cellinfo_dbus = NULL;
+ }
+ }
+}
+
static void sailfish_manager_slot_modem_changed(struct sailfish_watch *w,
void *user_data)
{
struct sailfish_slot_priv *s = user_data;
struct sailfish_manager_priv *p = s->manager->plugin;
+ sailfish_manager_slot_update_cell_info_dbus(s);
sailfish_manager_update_modem_paths_full(p);
sailfish_manager_update_ready(p);
}
@@ -382,6 +425,8 @@
}
sailfish_sim_info_unref(s->siminfo);
sailfish_sim_info_dbus_free(s->siminfo_dbus);
+ sailfish_cell_info_dbus_free(s->cellinfo_dbus);
+ sailfish_cell_info_unref(s->cellinfo);
sailfish_watch_remove_all_handlers(s->watch, s->watch_event_id);
sailfish_watch_unref(s->watch);
g_free(s->imei);
@@ -392,6 +437,55 @@
sailfish_manager_reindex_slots(p);
}
+void sailfish_manager_set_cell_info(struct sailfish_slot *s,
+ struct sailfish_cell_info *info)
+{
+ if (s) {
+ struct sailfish_slot_priv *slot = sailfish_slot_priv_cast(s);
+
+ if (slot->cellinfo != info) {
+ sailfish_cell_info_dbus_free(slot->cellinfo_dbus);
+ sailfish_cell_info_unref(slot->cellinfo);
+ slot->cellinfo = sailfish_cell_info_ref(info);
+ slot->cellinfo_dbus = NULL;
+ sailfish_manager_slot_update_cell_info_dbus(slot);
+ }
+ }
+}
+
+static gboolean sailfish_manager_update_dbus_block_proc
+ (struct sailfish_slot_driver_reg *r, void *data)
+{
+ enum sailfish_manager_dbus_block *block = data;
+ struct sailfish_slot_manager *m;
+ struct sailfish_slot_priv *s;
+
+ if (r->init_id) {
+ /* Driver is being initialized */
+ (*block) |= SAILFISH_MANAGER_DBUS_BLOCK_ALL;
+ return SF_LOOP_DONE;
+ }
+
+ m = r->manager;
+ if (!m) {
+ return SF_LOOP_CONTINUE;
+ }
+
+ if (!m->started) {
+ /* Slots are being initialized */
+ (*block) |= SAILFISH_MANAGER_DBUS_BLOCK_ALL;
+ return SF_LOOP_DONE;
+ }
+
+ for (s = m->slots; s && s->imei; s = s->next);
+ if (s) {
+ /* IMEI is not available (yet) */
+ (*block) |= SAILFISH_MANAGER_DBUS_BLOCK_IMEI;
+ }
+
+ return SF_LOOP_CONTINUE;
+}
+
static void sailfish_manager_update_dbus_block(struct sailfish_manager_priv *p)
{
enum sailfish_manager_dbus_block block =
@@ -401,35 +495,8 @@
/* Plugin is being initialized */
block |= SAILFISH_MANAGER_DBUS_BLOCK_ALL;
} else {
- struct sailfish_slot_driver_reg *r;
-
- for (r = p->drivers; r; r = r->next) {
- struct sailfish_slot_manager *m;
- struct sailfish_slot_priv *s;
-
- if (r->init_id) {
- /* Driver is being initialized */
- block |= SAILFISH_MANAGER_DBUS_BLOCK_ALL;
- break;
- }
-
- m = r->manager;
- if (!m) {
- continue;
- }
-
- if (!m->started) {
- /* Slots are being initialized */
- block |= SAILFISH_MANAGER_DBUS_BLOCK_ALL;
- break;
- }
-
- for (s = m->slots; s && s->imei; s = s->next);
- if (s) {
- /* IMEI is not available (yet) */
- block |= SAILFISH_MANAGER_DBUS_BLOCK_IMEI;
- }
- }
+ sailfish_manager_foreach_driver(p,
+ sailfish_manager_update_dbus_block_proc, &block);
}
sailfish_manager_dbus_set_block(p->dbus, block);
@@ -437,16 +504,14 @@
static void sailfish_manager_set_config_string
(struct sailfish_manager_priv *p, const char *key,
- const char *value, gboolean sync)
+ const char *value)
{
if (value) {
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/src/log.c
^
|
@@ -143,7 +143,7 @@
}
}
-void __ofono_dbg(const struct ofono_debug_desc *desc, const char *format, ...)
+void ofono_dbg(const struct ofono_debug_desc *desc, const char *format, ...)
{
va_list ap;
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/src/sms.c
^
|
@@ -1182,7 +1182,8 @@
static void dispatch_app_datagram(struct ofono_sms *sms,
const struct ofono_uuid *uuid,
int dst, int src,
- unsigned char *buf, unsigned len,
+ const unsigned char *buf,
+ unsigned int len,
const struct sms_address *addr,
const struct sms_scts *scts)
{
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/src/smsutil.c
^
|
@@ -4134,12 +4134,13 @@
*/
for (; i < written; i++, bufsize++) {
if (unpacked[i] == '\r') {
- int t;
+ int j;
- t = strspn((const char *) unpacked + i,
- "\r");
+ for (j = i + 1; j < written; j++)
+ if (unpacked[j] != '\r')
+ break;
- if (t + i == written)
+ if (j == written)
break;
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/unit/coverage
^
|
@@ -17,6 +17,7 @@
test-sms-root \
test-caif \
test-provision \
+ test-sailfish_cell_info \
test-sailfish_manager \
test-sailfish_sim_info"
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/unit/test-provision.c
^
|
@@ -142,6 +142,33 @@
g_assert(!__ofono_gprs_provision_get_settings("000", "01", NULL,
&settings, &count));
+ g_assert(!settings);
+ g_assert(!count);
+}
+
+static void test_bad_driver()
+{
+ static const struct ofono_gprs_provision_driver bad_driver1 = {
+ .name = "Bad driver 1",
+ };
+
+ static const struct ofono_gprs_provision_driver bad_driver2 = {
+ .name = "Bad driver 2",
+ };
+
+ struct ofono_gprs_provision_data *settings = NULL;
+ int count = 0;
+
+ g_assert(!ofono_gprs_provision_driver_register(&bad_driver1));
+ g_assert(!ofono_gprs_provision_driver_register(&bad_driver2));
+
+ g_assert(!__ofono_gprs_provision_get_settings("000", "01", NULL,
+ &settings, &count));
+ g_assert(!settings);
+ g_assert(!count);
+
+ ofono_gprs_provision_driver_unregister(&bad_driver1);
+ ofono_gprs_provision_driver_unregister(&bad_driver2);
}
static void test_no_mcc_mnc()
@@ -169,6 +196,22 @@
static char telia_fi_message_proxy [] = "195.156.25.33:8080";
static char telia_fi_message_center [] = "http://mms/";
+/* Default Internet settings */
+#define DEFAILT_INTERNET_SETTINGS \
+ .type = OFONO_GPRS_CONTEXT_TYPE_INTERNET, \
+ .proto = OFONO_GPRS_PROTO_IPV4V6, \
+ .name = "Internet", \
+ .apn = "internet", \
+ .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
+
+/* Default MMS settings */
+#define DEFAULT_MMS_SETTINGS \
+ .type = OFONO_GPRS_CONTEXT_TYPE_MMS, \
+ .proto = OFONO_GPRS_PROTO_IP, \
+ .name = "MMS", \
+ .apn = "mms", \
+ .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
+
static const struct ofono_gprs_provision_data telia_fi_internet_mms_p[] = {
{
.type = OFONO_GPRS_CONTEXT_TYPE_INTERNET,
@@ -219,23 +262,13 @@
.name = telia_fi_name_internet,
.apn = telia_fi_apn_internet,
.auth_method = OFONO_GPRS_AUTH_METHOD_NONE
- }, { /* Default MMS settings: */
- .type = OFONO_GPRS_CONTEXT_TYPE_MMS,
- .proto = OFONO_GPRS_PROTO_IP,
- .name = "MMS",
- .apn = "mms",
- .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
- }
+ },
+ { DEFAULT_MMS_SETTINGS }
};
static const struct ofono_gprs_provision_data telia_fi_mms[] = {
- { /* Default Internet settings: */
- .type = OFONO_GPRS_CONTEXT_TYPE_INTERNET,
- .proto = OFONO_GPRS_PROTO_IPV4V6,
- .name = "Internet",
- .apn = "internet",
- .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
- }, {
+ { DEFAILT_INTERNET_SETTINGS },
+ {
.type = OFONO_GPRS_CONTEXT_TYPE_MMS,
.proto = OFONO_GPRS_PROTO_IP,
.provider_name = telia_fi_provider_name,
@@ -248,19 +281,8 @@
};
static const struct ofono_gprs_provision_data default_settings[] = {
- { /* Default Internet settings: */
- .type = OFONO_GPRS_CONTEXT_TYPE_INTERNET,
- .proto = OFONO_GPRS_PROTO_IPV4V6,
- .name = "Internet",
- .apn = "internet",
- .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
- }, { /* Default MMS settings: */
- .type = OFONO_GPRS_CONTEXT_TYPE_MMS,
- .proto = OFONO_GPRS_PROTO_IP,
- .name = "MMS",
- .apn = "mms",
- .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
- }
+ { DEFAILT_INTERNET_SETTINGS },
+ { DEFAULT_MMS_SETTINGS }
};
static const struct ofono_gprs_provision_data no_auth_settings[] = {
@@ -299,6 +321,44 @@
}
};
+static const struct ofono_gprs_provision_data settings_ip[] = {
+ {
+ .type = OFONO_GPRS_CONTEXT_TYPE_INTERNET,
+ .proto = OFONO_GPRS_PROTO_IP,
+ .name = "Internet",
+ .apn = "internet",
+ .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
+ },
+ { DEFAULT_MMS_SETTINGS }
+};
+
+static const struct ofono_gprs_provision_data settings_ipv6[] = {
+ {
+ .type = OFONO_GPRS_CONTEXT_TYPE_INTERNET,
+ .proto = OFONO_GPRS_PROTO_IPV6,
+ .name = "Internet",
+ .apn = "internet",
+ .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
+ }, {
+ .type = OFONO_GPRS_CONTEXT_TYPE_MMS,
+ .proto = OFONO_GPRS_PROTO_IPV6,
+ .name = "MMS",
+ .apn = "mms",
+ .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
+ }
+};
+
+static const struct ofono_gprs_provision_data settings_ipv4v6[] = {
+ { DEFAILT_INTERNET_SETTINGS },
+ {
+ .type = OFONO_GPRS_CONTEXT_TYPE_MMS,
+ .proto = OFONO_GPRS_PROTO_IPV4V6,
+ .name = "MMS",
+ .apn = "mms",
+ .auth_method = OFONO_GPRS_AUTH_METHOD_NONE
+ }
+};
+
static char test_provider_name[] = "Test provider";
static char test_message_proxy[] = "192.168.0.1:8888";
static char test_message_center[] = "http://mms/";
@@ -871,6 +931,121 @@
.settings = auth_settings,
.count = G_N_ELEMENTS(auth_settings)
},{
+ .name = TEST_SUITE "protocol_data_ip",
+ .xml =
+"<serviceproviders format=\"2.0\">\n\
+<country code=\"xx\">\n\
+ <provider>\n\
+ <gsm>\n\
+ <network-id mcc=\"123\" mnc=\"45\"/>\n\
+ <apn value=\"internet\">\n\
+ <usage type=\"internet\"/>\n\
+ <name>Internet</name>\n\
+ <protocol type=\"ip\"/>\n\
+ </apn>\n\
+ </gsm>\n\
+ </provider>\n\
+</country>\n\
+</serviceproviders>\n",
+ .mcc = "123",
+ .mnc = "45",
+ .settings = settings_ip,
+ .count = G_N_ELEMENTS(settings_ip)
+ },{
+ .name = TEST_SUITE "protocol_ipv6",
+ .xml =
+"<serviceproviders format=\"2.0\">\n\
+<country code=\"xx\">\n\
+ <provider>\n\
+ <gsm>\n\
+ <network-id mcc=\"123\" mnc=\"45\"/>\n\
+ <apn value=\"internet\">\n\
+ <usage type=\"internet\"/>\n\
+ <name>Internet</name>\n\
+ <protocol type=\"ipv6\"/>\n\
+ </apn>\n\
+ <apn value=\"mms\">\n\
+ <usage type=\"mms\"/>\n\
+ <name>MMS</name>\n\
+ <protocol type=\"ipv6\"/>\n\
+ </apn>\n\
+ </gsm>\n\
+ </provider>\n\
+</country>\n\
+</serviceproviders>\n",
+ .mcc = "123",
+ .mnc = "45",
|
[-]
[+]
|
Added |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/unit/test-sailfish_cell_info.c
^
|
@@ -0,0 +1,203 @@
+/*
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2017 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 <sailfish_cell_info.h>
+
+#include <gutil_log.h>
+
+/* Fake sailfish_cell_info */
+
+#define FAKE_HANDLER_ID (1)
+
+static int fake_sailfish_cell_info_ref_count = 0;
+
+static void fake_sailfish_cell_info_ref(struct sailfish_cell_info *info)
+{
+ g_assert(fake_sailfish_cell_info_ref_count >= 0);
+ fake_sailfish_cell_info_ref_count++;
+}
+
+static void fake_sailfish_cell_info_unref(struct sailfish_cell_info *info)
+{
+ g_assert(fake_sailfish_cell_info_ref_count > 0);
+ fake_sailfish_cell_info_ref_count--;
+}
+
+static gulong fake_sailfish_cell_info_add_cells_changed_handler
+ (struct sailfish_cell_info *info, sailfish_cell_info_cb_t cb, void *arg)
+{
+ return FAKE_HANDLER_ID;
+}
+
+static void fake_sailfish_cell_info_remove_handler
+ (struct sailfish_cell_info *info, gulong id)
+{
+ g_assert(id == FAKE_HANDLER_ID);
+}
+
+static const struct sailfish_cell_info_proc fake_sailfish_cell_info_proc = {
+ fake_sailfish_cell_info_ref,
+ fake_sailfish_cell_info_unref,
+ fake_sailfish_cell_info_add_cells_changed_handler,
+ fake_sailfish_cell_info_remove_handler
+};
+
+static struct sailfish_cell_info fake_sailfish_cell_info = {
+ &fake_sailfish_cell_info_proc,
+ NULL
+};
+
+/* ==== basic ==== */
+
+static void test_basic(void)
+{
+ /* NULL resistance */
+ g_assert(!sailfish_cell_info_ref(NULL));
+ sailfish_cell_info_unref(NULL);
+ g_assert(!sailfish_cell_compare_func(NULL, NULL));
+ g_assert(!sailfish_cell_info_add_cells_changed_handler(NULL, NULL,
+ NULL));
+ sailfish_cell_info_remove_handler(NULL, 0);
+
+ /* Make sure that callbacks are being invoked */
+ g_assert(sailfish_cell_info_ref(&fake_sailfish_cell_info) ==
+ &fake_sailfish_cell_info);
+ g_assert(fake_sailfish_cell_info_ref_count == 1);
+ g_assert(sailfish_cell_info_add_cells_changed_handler(
+ &fake_sailfish_cell_info, NULL, NULL) == FAKE_HANDLER_ID);
+ sailfish_cell_info_remove_handler(&fake_sailfish_cell_info,
+ FAKE_HANDLER_ID);
+ sailfish_cell_info_unref(&fake_sailfish_cell_info);
+ g_assert(!fake_sailfish_cell_info_ref_count);
+}
+
+/* ==== compare ==== */
+
+static void test_compare(void)
+{
+ struct sailfish_cell c1, c2;
+
+ memset(&c1, 0, sizeof(c1));
+ memset(&c2, 0, sizeof(c2));
+
+ g_assert(!sailfish_cell_compare_location(NULL, NULL));
+ g_assert(sailfish_cell_compare_location(&c1, NULL) > 0);
+ g_assert(sailfish_cell_compare_location(NULL, &c2) < 0);
+
+ c1.type = SAILFISH_CELL_TYPE_GSM;
+ c2.type = SAILFISH_CELL_TYPE_WCDMA;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ g_assert(sailfish_cell_compare_location(&c2, &c1) > 0);
+
+ /* GSM */
+ c1.type = SAILFISH_CELL_TYPE_GSM;
+ c2 = c1;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.gsm.mcc++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.gsm.mnc++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.gsm.lac++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.gsm.cid++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ /* Other attributes are not being compared */
+ c2 = c1; c2.info.gsm.arfcn++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.gsm.bsic++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.gsm.signalStrength++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.gsm.bitErrorRate++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.gsm.bitErrorRate++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+
+ /* WCDMA */
+ c1.type = SAILFISH_CELL_TYPE_WCDMA;
+ c2 = c1;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.wcdma.mcc++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.wcdma.mnc++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.wcdma.lac++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.wcdma.cid++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ /* Other attributes are not being compared */
+ c2 = c1; c2.info.wcdma.psc++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.wcdma.uarfcn++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.wcdma.signalStrength++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.wcdma.bitErrorRate++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+
+ /* LTE */
+ c1.type = SAILFISH_CELL_TYPE_LTE;
+ c2 = c1;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.lte.mcc++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.lte.mnc++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.lte.ci++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.lte.pci++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ c2 = c1; c2.info.lte.tac++;
+ g_assert(sailfish_cell_compare_location(&c1, &c2) < 0);
+ /* Other attributes are not being compared */
+ c2 = c1; c2.info.lte.earfcn++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.lte.signalStrength++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.lte.rsrp++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.lte.rsrq++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.lte.rssnr++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.lte.cqi++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+ c2 = c1; c2.info.lte.timingAdvance++;
+ g_assert(!sailfish_cell_compare_location(&c1, &c2));
+}
+
+#define TEST_(name) "/sailfish_cell_info/" name
+
+int main(int argc, char *argv[])
+{
+ g_test_init(&argc, &argv, NULL);
+
+ gutil_log_timestamp = FALSE;
+ gutil_log_default.level = g_test_verbose() ?
+ GLOG_LEVEL_VERBOSE : GLOG_LEVEL_NONE;
+
+ g_test_add_func(TEST_("basic"), test_basic);
+ g_test_add_func(TEST_("compare"), test_compare);
+
+ return g_test_run();
+}
+
+/*
+ * Local Variables:
+ * mode: C
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/unit/test-sailfish_manager.c
^
|
@@ -14,6 +14,8 @@
*/
#include <sailfish_manager.h>
+#include <sailfish_cell_info.h>
+
#include "sailfish_sim_info.h"
#include "sailfish_manager_dbus.h"
#include "fake_sailfish_watch.h"
@@ -127,6 +129,8 @@
struct sailfish_manager_dbus_cb cb;
enum sailfish_manager_dbus_block block;
void (*fn_block_changed)(struct sailfish_manager_dbus *d);
+ void (*fn_signal)(struct sailfish_manager_dbus *d,
+ enum sailfish_manager_dbus_signal m);
int signals;
} fake_sailfish_manager_dbus;
@@ -164,6 +168,9 @@
enum sailfish_manager_dbus_signal m)
{
d->signals |= m;
+ if (d->fn_signal) {
+ d->fn_signal(d, m);
+ }
}
void sailfish_manager_dbus_signal_sim(struct sailfish_manager_dbus *d,
@@ -173,7 +180,7 @@
void sailfish_manager_dbus_signal_modem_error(struct sailfish_manager_dbus *d,
int index, const char *id, const char *msg) {}
-/* Fake sailfish_sim_info_dbus */
+/* Fake sailfish_sim_info */
struct sailfish_sim_info_dbus {
int unused;
@@ -188,6 +195,61 @@
void sailfish_sim_info_dbus_free(struct sailfish_sim_info_dbus *dbus) {}
+/* Fake sailfish_cell_info */
+
+static int fake_sailfish_cell_info_ref_count = 0;
+
+static void fake_sailfish_cell_info_ref(struct sailfish_cell_info *info)
+{
+ g_assert(fake_sailfish_cell_info_ref_count >= 0);
+ fake_sailfish_cell_info_ref_count++;
+}
+
+static void fake_sailfish_cell_info_unref(struct sailfish_cell_info *info)
+{
+ g_assert(fake_sailfish_cell_info_ref_count > 0);
+ fake_sailfish_cell_info_ref_count--;
+}
+
+static gulong fake_sailfish_cell_info_add_cells_changed_handler
+ (struct sailfish_cell_info *info, sailfish_cell_info_cb_t cb, void *arg)
+{
+ return 1;
+}
+
+static void fake_sailfish_cell_info_remove_handler
+ (struct sailfish_cell_info *info, gulong id)
+{
+ g_assert(id == 1);
+}
+
+static const struct sailfish_cell_info_proc fake_sailfish_cell_info_proc = {
+ fake_sailfish_cell_info_ref,
+ fake_sailfish_cell_info_unref,
+ fake_sailfish_cell_info_add_cells_changed_handler,
+ fake_sailfish_cell_info_remove_handler
+};
+
+static struct sailfish_cell_info fake_sailfish_cell_info = {
+ &fake_sailfish_cell_info_proc,
+ NULL
+};
+
+/* Fake sailfish_cell_info_dbus */
+
+struct sailfish_cell_info_dbus {
+ int unused;
+};
+
+struct sailfish_cell_info_dbus *sailfish_cell_info_dbus_new
+ (struct ofono_modem *modem, struct sailfish_cell_info *info)
+{
+ static struct sailfish_cell_info_dbus fake_sailfish_cell_info_dbus;
+ return &fake_sailfish_cell_info_dbus;
+}
+
+void sailfish_cell_info_dbus_free(struct sailfish_cell_info_dbus *dbus) {}
+
/* Code shared by all tests */
typedef struct sailfish_slot_impl {
@@ -347,6 +409,7 @@
sailfish_manager_foreach_slot_manager(NULL, NULL, NULL);
sailfish_manager_imei_obtained(NULL, NULL);
sailfish_manager_imeisv_obtained(NULL, NULL);
+ sailfish_manager_set_cell_info(NULL, NULL);
sailfish_manager_set_sim_state(NULL, SAILFISH_SIM_STATE_UNKNOWN);
sailfish_manager_slot_error(NULL, NULL, NULL);
sailfish_manager_error(NULL, NULL, NULL);
@@ -477,6 +540,43 @@
test_common_deinit();
}
+/* ==== no_plugins ==== */
+
+static void test_quit_when_ready(struct sailfish_manager_dbus *d,
+ enum sailfish_manager_dbus_signal m)
+{
+ DBG("%d", m);
+ if (d->m->ready) {
+ DBG("Ready!");
+ g_main_loop_quit(test_loop);
+ }
+}
+
+static void test_no_plugins(void)
+{
+ test_common_init();
+ fake_sailfish_manager_dbus.fn_signal = test_quit_when_ready;
+ g_main_loop_run(test_loop);
+ test_common_deinit();
+}
+
+/* ==== no_manager ==== */
+
+static void test_no_manager(void)
+{
+ static const struct sailfish_slot_driver no_manager_driver = {
+ .name = "no_manager",
+ };
+
+ test_common_init();
+ g_assert(sailfish_slot_driver_register(&no_manager_driver));
+ fake_sailfish_manager_dbus.fn_signal = test_quit_when_ready;
+ g_main_loop_run(test_loop);
+ g_assert(fake_sailfish_manager_dbus.m->ready);
+
+ test_common_deinit();
+}
+
/* ==== no_slots ==== */
static guint test_no_slots_start(test_slot_manager *sm)
@@ -510,12 +610,37 @@
{
test_slot_manager *sm = user_data;
test_slot *s = sm->slot;
+ struct sailfish_watch *w = sailfish_watch_new(TEST_PATH);
struct sailfish_manager *m = fake_sailfish_manager_dbus.m;
+ struct ofono_modem modem;
char **slots;
GHashTable *errors;
g_assert(m);
+ /* Poke cell info API */
+ sailfish_manager_set_cell_info(s->handle, NULL);
+ sailfish_manager_set_cell_info(s->handle, &fake_sailfish_cell_info);
+
+ memset(&modem, 0, sizeof(modem));
+ w->modem = &modem;
+ w->online = TRUE;
+ fake_sailfish_watch_signal_queue(w, WATCH_SIGNAL_ONLINE_CHANGED);
+ fake_sailfish_watch_signal_queue(w, WATCH_SIGNAL_MODEM_CHANGED);
+ fake_sailfish_watch_emit_queued_signals(w);
+
+ sailfish_manager_set_cell_info(s->handle, NULL);
+ sailfish_manager_set_cell_info(s->handle, &fake_sailfish_cell_info);
+
+ w->modem = NULL;
+ w->online = FALSE;
+ fake_sailfish_watch_signal_queue(w, WATCH_SIGNAL_ONLINE_CHANGED);
+ fake_sailfish_watch_signal_queue(w, WATCH_SIGNAL_MODEM_CHANGED);
+ fake_sailfish_watch_emit_queued_signals(w);
+
+ sailfish_manager_set_cell_info(s->handle, NULL);
+ g_assert(!fake_sailfish_cell_info_ref_count);
+
/* Poke error counters */
sailfish_manager_error(sm->handle, TEST_ERROR_KEY, "Aaah!");
sailfish_manager_slot_error(s->handle, TEST_SLOT_ERROR_KEY, "Aaah!");
@@ -582,6 +707,8 @@
SAILFISH_MANAGER_DBUS_BLOCK_ALL);
fake_sailfish_manager_dbus.fn_block_changed =
test_quit_loop_when_unblocked;
+
+ sailfish_watch_unref(w);
return G_SOURCE_REMOVE;
}
@@ -621,6 +748,7 @@
.slot_enabled_changed = test_slot_enabled_changed,
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/unit/test-simutil.c
^
|
@@ -178,12 +178,12 @@
ber_tlv_builder_optimize(&builder, NULL, NULL);
eons_info = sim_eons_new(1);
- sim_eons_add_pnn_record(eons_info, 1, efpnn0, sizeof(efpnn0));
+ sim_eons_add_pnn_record(eons_info, 1, efpnn0, 8 + 10);
g_assert(!sim_eons_pnn_is_empty(eons_info));
sim_eons_free(eons_info);
eons_info = sim_eons_new(1);
- sim_eons_add_pnn_record(eons_info, 1, efpnn1, sizeof(efpnn1));
+ sim_eons_add_pnn_record(eons_info, 1, efpnn1, 8 + 6);
g_assert(!sim_eons_pnn_is_empty(eons_info));
sim_eons_free(eons_info);
}
|
[-]
[+]
|
Changed |
_service:tar_git:ofono-1.19+git33.tar.bz2/ofono/unit/test-sms.c
^
|
@@ -1145,6 +1145,8 @@
reencoded = sms_decode_text(l);
+ g_slist_free_full(l, g_free);
+
if (g_test_verbose())
g_printf("ReEncoded:\n%s\n", reencoded);
@@ -1304,6 +1306,8 @@
g_assert(decoded_str);
g_assert(strcmp(decoded_str, test->str) == 0);
g_free(decoded_str);
+ g_slist_free_full(pdus, g_free);
+ g_slist_free_full(r, g_free);
sms_assembly_free(assembly);
}
@@ -1334,6 +1338,7 @@
g_assert(g_utf8_strlen(decoded, -1) == target_size);
g_free(decoded);
+ g_slist_free_full(l, g_free);
memcpy(utf8 + i, utf8_char, stride);
utf8[i+stride] = '\0';
|