Compare commits

..

3 Commits

Author SHA1 Message Date
Miia Leinonen
72395683a1 [rilmodem] Fix for Call Barring commit
Signed-off-by: Miia Leinonen <miia.leinonen@oss.tieto.com>
2014-01-16 09:52:30 +02:00
Miia Leinonen
f595d0fae0 [rilmodem] Add Call Barring support
Signed-off-by: Miia Leinonen <miia.leinonen@oss.tieto.com>
2014-01-16 09:52:30 +02:00
Jarko Poutiainen
a170c3a01e [rilmodem] add missing brace characters
Signed-off-by: Jarko Poutiainen <Jarko.Poutiainen@oss.tieto.com>
2014-01-16 09:52:30 +02:00
172 changed files with 1375 additions and 4005 deletions

View File

@@ -92,7 +92,3 @@ Jesper Larsen <jesper.larsen@ixonos.com>
Slava Monich <slava.monich@jolla.com>
Andrew Earl <andrewx.earl@intel.com>
Krzysztof Wilk <krzysztofx.wilk@intel.com>
Tony Espy <espy@canonical.com>
Martin Pitt <martin.pitt@ubuntu.com>
Alfonso Sanchez-Beato <alfonso.sanchez-beato@canonical.com>
Jussi Pakkanen <jussi.pakkanen@canonical.com>

View File

@@ -143,8 +143,7 @@ builtin_sources += drivers/rilmodem/rilmodem.h \
drivers/rilmodem/call-forwarding.c \
drivers/rilmodem/cbs.c \
drivers/rilmodem/oemraw-messages.c \
drivers/rilmodem/call-barring.c \
drivers/rilmodem/stk.c
drivers/rilmodem/call-barring.c
endif
@@ -514,7 +513,7 @@ if PROVISION
builtin_sources += plugins/mbpi.h plugins/mbpi.c
builtin_modules += provision
builtin_sources += plugins/provision.h plugins/provision.c
builtin_sources += plugins/provision.c
builtin_modules += cdma_provision
builtin_sources += plugins/cdma-provision.c
@@ -549,13 +548,6 @@ builtin_sources += plugins/smart-messaging.c
builtin_modules += push_notification
builtin_sources += plugins/push-notification.c
if PUSHFORWARDER
builtin_modules += push_forwarder
builtin_sources += plugins/push-forwarder.c
builtin_cflags += @WSPCODEC_CFLAGS@
builtin_libadd += @WSPCODEC_LIBS@
endif
builtin_modules += sms_history
builtin_sources += plugins/smshistory.c
@@ -587,7 +579,7 @@ src_ofonod_SOURCES = $(builtin_sources) src/ofono.ver \
src/cdma-provision.c src/handsfree.c \
src/handsfree-audio.c src/bluetooth.h \
src/hfp.h src/sim-mnclength.c src/oemraw.c \
src/siri.c src/voicecallagent.c
src/siri.c
src_ofonod_LDADD = gdbus/libgdbus-internal.la $(builtin_libadd) \
@GLIB_LIBS@ @DBUS_LIBS@ -ldl
@@ -720,16 +712,13 @@ test_scripts = test/backtrace \
test/set-context-property \
test/test-gnss \
test/swap-calls \
test/transfer-call \
test/release-and-answer \
test/release-and-swap \
test/hold-and-answer \
test/hangup-multiparty \
test/hangup-call \
test/display-icon \
test/set-msisdn \
test/test-voicecallagent \
test/get-network-time
test/set-msisdn
if TEST
testdir = $(pkglibdir)/test
@@ -750,8 +739,7 @@ unit_tests = unit/test-common unit/test-util unit/test-idmap \
unit/test-grilrequest \
unit/test-grilreply \
unit/test-grilunsol \
unit/test-sms unit/test-cdmasms \
unit/test-provision
unit/test-sms unit/test-cdmasms
noinst_PROGRAMS = $(unit_tests) \
unit/test-sms-root unit/test-mux unit/test-caif
@@ -818,13 +806,6 @@ unit_test_grilunsol_SOURCES = unit/test-grilunsol.c $(gril_sources) \
unit_test_grilunsol_LDADD = @GLIB_LIBS@ -ldl
unit_objects += $(unit_test_grilunsol_OBJECTS)
unit_test_provision_SOURCES = unit/test-provision.c \
plugins/provision.h plugins/provision.c \
plugins/mbpi.c src/gprs-provision.c \
src/log.c
unit_test_provision_LDADD = @GLIB_LIBS@ -ldl
unit_objects += $(unit_test_provision_OBJECTS)
TESTS = $(unit_tests)
if TOOLS

View File

@@ -192,10 +192,7 @@ AM_CONDITIONAL(BLUETOOTH, test "${enable_bluetooth}" != "no")
AC_ARG_ENABLE(nettime, AC_HELP_STRING([--disable-nettime],
[disable Nettime plugin]),
[enable_nettime=${enableval}])
if (test "${enable_nettime}" != "no"); then
AC_SEARCH_LIBS([clock_gettime], [rt])
fi
AM_CONDITIONAL(NETTIME, test "${enable_nettime}" != "no")
AM_CONDITIONAL(NETTIME, test "${enable_netttime}" != "no")
AC_ARG_WITH([provisiondb], AC_HELP_STRING([--with-provisiondb=FILE],
[location of provision database]), [path_provisiondb=${withval}])
@@ -226,17 +223,6 @@ AC_ARG_ENABLE(datafiles, AC_HELP_STRING([--disable-datafiles],
[enable_datafiles=${enableval}])
AM_CONDITIONAL(DATAFILES, test "${enable_datafiles}" != "no")
AC_ARG_ENABLE(pushforwarder, AC_HELP_STRING([--disable-pushforwarder],
[disable Push Forwarder plugin]),
[enable_pushforwarder=${enableval}])
AM_CONDITIONAL(PUSHFORWARDER, test "${enable_pushforwarder}" != "no")
if (test "${enable_pushforwarder}" != "no"); then
PKG_CHECK_MODULES(WSPCODEC, libwspcodec >= 2.0, dummy=yes,
AC_MSG_ERROR(WSP decoder is required))
AC_SUBST(WSPCODEC_CFLAGS)
AC_SUBST(WSPCODEC_LIBS)
fi
if (test "${prefix}" = "NONE"); then
dnl no prefix and no localstatedir, so default to /var
if (test "$localstatedir" = '${prefix}/var'); then

View File

@@ -45,12 +45,6 @@ Properties array{string} Features [readonly]
"voice-recognition"
"attach-voice-tag"
"echo-canceling-and-noise-reduction"
"three-way-calling"
"release-all-held"
"release-specified-active-call"
"private-chat"
"create-multiparty"
"transfer"
boolean InbandRinging [readonly]
@@ -76,7 +70,3 @@ Properties array{string} Features [readonly]
The current charge level of the battery. The value
can be between 0 and 5 respectively.
array{string} SubscriberNumbers [readonly]
List of subscriber numbers provided by the AG.

View File

@@ -198,25 +198,6 @@ Methods dict GetProperties()
[service].Error.InvalidFormat
[service].Error.Failed
void RegisterVoicecallAgent(object path)
Registers an agent which will be called whenever a
specific voice call related event requiring a client
action occurs. Currently, the only such action is
playing a ringback tone locally.
Possible Errors: [service].Error.InProgress
[service].Error.InvalidArguments
[service].Error.InvalidFormat
[service].Error.Failed
void UnregisterVoicecallAgent(object path)
Unregisters an agent.
Possible Errors: [service].Error.InvalidArguments
[service].Error.Failed
Signals CallAdded(object path, dict properties)
Signal that is sent when a new call is added. It
@@ -276,26 +257,3 @@ Properties array{string} EmergencyNumbers [readonly]
of numbers provided by the specification and any
extra numbers provisioned by the carrier on the
SIM.
VoiceCallAgent Hierarchy
========================
Service unique name
Interface org.ofono.VoiceCallAgent
Object path freely definable
Methods void RingbackTone(boolean playTone)
Requests the client to generate an alerting tone locally
(3GPP 24.008; 5.2.1.5). This can happen when an outgoing
voice call is made and network is not providing the
alerting tone. Value 0 stands for "stop playing ringback
tone" and 1 for "start playing ringback tone".
void Release() [noreply]
Agent is being released, possibly because of oFono
terminating, voicecall interface is being torn down or
modem is switched off. No UnregisterVoicecallAgent
call is needed.

View File

@@ -49,7 +49,6 @@ static const char *bvra_prefix[] = { "+BVRA:", NULL };
struct hf_data {
GAtChat *chat;
unsigned int ag_features;
unsigned int ag_chld_features;
int battchg_index;
guint register_source;
};
@@ -125,87 +124,6 @@ static void ciev_notify(GAtResult *result, gpointer user_data)
ofono_handsfree_battchg_notify(hf, value);
}
static void cnum_query_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct cb_data *cbd = user_data;
ofono_handsfree_cnum_query_cb_t cb = cbd->cb;
GAtResultIter iter;
struct ofono_phone_number *list = NULL;
int num = 0;
struct ofono_error error;
decode_at_error(&error, g_at_result_final_response(result));
if (!ok)
goto out;
g_at_result_iter_init(&iter, result);
while (g_at_result_iter_next(&iter, "+CNUM:"))
num++;
if (num == 0)
goto out;
list = g_new0(struct ofono_phone_number, num);
g_at_result_iter_init(&iter, result);
for (num = 0; g_at_result_iter_next(&iter, "+CNUM:"); ) {
const char *number;
int service;
int type;
if (!g_at_result_iter_skip_next(&iter))
continue;
if (!g_at_result_iter_next_string(&iter, &number))
continue;
if (!g_at_result_iter_next_number(&iter, &type))
continue;
if (!g_at_result_iter_skip_next(&iter))
continue;
if (!g_at_result_iter_next_number(&iter, &service))
continue;
/* We are only interested in Voice services */
if (service != 4)
continue;
strncpy(list[num].number, number,
OFONO_MAX_PHONE_NUMBER_LENGTH);
list[num].number[OFONO_MAX_PHONE_NUMBER_LENGTH] = '\0';
list[num].type = type;
DBG("cnum_notify:%s", list[num].number);
num++;
}
out:
cb(&error, num, list, cbd->data);
g_free(list);
}
static void hfp_cnum_query(struct ofono_handsfree *hf,
ofono_handsfree_cnum_query_cb_t cb, void *data)
{
struct hf_data *hd = ofono_handsfree_get_data(hf);
struct cb_data *cbd = cb_data_new(cb, data);
if (g_at_chat_send(hd->chat, "AT+CNUM", NULL,
cnum_query_cb, cbd, g_free) > 0)
return;
g_free(cbd);
CALLBACK_WITH_FAILURE(cb, -1, NULL, data);
}
static gboolean hfp_handsfree_register(gpointer user_data)
{
struct ofono_handsfree *hf = user_data;
@@ -221,7 +139,6 @@ static gboolean hfp_handsfree_register(gpointer user_data)
ofono_handsfree_set_inband_ringing(hf, TRUE);
ofono_handsfree_set_ag_features(hf, hd->ag_features);
ofono_handsfree_set_ag_chld_features(hf, hd->ag_chld_features);
ofono_handsfree_register(hf);
return FALSE;
@@ -237,7 +154,6 @@ static int hfp_handsfree_probe(struct ofono_handsfree *hf,
hd = g_new0(struct hf_data, 1);
hd->chat = g_at_chat_clone(info->chat);
hd->ag_features = info->ag_features;
hd->ag_chld_features = info->ag_mpty_features;
ofono_handsfree_set_data(hf, hd);
@@ -364,7 +280,6 @@ static struct ofono_handsfree_driver driver = {
.name = "hfpmodem",
.probe = hfp_handsfree_probe,
.remove = hfp_handsfree_remove,
.cnum_query = hfp_cnum_query,
.request_phone_number = hfp_request_phone_number,
.voice_recognition = hfp_voice_recognition,
.disable_nrec = hfp_disable_nrec,

View File

@@ -128,19 +128,19 @@ static void chld_cb(gboolean ok, GAtResult *result, gpointer user_data)
while (g_at_result_iter_next_unquoted_string(&iter, &str)) {
if (!strcmp(str, "0"))
ag_mpty_feature |= HFP_AG_CHLD_0;
ag_mpty_feature |= AG_CHLD_0;
else if (!strcmp(str, "1"))
ag_mpty_feature |= HFP_AG_CHLD_1;
ag_mpty_feature |= AG_CHLD_1;
else if (!strcmp(str, "1x"))
ag_mpty_feature |= HFP_AG_CHLD_1x;
ag_mpty_feature |= AG_CHLD_1x;
else if (!strcmp(str, "2"))
ag_mpty_feature |= HFP_AG_CHLD_2;
ag_mpty_feature |= AG_CHLD_2;
else if (!strcmp(str, "2x"))
ag_mpty_feature |= HFP_AG_CHLD_2x;
ag_mpty_feature |= AG_CHLD_2x;
else if (!strcmp(str, "3"))
ag_mpty_feature |= HFP_AG_CHLD_3;
ag_mpty_feature |= AG_CHLD_3;
else if (!strcmp(str, "4"))
ag_mpty_feature |= HFP_AG_CHLD_4;
ag_mpty_feature |= AG_CHLD_4;
}
if (!g_at_result_iter_close_list(&iter))

View File

@@ -19,6 +19,14 @@
*
*/
#define AG_CHLD_0 0x01
#define AG_CHLD_1 0x02
#define AG_CHLD_1x 0x04
#define AG_CHLD_2 0x08
#define AG_CHLD_2x 0x10
#define AG_CHLD_3 0x20
#define AG_CHLD_4 0x40
enum hfp_indicator {
HFP_INDICATOR_SERVICE = 0,
HFP_INDICATOR_CALL,

View File

@@ -37,7 +37,6 @@
#include <ofono/voicecall.h>
#include "common.h"
#include "hfp.h"
#include "hfpmodem.h"
#include "slc.h"
@@ -448,7 +447,7 @@ static void hfp_hold_all_active(struct ofono_voicecall *vc,
{
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
if (vd->ag_mpty_features & HFP_AG_CHLD_2) {
if (vd->ag_mpty_features & AG_CHLD_2) {
hfp_template("AT+CHLD=2", vc, generic_cb, 0, cb, data);
return;
}
@@ -462,7 +461,7 @@ static void hfp_release_all_held(struct ofono_voicecall *vc,
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
unsigned int held_status = 1 << CALL_STATUS_HELD;
if (vd->ag_mpty_features & HFP_AG_CHLD_0) {
if (vd->ag_mpty_features & AG_CHLD_0) {
hfp_template("AT+CHLD=0", vc, generic_cb, held_status,
cb, data);
return;
@@ -477,7 +476,7 @@ static void hfp_set_udub(struct ofono_voicecall *vc,
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
unsigned int incoming_or_waiting = 1 << CALL_STATUS_WAITING;
if (vd->ag_mpty_features & HFP_AG_CHLD_0) {
if (vd->ag_mpty_features & AG_CHLD_0) {
hfp_template("AT+CHLD=0", vc, generic_cb, incoming_or_waiting,
cb, data);
return;
@@ -529,7 +528,7 @@ static void hfp_release_all_active(struct ofono_voicecall *vc,
{
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
if (vd->ag_mpty_features & HFP_AG_CHLD_1) {
if (vd->ag_mpty_features & AG_CHLD_1) {
hfp_template("AT+CHLD=1", vc, release_all_active_cb, 0x1, cb,
data);
return;
@@ -560,7 +559,7 @@ static void hfp_release_specific(struct ofono_voicecall *vc, int id,
struct release_id_req *req = NULL;
char buf[32];
if (!(vd->ag_mpty_features & HFP_AG_CHLD_1x))
if (!(vd->ag_mpty_features & AG_CHLD_1x))
goto error;
req = g_try_new0(struct release_id_req, 1);
@@ -591,7 +590,7 @@ static void hfp_private_chat(struct ofono_voicecall *vc, int id,
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
char buf[32];
if (vd->ag_mpty_features & HFP_AG_CHLD_2x) {
if (vd->ag_mpty_features & AG_CHLD_2x) {
snprintf(buf, sizeof(buf), "AT+CHLD=2%d", id);
hfp_template(buf, vc, generic_cb, 0, cb, data);
@@ -607,7 +606,7 @@ static void hfp_create_multiparty(struct ofono_voicecall *vc,
{
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
if (vd->ag_mpty_features & HFP_AG_CHLD_3) {
if (vd->ag_mpty_features & AG_CHLD_3) {
hfp_template("AT+CHLD=3", vc, generic_cb, 0, cb, data);
return;
@@ -626,7 +625,7 @@ static void hfp_transfer(struct ofono_voicecall *vc,
*/
unsigned int transfer = 0x1 | 0x2 | 0x4 | 0x8;
if (vd->ag_mpty_features & HFP_AG_CHLD_4) {
if (vd->ag_mpty_features & AG_CHLD_4) {
hfp_template("AT+CHLD=4", vc, generic_cb, transfer, cb, data);
return;

View File

@@ -273,7 +273,7 @@ static int ril_call_barring_probe(struct ofono_call_barring *cb,
bd->ril = g_ril_clone(ril);
ofono_call_barring_set_data(cb, bd);
bd->timer_id = g_timeout_add_seconds(2, ril_delayed_register, cb);
g_timeout_add_seconds(2, ril_delayed_register, cb);
return 0;
}

View File

@@ -3,7 +3,7 @@
* oFono - Open Source Telephony
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
* Copyright (C) 2013-2014 Jolla Ltd
* Copyright (C) 2013 Jolla Ltd
* Contact: Jussi Kangas <jussi.kangas@tieto.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -94,10 +94,11 @@ static void ril_registration(struct ofono_call_forwarding *cf, int type,
* or settings made with bearer class
* BEARER_CLASS_DEFAULT. Design decision: If given
* class is BEARER_CLASS_DEFAULT let's map it to
* BEARER_CLASS_VOICE as per RIL design.
* SERVICE_CLASS_NONE as with it e.g. ./send-ussd '*21*<phone_number>#'
* returns cls:53 i.e. 1+4+16+32 as service class.
*/
if (cls == BEARER_CLASS_DEFAULT)
cls = BEARER_CLASS_VOICE;
cls = SERVICE_CLASS_NONE;
parcel_w_int32(&rilp, cls);
@@ -139,10 +140,11 @@ static void ril_send_forward_cmd(struct ofono_call_forwarding *cf,
* or settings made with bearer class
* BEARER_CLASS_DEFAULT. Design decision: If given
* class is BEARER_CLASS_DEFAULT let's map it to
* BEARER_CLASS_VOICE as per RIL design.
* SERVICE_CLASS_NONE as with it e.g. ./send-ussd '*21*<phone_number>#'
* returns cls:53 i.e. 1+4+16+32 as service class.
*/
if (cls == BEARER_CLASS_DEFAULT)
cls = BEARER_CLASS_VOICE;
cls = SERVICE_CLASS_NONE;
parcel_w_int32(&rilp, cls); /* Service class */
@@ -235,8 +237,9 @@ static void ril_query_cb(struct ril_msg *message, gpointer user_data)
list[i].phone_number.number[
OFONO_MAX_PHONE_NUMBER_LENGTH] = '\0';
list[i].time = parcel_r_int32(&rilp);
}
list[i].time = parcel_r_int32(&rilp);
}
CALLBACK_WITH_SUCCESS(cb, nmbr_of_resps, list, cbd->data);
@@ -270,7 +273,8 @@ static void ril_query(struct ofono_call_forwarding *cf, int type, int cls,
* or settings made with bearer class
* BEARER_CLASS_DEFAULT. Design decision: If given
* class is BEARER_CLASS_DEFAULT let's map it to
* SERVICE_CLASS_NONE as per RIL design.
* SERVICE_CLASS_NONE as with it e.g. ./send-ussd '*21*<phone_number>#'
* returns cls:53 i.e. 1+4+16+32 as service class.
*/
if (cls == BEARER_CLASS_DEFAULT)
cls = SERVICE_CLASS_NONE;

View File

@@ -98,7 +98,6 @@ static void query_revision_cb(struct ril_msg *message, gpointer user_data)
revision = parcel_r_string(&rilp);
cb(&error, revision, cbd->data);
g_free(revision);
}
static void ril_query_revision(struct ofono_devinfo *info,
@@ -138,10 +137,10 @@ static void query_serial_cb(struct ril_msg *message, gpointer user_data)
}
ril_util_init_parcel(message, &rilp);
imei = parcel_r_string(&rilp);
cb(&error, imei, cbd->data);
g_free(imei);
}
static void ril_query_serial(struct ofono_devinfo *info,

View File

@@ -45,12 +45,6 @@
#include "rilmodem.h"
enum data_call_state {
DATA_CALL_INACTIVE,
DATA_CALL_LINK_DOWN,
DATA_CALL_ACTIVE,
};
enum state {
STATE_IDLE,
STATE_ENABLING,
@@ -68,16 +62,22 @@ struct gprs_context_data {
static void ril_gprs_context_deactivate_primary(struct ofono_gprs_context *gc,
unsigned int id,
ofono_gprs_context_cb_t cb,
void *data);
ofono_gprs_context_cb_t cb, void *data);
static void set_context_disconnected(struct gprs_context_data *gcd)
{
DBG("");
gcd->active_ctx_cid = -1;
gcd->active_rild_cid = -1;
gcd->state = STATE_IDLE;
}
static void disconnect_context(struct ofono_gprs_context *gc)
{
ril_gprs_context_deactivate_primary(gc, 0, NULL, NULL);
}
static void ril_gprs_context_call_list_changed(struct ril_msg *message,
gpointer user_data)
{
@@ -85,6 +85,7 @@ static void ril_gprs_context_call_list_changed(struct ril_msg *message,
struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
struct data_call *call = NULL;
struct unsol_data_call_list *unsol;
gboolean active_cid_found = FALSE;
gboolean disconnect = FALSE;
GSList *iterator = NULL;
struct ofono_error error;
@@ -99,55 +100,19 @@ static void ril_gprs_context_call_list_changed(struct ril_msg *message,
for (iterator = unsol->call_list; iterator; iterator = iterator->next) {
call = (struct data_call *) iterator->data;
if (call->status != 0)
ofono_info("data call status:%d", call->status);
if (call->cid == gcd->active_rild_cid) {
active_cid_found = TRUE;
if (call->active == DATA_CALL_INACTIVE) {
disconnect = TRUE;
ofono_gprs_context_deactivated(gc, gcd->active_ctx_cid);
break;
}
if (call->active == DATA_CALL_ACTIVE) {
char **split_ip_addr = NULL;
const char **dns_addresses;
if (call->ifname) {
ofono_gprs_context_set_interface(gc,
call->ifname);
if (call->active == 0) {
disconnect = TRUE;
ofono_gprs_context_deactivated(gc, gcd->active_ctx_cid);
}
if (call->addresses) {
ofono_gprs_context_set_ipv4_netmask(gc,
ril_util_get_netmask(call->addresses));
split_ip_addr = g_strsplit(call->addresses,
"/", 2);
ofono_gprs_context_set_ipv4_address(gc,
split_ip_addr[0], TRUE);
}
if (call->gateways) {
ofono_gprs_context_set_ipv4_gateway(gc,
call->gateways);
}
if (call->dnses)
DBG("dnses:%s", call->dnses);
dns_addresses =
(const char **)(call->dnses ?
g_strsplit((const gchar*)call->dnses, " ", 3)
: NULL);
ofono_gprs_context_set_ipv4_dns_servers(gc,
dns_addresses);
break;
}
}
if (disconnect) {
if (disconnect || active_cid_found == FALSE) {
ofono_error("Clearing active context");
set_context_disconnected(gcd);
}
@@ -184,7 +149,10 @@ static void ril_setup_data_call_cb(struct ril_msg *message, gpointer user_data)
gcd->active_rild_cid = reply->cid;
if (error.type != OFONO_ERROR_TYPE_NO_ERROR) {
ofono_error("no active context. disconnect");
if (gcd->active_rild_cid != -1) {
ofono_error("no active context. disconnect");
disconnect_context(gc);
}
goto error;
}
@@ -196,6 +164,7 @@ static void ril_setup_data_call_cb(struct ril_msg *message, gpointer user_data)
error.type = OFONO_ERROR_TYPE_FAILURE;
error.error = reply->status;
set_context_disconnected(gcd);
goto error;
}
@@ -203,7 +172,7 @@ static void ril_setup_data_call_cb(struct ril_msg *message, gpointer user_data)
* TODO: consier moving this into parse_data_reply
*
* Note - the address may optionally include a prefix size
* ( Eg. "/30" ). As this may confuse client, we
* ( Eg. "/30" ). As this confuses NetworkManager, we
* explicitly strip any prefix after calculating the netmask.
*/
split_ip_addr = g_strsplit(reply->ip_addrs[0], "/", 2);
@@ -240,7 +209,7 @@ static void ril_setup_data_call_cb(struct ril_msg *message, gpointer user_data)
ofono_gprs_context_set_ipv4_gateway(gc, reply->gateways[0]);
ofono_gprs_context_set_ipv4_dns_servers(gc,
(const char **) reply->dns_addresses);
(const char **) reply->dns_addresses);
error:
g_ril_reply_free_setup_data_call(reply);
@@ -250,8 +219,8 @@ error:
}
static void ril_gprs_context_activate_primary(struct ofono_gprs_context *gc,
const struct ofono_gprs_primary_context *ctx,
ofono_gprs_context_cb_t cb, void *data)
const struct ofono_gprs_primary_context *ctx,
ofono_gprs_context_cb_t cb, void *data)
{
struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
struct cb_data *cbd = cb_data_new(cb, data);
@@ -315,8 +284,7 @@ error:
}
}
static void ril_deactivate_data_call_cb(struct ril_msg *message,
gpointer user_data)
static void ril_deactivate_data_call_cb(struct ril_msg *message, gpointer user_data)
{
struct cb_data *cbd = user_data;
ofono_gprs_context_cb_t cb = cbd->cb;
@@ -354,8 +322,7 @@ static void ril_deactivate_data_call_cb(struct ril_msg *message,
static void ril_gprs_context_deactivate_primary(struct ofono_gprs_context *gc,
unsigned int id,
ofono_gprs_context_cb_t cb,
void *data)
ofono_gprs_context_cb_t cb, void *data)
{
struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
struct cb_data *cbd = NULL;
@@ -408,7 +375,6 @@ error:
if (ret <= 0) {
ofono_error("Send RIL_REQUEST_DEACTIVATE_DATA_CALL failed.");
g_free(cbd);
if (cb)
CALLBACK_WITH_FAILURE(cb, data);
}
@@ -449,13 +415,14 @@ static void ril_gprs_context_remove(struct ofono_gprs_context *gc)
DBG("");
if (gcd->state != STATE_IDLE)
if (gcd->state != STATE_IDLE) {
ril_gprs_context_detach_shutdown(gc, 0);
}
ofono_gprs_context_set_data(gc, NULL);
if (gcd->regid != -1)
g_ril_unregister(gcd->ril, gcd->regid);
g_ril_unregister(gcd->ril,gcd->regid);
g_ril_unref(gcd->ril);
g_free(gcd);
@@ -465,9 +432,9 @@ static struct ofono_gprs_context_driver driver = {
.name = RILMODEM,
.probe = ril_gprs_context_probe,
.remove = ril_gprs_context_remove,
.activate_primary = ril_gprs_context_activate_primary,
.deactivate_primary = ril_gprs_context_deactivate_primary,
.detach_shutdown = ril_gprs_context_detach_shutdown,
.activate_primary = ril_gprs_context_activate_primary,
.deactivate_primary = ril_gprs_context_deactivate_primary,
.detach_shutdown = ril_gprs_context_detach_shutdown,
};
void ril_gprs_context_init(void)

View File

@@ -45,8 +45,6 @@
#include "rilmodem.h"
#include <ofono/netreg.h>
#include <ofono/sim.h>
#include "storage.h"
/*
* This module is the ofono_gprs_driver implementation for rilmodem.
@@ -65,23 +63,16 @@
* +CREG ( see 27.003 7.2 ).
*/
#define FAKE_STATE_TIMER 5
struct gprs_data {
GRil *ril;
gboolean ofono_attached;
int max_cids;
int rild_status;
int true_status;
gboolean notified;
guint registerid;
guint timer_id;
guint fake_timer_id;
};
/*if we have called ofono_gprs_register or not*/
static gboolean registered;
static void ril_gprs_registration_status(struct ofono_gprs *gprs,
ofono_gprs_status_cb_t cb,
void *data);
@@ -90,10 +81,7 @@ static void ril_gprs_state_change(struct ril_msg *message, gpointer user_data)
{
struct ofono_gprs *gprs = user_data;
g_assert(message->req ==
RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);
DBG("");
g_assert(message->req == RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);
/* We need to notify core always to cover situations when
* connection drops temporarily for example when user is
@@ -109,7 +97,6 @@ static gboolean ril_gprs_set_attached_callback(gpointer user_data)
ofono_gprs_cb_t cb = cbd->cb;
struct ofono_gprs *gprs = cbd->user;
struct gprs_data *gd = ofono_gprs_get_data(gprs);
DBG("");
gd->timer_id = 0;
@@ -142,12 +129,11 @@ static void ril_gprs_set_attached(struct ofono_gprs *gprs, int attached,
* are met.
*/
gd->notified = (gd->ofono_attached == attached) ? TRUE : FALSE;
gd->ofono_attached = attached;
cbd->user = gprs;
ril_gprs_registration_status(gprs, NULL, NULL);
/*
* However we cannot respond immediately, since core sets the
* value of driver_attached after calling set_attached and that
@@ -158,42 +144,6 @@ static void ril_gprs_set_attached(struct ofono_gprs *gprs, int attached,
cbd);
}
static gboolean ril_fake_response(gpointer user_data)
{
struct cb_data *cbd = user_data;
struct ofono_gprs *gprs = cbd->user;
struct gprs_data *gd = ofono_gprs_get_data(gprs);
DBG("");
ofono_gprs_status_notify(gprs, gd->true_status);
g_free(cbd);
return FALSE;
}
static gboolean ril_roaming_allowed()
{
GError *error;
error = NULL;
GKeyFile *settings;
struct ofono_sim *sim;
sim = get_sim();
const char *imsi = ofono_sim_get_imsi(sim);
settings = storage_open(imsi, "gprs");
gboolean roaming_allowed = g_key_file_get_boolean(settings,
"Settings",
"RoamingAllowed",
&error);
if (error)
g_error_free(error);
storage_close(imsi, "gprs", settings, FALSE);
return roaming_allowed;
}
static void ril_data_reg_cb(struct ril_msg *message, gpointer user_data)
{
struct cb_data *cbd = user_data;
@@ -203,8 +153,7 @@ static void ril_data_reg_cb(struct ril_msg *message, gpointer user_data)
struct ofono_error error;
int status, lac, ci, tech;
int max_cids = 1;
DBG("");
int id = RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED;
if (gd && message->error == RIL_E_SUCCESS) {
decode_ril_error(&error, "OK");
@@ -225,20 +174,12 @@ static void ril_data_reg_cb(struct ril_msg *message, gpointer user_data)
goto error;
}
if ((gd->fake_timer_id > 0) &&
((status == (NETWORK_REGISTRATION_STATUS_REGISTERED
|| NETWORK_REGISTRATION_STATUS_ROAMING)) ||
!(gd->ofono_attached))) {
g_source_remove(gd->fake_timer_id);
gd->true_status = -1;
}
if (status > 10)
status = status - 10;
if (!registered) {
if (gd->rild_status == -1) {
ofono_gprs_register(gprs);
registered = TRUE;
DBG("Starting to listen network status");
gd->registerid = g_ril_register(gd->ril,
id, ril_gprs_state_change, gprs);
}
if (max_cids > gd->max_cids) {
@@ -252,130 +193,63 @@ static void ril_data_reg_cb(struct ril_msg *message, gpointer user_data)
if (status == NETWORK_REGISTRATION_STATUS_ROAMING)
status = check_if_really_roaming(status);
DBG(" attached:%d, status:%d", gd->ofono_attached, status);
if (!gd->ofono_attached) {
if (status == NETWORK_REGISTRATION_STATUS_ROAMING) {
if (!gd->notified && cb) {
if (ril_roaming_allowed() == FALSE)
ofono_gprs_detached_notify(gprs);
/*
* This prevents core ending
* into eternal loop with driver
*/
decode_ril_error(&error, "FAIL");
ofono_gprs_status_notify(gprs, status);
}
} else {
if (status == NETWORK_REGISTRATION_STATUS_SEARCHING &&
!gd->notified &&
cb)
/*
* This is a hack that prevents core ending
* into eternal loop with driver
*/
decode_ril_error(&error, "FAIL");
if (gd->ofono_attached && !gd->notified) {
if (status == NETWORK_REGISTRATION_STATUS_ROAMING ||
status == NETWORK_REGISTRATION_STATUS_REGISTERED) {
DBG("connection becomes available");
gd->ofono_attached = TRUE;
ofono_gprs_status_notify(gprs, status);
}
if (cb)
gd->notified = TRUE;
gd->rild_status = status;
gd->rild_status = status;
}
goto error;
}
if (status == NETWORK_REGISTRATION_STATUS_ROAMING ||
status == NETWORK_REGISTRATION_STATUS_REGISTERED) {
ofono_gprs_status_notify(gprs, status);
gd->rild_status = status;
} else {
if (gd->fake_timer_id <= 0) {
struct cb_data *fake_cbd = cb_data_new(NULL, NULL);
fake_cbd->user = gprs;
gd->fake_timer_id = g_timeout_add_seconds(
FAKE_STATE_TIMER,
ril_fake_response, fake_cbd);
if (gd->ofono_attached &&
status != NETWORK_REGISTRATION_STATUS_SEARCHING) {
DBG("ofono attached, start faking responses");
if (status != NETWORK_REGISTRATION_STATUS_ROAMING) {
/*
* Only core can succesfully drop the connection
* If we drop the connection from here it leads
* to race situation where core asks context
* deactivation and at the same time we get
* Registered notification from modem.
*/
status = NETWORK_REGISTRATION_STATUS_REGISTERED;
}
gd->true_status = status;
if (gd->registerid != -1)
g_ril_unregister(gd->ril, gd->registerid);
gd->registerid = -1;
} else {
/*
* Client is not approving succesful result
* This covers the situation when context is
* active in roaming situation and client closes
* it directly by calling RoamingAllowed in API
*/
DBG("data registration status is %d", status);
if (gd->rild_status == NETWORK_REGISTRATION_STATUS_ROAMING)
status = NETWORK_REGISTRATION_STATUS_ROAMING;
else
if (status != NETWORK_REGISTRATION_STATUS_SEARCHING) {
DBG("ofono not attached, notify core");
status = NETWORK_REGISTRATION_STATUS_NOT_REGISTERED;
ofono_gprs_detached_notify(gprs);
gd->notified = FALSE;
gd->ofono_attached = FALSE;
} else if (gd->notified) {
DBG("hide the searching state");
status = NETWORK_REGISTRATION_STATUS_REGISTERED;
gd->rild_status = status;
ofono_gprs_status_notify(gprs, status);
gd->ofono_attached = TRUE;
}
}
error:
ofono_info("data registration status is %d", status);
if (cb)
cb(&error, status, cbd->data);
}
static void ril_data_probe_reg_cb(struct ril_msg *message, gpointer user_data)
{
struct cb_data *cbd = user_data;
struct ofono_gprs *gprs = cbd->user;
struct gprs_data *gd = ofono_gprs_get_data(gprs);
struct ofono_error error;
int status, lac, ci, tech;
int max_cids = 1;
int id = RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED;
DBG("");
if (!(gd && message->error == RIL_E_SUCCESS)) {
ofono_error("ril_data_reg_cb: reply failure: %s",
ril_error_to_string(message->error));
decode_ril_error(&error, "FAIL");
error.error = message->error;
status = NETWORK_REGISTRATION_STATUS_UNKNOWN;
goto out;
}
decode_ril_error(&error, "OK");
status = -1;
if (ril_util_parse_reg(gd->ril, message, &status,
&lac, &ci, &tech, &max_cids) == FALSE) {
ofono_error("Failure parsing data registration response.");
decode_ril_error(&error, "FAIL");
if (status == -1)
status = NETWORK_REGISTRATION_STATUS_UNKNOWN;
goto out;
}
ofono_gprs_register(gprs);
registered = TRUE;
if (max_cids > gd->max_cids) {
DBG("Setting max cids to %d", max_cids);
gd->max_cids = max_cids;
ofono_gprs_set_cid_range(gprs, 1, max_cids);
}
if (status == NETWORK_REGISTRATION_STATUS_ROAMING)
status = check_if_really_roaming(status);
out:
ofono_info("data registration status is %d", status);
DBG("Starting to listen network status");
gd->registerid = g_ril_register(gd->ril,
id, ril_gprs_state_change, gprs);
gd->rild_status = status;
error:
if (cb)
cb(&error, status, cbd->data);
}
static void ril_gprs_registration_status(struct ofono_gprs *gprs,
@@ -387,27 +261,20 @@ static void ril_gprs_registration_status(struct ofono_gprs *gprs,
int request = RIL_REQUEST_DATA_REGISTRATION_STATE;
guint ret;
DBG("");
if (gd == NULL || cbd == NULL)
return;
cbd->user = gprs;
ret = g_ril_send(gd->ril, request,
NULL, 0,
((gd->rild_status == -1)
? ril_data_probe_reg_cb
: ril_data_reg_cb), cbd, g_free);
NULL, 0, ril_data_reg_cb, cbd, g_free);
g_ril_print_request_no_args(gd->ril, ret, request);
if (ret <= 0) {
ofono_error("Send RIL_REQUEST_DATA_RESTISTRATION_STATE fail.");
ofono_error("Send RIL_REQUEST_DATA_RESTISTRATION_STATE failed.");
g_free(cbd);
if (cb)
CALLBACK_WITH_FAILURE(cb, -1, data);
CALLBACK_WITH_FAILURE(cb, -1, data);
}
}
@@ -425,13 +292,9 @@ static int ril_gprs_probe(struct ofono_gprs *gprs,
gd->ofono_attached = FALSE;
gd->max_cids = 0;
gd->rild_status = -1;
gd->true_status = -1;
gd->notified = FALSE;
gd->registerid = -1;
gd->timer_id = 0;
registered = FALSE;
ofono_gprs_set_data(gprs, gd);
ril_gprs_registration_status(gprs, NULL, NULL);
@@ -453,9 +316,6 @@ static void ril_gprs_remove(struct ofono_gprs *gprs)
if (gd->timer_id > 0)
g_source_remove(gd->timer_id);
if (gd->fake_timer_id > 0)
g_source_remove(gd->fake_timer_id);
g_ril_unref(gd->ril);
g_free(gd);
}

View File

@@ -573,17 +573,6 @@ error:
ofono_error("Unable to notify ofono about nitz");
}
gboolean check_if_ok_to_attach()
{
int status = NETWORK_REGISTRATION_STATUS_SEARCHING;
status = ofono_netreg_get_status(current_netreg);
if (status == NETWORK_REGISTRATION_STATUS_SEARCHING
|| status == NETWORK_REGISTRATION_STATUS_ROAMING
|| status == NETWORK_REGISTRATION_STATUS_REGISTERED)
return TRUE;
return FALSE;
}
gint check_if_really_roaming(gint status)
{
const char *net_mcc = ofono_netreg_get_mcc(current_netreg);
@@ -669,7 +658,6 @@ static void ril_netreg_remove(struct ofono_netreg *netreg)
g_source_remove(nd->nitz_timeout);
ofono_netreg_set_data(netreg, NULL);
current_netreg = NULL;
if (nd->timer_id > 0)
g_source_remove(nd->timer_id);

View File

@@ -38,18 +38,14 @@
struct oem_raw_data {
GRil *ril;
unsigned int vendor;
guint timer_id;
};
static gboolean ril_oemraw_delayed_register(gpointer user_data)
{
struct ofono_oem_raw *raw = user_data;
struct oem_raw_data *od = ofono_oem_raw_get_data(raw);
DBG("");
od->timer_id = 0;
ofono_oem_raw_dbus_register(raw);
return FALSE; /* This makes the timeout a single-shot */
}
@@ -68,8 +64,7 @@ static int ril_oemraw_probe(struct ofono_oem_raw *raw, unsigned int vendor,
od->vendor = vendor;
ofono_oem_raw_set_data(raw, od);
od->timer_id = g_timeout_add_seconds(1, ril_oemraw_delayed_register,
raw);
g_timeout_add_seconds(1, ril_oemraw_delayed_register, raw);
return 0;
}
@@ -84,9 +79,6 @@ static void ril_oemraw_remove(struct ofono_oem_raw *raw)
ofono_oem_raw_set_data(raw, NULL);
if (od->timer_id)
g_source_remove(od->timer_id);
g_ril_unref(od->ril);
g_free(od);
}

View File

@@ -162,18 +162,11 @@ void handle_adn(size_t len, char *name, const unsigned char *msg,
char *number, struct pb_file_info *next_file,
struct pb_data *pbd)
{
uint8_t name_length;
uint8_t number_start;
const uint8_t name_length = len - 14;
const uint8_t number_start = name_length;
uint8_t number_length = 0;
uint8_t extension_record = UNUSED;
uint8_t i, prefix;
if (len < 14)
return;
name_length = len - 14;
number_start = name_length;
name = sim_string_to_utf8(msg, name_length);
/* Length contains also TON&NPI */
number_length = msg[number_start];
@@ -263,19 +256,15 @@ void handle_adn(size_t len, char *name, const unsigned char *msg,
}
}
void handle_sne(size_t len, const unsigned char *msg, char *sne)
void handle_sne(size_t len,
const unsigned char *msg,
char *sne)
{
uint8_t sne_length;
uint8_t phonebook_entry_nbr;
const uint8_t sne_length = len - 2;
uint8_t phonebook_entry_nbr = msg[len - 1];
DBG("SNE");
if (len < 2)
return;
sne_length = len - 2;
phonebook_entry_nbr = msg[len - 1];
sne = sim_string_to_utf8(msg, sne_length);
if (sne) {
@@ -310,26 +299,20 @@ void handle_sne(size_t len, const unsigned char *msg, char *sne)
}
}
void handle_anr(size_t len,const unsigned char *msg,char *anr,
struct pb_file_info *next_file, struct pb_data *pbd)
void handle_anr(size_t len,
const unsigned char *msg,
char *anr,
struct pb_file_info *next_file,
struct pb_data *pbd)
{
uint8_t number_length = 0;
uint8_t extension_record = UNUSED;
uint8_t aas_record = UNUSED;
uint8_t i, prefix;
uint8_t phonebook_entry_nbr;
uint8_t phonebook_entry_nbr = msg[len - 1];
GSList *list_entry;
DBG("ANR");
if (!msg)
return;
if (len < 1)
return;
phonebook_entry_nbr = msg[len - 1];
if (msg[0] == UNUSED)
return;
@@ -415,18 +398,11 @@ void handle_anr(size_t len,const unsigned char *msg,char *anr,
}
}
void handle_email(size_t len, const unsigned char *msg, char *email)
void handle_email(size_t len,
const unsigned char *msg,
char *email)
{
uint8_t phonebook_entry_nbr;
if (!msg)
return;
if (len < 1)
return;
phonebook_entry_nbr = msg[len - 1];
uint8_t phonebook_entry_nbr = msg[len - 1];
email = sim_string_to_utf8(msg, len - 2);
/* GSlist nth counts from 0, PB entries from 1 */
@@ -458,13 +434,13 @@ void handle_email(size_t len, const unsigned char *msg, char *email)
}
}
void handle_ext1(struct pb_data *pbd, const unsigned char *msg,
char *ext_number, struct pb_file_info *next_file)
void handle_ext1(struct pb_data *pbd,
const unsigned char *msg,
char *ext_number,
struct pb_file_info *next_file)
{
uint8_t number_length, i, next_extension_record;
if (!msg)
return;
number_length = msg[1];
@@ -842,7 +818,7 @@ static void pb_content_data_cb(const struct ofono_error *error,
file_info = pb_next->data;
if (((file_info->structure ==
OFONO_SIM_FILE_STRUCTURE_FIXED) ||
OFONO_SIM_FILE_STRUCTURE_FIXED) ||
(file_info->structure ==
OFONO_SIM_FILE_STRUCTURE_CYCLIC))
&& (file_info->record <
@@ -1131,27 +1107,15 @@ static void pb_reference_data_cb(const struct ofono_error *error,
pbd->pb_reference_file_info.record_length)) {
pbd->pb_reference_file_info.record++;
DBG("Next EFpbr record %d", pbd->pb_reference_file_info.record);
if (RIL_APPTYPE_SIM == ril_get_app_type()) {
pbd->sim_driver->read_file_linear(get_sim(),
pbd->pb_reference_file_info.
file_id,
pbd->pb_reference_file_info.
record,
pbd->pb_reference_file_info.
record_length,
sim_path, sizeof(sim_path),
pb_reference_data_cb, cbd);
} else {
pbd->sim_driver->read_file_linear(get_sim(),
pbd->pb_reference_file_info.
file_id,
pbd->pb_reference_file_info.
record,
pbd->pb_reference_file_info.
record_length,
usim_path, sizeof(usim_path),
pb_reference_data_cb, cbd);
}
pbd->sim_driver->read_file_linear(get_sim(),
pbd->pb_reference_file_info.
file_id,
pbd->pb_reference_file_info.
record,
pbd->pb_reference_file_info.
record_length,
NULL, 0,
pb_reference_data_cb, cbd);
} else {
struct pb_file_info *file_info;
DBG("All EFpbr records read");

View File

@@ -35,7 +35,6 @@
#include <ofono/log.h>
#include <ofono/modem.h>
#include <ofono/radio-settings.h>
#include <ofono/sim.h>
#include "gril.h"
#include "grilutil.h"
@@ -75,7 +74,7 @@ static void ril_set_rat_mode(struct ofono_radio_settings *rs,
int pref = rd->ratmode;
int ret = 0;
ofono_info("setting rat mode:%d", mode);
ofono_info("setting rat mode");
parcel_init(&rilp);
@@ -201,17 +200,11 @@ static gboolean ril_get_net_config(struct radio_data *rsd)
{
GKeyFile *keyfile;
GError *err = NULL;
char *config_path = RIL_CONFIG_DIR;
char *path = RIL_CONFIG;
char **alreadyset = NULL;
gboolean needsconfig = FALSE;
gboolean value = FALSE;
gboolean found = FALSE;
rsd->ratmode = PREF_NET_TYPE_GSM_WCDMA_AUTO;
GDir *config_dir;
const gchar *config_file;
gsize length;
gchar **codes = NULL;
int i;
/*
* First we need to check should the LTE be on
@@ -222,45 +215,15 @@ static gboolean ril_get_net_config(struct radio_data *rsd)
g_key_file_set_list_separator(keyfile, ',');
config_dir = g_dir_open(config_path, 0, NULL);
while ((config_file = g_dir_read_name(config_dir)) != NULL) {
char *path = g_strconcat(RIL_CONFIG_DIR "/", config_file, NULL);
DBG("Rilconfig handling %s", path);
gboolean ok = g_key_file_load_from_file(keyfile, path, 0, &err);
g_free(path);
if (!ok) {
g_error_free(err);
DBG("Rilconfig file skipped");
continue;
}
if (g_key_file_load_from_file(keyfile, path, 0, &err)) {
if (g_key_file_has_group(keyfile, LTE_FLAG))
found = TRUE;
else if (g_key_file_has_group(keyfile, MCC_LIST)) {
codes = g_key_file_get_string_list(keyfile, MCC_LIST,
MCC_KEY, &length, NULL);
if (codes) {
for (i = 0; codes[i]; i++) {
if (g_str_equal(codes[i],
ofono_sim_get_mcc(get_sim()))
== TRUE) {
found = TRUE;
break;
}
}
g_strfreev(codes);
}
}
if (found) {
rsd->ratmode = PREF_NET_TYPE_LTE_GSM_WCDMA;
break;
}
} else {
g_error_free(err);
needsconfig = TRUE;
}
g_key_file_free(keyfile);
g_dir_close(config_dir);
/* Then we need to check if it already set */

View File

@@ -56,7 +56,6 @@ static int rilmodem_init(void)
ril_call_barring_init();
ril_cbs_init();
ril_oemraw_init();
ril_stk_init();
return 0;
}
@@ -81,7 +80,6 @@ static void rilmodem_exit(void)
ril_call_barring_exit();
ril_cbs_exit();
ril_oemraw_exit();
ril_stk_exit();
}
OFONO_PLUGIN_DEFINE(rilmodem, "RIL modem driver", VERSION,

View File

@@ -28,14 +28,9 @@
/* Shared constants */
#define EF_STATUS_INVALIDATED 0
#define EF_STATUS_VALID 1
#define RIL_HW_CONFIG "/etc/ofono/ril_subscription.conf"
#define RIL_CONFIG_DIR "/etc/ofono/"
#define RIL_CONFIG "/etc/ofono/ril_subscription.conf"
#define RIL_STORE "rilmodem"
#define LTE_FLAG "4gOn"
#define MCC_LIST "MCC-whitelist"
#define MCC_KEY "Countries"
#define UI_LANG "/var/lib/environment/nemo/locale.conf"
#define CFG_LANG "LANG="
extern void ril_devinfo_init(void);
extern void ril_devinfo_exit(void);
@@ -84,7 +79,3 @@ extern void ril_phonebook_exit(void);
extern void ril_oemraw_init(void);
extern void ril_oemraw_exit(void);
extern void ril_stk_init(void);
extern void ril_stk_exit(void);

View File

@@ -402,25 +402,13 @@ gboolean ril_util_parse_sim_status(GRil *gril,
apps[i]->app_type = parcel_r_int32(&rilp);
apps[i]->app_state = parcel_r_int32(&rilp);
/*
* Consider RIL_APPSTATE_ILLEGAL also READY. Even if app state
* is RIL_APPSTATE_ILLEGAL (-1), ICC operations must be
* permitted. Network access requests will anyway be rejected
* and ME will be in limited service.
*/
if (apps[i]->app_state == RIL_APPSTATE_ILLEGAL) {
DBG("RIL_APPSTATE_ILLEGAL => RIL_APPSTATE_READY");
apps[i]->app_state = RIL_APPSTATE_READY;
}
apps[i]->perso_substate = parcel_r_int32(&rilp);
/* TODO: we need a way to instruct parcel to skip
* a string, without allocating memory...
*/
apps[i]->aid_str = parcel_r_string(&rilp); /* app ID (AID) */
apps[i]->app_str = parcel_r_string(&rilp); /* app label */
apps[i]->aid_str = parcel_r_string(&rilp); /* application ID (AID) */
apps[i]->app_str = parcel_r_string(&rilp); /* application label */
apps[i]->pin_replaced = parcel_r_int32(&rilp);
apps[i]->pin1_state = parcel_r_int32(&rilp);
@@ -471,8 +459,7 @@ gboolean ril_util_parse_reg(GRil *gril,
* >= 4 for VOICE_REG reply
* >= 5 for DATA_REG reply
*/
tmp = parcel_r_int32(&rilp);
if (tmp < 4) {
if ((tmp = parcel_r_int32(&rilp)) < 4) {
DBG("Size of response array is too small: %d", tmp);
goto error;
}
@@ -495,12 +482,10 @@ gboolean ril_util_parse_reg(GRil *gril,
* voice & data response.
*/
if (tmp--) {
/* TODO: different use for CDMA */
sreason = parcel_r_string(&rilp);
sreason = parcel_r_string(&rilp); /* TODO: different use for CDMA */
if (tmp--) {
/* TODO: different use for CDMA */
smax = parcel_r_string(&rilp);
smax = parcel_r_string(&rilp); /* TODO: different use for CDMA */
if (smax && max_calls)
*max_calls = atoi(smax);
@@ -533,7 +518,7 @@ gboolean ril_util_parse_reg(GRil *gril,
if (tech) {
if (stech) {
switch (atoi(stech)) {
switch(atoi(stech)) {
case RADIO_TECH_UNKNOWN:
*tech = -1;
break;
@@ -674,8 +659,7 @@ gint ril_util_get_signal(GRil *gril, struct ril_msg *message)
return -1;
}
void ril_util_free_sim_apps(struct sim_app **apps, guint num_apps)
{
void ril_util_free_sim_apps(struct sim_app **apps, guint num_apps) {
guint i;
for (i = 0; i < num_apps; i++) {

View File

@@ -62,6 +62,29 @@ enum at_util_charset {
RIL_UTIL_CHARSET_8859_H = 0x10000,
};
/* TODO: consider moving these to ril_constants.h */
enum app_state {
APPSTATE_UNKNOWN,
APPSTATE_DETECTED,
APPSTATE_PIN,
APPSTATE_PUK,
APPSTATE_SUBSCRIPTION_PERSO,
APPSTATE_READY,
};
enum perso_state {
PERSOSUBSTATE_SIM_NETWORK = 3,
PERSOSUBSTATE_SIM_NETWORK_SUBSET,
PERSOSUBSTATE_SIM_CORPORATE,
PERSOSUBSTATE_SIM_SERVICE_PROVIDER,
PERSOSUBSTATE_SIM_SIM,
PERSOSUBSTATE_SIM_NETWORK_PUK,
PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK,
PERSOSUBSTATE_SIM_CORPORATE_PUK,
PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK,
PERSOSUBSTATE_SIM_SIM_PUK,
};
#define MAX_UICC_APPS 16
struct sim_status {
@@ -123,8 +146,6 @@ struct ofono_sim *get_sim();
gint check_if_really_roaming(gint status);
gboolean check_if_ok_to_attach();
void ril_util_free_sim_apps(struct sim_app **apps, guint num_apps);
struct cb_data {
@@ -149,7 +170,7 @@ static inline struct cb_data *cb_data_new2(void *user, void *cb,
{
struct cb_data *ret;
ret = g_new0(struct cb_data, 1);
ret = g_try_new0(struct cb_data, 1);
if (ret) {
ret->cb = cb;
@@ -172,7 +193,7 @@ static inline int ril_util_convert_signal_strength(int strength)
return result;
}
#define DECLARE_FAILURE(e) \
#define DECLARE_FAILURE(e) \
struct ofono_error e; \
e.type = OFONO_ERROR_TYPE_FAILURE; \
e.error = 0 \

View File

@@ -4,7 +4,6 @@
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
* Copyright (C) 2013 Canonical, Ltd. All rights reserved.
* Copyright (C) 2014 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
@@ -103,7 +102,6 @@ struct sim_data {
enum ofono_sim_password_type passwd_state;
guint card_state;
guint idle_id;
gboolean removed;
};
static void ril_pin_change_state_cb(struct ril_msg *message,
@@ -181,15 +179,6 @@ static void ril_file_info_cb(struct ril_msg *message, gpointer user_data)
DBG("");
/* In case sim card has been removed prior to this callback has been
* called we must not call the core call back method as otherwise the
* core will crash.
*/
if (sd->removed == TRUE) {
ofono_error("RIL_CARDSTATE_ABSENT");
return;
}
if (message->error == RIL_E_SUCCESS) {
decode_ril_error(&error, "OK");
} else {
@@ -567,42 +556,42 @@ static void configure_active_app(struct sim_data *sd,
DBG("setting aid_str (AID) to: %s", sd->aid_str);
switch (app->app_state) {
case RIL_APPSTATE_PIN:
case APPSTATE_PIN:
sd->passwd_state = OFONO_SIM_PASSWORD_SIM_PIN;
break;
case RIL_APPSTATE_PUK:
case APPSTATE_PUK:
sd->passwd_state = OFONO_SIM_PASSWORD_SIM_PUK;
break;
case RIL_APPSTATE_SUBSCRIPTION_PERSO:
case APPSTATE_SUBSCRIPTION_PERSO:
switch (app->perso_substate) {
case RIL_PERSOSUBSTATE_SIM_NETWORK:
case PERSOSUBSTATE_SIM_NETWORK:
sd->passwd_state = OFONO_SIM_PASSWORD_PHNET_PIN;
break;
case RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET:
case PERSOSUBSTATE_SIM_NETWORK_SUBSET:
sd->passwd_state = OFONO_SIM_PASSWORD_PHNETSUB_PIN;
break;
case RIL_PERSOSUBSTATE_SIM_CORPORATE:
case PERSOSUBSTATE_SIM_CORPORATE:
sd->passwd_state = OFONO_SIM_PASSWORD_PHCORP_PIN;
break;
case RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER:
case PERSOSUBSTATE_SIM_SERVICE_PROVIDER:
sd->passwd_state = OFONO_SIM_PASSWORD_PHSP_PIN;
break;
case RIL_PERSOSUBSTATE_SIM_SIM:
case PERSOSUBSTATE_SIM_SIM:
sd->passwd_state = OFONO_SIM_PASSWORD_PHSIM_PIN;
break;
case RIL_PERSOSUBSTATE_SIM_NETWORK_PUK:
case PERSOSUBSTATE_SIM_NETWORK_PUK:
sd->passwd_state = OFONO_SIM_PASSWORD_PHNET_PUK;
break;
case RIL_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK:
case PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK:
sd->passwd_state = OFONO_SIM_PASSWORD_PHNETSUB_PUK;
break;
case RIL_PERSOSUBSTATE_SIM_CORPORATE_PUK:
case PERSOSUBSTATE_SIM_CORPORATE_PUK:
sd->passwd_state = OFONO_SIM_PASSWORD_PHCORP_PUK;
break;
case RIL_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK:
case PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK:
sd->passwd_state = OFONO_SIM_PASSWORD_PHSP_PUK;
break;
case RIL_PERSOSUBSTATE_SIM_SIM_PUK:
case PERSOSUBSTATE_SIM_SIM_PUK:
sd->passwd_state = OFONO_SIM_PASSWORD_PHFSIM_PUK;
break;
default:
@@ -610,11 +599,11 @@ static void configure_active_app(struct sim_data *sd,
break;
};
break;
case RIL_APPSTATE_READY:
case APPSTATE_READY:
sd->passwd_state = OFONO_SIM_PASSWORD_NONE;
break;
case RIL_APPSTATE_UNKNOWN:
case RIL_APPSTATE_DETECTED:
case APPSTATE_UNKNOWN:
case APPSTATE_DETECTED:
default:
sd->passwd_state = OFONO_SIM_PASSWORD_INVALID;
break;
@@ -669,7 +658,6 @@ static void sim_status_cb(struct ril_msg *message, gpointer user_data)
if (sd->card_state != RIL_CARDSTATE_PRESENT) {
ofono_sim_inserted_notify(sim, TRUE);
sd->card_state = RIL_CARDSTATE_PRESENT;
sd->removed = FALSE;
}
}
@@ -707,7 +695,6 @@ static void sim_status_cb(struct ril_msg *message, gpointer user_data)
parcel_w_int32(&rilp, 1);
parcel_w_int32(&rilp, 1);
ofono_info("RIL_REQUEST_RADIO_POWER ON");
g_ril_send(sd->ril,
RIL_REQUEST_RADIO_POWER,
rilp.data,
@@ -727,10 +714,7 @@ static void sim_status_cb(struct ril_msg *message, gpointer user_data)
if (status.card_state == RIL_CARDSTATE_ABSENT) {
DBG("sd->card_state:%u,status.card_state:%u,",
sd->card_state, status.card_state);
ofono_info("RIL_CARDSTATE_ABSENT");
ofono_sim_inserted_notify(sim, FALSE);
if (sd->card_state == RIL_CARDSTATE_PRESENT)
sd->removed = TRUE;
sd->card_state = RIL_CARDSTATE_ABSENT;
if (current_passwd)
@@ -808,8 +792,10 @@ static void ril_pin_change_state_cb(struct ril_msg *message, gpointer user_data)
retries[passwd_type] = retry_count;
sd->retries[passwd_type] = retries[passwd_type];
DBG("result=%d passwd_type=%d retry_count=%d",
message->error, passwd_type, retry_count);
/*
* TODO: re-bfactor to not use macro for FAILURE; doesn't return error!
*/
if (message->error == RIL_E_SUCCESS) {
CALLBACK_WITH_SUCCESS(cb, cbd->data);
g_ril_print_response_no_args(sd->ril, message);
@@ -858,53 +844,11 @@ static void ril_pin_send(struct ofono_sim *sim, const char *passwd,
}
}
static int ril_perso_change_state(struct ofono_sim *sim,
enum ofono_sim_password_type passwd_type,
int enable, const char *passwd,
ofono_sim_lock_unlock_cb_t cb, void *data)
{
struct sim_data *sd = ofono_sim_get_data(sim);
struct cb_data *cbd = cb_data_new(cb, data);
struct parcel rilp;
int request = 0;
int ret = 0;
sd->passwd_type = passwd_type;
cbd->user = sd;
parcel_init(&rilp);
switch (passwd_type) {
case OFONO_SIM_PASSWORD_PHNET_PIN:
if (enable) {
DBG("Not supported, enable=%d", enable);
goto end;
}
request = RIL_REQUEST_ENTER_NETWORK_DEPERSONALIZATION;
parcel_w_int32(&rilp, RIL_PERSOSUBSTATE_SIM_NETWORK);
parcel_w_string(&rilp, (char *) passwd);
break;
default:
DBG("Not supported, type=%d", passwd_type);
goto end;
}
ret = g_ril_send(sd->ril, request,
rilp.data, rilp.size, ril_pin_change_state_cb,
cbd, g_free);
g_ril_print_request(sd->ril, ret, request);
end:
parcel_free(&rilp);
return ret;
}
static void ril_pin_change_state(struct ofono_sim *sim,
enum ofono_sim_password_type passwd_type,
int enable, const char *passwd,
ofono_sim_lock_unlock_cb_t cb, void *data)
{
DBG("passwd_type=%d", passwd_type);
struct sim_data *sd = ofono_sim_get_data(sim);
struct cb_data *cbd = cb_data_new(cb, data);
struct parcel rilp;
@@ -942,9 +886,9 @@ static void ril_pin_change_state(struct ofono_sim *sim,
parcel_w_string(&rilp, "P2");
break;
case OFONO_SIM_PASSWORD_PHNET_PIN:
ret = ril_perso_change_state(sim, passwd_type, enable, passwd,
cb, data);
goto end;
g_ril_append_print_buf(sd->ril, "(PN,");
parcel_w_string(&rilp, "PN");
break;
case OFONO_SIM_PASSWORD_PHNETSUB_PIN:
g_ril_append_print_buf(sd->ril, "(PU,");
parcel_w_string(&rilp, "PU");
@@ -958,7 +902,8 @@ static void ril_pin_change_state(struct ofono_sim *sim,
parcel_w_string(&rilp, "PC");
break;
default:
goto end;
CALLBACK_WITH_FAILURE(cb, data);
return;
}
if (enable)
@@ -985,7 +930,6 @@ static void ril_pin_change_state(struct ofono_sim *sim,
g_ril_print_request(sd->ril, ret, request);
end:
parcel_free(&rilp);
if (ret <= 0) {
@@ -1115,7 +1059,6 @@ static int ril_sim_probe(struct ofono_sim *sim, unsigned int vendor,
sd->passwd_type = OFONO_SIM_PASSWORD_NONE;
sd->sim_registered = FALSE;
sd->card_state = RIL_CARDSTATE_ABSENT;
sd->removed = FALSE;
for (i = 0; i < OFONO_SIM_PASSWORD_INVALID; i++)
sd->retries[i] = -1;
@@ -1149,8 +1092,6 @@ static void ril_sim_remove(struct ofono_sim *sim)
if (sd->idle_id > 0)
g_source_remove(sd->idle_id);
g_free(sd->aid_str);
g_free(sd->app_str);
g_ril_unref(sd->ril);
g_free(sd);
}
@@ -1171,6 +1112,17 @@ static struct ofono_sim_driver driver = {
.change_passwd = ril_change_passwd,
.query_pin_retries = ril_query_pin_retries,
/*
* TODO: Implmenting PIN/PUK support requires defining
* the following driver methods.
*
* In the meanwhile, as long as the SIM card is present,
* and unlocked, the core SIM code will check for the
* presence of query_passwd_state, and if null, then the
* function sim_initialize_after_pin() is called.
*
* .query_pin_retries = ril_pin_retries_query,
* .query_locked = ril_pin_query_enabled,
*
* TODO: Implementing SIM write file IO support requires
* the following functions to be defined.
*

View File

@@ -38,18 +38,10 @@
#include <ofono/log.h>
#include <ofono/modem.h>
#include <ofono/sms.h>
#include <ofono/types.h>
#include <ofono/sim.h>
#include "smsutil.h"
#include "util.h"
#include "rilmodem.h"
#include "simutil.h"
#define SIM_EFSMS_FILEID 0x6F3C
#define EFSMS_LENGTH 176
unsigned char path[4] = {0x3F, 0x00, 0x7F, 0x10};
struct sms_data {
GRil *ril;
@@ -176,14 +168,10 @@ static void submit_sms_cb(struct ril_msg *message, gpointer user_data)
int mr;
if (message->error == RIL_E_SUCCESS) {
ofono_info("sms sending successful");
ofono_info("sms sending succesful");
decode_ril_error(&error, "OK");
} else if (message->error == RIL_E_GENERIC_FAILURE) {
ofono_info("not allowed by MO SMS control, do not retry");
error.type = OFONO_ERROR_TYPE_CMS;
error.error = 500;
} else {
ofono_error("sms sending failed, retry");
ofono_error("sms sending failed");
decode_ril_error(&error, "FAIL");
}
@@ -260,21 +248,19 @@ static void ril_ack_delivery_cb(struct ril_msg *message, gpointer user_data)
"SMS acknowledgement failed: Further SMS reception is not guaranteed");
}
static void ril_ack_delivery(struct ofono_sms *sms, int error)
static void ril_ack_delivery(struct ofono_sms *sms)
{
struct sms_data *sd = ofono_sms_get_data(sms);
struct parcel rilp;
int ret;
int request = RIL_REQUEST_SMS_ACKNOWLEDGE;
int code = 0;
if (!error)
code = 0xFF;
parcel_init(&rilp);
parcel_w_int32(&rilp, 2); /* Number of int32 values in array */
parcel_w_int32(&rilp, error); /* Successful (1)/Failed (0) receipt */
parcel_w_int32(&rilp, code); /* error code */
parcel_w_int32(&rilp, 1); /* Successful receipt */
parcel_w_int32(&rilp, 0); /* error code */
/* TODO: should ACK be sent for either of the error cases? */
/* ACK the incoming NEW_SMS */
ret = g_ril_send(sd->ril, request,
@@ -343,109 +329,14 @@ static void ril_sms_notify(struct ril_msg *message, gpointer user_data)
ril_buf_len - smsc_len);
}
ril_ack_delivery(sms, TRUE);
ril_ack_delivery(sms);
return;
error:
ril_ack_delivery(sms, FALSE);
ofono_error("Unable to parse NEW_SMS notification");
}
static void ril_new_sms_on_sim_cb(struct ril_msg *message, gpointer user_data)
{
DBG("");
if (message->error == RIL_E_SUCCESS)
ofono_info("sms deleted from sim");
else
ofono_error("deleting sms from sim failed");
}
static void ril_request_delete_sms_om_sim(struct ofono_sms *sms,int record)
{
struct sms_data *data = ofono_sms_get_data(sms);
struct parcel rilp;
int request = RIL_REQUEST_DELETE_SMS_ON_SIM;
int ret;
DBG("Deleting record: %d", record);
parcel_init(&rilp);
parcel_w_int32(&rilp, 1); /* Number of int32 values in array */
parcel_w_int32(&rilp, record);
ret = g_ril_send(data->ril, request, rilp.data,
rilp.size, ril_new_sms_on_sim_cb, NULL, NULL);
parcel_free(&rilp);
if (ret <= 0)
ofono_error("cannot delete sms from sim");
}
static void ril_read_sms_on_sim_cb(const struct ofono_error *error,
const unsigned char *sdata,
int length, void *data)
{
struct cb_data *cbd = data;
struct ofono_sms *sms = cbd->user;
int sms_len,i,record;
unsigned int smsc_len;
if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
ofono_error("cannot read sms from sim");
goto exit;
}
sms_len = strlen(sdata);
/*
* It seems when reading EFsms RIL returns the whole record including
* the first status byte therefore we ignore that as we are only
* interested of the following pdu
*/
/* The first octect in the pdu contains the SMSC address length
* which is the X following octects it reads. We add 1 octet to
* the read length to take into account this read octet in order
* to calculate the proper tpdu length.
*/
smsc_len = sdata[1] + 1;
ofono_sms_deliver_notify(sms, sdata + 1, length - 1,
length - smsc_len - 1);
record = (int)cbd->data;
ril_request_delete_sms_om_sim(sms,record);
exit:
g_free(cbd);
}
static void ril_new_sms_on_sim(struct ril_msg *message, gpointer user_data)
{
struct ofono_sms *sms = user_data;
struct parcel rilp;
int record;
ofono_info("new sms on sim");
ril_util_init_parcel(message, &rilp);
/* data length of the response */
record = parcel_r_int32(&rilp);
if (record > 0) {
record = parcel_r_int32(&rilp);
struct cb_data *cbd = cb_data_new2(sms, NULL, record);
DBG(":%d", record);
get_sim_driver()->read_file_linear(get_sim(), SIM_EFSMS_FILEID,
record, EFSMS_LENGTH, path,
sizeof(path),
ril_read_sms_on_sim_cb, cbd);
}
}
static gboolean ril_delayed_register(gpointer user_data)
{
struct ofono_sms *sms = user_data;
@@ -461,8 +352,6 @@ static gboolean ril_delayed_register(gpointer user_data)
ril_sms_notify, sms);
g_ril_register(data->ril, RIL_UNSOL_RESPONSE_NEW_SMS_STATUS_REPORT,
ril_sms_notify, sms);
g_ril_register(data->ril, RIL_UNSOL_RESPONSE_NEW_SMS_ON_SIM,
ril_new_sms_on_sim, sms);
/* This makes the timeout a single-shot */
return FALSE;

View File

@@ -1,337 +0,0 @@
/*
*
* oFono - Open Source Telephony
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
* Copyright (C) 2014 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#define _GNU_SOURCE
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <glib.h>
#include <ofono/log.h>
#include <ofono/modem.h>
#include <ofono/stk.h>
#include "gril.h"
#include "util.h"
#include "rilmodem.h"
#include "ril_constants.h"
struct stk_data {
GRil *ril;
};
gboolean subscribed;
static void ril_envelope_cb(struct ril_msg *message, gpointer user_data)
{
struct cb_data *cbd = user_data;
ofono_stk_envelope_cb_t cb = cbd->cb;
struct ofono_error error;
DBG("");
if (message->error == RIL_E_SUCCESS) {
decode_ril_error(&error, "OK");
} else {
DBG("Envelope reply failure: %s",
ril_error_to_string(message->error));
decode_ril_error(&error, "FAIL");
}
cb(&error, NULL, 0, cbd->data);
}
static void ril_stk_envelope(struct ofono_stk *stk, int length,
const unsigned char *command,
ofono_stk_envelope_cb_t cb, void *data)
{
struct stk_data *sd = ofono_stk_get_data(stk);
struct cb_data *cbd = cb_data_new(cb, data);
struct parcel rilp;
char *hex_envelope = NULL;
int request = RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND;
guint ret;
DBG("");
hex_envelope = encode_hex(command, length, 0);
DBG("rilmodem envelope: %s", hex_envelope);
parcel_init(&rilp);
parcel_w_string(&rilp, hex_envelope);
ret = g_ril_send(sd->ril, request,
rilp.data, rilp.size, ril_envelope_cb,
cbd, g_free);
parcel_free(&rilp);
if (ret <= 0) {
g_free(cbd);
CALLBACK_WITH_FAILURE(cb, NULL, -1, data);
}
}
static void ril_tr_cb(struct ril_msg *message, gpointer user_data)
{
struct cb_data *cbd = user_data;
ofono_stk_generic_cb_t cb = cbd->cb;
struct ofono_error error;
DBG("");
if (message->error == RIL_E_SUCCESS) {
decode_ril_error(&error, "OK");
} else {
DBG("Error in sending terminal response");
ofono_error("Error in sending terminal response");
decode_ril_error(&error, "FAIL");
}
cb(&error, cbd->data);
}
static void ril_stk_terminal_response(struct ofono_stk *stk, int length,
const unsigned char *resp,
ofono_stk_generic_cb_t cb, void *data)
{
struct stk_data *sd = ofono_stk_get_data(stk);
struct cb_data *cbd = cb_data_new(cb, data);
struct parcel rilp;
char *hex_tr = NULL;
int request = RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE;
guint ret;
DBG("");
hex_tr = encode_hex(resp, length, 0);
DBG("rilmodem terminal response: %s", hex_tr);
parcel_init(&rilp);
parcel_w_string(&rilp, hex_tr);
ret = g_ril_send(sd->ril, request,
rilp.data, rilp.size, ril_tr_cb,
cbd, g_free);
parcel_free(&rilp);
if (ret <= 0) {
g_free(cbd);
CALLBACK_WITH_FAILURE(cb, data);
}
}
static void ril_stk_user_confirmation(struct ofono_stk *stk,
ofono_bool_t confirm)
{
struct stk_data *sd = ofono_stk_get_data(stk);
struct parcel rilp;
int request = RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM;
int ret;
DBG("");
/* Only pcmd needing user confirmation is call set up
* RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM
*/
parcel_init(&rilp);
parcel_w_int32(&rilp, 1); /* size of array */
parcel_w_int32(&rilp, confirm); /* yes/no */
/* fire and forget i.e. not waiting for the callback*/
ret = g_ril_send(sd->ril, request, rilp.data,
rilp.size, NULL, NULL, NULL);
g_ril_print_request_no_args(sd->ril, ret, request);
parcel_free(&rilp);
}
static void ril_stk_pcmd_notify(struct ril_msg *message, gpointer user_data)
{
struct ofono_stk *stk = user_data;
struct parcel rilp;
char *pcmd = NULL;
guchar *pdu = NULL;
long len;
DBG("");
ril_util_init_parcel(message, &rilp);
pcmd = parcel_r_string(&rilp);
DBG("pcmd: %s", pcmd);
pdu = decode_hex((const char *) pcmd,
strlen(pcmd),
&len, -1);
ofono_stk_proactive_command_notify(stk, len, (const guchar *)pdu);
}
static void ril_stk_event_notify(struct ril_msg *message, gpointer user_data)
{
struct ofono_stk *stk = user_data;
struct parcel rilp;
char *pcmd = NULL;
guchar *pdu = NULL;
long len;
DBG("");
/* Proactive command has been handled by the modem. */
ril_util_init_parcel(message, &rilp);
pcmd = parcel_r_string(&rilp);
DBG("pcmd: %s", pcmd);
pdu = decode_hex((const char *) pcmd,
strlen(pcmd),
&len, -1);
ofono_stk_proactive_command_handled_notify(stk, len,
(const guchar *)pdu);
}
static void ril_stk_session_end_notify(struct ril_msg *message,
gpointer user_data)
{
struct ofono_stk *stk = user_data;
DBG("");
ofono_stk_proactive_session_end_notify(stk);
}
static void ril_stk_agent_ready(struct ofono_stk *stk)
{
struct stk_data *sd = ofono_stk_get_data(stk);
int request = RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING;
int ret;
DBG("");
if (!subscribed) {
DBG("Subscribing notifications");
g_ril_register(sd->ril, RIL_UNSOL_STK_PROACTIVE_COMMAND,
ril_stk_pcmd_notify, stk);
g_ril_register(sd->ril, RIL_UNSOL_STK_SESSION_END,
ril_stk_session_end_notify, stk);
g_ril_register(sd->ril, RIL_UNSOL_STK_EVENT_NOTIFY,
ril_stk_event_notify, stk);
subscribed = TRUE;
}
/* fire and forget i.e. not waiting for the callback*/
ret = g_ril_send(sd->ril, request, NULL, 0,
NULL, NULL, NULL);
g_ril_print_request_no_args(sd->ril, ret, request);
}
void ril_stk_set_lang()
{
gchar *contents;
GError *err = NULL;
if (!g_file_get_contents(UI_LANG, &contents, NULL, &err)) {
if (err)
ofono_error("cannot open %s error: %d: message: %s",
UI_LANG, err->code, err->message);
g_error_free(err);
} else {
gchar *pch = g_strrstr(contents, CFG_LANG);
/* Set System UI lang to env LANG */
if (pch) {
setenv("LANG", pch + strlen(CFG_LANG), 1);
DBG("LANG %s", getenv("LANG"));
}
g_free(contents);
}
}
static int ril_stk_probe(struct ofono_stk *stk, unsigned int vendor, void *data)
{
GRil *ril = data;
struct stk_data *sd;
DBG("");
sd = g_try_new0(struct stk_data, 1);
if (sd == NULL)
return -ENOMEM;
sd->ril = g_ril_clone(ril);
ofono_stk_set_data(stk, sd);
/* Register interface in this phase for stk agent */
ofono_stk_register(stk);
subscribed = FALSE;
/* UI language for local info */
ril_stk_set_lang();
return 0;
}
static void ril_stk_remove(struct ofono_stk *stk)
{
struct stk_data *sd = ofono_stk_get_data(stk);
DBG("");
ofono_stk_set_data(stk, NULL);
g_ril_unref(sd->ril);
g_free(sd);
}
static struct ofono_stk_driver driver = {
.name = "rilmodem",
.probe = ril_stk_probe,
.remove = ril_stk_remove,
.envelope = ril_stk_envelope,
.terminal_response = ril_stk_terminal_response,
.user_confirmation = ril_stk_user_confirmation,
.ready = ril_stk_agent_ready
};
void ril_stk_init(void)
{
ofono_stk_driver_register(&driver);
}
void ril_stk_exit(void)
{
ofono_stk_driver_unregister(&driver);
}

View File

@@ -75,30 +75,12 @@ static void ril_ussd_request(struct ofono_ussd *ussd, int dcs,
if (charset == SMS_CHARSET_7BIT) {
unsigned char unpacked_buf[182] = "";
long written;
int length;
unpack_7bit_own_buf(pdu, len, 0, TRUE,
sizeof(unpacked_buf), &written, 0,
unpacked_buf);
if (written >= 1) {
/*
* When USSD was packed, additional CR
might have been added (according to
23.038 6.1.2.3.1). So if the last
character is CR, it should be removed
here. And in addition written doesn't
contain correct length...
Over 2 characters long USSD string must
end with # (checked in
valid_ussd_string() ), so it should be
safe to remove extra CR.
*/
length = strlen((char *)unpacked_buf);
if (length > 2 &&
unpacked_buf[length-1] == '\r')
unpacked_buf[length-1] = 0;
struct parcel rilp;
parcel_init(&rilp);
parcel_w_string(&rilp, (char *)unpacked_buf);

View File

@@ -4,7 +4,7 @@
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
* Copyright (C) 2012 Canonical Ltd.
* Copyright (C) 2014 Jolla Ltd.
* Copyright (C) 2013 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
@@ -86,21 +86,6 @@ struct lastcause_req {
static void send_one_dtmf(struct voicecall_data *vd);
static void clear_dtmf_queue(struct voicecall_data *vd);
/*
* structs ofono_voicecall and voicecall are fully defined
* in src/voicecall.c; we need (read) access to the
* call objects, so partially redefine them here.
*/
struct ofono_voicecall {
GSList *call_list;
/* ... */
};
struct voicecall {
struct ofono_call *call;
/* ... */
};
static void lastcause_cb(struct ril_msg *message, gpointer user_data)
{
struct lastcause_req *reqdata = user_data;
@@ -114,38 +99,11 @@ static void lastcause_cb(struct ril_msg *message, gpointer user_data)
if (parcel_r_int32(&rilp) > 0)
last_cause = parcel_r_int32(&rilp);
/*
* Not all call control cause values specified in 3GPP TS 24.008
* "Mobile radio interface Layer 3 specification; Core network protocols",
* Annex H, are properly reflected in the RIL API. For example, cause
* #21 "call rejected" is mapped to CALL_FAIL_ERROR_UNSPECIFIED, and
* thus indistinguishable from a network failure.
* We signal disconnect reason "remote" for cause values
* - #16 "normal call clearing"
* - #17 "user busy"
* - UNSPECIFIED for MO calls that are not yet connected
* , and disconnect reason "network" otherwise.
*/
ofono_info("Call %d ended with RIL cause %d", id, last_cause);
if (last_cause == CALL_FAIL_NORMAL || last_cause == CALL_FAIL_BUSY) {
reason = OFONO_DISCONNECT_REASON_REMOTE_HANGUP;
}
if (last_cause == CALL_FAIL_ERROR_UNSPECIFIED) {
GSList *l;
struct voicecall *v;
for (l = vc->call_list; l; l = l->next) {
v = l->data;
if (v->call->id == id) {
if (v->call->status == CALL_STATUS_DIALING
|| v->call->status == CALL_STATUS_ALERTING) {
reason = OFONO_DISCONNECT_REASON_REMOTE_HANGUP;
}
break;
}
}
}
ofono_voicecall_disconnected(vc, id, reason, NULL);
}
@@ -278,8 +236,6 @@ static void generic_cb(struct ril_msg *message, gpointer user_data)
int request = RIL_REQUEST_GET_CURRENT_CALLS;
int ret;
ofono_info("request:%d",message->req);
if (message->error == RIL_E_SUCCESS) {
decode_ril_error(&error, "OK");
} else {
@@ -678,13 +634,6 @@ static void ril_create_multiparty(struct ofono_voicecall *vc,
cb(&error, data);
}
static void ril_transfer(struct ofono_voicecall *vc,
ofono_voicecall_cb_t cb, void *data)
{
ril_template(RIL_REQUEST_EXPLICIT_CALL_TRANSFER, vc, generic_cb, 0,
NULL, 0, cb, data);
}
static void private_chat_cb(struct ril_msg *message, gpointer user_data)
{
struct ofono_error error;
@@ -778,23 +727,6 @@ static gboolean enable_supp_svc(gpointer user_data)
return FALSE;
}
static void ril_ringback_tone_notify(struct ril_msg *message,
gpointer user_data)
{
struct parcel rilp;
struct ofono_voicecall *vc = user_data;
gboolean playTone = FALSE;
ril_util_init_parcel(message, &rilp);
if (message->req == RIL_UNSOL_RINGBACK_TONE) {
if (parcel_r_int32(&rilp) > 0)
playTone = parcel_r_int32(&rilp);
DBG("play ringback tone: %d", playTone);
ofono_voicecall_ringback_tone_notify(vc, playTone);
}
}
static gboolean ril_delayed_register(gpointer user_data)
{
struct ofono_voicecall *vc = user_data;
@@ -815,10 +747,6 @@ static gboolean ril_delayed_register(gpointer user_data)
g_ril_register(vd->ril, RIL_UNSOL_SUPP_SVC_NOTIFICATION,
ril_ss_notify, vc);
/* Register for ringback tone notifications */
g_ril_register(vd->ril, RIL_UNSOL_RINGBACK_TONE,
ril_ringback_tone_notify, vc);
/* request supplementary service notifications*/
enable_supp_svc(vc);
@@ -875,7 +803,6 @@ static void ril_voicecall_remove(struct ofono_voicecall *vc)
if (vd->timer_id > 0)
g_source_remove(vd->timer_id);
g_free(vd->tone_queue);
g_ril_unref(vd->ril);
g_free(vd);
}
@@ -890,13 +817,12 @@ static struct ofono_voicecall_driver driver = {
.release_specific = ril_hangup_specific,
.send_tones = ril_send_dtmf,
.create_multiparty = ril_create_multiparty,
.transfer = ril_transfer,
.private_chat = ril_private_chat,
.swap_without_accept = ril_swap_without_accept,
.hold_all_active = ril_hold_all_active,
.release_all_held = ril_release_all_held,
.set_udub = ril_set_udub,
.release_all_active = ril_release_all_active,
.release_all_active = ril_release_all_active,
};
void ril_voicecall_init(void)

View File

@@ -1,7 +1,6 @@
[Unit]
Description=DUN service
Requires=dbus.service
After=dbus.service
After=syslog.target
[Service]
Type=dbus

View File

@@ -835,9 +835,6 @@ static gboolean can_write_data(gpointer data)
gsize len;
char *cr;
gboolean wakeup_first = FALSE;
#ifdef WRITE_SCHEDULER_DEBUG
int limiter;
#endif
/* Grab the first command off the queue and write as
* much of it as we can
@@ -889,20 +886,13 @@ static gboolean can_write_data(gpointer data)
towrite = cr - (cmd->cmd + chat->cmd_bytes_written) + 1;
#ifdef WRITE_SCHEDULER_DEBUG
limiter = towrite;
if (limiter > 5)
limiter = 5;
if (towrite > 5)
towrite = 5;
#endif
bytes_written = g_at_io_write(chat->io,
cmd->cmd + chat->cmd_bytes_written,
#ifdef WRITE_SCHEDULER_DEBUG
limiter
#else
towrite
#endif
);
towrite);
if (bytes_written == 0)
return FALSE;

View File

@@ -56,8 +56,6 @@ struct GDBusClient {
void *signal_data;
GDBusProxyFunction proxy_added;
GDBusProxyFunction proxy_removed;
GDBusClientFunction ready;
void *ready_data;
GDBusPropertyFunction property_changed;
void *user_data;
GList *proxy_list;
@@ -727,93 +725,6 @@ gboolean g_dbus_proxy_set_property_basic(GDBusProxy *proxy,
return TRUE;
}
gboolean g_dbus_proxy_set_property_array(GDBusProxy *proxy,
const char *name, int type, const void *value,
size_t size, GDBusResultFunction function,
void *user_data, GDBusDestroyFunction destroy)
{
struct set_property_data *data;
GDBusClient *client;
DBusMessage *msg;
DBusMessageIter iter, variant, array;
DBusPendingCall *call;
char array_sig[3];
char type_sig[2];
if (!proxy || !name || !value)
return FALSE;
if (!dbus_type_is_basic(type))
return FALSE;
client = proxy->client;
if (!client)
return FALSE;
data = g_try_new0(struct set_property_data, 1);
if (!data)
return FALSE;
data->function = function;
data->user_data = user_data;
data->destroy = destroy;
msg = dbus_message_new_method_call(client->service_name,
proxy->obj_path,
DBUS_INTERFACE_PROPERTIES,
"Set");
if (!msg) {
g_free(data);
return FALSE;
}
array_sig[0] = DBUS_TYPE_ARRAY;
array_sig[1] = (char) type;
array_sig[2] = '\0';
type_sig[0] = (char) type;
type_sig[1] = '\0';
dbus_message_iter_init_append(msg, &iter);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
&proxy->interface);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
array_sig, &variant);
dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
type_sig, &array);
if (dbus_type_is_fixed(type))
dbus_message_iter_append_fixed_array(&array, type, &value,
size);
else if (type == DBUS_TYPE_STRING || type == DBUS_TYPE_OBJECT_PATH) {
const char **str = (const char **) value;
size_t i;
for (i = 0; i < size; i++)
dbus_message_iter_append_basic(&array, type, &str[i]);
}
dbus_message_iter_close_container(&variant, &array);
dbus_message_iter_close_container(&iter, &variant);
if (g_dbus_send_message_with_reply(client->dbus_conn, msg,
&call, -1) == FALSE) {
dbus_message_unref(msg);
g_free(data);
return FALSE;
}
dbus_pending_call_set_notify(call, set_property_reply, data, g_free);
dbus_pending_call_unref(call);
dbus_message_unref(msg);
return TRUE;
}
struct method_call_data {
GDBusReturnFunction function;
void *user_data;
@@ -1071,9 +982,6 @@ static void parse_managed_objects(GDBusClient *client, DBusMessage *msg)
dbus_message_iter_next(&dict);
}
if (client->ready)
client->ready(client, client->ready_data);
}
static void get_managed_objects_reply(DBusPendingCall *call, void *user_data)
@@ -1335,18 +1243,6 @@ gboolean g_dbus_client_set_signal_watch(GDBusClient *client,
return TRUE;
}
gboolean g_dbus_client_set_ready_watch(GDBusClient *client,
GDBusClientFunction ready, void *user_data)
{
if (client == NULL)
return FALSE;
client->ready = ready;
client->ready_data = user_data;
return TRUE;
}
gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client,
GDBusProxyFunction proxy_added,
GDBusProxyFunction proxy_removed,

View File

@@ -329,11 +329,6 @@ gboolean g_dbus_proxy_set_property_basic(GDBusProxy *proxy,
GDBusResultFunction function, void *user_data,
GDBusDestroyFunction destroy);
gboolean g_dbus_proxy_set_property_array(GDBusProxy *proxy,
const char *name, int type, const void *value,
size_t size, GDBusResultFunction function,
void *user_data, GDBusDestroyFunction destroy);
typedef void (* GDBusSetupFunction) (DBusMessageIter *iter, void *user_data);
typedef void (* GDBusReturnFunction) (DBusMessage *message, void *user_data);
@@ -342,7 +337,6 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
GDBusReturnFunction function, void *user_data,
GDBusDestroyFunction destroy);
typedef void (* GDBusClientFunction) (GDBusClient *client, void *user_data);
typedef void (* GDBusProxyFunction) (GDBusProxy *proxy, void *user_data);
typedef void (* GDBusPropertyFunction) (GDBusProxy *proxy, const char *name,
DBusMessageIter *iter, void *user_data);
@@ -365,8 +359,7 @@ gboolean g_dbus_client_set_disconnect_watch(GDBusClient *client,
GDBusWatchFunction function, void *user_data);
gboolean g_dbus_client_set_signal_watch(GDBusClient *client,
GDBusMessageFunction function, void *user_data);
gboolean g_dbus_client_set_ready_watch(GDBusClient *client,
GDBusClientFunction ready, void *user_data);
gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client,
GDBusProxyFunction proxy_added,
GDBusProxyFunction proxy_removed,

View File

@@ -30,6 +30,8 @@
#include "gdbus.h"
#define DISPATCH_TIMEOUT 0
#define info(fmt...)
#define error(fmt...)
#define debug(fmt...)
@@ -68,6 +70,8 @@ static gboolean message_dispatch(void *data)
{
DBusConnection *conn = data;
dbus_connection_ref(conn);
/* Dispatch messages */
while (dbus_connection_dispatch(conn) == DBUS_DISPATCH_DATA_REMAINS);
@@ -80,7 +84,7 @@ static inline void queue_dispatch(DBusConnection *conn,
DBusDispatchStatus status)
{
if (status == DBUS_DISPATCH_DATA_REMAINS)
g_idle_add(message_dispatch, dbus_connection_ref(conn));
g_timeout_add(DISPATCH_TIMEOUT, message_dispatch, conn);
}
static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
@@ -88,6 +92,9 @@ static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
struct watch_info *info = data;
unsigned int flags = 0;
DBusDispatchStatus status;
DBusConnection *conn;
conn = dbus_connection_ref(info->conn);
if (cond & G_IO_IN) flags |= DBUS_WATCH_READABLE;
if (cond & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE;
@@ -96,8 +103,10 @@ static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
dbus_watch_handle(info->watch, flags);
status = dbus_connection_get_dispatch_status(info->conn);
queue_dispatch(info->conn, status);
status = dbus_connection_get_dispatch_status(conn);
queue_dispatch(conn, status);
dbus_connection_unref(conn);
return TRUE;
}

View File

@@ -1253,8 +1253,6 @@ static struct generic_data *object_path_ref(DBusConnection *connection,
if (!dbus_connection_register_object_path(connection, path,
&generic_table, data)) {
dbus_connection_unref(data->conn);
g_free(data->path);
g_free(data->introspect);
g_free(data);
return NULL;

View File

@@ -355,8 +355,7 @@ static void handle_response(struct ril_s *p, struct ril_msg *message)
int i;
guint len, id;
if (!count)
return;
g_assert(count > 0);
for (i = 0; i < count; i++) {
req = g_queue_peek_nth(p->command_queue, i);
@@ -374,13 +373,13 @@ static void handle_response(struct ril_s *p, struct ril_msg *message)
message->error));
req = g_queue_pop_nth(p->command_queue, i);
if (req->callback)
if (req->callback) {
req->callback(message, req->user_data);
}
len = g_queue_get_length(p->out_queue);
for (i = 0; i < len; i++) {
id = *(guint *) g_queue_peek_nth(
p->out_queue, i);
id = *(guint *) g_queue_peek_nth(p->out_queue, i);
if (id == req->id) {
g_queue_pop_nth(p->out_queue, i);
break;
@@ -404,21 +403,14 @@ static void handle_response(struct ril_s *p, struct ril_msg *message)
}
static void notify_call_callback(gpointer data, gpointer user_data)
{
struct ril_notify_node *node = data;
struct ril_msg *message = user_data;
node->callback(message, node->user_data);
}
static void handle_unsol_req(struct ril_s *p, struct ril_msg *message)
{
GHashTableIter iter;
struct ril_notify *notify;
int req_key;
gpointer key, value;
GSList *list_item;
GList *list_item;
struct ril_notify_node *node;
gboolean found = FALSE;
if (p->notify_list == NULL)
@@ -438,12 +430,15 @@ static void handle_unsol_req(struct ril_s *p, struct ril_msg *message)
if (req_key != message->req)
continue;
list_item = notify->nodes;
list_item = (GList *) notify->nodes;
if (list_item)
while (list_item != NULL) {
node = list_item->data;
node->callback(message, node->user_data);
found = TRUE;
g_slist_foreach(notify->nodes, notify_call_callback, message);
list_item = (GList *) g_slist_next(list_item);
}
}
/* Only log events not being listended for... */
@@ -587,8 +582,9 @@ static void new_bytes(struct ring_buffer *rbuf, gpointer user_data)
while (p->suspended == FALSE && (p->read_so_far < len)) {
gsize rbytes = MIN(len - p->read_so_far, wrap - p->read_so_far);
if (rbytes < 4)
if (rbytes < 4) {
return;
}
/* this function attempts to read the next full length
* fixed message from the stream. if not all bytes are
@@ -599,8 +595,9 @@ static void new_bytes(struct ring_buffer *rbuf, gpointer user_data)
message = read_fixed_record(p, buf, &rbytes);
/* wait for the rest of the record... */
if (message == NULL)
if (message == NULL) {
break;
}
buf += rbytes;
p->read_so_far += rbytes;
@@ -645,8 +642,7 @@ static gboolean can_write_data(gpointer data)
for (i = 0; i < qlen; i++) {
req = g_queue_peek_nth(ril->command_queue, i);
if (req) {
id = *(guint *) g_queue_peek_head(
ril->out_queue);
id = *(guint *) g_queue_peek_head(ril->out_queue);
if (req->id == id)
goto out;
} else {

View File

@@ -191,7 +191,6 @@
#define RIL_PERSOSUBSTATE_RUIM_RUIM_PUK 24
/* SIM - App states */
#define RIL_APPSTATE_ILLEGAL -1
#define RIL_APPSTATE_UNKNOWN 0
#define RIL_APPSTATE_DETECTED 1
#define RIL_APPSTATE_PIN 2

View File

@@ -80,29 +80,29 @@ extern "C" {
DBusConnection *ofono_dbus_get_connection(void);
void ofono_dbus_dict_append(DBusMessageIter *dict, const char *key, int type,
const void *value);
void *value);
void ofono_dbus_dict_append_array(DBusMessageIter *dict, const char *key,
int type, const void *val);
int type, void *val);
void ofono_dbus_dict_append_dict(DBusMessageIter *dict, const char *key,
int type, const void *val);
int type, void *val);
int ofono_dbus_signal_property_changed(DBusConnection *conn, const char *path,
const char *interface, const char *name,
int type, const void *value);
int type, void *value);
int ofono_dbus_signal_array_property_changed(DBusConnection *conn,
const char *path,
const char *interface,
const char *name, int type,
const void *value);
void *value);
int ofono_dbus_signal_dict_property_changed(DBusConnection *conn,
const char *path,
const char *interface,
const char *name, int type,
const void *value);
void *value);
#ifdef __cplusplus
}

View File

@@ -31,8 +31,6 @@ extern "C" {
struct ofono_gprs_provision_data {
enum ofono_gprs_context_type type;
enum ofono_gprs_proto proto;
char *provider_name;
ofono_bool_t provider_primary;
char *name;
char *apn;
char *username;

View File

@@ -36,18 +36,12 @@ typedef void (*ofono_handsfree_cb_t)(const struct ofono_error *error,
typedef void (*ofono_handsfree_phone_cb_t)(const struct ofono_error *error,
const struct ofono_phone_number *number,
void *data);
typedef void (*ofono_handsfree_cnum_query_cb_t)(const struct ofono_error *error,
int total,
const struct ofono_phone_number *numbers,
void *data);
struct ofono_handsfree_driver {
const char *name;
int (*probe)(struct ofono_handsfree *hf, unsigned int vendor,
void *data);
void (*remove)(struct ofono_handsfree *hf);
void (*cnum_query)(struct ofono_handsfree *hf,
ofono_handsfree_cnum_query_cb_t cb, void *data);
void (*request_phone_number) (struct ofono_handsfree *hf,
ofono_handsfree_phone_cb_t cb,
void *data);
@@ -60,8 +54,6 @@ struct ofono_handsfree_driver {
void ofono_handsfree_set_ag_features(struct ofono_handsfree *hf,
unsigned int ag_features);
void ofono_handsfree_set_ag_chld_features(struct ofono_handsfree *hf,
unsigned int ag_chld_features);
void ofono_handsfree_set_inband_ringing(struct ofono_handsfree *hf,
ofono_bool_t enabled);
void ofono_handsfree_voice_recognition_notify(struct ofono_handsfree *hf,

View File

@@ -48,7 +48,6 @@ struct ofono_stk_driver {
int length, const unsigned char *resp,
ofono_stk_generic_cb_t cb, void *data);
void (*user_confirmation)(struct ofono_stk *stk, ofono_bool_t confirm);
void (*ready)(struct ofono_stk *stk);
};
int ofono_stk_driver_register(const struct ofono_stk_driver *d);

View File

@@ -3,7 +3,6 @@
* oFono - Open Source Telephony
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
* Copyright (C) 2014 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
@@ -172,9 +171,6 @@ void ofono_voicecall_ssn_mt_notify(struct ofono_voicecall *vc, unsigned int id,
int code, int index,
const struct ofono_phone_number *ph);
void ofono_voicecall_ringback_tone_notify(struct ofono_voicecall *vc,
const ofono_bool_t playTone);
#ifdef __cplusplus
}
#endif

View File

@@ -59,7 +59,6 @@
#include <drivers/atmodem/vendor.h>
static const char *none_prefix[] = { NULL };
static const char *qss_prefix[] = { "#QSS:", NULL };
struct he910_data {
GAtChat *chat; /* AT chat */
@@ -102,7 +101,7 @@ static GAtChat *open_device(struct ofono_modem *modem,
if (channel == NULL)
return NULL;
syntax = g_at_syntax_new_gsm_permissive();
syntax = g_at_syntax_new_gsmv1();
chat = g_at_chat_new(channel, syntax);
g_at_syntax_unref(syntax);
g_io_channel_unref(channel);
@@ -168,31 +167,6 @@ static void he910_qss_notify(GAtResult *result, gpointer user_data)
switch_sim_state_status(modem, status);
}
static void qss_query_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
int status, mode;
GAtResultIter iter;
DBG("%p", modem);
if (!ok)
return;
g_at_result_iter_init(&iter, result);
if (!g_at_result_iter_next(&iter, "#QSS:"))
return;
if (!g_at_result_iter_next_number(&iter, &mode))
return;
if (!g_at_result_iter_next_number(&iter, &status))
return;
switch_sim_state_status(modem, status);
}
static void cfun_enable_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
@@ -230,15 +204,6 @@ static void cfun_enable_cb(gboolean ok, GAtResult *result, gpointer user_data)
g_at_chat_send(data->chat, "AT#AUTOATT=0", none_prefix,
NULL, NULL, NULL);
/* Follow sim state */
g_at_chat_register(data->chat, "#QSS:", he910_qss_notify,
FALSE, modem, NULL);
/* Enable sim state notification */
g_at_chat_send(data->chat, "AT#QSS=2", none_prefix, NULL, NULL, NULL);
g_at_chat_send(data->chat, "AT#QSS?", qss_prefix,
qss_query_cb, modem, NULL);
}
static int he910_enable(struct ofono_modem *modem)
@@ -267,6 +232,13 @@ static int he910_enable(struct ofono_modem *modem)
g_at_chat_send(data->chat, "ATE0 +CMEE=1", none_prefix,
NULL, NULL, NULL);
/* Follow sim state */
g_at_chat_register(data->chat, "#QSS:", he910_qss_notify,
FALSE, modem, NULL);
/* Enable sim state notification */
g_at_chat_send(data->chat, "AT#QSS=2", none_prefix, NULL, NULL, NULL);
/* Set phone functionality */
g_at_chat_send(data->chat, "AT+CFUN=1", none_prefix,
cfun_enable_cb, modem, NULL);

View File

@@ -53,8 +53,6 @@ enum MBPI_ERROR {
struct gsm_data {
const char *match_mcc;
const char *match_mnc;
char *provider_name;
gboolean provider_primary;
GSList *apns;
gboolean match_found;
gboolean allow_duplicates;
@@ -86,7 +84,6 @@ static GQuark mbpi_error_quark(void)
void mbpi_ap_free(struct ofono_gprs_provision_data *ap)
{
g_free(ap->provider_name);
g_free(ap->name);
g_free(ap->apn);
g_free(ap->username);
@@ -120,7 +117,6 @@ static void text_handler(GMarkupParseContext *context,
{
char **string = userdata;
g_free(*string);
*string = g_strndup(text, text_len);
}
@@ -194,9 +190,7 @@ static void apn_end(GMarkupParseContext *context, const gchar *element_name,
{
if (g_str_equal(element_name, "name") ||
g_str_equal(element_name, "username") ||
g_str_equal(element_name, "password") ||
g_str_equal(element_name, "mmsc") ||
g_str_equal(element_name, "mmsproxy"))
g_str_equal(element_name, "password"))
g_markup_parse_context_pop(context);
}
@@ -292,9 +286,6 @@ static void apn_handler(GMarkupParseContext *context, struct gsm_data *gsm,
}
ap = g_new0(struct ofono_gprs_provision_data, 1);
ap->provider_name = g_strdup(gsm->provider_name);
ap->provider_primary = gsm->provider_primary;
ap->apn = g_strdup(apn);
ap->type = OFONO_GPRS_CONTEXT_TYPE_INTERNET;
ap->proto = OFONO_GPRS_PROTO_IP;
@@ -461,68 +452,27 @@ static const GMarkupParser provider_parser = {
NULL,
};
static void gsm_provider_start(GMarkupParseContext *context,
static void toplevel_gsm_start(GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
const gchar **atribute_names,
const gchar **attribute_values,
gpointer userdata, GError **error)
{
struct gsm_data *gsm = userdata;
if (g_str_equal(element_name, "name")) {
g_free(gsm->provider_name);
gsm->provider_name = NULL;
g_markup_parse_context_push(context, &text_parser,
&gsm->provider_name);
} else if (g_str_equal(element_name, "gsm")) {
if (g_str_equal(element_name, "gsm")) {
gsm->match_found = FALSE;
g_markup_parse_context_push(context, &gsm_parser, gsm);
} else if (g_str_equal(element_name, "cdma"))
g_markup_parse_context_push(context, &skip_parser, NULL);
}
static void gsm_provider_end(GMarkupParseContext *context,
const gchar *element_name,
gpointer userdata, GError **error)
{
if (g_str_equal(element_name, "name") ||
g_str_equal(element_name, "gsm") ||
g_str_equal(element_name, "cdma"))
g_markup_parse_context_pop(context);
}
static const GMarkupParser gsm_provider_parser = {
gsm_provider_start,
gsm_provider_end,
NULL,
NULL,
NULL,
};
static void toplevel_gsm_start(GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
const gchar **attribute_values,
gpointer userdata, GError **error)
{
struct gsm_data *gsm = userdata;
if (g_str_equal(element_name, "provider")) {
g_markup_collect_attributes(element_name, attribute_names,
attribute_values, error,
G_MARKUP_COLLECT_BOOLEAN | G_MARKUP_COLLECT_OPTIONAL,
"primary", &gsm->provider_primary,
G_MARKUP_COLLECT_INVALID);
g_markup_parse_context_push(context, &gsm_provider_parser, gsm);
}
}
static void toplevel_gsm_end(GMarkupParseContext *context,
const gchar *element_name,
gpointer userdata, GError **error)
{
if (g_str_equal(element_name, "provider"))
if (g_str_equal(element_name, "gsm") ||
g_str_equal(element_name, "cdma"))
g_markup_parse_context_pop(context);
}
@@ -536,7 +486,7 @@ static const GMarkupParser toplevel_gsm_parser = {
static void toplevel_cdma_start(GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
const gchar **atribute_names,
const gchar **attribute_values,
gpointer userdata, GError **error)
{
@@ -639,7 +589,6 @@ GSList *mbpi_lookup_apn(const char *mcc, const char *mnc,
gsm.apns = NULL;
}
g_free(gsm.provider_name);
return gsm.apns;
}

View File

@@ -188,11 +188,11 @@ static int nettime_probe(struct ofono_nettime_context *context)
NULL, // GDBusPropertyTable *properties
NULL, // user data
NULL)) { // GDBusDestroyFunction destroy
ofono_error("Network time: Could not register interface %s, path %s",
ofono_error("Networkt time: Could not register interface %s, path %s",
OFONO_NETWORK_TIME_INTERFACE, path);
return 1;
} else {
ofono_info("Network time: Registered interface %s, path %s",
ofono_info("Network time: Registered inteface %s, path %s",
OFONO_NETWORK_TIME_INTERFACE, path);
}
@@ -235,12 +235,6 @@ static void nettime_info_received(struct ofono_nettime_context *context,
netreg = __ofono_atom_get_data(__ofono_modem_find_atom(
context->modem, OFONO_ATOM_TYPE_NETREG));
if (!(ofono_netreg_get_mcc(netreg) && ofono_netreg_get_mnc(netreg))) {
DBG("Incomplete network time received, ignoring");
return;
}
ntd->path = ofono_modem_get_path(context->modem);
ntd->mcc = ofono_netreg_get_mcc(netreg);
ntd->mnc = ofono_netreg_get_mnc(netreg);

View File

@@ -1071,7 +1071,6 @@ done:
static int phonesim_init(void)
{
int err;
char *conf_override = getenv("OFONO_PHONESIM_CONFIG");
err = ofono_modem_driver_register(&phonesim_driver);
if (err < 0)
@@ -1082,10 +1081,7 @@ static int phonesim_init(void)
ofono_gprs_context_driver_register(&context_driver);
ofono_ctm_driver_register(&ctm_driver);
if (conf_override)
parse_config(conf_override);
else
parse_config(CONFIGDIR "/phonesim.conf");
parse_config(CONFIGDIR "/phonesim.conf");
return 0;
}

View File

@@ -24,7 +24,6 @@
#include <config.h>
#endif
#define _GNU_SOURCE
#include <errno.h>
#include <string.h>
@@ -37,134 +36,9 @@
#include <ofono/modem.h>
#include <ofono/gprs-provision.h>
#include "provision.h"
#include "mbpi.h"
/* Returns the list containing exactly one INTERNET and one MMS access point */
static GSList *provision_normalize_apn_list(GSList *apns, const char* spn)
{
struct ofono_gprs_provision_data *best_internet = NULL;
struct ofono_gprs_provision_data *best_mms = NULL;
struct ofono_gprs_provision_data *second_best_internet = NULL;
struct ofono_gprs_provision_data *second_best_mms = NULL;
GSList *best_apns = NULL;
GSList *l;
/* 1. save the first found internet APN and the first MMS APN */
l = apns;
while (l != NULL) {
GSList *next = l->next;
struct ofono_gprs_provision_data *ap = l->data;
if (ap->type == OFONO_GPRS_CONTEXT_TYPE_INTERNET
&& !best_internet) {
best_internet = ap;
} else if (ap->type == OFONO_GPRS_CONTEXT_TYPE_MMS
&& !best_mms) {
best_mms = ap;
}
l = next;
}
/*
* 2. look for a "primary" provider (i.e. an MNO, not
* an MVNO on the same radio network)
*/
second_best_internet = best_internet;
best_internet = NULL;
second_best_mms = best_mms;
best_mms = NULL;
l = apns;
while (l != NULL) {
GSList *next = l->next;
struct ofono_gprs_provision_data *ap = l->data;
if (ap->provider_primary) {
if (ap->type == OFONO_GPRS_CONTEXT_TYPE_INTERNET
&& !best_internet) {
best_internet = ap;
} else if (ap->type == OFONO_GPRS_CONTEXT_TYPE_MMS
&& !best_mms) {
best_mms = ap;
}
}
l = next;
}
/* no better match found */
if (!best_internet)
best_internet = second_best_internet;
if (!best_mms)
best_mms = second_best_mms;
/*
* 3. if there is an SPN given, save the first internet APN and the
* first MMS APN matching the SPN (partially, case-insensitively)
* */
if (spn) {
second_best_internet = best_internet;
best_internet = NULL;
second_best_mms = best_mms;
best_mms = NULL;
l = apns;
while (l != NULL) {
GSList *next = l->next;
struct ofono_gprs_provision_data *ap = l->data;
if ((ap->provider_name && strcasestr(ap->provider_name, spn))
|| (ap->name && strcasestr(ap->name, spn))
|| (ap->apn && strcasestr(ap->apn, spn))) {
if (ap->type == OFONO_GPRS_CONTEXT_TYPE_INTERNET
&& !best_internet) {
best_internet = ap;
} else if (ap->type == OFONO_GPRS_CONTEXT_TYPE_MMS
&& !best_mms) {
best_mms = ap;
}
}
l = next;
}
/* no better match found */
if (!best_internet)
best_internet = second_best_internet;
if (!best_mms)
best_mms = second_best_mms;
}
/* 4. if none found yet, create APNs with default values */
if (!best_internet) {
best_internet = g_try_new0(struct ofono_gprs_provision_data, 1);
if (best_internet) {
best_internet->type =
OFONO_GPRS_CONTEXT_TYPE_INTERNET;
best_internet->name =
g_strdup("Internet");
best_internet->apn =
g_strdup("internet");
}
}
if (!best_mms) {
best_mms = g_try_new0(struct ofono_gprs_provision_data, 1);
if (best_mms) {
best_mms->type =
OFONO_GPRS_CONTEXT_TYPE_MMS;
best_mms->name =
g_strdup("MMS");
best_mms->apn =
g_strdup("mms");
}
}
best_apns = g_slist_append(best_apns, best_internet);
best_apns = g_slist_append(best_apns, best_mms);
return best_apns;
}
int provision_get_settings(const char *mcc, const char *mnc,
static int provision_get_settings(const char *mcc, const char *mnc,
const char *spn,
struct ofono_gprs_provision_data **settings,
int *count)
@@ -175,26 +49,36 @@ int provision_get_settings(const char *mcc, const char *mnc,
int ap_count;
int i;
ofono_info("Provisioning for MCC %s, MNC %s, SPN '%s'", mcc, mnc, spn);
DBG("Provisioning for MCC %s, MNC %s, SPN '%s'", mcc, mnc, spn);
/*
* Passing FALSE to mbpi_lookup_apn() would return
* an empty list if duplicates are found.
* TODO: review with upstream. Default behavior was to
* disallow duplicate APN entries, which unfortunately exist
* in the mobile-broadband-provider-info db.
*/
apns = mbpi_lookup_apn(mcc, mnc, TRUE, &error);
if (error != NULL) {
ofono_error("%s", error->message);
g_error_free(error);
}
if (apns == NULL) {
if (error != NULL) {
ofono_error("%s", error->message);
g_error_free(error);
}
ofono_info("Found %d APs in MBPI", g_slist_length(apns));
apns = provision_normalize_apn_list(apns, spn);
if (apns == NULL)
return -ENOENT;
}
ap_count = g_slist_length(apns);
ofono_info("Provisioning %d APs", ap_count);
ofono_info("GPRS Provisioning found %d matching APNs for SPN: %s MCC: %s MNC: %s",
ap_count, spn, mcc, mnc);
/*
* Only keep the first APN found.
*
* This allows auto-provisioning to work most of the time vs.
* passing FALSE to mbpi_lookup_apn() which would return an
* an empty list if duplicates are found.
*/
if (ap_count > 1)
ap_count = 1;
*settings = g_try_new0(struct ofono_gprs_provision_data, ap_count);
if (*settings == NULL) {
@@ -213,16 +97,25 @@ int provision_get_settings(const char *mcc, const char *mnc,
for (l = apns, i = 0; l; l = l->next, i++) {
struct ofono_gprs_provision_data *ap = l->data;
ofono_info("Name: '%s'", ap->name);
ofono_info("APN: '%s'", ap->apn);
ofono_info("Type: %s", mbpi_ap_type(ap->type));
ofono_info("Username: '%s'", ap->username);
ofono_info("Password: '%s'", ap->password);
/*
* Only create a data context for the first matching APN.
* See comment above that restricts restricts apn_count.
*/
if (i == 0) {
ofono_info("Name: '%s'", ap->name);
ofono_info("APN: '%s'", ap->apn);
ofono_info("Type: %s", mbpi_ap_type(ap->type));
ofono_info("Username: '%s'", ap->username);
ofono_info("Password: '%s'", ap->password);
memcpy(*settings + i, ap,
sizeof(struct ofono_gprs_provision_data));
memcpy(*settings + i, ap,
sizeof(struct ofono_gprs_provision_data));
g_free(ap);
} else {
mbpi_ap_free(ap);
}
g_free(ap);
}
g_slist_free(apns);

View File

@@ -1,28 +0,0 @@
/*
*
* oFono - Open Source Telephony
*
* Copyright (C) 2014 Jolla. All rights reserved.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
struct ofono_gprs_provision_data;
int provision_get_settings(const char *mcc, const char *mnc,
const char *spn,
struct ofono_gprs_provision_data **settings,
int *count);

View File

@@ -1,541 +0,0 @@
/*
* Copyright (C) 2013-2014 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.
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <glib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/inotify.h>
#include <wspcodec.h>
#define OFONO_API_SUBJECT_TO_CHANGE
#include <ofono.h>
#include <plugin.h>
/*
* Push forwarder plugin is looking for configuration files in
* /etc/ofono/push_forwarder.d directory. Confiration files are
* glib key files that look like this:
*
* [Jolla MMS Handler]
* ContentType = application/vnd.wap.mms-message
* Interface = com.jolla.MmsEngine.
* Service = com.jolla.MmsEngine
* Method = HandlePush
* Path = /
*
* Only files with .conf suffix are loaded. In addition to the keys
* from the above example, SourcePort and DestinationPort port keys
* are supported. All other keys are ignored. One file may describe
* several push handlers. See pf_parse_config() function for details.
*
* When push fowarder receives a WAP push, it goes through the list
* of registered handlers and invokes all of them that match content
* type and/or port numbers. The rest is up to the D-Bus service
* handling the call.
*/
#define PF_CONFIG_DIR CONFIGDIR "/push_forwarder.d"
struct pf_modem {
struct ofono_modem *modem;
struct ofono_sms *sms;
struct ofono_sim *sim;
unsigned int sim_watch_id;
unsigned int sms_watch_id;
unsigned int push_watch_id;
};
struct push_datagram_handler {
char *name;
char *content_type;
char *interface;
char *service;
char *method;
char *path;
int dst_port;
int src_port;
};
static GSList *handlers;
static GSList *modems;
static unsigned int modem_watch_id;
static int inotify_fd = -1;
static int inotify_watch_id = -1;
static guint inotify_watch_source_id;
static GIOChannel *inotify_watch_channel;
static void pf_notify_handler(struct push_datagram_handler *h,
const char *imsi, const char *from, const struct tm *remote,
const struct tm *local, int dst, int src,
const char *ct, const void *data, unsigned int len)
{
struct tm remote_tm = *remote;
struct tm local_tm = *local;
dbus_uint32_t remote_time_arg = mktime(&remote_tm);
dbus_uint32_t local_time_arg = mktime(&local_tm);
dbus_int32_t dst_arg = dst;
dbus_int32_t src_arg = src;
DBusMessageIter iter, array;
DBusMessage *msg = dbus_message_new_method_call(h->service,
h->path, h->interface, h->method);
dbus_message_append_args(msg,
DBUS_TYPE_STRING, &imsi,
DBUS_TYPE_STRING, &from,
DBUS_TYPE_UINT32, &remote_time_arg,
DBUS_TYPE_UINT32, &local_time_arg,
DBUS_TYPE_INT32, &dst_arg,
DBUS_TYPE_INT32, &src_arg,
DBUS_TYPE_STRING, &ct,
DBUS_TYPE_INVALID);
dbus_message_iter_init_append(msg, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_BYTE_AS_STRING, &array);
dbus_message_iter_append_fixed_array(&array,
DBUS_TYPE_BYTE, &data, len);
dbus_message_iter_close_container(&iter, &array);
dbus_message_set_no_reply(msg, TRUE);
dbus_connection_send(ofono_dbus_get_connection(), msg, NULL);
dbus_message_unref(msg);
}
static gboolean pf_match_port(int port, int expected_port)
{
if (expected_port < 0)
return TRUE;
if (expected_port == port)
return TRUE;
return FALSE;
}
static gboolean pf_match_handler(struct push_datagram_handler *h,
const char *ct, int dst, int src)
{
if (pf_match_port(dst, h->dst_port) == FALSE)
return FALSE;
if (pf_match_port(src, h->src_port) == FALSE)
return FALSE;
if (h->content_type == NULL)
return TRUE;
if (strcmp(h->content_type, ct) == 0)
return TRUE;
return FALSE;
}
static void pf_handle_datagram(const char *from,
const struct tm *remote, const struct tm *local, int dst,
int src, const unsigned char *buffer, unsigned int len,
void *userdata)
{
struct pf_modem *pm = userdata;
guint remain;
const guint8 *data;
unsigned int hdrlen;
unsigned int off;
const void *ct;
const char *imsi;
GSList *link;
DBG("received push of size: %u", len);
if (pm->sim == NULL)
return;
imsi = ofono_sim_get_imsi(pm->sim);
if (len < 3)
return;
if (buffer[1] != 6)
return;
remain = len - 2;
data = buffer + 2;
if (wsp_decode_uintvar(data, remain, &hdrlen, &off) == FALSE)
return;
if ((off + hdrlen) > remain)
return;
data += off;
remain -= off;
DBG(" WAP header %u bytes", hdrlen);
if (wsp_decode_content_type(data, hdrlen, &ct, &off, NULL) == FALSE)
return;
data += hdrlen;
remain -= hdrlen;
DBG(" content type %s", (char *)ct);
DBG(" imsi %s", imsi);
DBG(" data size %u", remain);
link = handlers;
while (link) {
struct push_datagram_handler *h = link->data;
if (pf_match_handler(h, ct, dst, src) != FALSE) {
DBG("notifying %s", h->name);
pf_notify_handler(h, imsi, from, remote, local, dst,
src, ct, data, remain);
}
link = link->next;
}
}
static void pf_sms_watch(struct ofono_atom *atom,
enum ofono_atom_watch_condition cond, void *userdata)
{
struct pf_modem *pm = userdata;
if (cond == OFONO_ATOM_WATCH_CONDITION_REGISTERED) {
DBG("registered");
pm->sms = __ofono_atom_get_data(atom);
pm->push_watch_id = __ofono_sms_datagram_watch_add(pm->sms,
pf_handle_datagram, -1, -1, pm, NULL);
} else if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) {
DBG("unregistered");
pm->sms = NULL;
pm->push_watch_id = 0;
}
}
static void pf_sms_watch_done(void *userdata)
{
struct pf_modem *pm = userdata;
pm->sms_watch_id = 0;
}
static void pf_sim_watch(struct ofono_atom *atom,
enum ofono_atom_watch_condition cond, void *userdata)
{
struct pf_modem *pm = userdata;
if (cond == OFONO_ATOM_WATCH_CONDITION_REGISTERED) {
DBG("registered");
pm->sim = __ofono_atom_get_data(atom);
} else if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) {
DBG("unregistered");
pm->sim = NULL;
}
}
static void pf_sim_watch_done(void *userdata)
{
struct pf_modem *pm = userdata;
pm->sim_watch_id = 0;
}
static void pf_free_modem(struct pf_modem *pm)
{
if (pm == NULL)
return;
if (pm->push_watch_id != 0)
__ofono_sms_datagram_watch_remove(pm->sms, pm->push_watch_id);
if (pm->sim_watch_id != 0)
__ofono_modem_remove_atom_watch(pm->modem, pm->sim_watch_id);
if (pm->sms_watch_id != 0)
__ofono_modem_remove_atom_watch(pm->modem, pm->sms_watch_id);
g_free(pm);
}
static void pf_modem_watch(struct ofono_modem *modem,
gboolean added, void *userdata)
{
DBG("modem: %p, added: %d", modem, added);
if (added != FALSE) {
struct pf_modem *pm;
pm = g_try_new0(struct pf_modem, 1);
if (pm == NULL)
return;
pm->modem = modem;
pm->sms_watch_id = __ofono_modem_add_atom_watch(modem,
OFONO_ATOM_TYPE_SMS, pf_sms_watch, pm,
pf_sms_watch_done);
pm->sim_watch_id = __ofono_modem_add_atom_watch(modem,
OFONO_ATOM_TYPE_SIM, pf_sim_watch, pm,
pf_sim_watch_done);
modems = g_slist_append(modems, pm);
} else {
GSList *link = modems;
while (link) {
struct pf_modem *pm = link->data;
if (pm->modem == modem) {
modems = g_slist_delete_link(modems, link);
pf_free_modem(pm);
break;
}
link = link->next;
}
}
}
static void pf_modem_init(struct ofono_modem *modem,
void *userdata)
{
pf_modem_watch(modem, TRUE, NULL);
}
static void pf_free_handler(void *data)
{
struct push_datagram_handler *h = data;
g_free(h->content_type);
g_free(h->interface);
g_free(h->service);
g_free(h->method);
g_free(h->path);
g_free(h->name);
g_free(h);
}
static void pf_parse_handler(GKeyFile *conf, const char *g)
{
GError *err = NULL;
struct push_datagram_handler *h;
char *interface;
char *service;
char *method;
char *path;
interface = g_key_file_get_string(conf, g, "Interface", NULL);
if (interface == NULL)
goto no_interface;
service = g_key_file_get_string(conf, g, "Service", NULL);
if (service == NULL)
goto no_service;
method = g_key_file_get_string(conf, g, "Method", NULL);
if (method == NULL)
goto no_method;
path = g_key_file_get_string(conf, g, "Path", NULL);
if (path == NULL)
goto no_path;
h = g_try_new0(struct push_datagram_handler, 1);
if (h == NULL)
goto no_memory;
h->name = g_strdup(g);
h->interface = interface;
h->service = service;
h->method = method;
h->path = path;
h->content_type = g_key_file_get_string(conf, g, "ContentType", NULL);
h->dst_port = g_key_file_get_integer(conf, g, "DestinationPort", &err);
if (h->dst_port == 0 && err != NULL) {
h->dst_port = -1;
g_error_free(err);
err = NULL;
}
h->src_port = g_key_file_get_integer(conf, g, "SourcePort", &err);
if (h->src_port == 0 && err != NULL) {
h->src_port = -1;
g_error_free(err);
err = NULL;
}
DBG("registered %s", h->name);
if (h->content_type != NULL)
DBG(" ContentType: %s", h->content_type);
if (h->dst_port >= 0)
DBG(" DestinationPort: %d", h->dst_port);
if (h->src_port >= 0)
DBG(" SourcePort: %d", h->src_port);
DBG(" Interface: %s", interface);
DBG(" Service: %s", service);
DBG(" Method: %s", method);
DBG(" Path: %s", path);
handlers = g_slist_append(handlers, h);
return;
no_memory:
g_free(path);
no_path:
g_free(method);
no_method:
g_free(service);
no_service:
g_free(interface);
no_interface:
return;
}
static void pf_parse_config(void)
{
GDir *dir;
const gchar *file;
g_slist_free_full(handlers, pf_free_handler);
handlers = NULL;
dir = g_dir_open(PF_CONFIG_DIR, 0, NULL);
if (dir == NULL) {
DBG(PF_CONFIG_DIR " not found.");
return;
}
DBG("loading configuration from " PF_CONFIG_DIR);
while ((file = g_dir_read_name(dir)) != NULL) {
GError *err;
GKeyFile *conf;
char *path;
if (g_str_has_suffix(file, ".conf") == FALSE)
continue;
err = NULL;
conf = g_key_file_new();
path = g_strconcat(PF_CONFIG_DIR "/", file, NULL);
DBG("reading %s", file);
if (g_key_file_load_from_file(conf, path, 0, &err) != FALSE) {
gsize i, n;
char **names = g_key_file_get_groups(conf, &n);
for (i = 0; i < n; i++)
pf_parse_handler(conf, names[i]);
g_strfreev(names);
} else {
ofono_warn("%s", err->message);
g_error_free(err);
}
g_key_file_free(conf);
g_free(path);
}
g_dir_close(dir);
}
static gboolean pf_inotify(GIOChannel *gio, GIOCondition c, gpointer data)
{
int avail;
gsize len;
void *buf;
GError *error;
if (ioctl(inotify_fd, FIONREAD, &avail) < 0)
return FALSE;
buf = g_try_malloc(avail);
if (buf == NULL)
return FALSE;
error = NULL;
if (g_io_channel_read_chars(gio, buf, avail, &len, &error) !=
G_IO_STATUS_NORMAL) {
g_free(buf);
return FALSE;
}
pf_parse_config();
g_free(buf);
return TRUE;
}
static int pf_plugin_init(void)
{
DBG("");
pf_parse_config();
modem_watch_id = __ofono_modemwatch_add(pf_modem_watch, NULL, NULL);
__ofono_modem_foreach(pf_modem_init, NULL);
inotify_fd = inotify_init();
if (inotify_fd < 0)
return 0;
inotify_watch_id = inotify_add_watch(inotify_fd,
PF_CONFIG_DIR,
IN_CLOSE_WRITE | IN_DELETE | IN_MOVE);
if (inotify_watch_id < 0)
goto no_inotify_watch_id;
inotify_watch_channel = g_io_channel_unix_new(inotify_fd);
if (inotify_watch_channel == NULL)
goto no_inotify_watch_channel;
g_io_channel_set_encoding(inotify_watch_channel, NULL, NULL);
g_io_channel_set_buffered(inotify_watch_channel, FALSE);
inotify_watch_source_id = g_io_add_watch(inotify_watch_channel,
G_IO_IN, pf_inotify, NULL);
if (inotify_watch_source_id != 0)
return 0;
g_io_channel_unref(inotify_watch_channel);
inotify_watch_channel = NULL;
no_inotify_watch_channel:
inotify_rm_watch(inotify_fd, inotify_watch_id);
inotify_watch_id = -1;
no_inotify_watch_id:
close(inotify_fd);
inotify_fd = -1;
return 0;
}
static void pf_plugin_exit(void)
{
DBG("");
__ofono_modemwatch_remove(modem_watch_id);
modem_watch_id = 0;
g_slist_free_full(modems, (GDestroyNotify)pf_free_modem);
modems = NULL;
g_slist_free_full(handlers, pf_free_handler);
handlers = NULL;
if (inotify_watch_source_id == 0)
return;
g_source_remove(inotify_watch_source_id);
inotify_watch_source_id = 0;
g_io_channel_unref(inotify_watch_channel);
inotify_watch_channel = NULL;
inotify_rm_watch(inotify_fd, inotify_watch_id);
inotify_watch_id = -1;
close(inotify_fd);
inotify_fd = -1;
}
OFONO_PLUGIN_DEFINE(push_forwarder, "Push Forwarder Plugin", VERSION,
OFONO_PLUGIN_PRIORITY_DEFAULT, pf_plugin_init,
pf_plugin_exit)

View File

@@ -63,7 +63,6 @@
#include <ofono/types.h>
#include <ofono/message-waiting.h>
#include <ofono/oemraw.h>
#include <ofono/stk.h>
#include "drivers/rilmodem/rilmodem.h"
@@ -98,10 +97,10 @@ struct ril_data {
static guint mce_daemon_watch;
static guint signal_watch;
static DBusConnection *connection;
gboolean reconnecting = FALSE;
static int ril_init(void);
static void ril_exit(void);
guint reconnect_timer;
static int send_get_sim_status(struct ofono_modem *modem);
static void ril_debug(const char *str, void *user_data)
@@ -113,12 +112,13 @@ static void ril_debug(const char *str, void *user_data)
static void sim_status_cb(struct ril_msg *message, gpointer user_data)
{
DBG("error=%d", message->error);
struct ofono_modem *modem = user_data;
struct ril_data *ril = ofono_modem_get_data(modem);
struct sim_status status;
struct sim_app *apps[MAX_UICC_APPS];
DBG("");
/*
* ril.h claims this should NEVER fail!
* However this isn't quite true. So,
@@ -188,7 +188,6 @@ static int send_get_sim_status(struct ofono_modem *modem)
static int ril_probe(struct ofono_modem *modem)
{
DBG("");
struct ril_data *ril = NULL;
ril = g_try_new0(struct ril_data, 1);
@@ -211,9 +210,9 @@ error:
static void ril_remove(struct ofono_modem *modem)
{
DBG("");
struct ril_data *ril = ofono_modem_get_data(modem);
ofono_modem_set_data(modem, NULL);
if (!ril)
@@ -222,6 +221,9 @@ static void ril_remove(struct ofono_modem *modem)
if (ril->timer_id > 0)
g_source_remove(ril->timer_id);
if (reconnect_timer > 0)
g_source_remove(ril->timer_id);
g_ril_unref(ril->modem);
g_free(ril);
@@ -229,7 +231,7 @@ static void ril_remove(struct ofono_modem *modem)
static void ril_pre_sim(struct ofono_modem *modem)
{
DBG("");
DBG("enter");
struct ril_data *ril = ofono_modem_get_data(modem);
struct ofono_sim *sim;
@@ -242,7 +244,6 @@ static void ril_pre_sim(struct ofono_modem *modem)
static void ril_post_sim(struct ofono_modem *modem)
{
DBG("");
struct ril_data *ril = ofono_modem_get_data(modem);
struct ofono_gprs *gprs;
struct ofono_gprs_context *gc;
@@ -269,7 +270,6 @@ static void ril_post_sim(struct ofono_modem *modem)
ofono_phonebook_create(modem, 0, "rilmodem", ril->modem);
ofono_call_forwarding_create(modem, 0, "rilmodem", ril->modem);
ofono_call_barring_create(modem, 0, "rilmodem", ril->modem);
ofono_stk_create(modem, 0, "rilmodem", ril->modem);
mw = ofono_message_waiting_create(modem);
if (mw)
@@ -278,7 +278,7 @@ static void ril_post_sim(struct ofono_modem *modem)
static void ril_post_online(struct ofono_modem *modem)
{
DBG("");
DBG("enter");
struct ril_data *ril = ofono_modem_get_data(modem);
ofono_call_volume_create(modem, 0, "rilmodem", ril->modem);
@@ -286,12 +286,13 @@ static void ril_post_online(struct ofono_modem *modem)
ofono_netreg_create(modem, 0, "rilmodem", ril->modem);
ofono_ussd_create(modem, 0, "rilmodem", ril->modem);
ofono_call_settings_create(modem, 0, "rilmodem", ril->modem);
ofono_cbs_create(modem, 0, "rilmodem", ril->modem);
ofono_oem_raw_create(modem, 0, "rilmodem", ril->modem);
}
static void ril_set_online_cb(struct ril_msg *message, gpointer user_data)
{
DBG("");
DBG("enter");
struct cb_data *cbd = user_data;
ofono_modem_online_cb_t cb = cbd->cb;
@@ -313,13 +314,12 @@ static void ril_set_online(struct ofono_modem *modem, ofono_bool_t online,
parcel_init(&rilp);
parcel_w_int32(&rilp, 1); /* Number of params */
parcel_w_int32(&rilp, online); /* Radio ON = 1, Radio OFF = 0 */
ofono_info("RIL_REQUEST_RADIO_POWER %d", online);
DBG("1");
ret = g_ril_send(ril->modem, RIL_REQUEST_RADIO_POWER, rilp.data,
rilp.size, ril_set_online_cb, cbd, g_free);
parcel_free(&rilp);
DBG("RIL_REQUEST_RADIO_POWER done");
DBG("2");
if (ret <= 0) {
g_free(cbd);
CALLBACK_WITH_FAILURE(callback, data);
@@ -357,7 +357,6 @@ static int ril_screen_state(struct ofono_modem *modem, ofono_bool_t state)
static gboolean display_changed(DBusConnection *conn,
DBusMessage *message, void *user_data)
{
DBG("");
struct ofono_modem *modem = user_data;
DBusMessageIter iter;
const char *value;
@@ -380,7 +379,6 @@ static gboolean display_changed(DBusConnection *conn,
static void mce_connect(DBusConnection *conn, void *user_data)
{
DBG("");
signal_watch = g_dbus_add_signal_watch(conn,
MCE_SERVICE, NULL,
MCE_SIGNAL_IF,
@@ -391,15 +389,12 @@ static void mce_connect(DBusConnection *conn, void *user_data)
static void mce_disconnect(DBusConnection *conn, void *user_data)
{
DBG("");
g_dbus_remove_watch(conn, signal_watch);
signal_watch = 0;
}
static void ril_connected(struct ril_msg *message, gpointer user_data)
{
DBG("");
struct ofono_modem *modem = (struct ofono_modem *) user_data;
struct ril_data *ril = ofono_modem_get_data(modem);
@@ -419,30 +414,20 @@ static void ril_connected(struct ril_msg *message, gpointer user_data)
static gboolean ril_re_init(gpointer user_data)
{
DBG("");
if (reconnecting) {
ril_init();
return TRUE;
} else {
return FALSE;
}
ril_init();
return FALSE;
}
static void gril_disconnected(gpointer user_data)
{
/* Signal clients modem going down
*/
/* Signal clients modem going down */
struct ofono_modem *modem = user_data;
DBusConnection *conn = ofono_dbus_get_connection();
if (ofono_modem_is_registered(modem)) {
if (modem) {
ofono_modem_remove(modem);
mce_disconnect(conn, user_data);
}
if (!reconnecting) {
reconnecting = TRUE;
g_timeout_add_seconds(2, ril_re_init, NULL);
reconnect_timer = g_timeout_add_seconds(2, ril_re_init, NULL);
}
}
@@ -475,7 +460,7 @@ void ril_switchUser()
static int ril_enable(struct ofono_modem *modem)
{
DBG("%p", modem);
DBG("enter");
struct ril_data *ril = ofono_modem_get_data(modem);
ril->have_sim = FALSE;
@@ -500,8 +485,6 @@ static int ril_enable(struct ofono_modem *modem)
return -EIO;
}
reconnecting = FALSE;
if (getenv("OFONO_RIL_TRACE"))
g_ril_set_trace(ril->modem, TRUE);
@@ -518,18 +501,17 @@ static int ril_enable(struct ofono_modem *modem)
static int ril_disable(struct ofono_modem *modem)
{
DBG("%p", modem);
struct ril_data *ril = ofono_modem_get_data(modem);
struct parcel rilp;
int request = RIL_REQUEST_RADIO_POWER;
guint ret;
DBG("%p", modem);
parcel_init(&rilp);
parcel_w_int32(&rilp, 1); /* size of array */
parcel_w_int32(&rilp, 0); /* POWER=OFF */
ofono_info("RIL_REQUEST_RADIO_POWER OFF");
/* fire and forget i.e. not waiting for the callback*/
ret = g_ril_send(ril->modem, request, rilp.data,
rilp.size, NULL, NULL, NULL);
@@ -573,7 +555,7 @@ static struct ofono_modem_driver ril_driver = {
*/
static int ril_init(void)
{
DBG("");
DBG("enter");
int retval = 0;
struct ofono_modem *modem;
@@ -598,6 +580,23 @@ static int ril_init(void)
retval = ofono_modem_register(modem);
DBG("ofono_modem_register returned: %d", retval);
/* kickstart the modem:
* causes core modem code to call
* - set_powered(TRUE) - which in turn
* calls driver->enable()
*
* - driver->pre_sim()
*
* Could also be done via:
*
* - a DBus call to SetProperties w/"Powered=TRUE" *1
* - sim_state_watch ( handles SIM removal? LOCKED states? **2
* - ofono_modem_set_powered()
*/
ofono_modem_reset(modem);
reconnect_timer = 0;
return retval;
}

View File

@@ -411,12 +411,9 @@ static void set_new_cond_list(struct ofono_call_forwarding *cf,
number = phone_number_to_string(
&lc->phone_number);
snprintf(attr, sizeof(attr), "%s%s",
bearer_class_to_string(lc->cls), cf_type_lut[i]);
ofono_dbus_signal_property_changed(conn, path,
OFONO_CALL_FORWARDING_INTERFACE,
attr,
cf_type_lut[i],
DBUS_TYPE_STRING, &number);
}
@@ -716,12 +713,8 @@ static DBusMessage *set_property_request(struct ofono_call_forwarding *cf,
if (ph->number[0] != '\0')
cf->driver->registration(cf, type, cls, ph, timeout,
set_property_callback, cf);
else {
if (cf->query_next == CALL_FORWARDING_TYPE_UNCONDITIONAL)
cf->query_end = CALL_FORWARDING_TYPE_NOT_REACHABLE;
else
cf->driver->erasure(cf, type, cls, set_property_callback, cf);
}
return NULL;
}

View File

@@ -48,7 +48,7 @@ struct error_mapping_entry cme_errors_mapping[] = {
};
static void append_variant(DBusMessageIter *iter,
int type, const void *value)
int type, void *value)
{
char sig[2];
DBusMessageIter valueiter;
@@ -65,7 +65,7 @@ static void append_variant(DBusMessageIter *iter,
}
void ofono_dbus_dict_append(DBusMessageIter *dict,
const char *key, int type, const void *value)
const char *key, int type, void *value)
{
DBusMessageIter keyiter;
@@ -85,8 +85,7 @@ void ofono_dbus_dict_append(DBusMessageIter *dict,
dbus_message_iter_close_container(dict, &keyiter);
}
static void append_array_variant(DBusMessageIter *iter, int type,
const void *val)
static void append_array_variant(DBusMessageIter *iter, int type, void *val)
{
DBusMessageIter variant, array;
char typesig[2];
@@ -114,7 +113,7 @@ static void append_array_variant(DBusMessageIter *iter, int type,
}
void ofono_dbus_dict_append_array(DBusMessageIter *dict, const char *key,
int type, const void *val)
int type, void *val)
{
DBusMessageIter entry;
@@ -128,8 +127,7 @@ void ofono_dbus_dict_append_array(DBusMessageIter *dict, const char *key,
dbus_message_iter_close_container(dict, &entry);
}
static void append_dict_variant(DBusMessageIter *iter, int type,
const void *val)
static void append_dict_variant(DBusMessageIter *iter, int type, void *val)
{
DBusMessageIter variant, array, entry;
char typesig[5];
@@ -184,7 +182,7 @@ static void append_dict_variant(DBusMessageIter *iter, int type,
}
void ofono_dbus_dict_append_dict(DBusMessageIter *dict, const char *key,
int type, const void *val)
int type, void *val)
{
DBusMessageIter entry;
@@ -202,7 +200,7 @@ int ofono_dbus_signal_property_changed(DBusConnection *conn,
const char *path,
const char *interface,
const char *name,
int type, const void *value)
int type, void *value)
{
DBusMessage *signal;
DBusMessageIter iter;
@@ -227,7 +225,7 @@ int ofono_dbus_signal_array_property_changed(DBusConnection *conn,
const char *path,
const char *interface,
const char *name,
int type, const void *value)
int type, void *value)
{
DBusMessage *signal;
@@ -253,7 +251,7 @@ int ofono_dbus_signal_dict_property_changed(DBusConnection *conn,
const char *path,
const char *interface,
const char *name,
int type, const void *value)
int type, void *value)
{
DBusMessage *signal;

View File

@@ -57,7 +57,6 @@
#define MAX_MESSAGE_CENTER_LENGTH 255
#define MAX_CONTEXTS 256
#define SUSPEND_TIMEOUT 8
#define MAX_MMS_MTU 1280
/* 27.007 Section 7.29 */
enum packet_bearer {
@@ -759,31 +758,6 @@ static void pri_reset_context_settings(struct pri_context *ctx)
g_free(interface);
}
static void pri_limit_mtu(const char *interface, int max_mtu)
{
struct ifreq ifr;
int sk;
if (interface == NULL)
return;
sk = socket(PF_INET, SOCK_DGRAM, 0);
if (sk < 0)
return;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, interface, IFNAMSIZ);
if (ioctl(sk, SIOCGIFMTU, &ifr) < 0 || ifr.ifr_mtu > max_mtu) {
ifr.ifr_mtu = max_mtu;
if (ioctl(sk, SIOCSIFMTU, &ifr) < 0)
ofono_error("Failed to set MTU");
}
close(sk);
}
static void pri_update_mms_context_settings(struct pri_context *ctx)
{
struct ofono_gprs_context *gc = ctx->context_driver;
@@ -800,8 +774,6 @@ static void pri_update_mms_context_settings(struct pri_context *ctx)
if (ctx->proxy_host)
pri_setproxy(settings->interface, ctx->proxy_host);
pri_limit_mtu(settings->interface, MAX_MMS_MTU);
}
static void append_context_properties(struct pri_context *ctx,
@@ -3044,56 +3016,14 @@ static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
__ofono_atom_register(gprs->atom, gprs_unregister);
}
static gboolean mms_context_configured(struct ofono_gprs *gprs)
{
GSList *l;
for (l = gprs->contexts; l; l = l->next) {
struct pri_context *ctx = l->data;
if (ctx->type == OFONO_GPRS_CONTEXT_TYPE_MMS)
return TRUE;
}
return FALSE;
}
static void provision_mms_context(struct ofono_gprs *gprs, const char *mcc,
const char *mnc, const char *spn)
{
struct ofono_gprs_provision_data *settings;
int count;
int i;
if (__ofono_gprs_provision_get_settings(mcc, mnc, spn,
&settings, &count) == FALSE) {
ofono_warn("Provisioning failed");
return;
}
for (i = 0; i < count; i++) {
if (settings[i].type == OFONO_GPRS_CONTEXT_TYPE_MMS) {
provision_context(&settings[i], gprs);
break;
}
}
__ofono_gprs_provision_free_settings(settings, count);
}
static void spn_read_cb(const char *spn, const char *dc, void *data)
{
struct ofono_gprs *gprs = data;
struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
struct ofono_sim *sim = __ofono_atom_find(OFONO_ATOM_TYPE_SIM, modem);
if (gprs->contexts == NULL) {
provision_contexts(gprs, ofono_sim_get_mcc(sim),
provision_contexts(gprs, ofono_sim_get_mcc(sim),
ofono_sim_get_mnc(sim), spn);
} else if (!mms_context_configured(gprs)) {
provision_mms_context(gprs, ofono_sim_get_mcc(sim),
ofono_sim_get_mnc(sim), spn);
}
ofono_sim_remove_spn_watch(sim, &gprs->spn_watch);
@@ -3110,7 +3040,7 @@ void ofono_gprs_register(struct ofono_gprs *gprs)
gprs_load_settings(gprs, ofono_sim_get_imsi(sim));
if (mms_context_configured(gprs))
if (gprs->contexts)
goto finish;
ofono_sim_add_spn_watch(sim, &gprs->spn_watch, spn_read_cb, gprs, NULL);

View File

@@ -44,34 +44,25 @@
static GSList *g_drivers = NULL;
#define HANDSFREE_FLAG_CACHED 0x1
struct ofono_handsfree {
ofono_bool_t nrec;
ofono_bool_t inband_ringing;
ofono_bool_t voice_recognition;
ofono_bool_t voice_recognition_pending;
unsigned int ag_features;
unsigned int ag_chld_features;
unsigned char battchg;
GSList *subscriber_numbers;
const struct ofono_handsfree_driver *driver;
void *driver_data;
struct ofono_atom *atom;
DBusMessage *pending;
int flags;
};
static const char **ag_features_list(unsigned int features,
unsigned int chld_features)
static const char **ag_features_list(unsigned int features)
{
static const char *list[10];
static const char *list[33];
unsigned int i = 0;
if (features & HFP_AG_FEATURE_3WAY)
list[i++] = "three-way-calling";
if (features & HFP_AG_FEATURE_ECNR)
list[i++] = "echo-canceling-and-noise-reduction";
@@ -81,21 +72,6 @@ static const char **ag_features_list(unsigned int features,
if (features & HFP_AG_FEATURE_ATTACH_VOICE_TAG)
list[i++] = "attach-voice-tag";
if (chld_features & HFP_AG_CHLD_0)
list[i++] = "release-all-held";
if (chld_features & HFP_AG_CHLD_1x)
list[i++] = "release-specified-active-call";
if (chld_features & HFP_AG_CHLD_2x)
list[i++] = "private-chat";
if (chld_features & HFP_AG_CHLD_3)
list[i++] = "create-multiparty";
if (chld_features & HFP_AG_CHLD_4)
list[i++] = "transfer";
list[i] = NULL;
return list;
@@ -149,15 +125,6 @@ void ofono_handsfree_set_ag_features(struct ofono_handsfree *hf,
hf->ag_features = ag_features;
}
void ofono_handsfree_set_ag_chld_features(struct ofono_handsfree *hf,
unsigned int ag_chld_features)
{
if (hf == NULL)
return;
hf->ag_chld_features = ag_chld_features;
}
void ofono_handsfree_battchg_notify(struct ofono_handsfree *hf,
unsigned char level)
{
@@ -181,44 +148,10 @@ void ofono_handsfree_battchg_notify(struct ofono_handsfree *hf,
&level);
}
static void append_subscriber_numbers(GSList *subscriber_numbers,
DBusMessageIter *iter)
{
DBusMessageIter entry;
DBusMessageIter variant, array;
GSList *l;
const char *subscriber_number_string;
char arraysig[3];
const char *key = "SubscriberNumbers";
arraysig[0] = DBUS_TYPE_ARRAY;
arraysig[1] = DBUS_TYPE_STRING;
arraysig[2] = '\0';
dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY,
NULL, &entry);
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
&key);
dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
arraysig, &variant);
dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &array);
for (l = subscriber_numbers; l; l = l->next) {
subscriber_number_string = phone_number_to_string(l->data);
dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING,
&subscriber_number_string);
}
dbus_message_iter_close_container(&variant, &array);
dbus_message_iter_close_container(&entry, &variant);
dbus_message_iter_close_container(iter, &entry);
}
static DBusMessage *generate_get_properties_reply(struct ofono_handsfree *hf,
DBusMessage *msg)
static DBusMessage *handsfree_get_properties(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct ofono_handsfree *hf = data;
DBusMessage *reply;
DBusMessageIter iter;
DBusMessageIter dict;
@@ -248,90 +181,18 @@ static DBusMessage *generate_get_properties_reply(struct ofono_handsfree *hf,
ofono_dbus_dict_append(&dict, "VoiceRecognition", DBUS_TYPE_BOOLEAN,
&voice_recognition);
features = ag_features_list(hf->ag_features, hf->ag_chld_features);
features = ag_features_list(hf->ag_features);
ofono_dbus_dict_append_array(&dict, "Features", DBUS_TYPE_STRING,
&features);
ofono_dbus_dict_append(&dict, "BatteryChargeLevel", DBUS_TYPE_BYTE,
&hf->battchg);
if (hf->subscriber_numbers)
append_subscriber_numbers(hf->subscriber_numbers, &dict);
dbus_message_iter_close_container(&iter, &dict);
return reply;
}
static void hf_cnum_callback(const struct ofono_error *error, int total,
const struct ofono_phone_number *numbers,
void *data)
{
struct ofono_handsfree *hf = data;
int num;
struct ofono_phone_number *subscriber_number;
if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
goto out;
for (num = 0; num < total; num++) {
subscriber_number = g_new0(struct ofono_phone_number, 1);
subscriber_number->type = numbers[num].type;
strncpy(subscriber_number->number, numbers[num].number,
OFONO_MAX_PHONE_NUMBER_LENGTH + 1);
hf->subscriber_numbers = g_slist_prepend(hf->subscriber_numbers,
subscriber_number);
}
hf->subscriber_numbers = g_slist_reverse(hf->subscriber_numbers);
out:
hf->flags |= HANDSFREE_FLAG_CACHED;
if (hf->pending) {
DBusMessage *reply =
generate_get_properties_reply(hf, hf->pending);
__ofono_dbus_pending_reply(&hf->pending, reply);
}
}
static void query_cnum(struct ofono_handsfree *hf)
{
DBusMessage *reply;
if (hf->driver->cnum_query != NULL) {
hf->driver->cnum_query(hf, hf_cnum_callback, hf);
return;
}
if (hf->pending == NULL)
return;
reply = generate_get_properties_reply(hf, hf->pending);
__ofono_dbus_pending_reply(&hf->pending, reply);
}
static DBusMessage *handsfree_get_properties(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct ofono_handsfree *hf = data;
if (hf->pending != NULL)
return __ofono_error_busy(msg);
if (hf->flags & HANDSFREE_FLAG_CACHED)
return generate_get_properties_reply(hf, msg);
/* Query the settings and report back */
hf->pending = dbus_message_ref(msg);
query_cnum(hf);
return NULL;
}
static void voicerec_set_cb(const struct ofono_error *error, void *data)
{
struct ofono_handsfree *hf = data;
@@ -563,10 +424,6 @@ static void handsfree_unregister(struct ofono_atom *atom)
__ofono_dbus_pending_reply(&hf->pending, reply);
}
g_slist_foreach(hf->subscriber_numbers, (GFunc) g_free, NULL);
g_slist_free(hf->subscriber_numbers);
hf->subscriber_numbers = NULL;
ofono_modem_remove_interface(modem, OFONO_HANDSFREE_INTERFACE);
g_dbus_unregister_interface(conn, path,
OFONO_HANDSFREE_INTERFACE);

View File

@@ -45,17 +45,6 @@ enum hfp_hf_feature {
HFP_HF_FEATURE_CODEC_NEGOTIATION = 0x80,
};
/* HFP AG supported call hold and multiparty services bitmap. Bluetooth HFP 1.6 spec page 76 */
enum hfp_ag_chld_feature {
HFP_AG_CHLD_0 = 0x1,
HFP_AG_CHLD_1 = 0x2,
HFP_AG_CHLD_1x = 0x4,
HFP_AG_CHLD_2 = 0x8,
HFP_AG_CHLD_2x = 0x10,
HFP_AG_CHLD_3 = 0x20,
HFP_AG_CHLD_4 = 0x40,
};
enum hfp_sdp_hf_features {
HFP_SDP_HF_FEATURE_ECNR = 0x1,
HFP_SDP_HF_FEATURE_3WAY = 0x2,

View File

@@ -135,7 +135,7 @@ void idmap_put(struct idmap *idmap, unsigned int id)
id %= BITS_PER_LONG;
idmap->bits[offset] &= ~(1UL << id);
idmap->bits[offset] &= ~(1 << id);
}
unsigned int idmap_alloc(struct idmap *idmap)
@@ -149,7 +149,7 @@ unsigned int idmap_alloc(struct idmap *idmap)
return idmap->max + 1;
offset = bit / BITS_PER_LONG;
idmap->bits[offset] |= 1UL << (bit % BITS_PER_LONG);
idmap->bits[offset] |= 1 << (bit % BITS_PER_LONG);
return bit + idmap->min;
}
@@ -163,7 +163,7 @@ void idmap_take(struct idmap *idmap, unsigned int id)
return;
offset = bit / BITS_PER_LONG;
idmap->bits[offset] |= 1UL << (bit % BITS_PER_LONG);
idmap->bits[offset] |= 1 << (bit % BITS_PER_LONG);
}
/*
@@ -186,7 +186,7 @@ unsigned int idmap_alloc_next(struct idmap *idmap, unsigned int last)
return idmap_alloc(idmap);
offset = bit / BITS_PER_LONG;
idmap->bits[offset] |= 1UL << (bit % BITS_PER_LONG);
idmap->bits[offset] |= 1 << (bit % BITS_PER_LONG);
return bit + idmap->min;
}

View File

@@ -289,8 +289,7 @@ void __ofono_log_enable(struct ofono_debug_desc *start,
}
int __ofono_log_init(const char *program, const char *debug,
ofono_bool_t detach,
ofono_bool_t backtrace)
ofono_bool_t detach)
{
static char path[PATH_MAX];
int option = LOG_NDELAY | LOG_PID;
@@ -306,8 +305,7 @@ int __ofono_log_init(const char *program, const char *debug,
if (detach == FALSE)
option |= LOG_PERROR;
if (backtrace == TRUE)
signal_setup(signal_handler);
signal_setup(signal_handler);
openlog(basename(program), option, LOG_DAEMON);
@@ -316,14 +314,13 @@ int __ofono_log_init(const char *program, const char *debug,
return 0;
}
void __ofono_log_cleanup(ofono_bool_t backtrace)
void __ofono_log_cleanup(void)
{
syslog(LOG_INFO, "Exit");
closelog();
if (backtrace == TRUE)
signal_setup(SIG_DFL);
signal_setup(SIG_DFL);
g_strfreev(enabled);
}

View File

@@ -133,7 +133,6 @@ static gchar *option_plugin = NULL;
static gchar *option_noplugin = NULL;
static gboolean option_detach = TRUE;
static gboolean option_version = FALSE;
static gboolean option_backtrace = TRUE;
static gboolean parse_debug(const char *key, const char *value,
gpointer user_data, GError **error)
@@ -159,9 +158,6 @@ static GOptionEntry options[] = {
"Don't run as daemon in background" },
{ "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
"Show version information and exit" },
{ "nobacktrace", 0, G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &option_backtrace,
"Don't print out backtrace information" },
{ NULL },
};
@@ -217,8 +213,7 @@ int main(int argc, char **argv)
signal = setup_signalfd();
__ofono_log_init(argv[0], option_debug, option_detach,
option_backtrace);
__ofono_log_init(argv[0], option_debug, option_detach);
dbus_error_init(&error);
@@ -269,7 +264,7 @@ cleanup:
g_main_loop_unref(event_loop);
__ofono_log_cleanup(option_backtrace);
__ofono_log_cleanup();
return 0;
}

View File

@@ -2106,14 +2106,18 @@ void ofono_netreg_register(struct ofono_netreg *netreg)
ofono_sim_add_spn_watch(netreg->sim, &netreg->spn_watch,
spn_read_cb, netreg, NULL);
ofono_sim_read(netreg->sim_context, SIM_EFSPDI_FILEID,
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
sim_spdi_read_cb, netreg);
if (__ofono_sim_service_available(netreg->sim,
SIM_UST_SERVICE_PROVIDER_DISPLAY_INFO,
SIM_SST_SERVICE_PROVIDER_DISPLAY_INFO)) {
ofono_sim_read(netreg->sim_context, SIM_EFSPDI_FILEID,
OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
sim_spdi_read_cb, netreg);
ofono_sim_add_file_watch(netreg->sim_context,
SIM_EFSPDI_FILEID,
sim_spdi_changed,
netreg, NULL);
ofono_sim_add_file_watch(netreg->sim_context,
SIM_EFSPDI_FILEID,
sim_spdi_changed,
netreg, NULL);
}
}
__ofono_atom_register(netreg->atom, netreg_unregister);

View File

@@ -15,7 +15,6 @@
<allow send_interface="org.ofono.SmartMessagingAgent"/>
<allow send_interface="org.ofono.PositioningRequestAgent"/>
<allow send_interface="org.ofono.HandsfreeAudioAgent"/>
<allow send_interface="org.ofono.VoiceCallAgent"/>
</policy>
<policy user="radio">
@@ -26,7 +25,6 @@
<allow send_interface="org.ofono.SmartMessagingAgent"/>
<allow send_interface="org.ofono.PositioningRequestAgent"/>
<allow send_interface="org.ofono.HandsfreeAudioAgent"/>
<allow send_interface="org.ofono.VoiceCallAgent"/>
</policy>
<policy at_console="true">

View File

@@ -38,9 +38,8 @@ void __ofono_modem_shutdown(void);
#include <ofono/log.h>
int __ofono_log_init(const char *program, const char *debug,
ofono_bool_t detach,
ofono_bool_t backtrace);
void __ofono_log_cleanup(ofono_bool_t backtrace);
ofono_bool_t detach);
void __ofono_log_cleanup(void);
void __ofono_log_enable(struct ofono_debug_desc *start,
struct ofono_debug_desc *stop);

View File

@@ -1,14 +1,13 @@
[Unit]
Description=Telephony service
Requires=dbus.service
After=dbus.service
After=syslog.target
[Service]
Type=dbus
BusName=org.ofono
User=root
EnvironmentFile=-/var/lib/environment/ofono/*.conf
ExecStart=@prefix@/sbin/ofonod -n --nobacktrace $OFONO_ARGS
ExecStart=@prefix@/sbin/ofonod -n $OFONO_ARGS
StandardError=null
Restart=always
RestartSec=3

View File

@@ -767,14 +767,12 @@ static char *sim_network_name_parse(const unsigned char *buffer, int length,
gboolean *add_ci)
{
char *ret = NULL;
unsigned char *endp;
unsigned char dcs;
int i;
gboolean ci = FALSE;
unsigned char *unpacked_buf;
long num_char, written;
int spare_bits;
if (length < 2)
if (length < 1)
return NULL;
dcs = *buffer++;
@@ -789,18 +787,11 @@ static char *sim_network_name_parse(const unsigned char *buffer, int length,
switch (dcs & (7 << 4)) {
case 0x00:
spare_bits = dcs & 0x07;
num_char = (length * 8 - spare_bits) / 7;
unpacked_buf = unpack_7bit(buffer, length, 0, FALSE,
num_char, &written, 0);
if (unpacked_buf == NULL)
break;
ret = convert_gsm_to_utf8(unpacked_buf, written, NULL, NULL, 0);
g_free(unpacked_buf);
endp = memchr(buffer, 0xff, length);
if (endp)
length = endp - buffer;
ret = convert_gsm_to_utf8(buffer, length,
NULL, NULL, 0xff);
break;
case 0x10:
if ((length % 2) == 1) {

View File

@@ -3561,7 +3561,7 @@ GSList *sms_text_prepare_with_alphabet(const char *to, const char *utf8,
if (gsm_encoded == NULL) {
gsize converted;
ucs2_encoded = g_convert(utf8, -1, "UTF-16BE//TRANSLIT", "UTF-8",
ucs2_encoded = g_convert(utf8, -1, "UCS-2BE//TRANSLIT", "UTF-8",
NULL, &converted, NULL);
written = converted;
}

View File

@@ -737,11 +737,6 @@ static DBusMessage *stk_register_agent(DBusConnection *conn,
if (stk->session_agent == NULL)
stk->current_agent = stk->default_agent;
if (stk->driver && stk->driver->ready) {
DBG("Report driver agent is ready");
stk->driver->ready(stk);
}
return dbus_message_new_method_return(msg);
}

View File

@@ -3,7 +3,6 @@
* oFono - Open Source Telephony
*
* Copyright (C) 2008-2011 Intel Corporation. All rights reserved.
* Copyright (C) 2014 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
@@ -39,7 +38,6 @@
#include "simutil.h"
#include "smsutil.h"
#include "storage.h"
#include "voicecallagent.h"
#define MAX_VOICE_CALLS 16
@@ -77,7 +75,6 @@ struct ofono_voicecall {
ofono_voicecall_cb_t release_queue_done_cb;
struct ofono_emulator *pending_em;
unsigned int pending_id;
struct voicecall_agent *vc_agent;
};
struct voicecall {
@@ -558,11 +555,6 @@ static DBusMessage *voicecall_hangup(DBusConnection *conn,
struct ofono_voicecall *vc = v->vc;
struct ofono_call *call = v->call;
gboolean single_call = vc->call_list->next == 0;
struct tone_queue_entry *tone_entry = NULL;
/* clear any remaining tones */
while ((tone_entry = g_queue_peek_head(vc->toneq)))
tone_request_finish(vc, tone_entry, ENOENT, TRUE);
if (vc->pending || vc->pending_em)
return __ofono_error_busy(msg);
@@ -2148,72 +2140,6 @@ static DBusMessage *manager_get_calls(DBusConnection *conn,
return reply;
}
static void voicecall_agent_notify(gpointer user_data)
{
struct ofono_voicecall *vc = user_data;
vc->vc_agent = NULL;
}
static DBusMessage *voicecall_register_agent(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct ofono_voicecall *vc = data;
const char *agent_path;
if (vc->vc_agent)
return __ofono_error_busy(msg);
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH,
&agent_path, DBUS_TYPE_INVALID) == FALSE)
return __ofono_error_invalid_args(msg);
if (!__ofono_dbus_valid_object_path(agent_path))
return __ofono_error_invalid_format(msg);
vc->vc_agent = voicecall_agent_new(agent_path,
dbus_message_get_sender(msg));
if (vc->vc_agent == NULL)
return __ofono_error_failed(msg);
voicecall_agent_set_removed_notify(vc->vc_agent,
voicecall_agent_notify, vc);
return dbus_message_new_method_return(msg);
}
static DBusMessage *voicecall_unregister_agent(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct ofono_voicecall *vc = data;
const char *agent_path;
const char *agent_bus = dbus_message_get_sender(msg);
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &agent_path,
DBUS_TYPE_INVALID) == FALSE)
return __ofono_error_invalid_args(msg);
if (vc->vc_agent == NULL)
return __ofono_error_failed(msg);
if (!voicecall_agent_matches(vc->vc_agent, agent_path, agent_bus))
return __ofono_error_access_denied(msg);
if (vc->vc_agent) {
voicecall_agent_free(vc->vc_agent);
vc->vc_agent = NULL;
}
return dbus_message_new_method_return(msg);
}
void ofono_voicecall_ringback_tone_notify(struct ofono_voicecall *vc,
const ofono_bool_t playTone)
{
if (vc->vc_agent)
voicecall_agent_ringback_tone(vc->vc_agent, playTone);
}
static const GDBusMethodTable manager_methods[] = {
{ GDBUS_METHOD("GetProperties",
NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
@@ -2246,12 +2172,6 @@ static const GDBusMethodTable manager_methods[] = {
{ GDBUS_METHOD("GetCalls",
NULL, GDBUS_ARGS({ "calls_with_properties", "a(oa{sv})" }),
manager_get_calls) },
{ GDBUS_ASYNC_METHOD("RegisterVoicecallAgent",
GDBUS_ARGS({ "path", "o" }), NULL,
voicecall_register_agent) },
{ GDBUS_ASYNC_METHOD("UnregisterVoicecallAgent",
GDBUS_ARGS({ "path", "o" }), NULL,
voicecall_unregister_agent) },
{ }
};
@@ -2824,11 +2744,6 @@ static void voicecall_unregister(struct ofono_atom *atom)
voicecall_close_settings(vc);
if (vc->vc_agent) {
voicecall_agent_free(vc->vc_agent);
vc->vc_agent = 0;
}
if (vc->sim_state_watch) {
ofono_sim_remove_state_watch(vc->sim, vc->sim_state_watch);
vc->sim_state_watch = 0;
@@ -2944,24 +2859,19 @@ static void read_sim_ecc_numbers(int id, void *userdata)
ecc_g3_read_cb, vc);
}
static void get_ecc_numbers(struct ofono_voicecall *vc)
{
if (vc->sim_context == NULL) {
vc->sim_context = ofono_sim_context_create(vc->sim);
ofono_sim_add_file_watch(vc->sim_context, SIM_EFECC_FILEID,
read_sim_ecc_numbers, vc, NULL);
}
read_sim_ecc_numbers(SIM_EFECC_FILEID, vc);
}
static void sim_state_watch(enum ofono_sim_state new_state, void *user)
{
struct ofono_voicecall *vc = user;
switch (new_state) {
case OFONO_SIM_STATE_INSERTED:
get_ecc_numbers(vc);
if (vc->sim_context == NULL)
vc->sim_context = ofono_sim_context_create(vc->sim);
read_sim_ecc_numbers(SIM_EFECC_FILEID, vc);
ofono_sim_add_file_watch(vc->sim_context, SIM_EFECC_FILEID,
read_sim_ecc_numbers, vc, NULL);
break;
case OFONO_SIM_STATE_NOT_PRESENT:
case OFONO_SIM_STATE_RESETTING:
@@ -2978,8 +2888,6 @@ static void sim_state_watch(enum ofono_sim_state new_state, void *user)
voicecall_close_settings(vc);
break;
case OFONO_SIM_STATE_READY:
get_ecc_numbers(vc);
voicecall_load_settings(vc);
break;
case OFONO_SIM_STATE_LOCKED_OUT:

View File

@@ -1,131 +0,0 @@
/*
*
* oFono - Open Source Telephony
*
* Copyright (C) 2014 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include <glib.h>
#include <gdbus.h>
#include "ofono.h"
#include "voicecallagent.h"
#define OFONO_VOICECALL_AGENT_INTERFACE "org.ofono.VoiceCallAgent"
struct voicecall_agent {
char *path; /* Agent Path */
char *bus; /* Agent bus */
guint disconnect_watch; /* DBus disconnect watch */
ofono_destroy_func removed_cb;
void *removed_data;
};
void voicecall_agent_ringback_tone(struct voicecall_agent *agent,
const ofono_bool_t playTone)
{
DBusConnection *conn = ofono_dbus_get_connection();
DBusMessage *message = dbus_message_new_method_call(
agent->bus, agent->path,
OFONO_VOICECALL_AGENT_INTERFACE,
"RingbackTone");
if (message == NULL)
return;
if (!dbus_message_append_args(message, DBUS_TYPE_BOOLEAN, &playTone,
DBUS_TYPE_INVALID))
return;
dbus_message_set_no_reply(message, TRUE);
g_dbus_send_message(conn, message);
}
void voicecall_agent_send_release(struct voicecall_agent *agent)
{
DBusConnection *conn = ofono_dbus_get_connection();
DBusMessage *message = dbus_message_new_method_call(
agent->bus, agent->path,
OFONO_VOICECALL_AGENT_INTERFACE,
"Release");
if (message == NULL)
return;
dbus_message_set_no_reply(message, TRUE);
g_dbus_send_message(conn, message);
}
void voicecall_agent_set_removed_notify(struct voicecall_agent *agent,
ofono_destroy_func destroy,
void *user_data)
{
agent->removed_cb = destroy;
agent->removed_data = user_data; /* voicecall atom (not owned) */
}
void voicecall_agent_free(struct voicecall_agent *agent)
{
DBusConnection *conn = ofono_dbus_get_connection();
if (agent->disconnect_watch) {
voicecall_agent_send_release(agent);
g_dbus_remove_watch(conn, agent->disconnect_watch);
agent->disconnect_watch = 0;
}
if (agent->removed_cb)
agent->removed_cb(agent->removed_data);
g_free(agent->path);
g_free(agent->bus);
g_free(agent);
}
ofono_bool_t voicecall_agent_matches(struct voicecall_agent *agent,
const char *path, const char *sender)
{
return g_str_equal(agent->path, path) &&
g_str_equal(agent->bus, sender);
}
void voicecall_agent_disconnect_cb(DBusConnection *conn, void *user_data)
{
struct voicecall_agent *agent = user_data;
agent->disconnect_watch = 0;
voicecall_agent_free(agent);
}
struct voicecall_agent *voicecall_agent_new(const char *path,
const char *sender)
{
struct voicecall_agent *agent = g_try_new0(struct voicecall_agent, 1);
DBusConnection *conn = ofono_dbus_get_connection();
if (agent == NULL)
return NULL;
agent->path = g_strdup(path);
agent->bus = g_strdup(sender);
agent->disconnect_watch = g_dbus_add_disconnect_watch(conn, sender,
voicecall_agent_disconnect_cb,
agent, NULL);
return agent;
}

View File

@@ -1,40 +0,0 @@
/*
*
* oFono - Open Source Telephony
*
* Copyright (C) 2014 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
struct voicecall_agent;
void voicecall_agent_ringback_tone(struct voicecall_agent *agent,
const ofono_bool_t playTone);
void voicecall_agent_set_removed_notify(struct voicecall_agent *agent,
ofono_destroy_func removed_cb,
void *user_data);
void voicecall_agent_free(struct voicecall_agent *agent);
ofono_bool_t voicecall_agent_matches(struct voicecall_agent *agent,
const char *path, const char *sender);
struct voicecall_agent *voicecall_agent_new(const char *path,
const char *sender);
void voicecall_agent_disconnect_cb(DBusConnection *conn,
void *user_data);

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -20,7 +20,7 @@ for path, properties in modems:
contexts = connman.GetContexts()
if (len(contexts) == 0):
print("No context available")
print "No context available"
sys.exit(1)
connman.SetProperty("Powered", dbus.Boolean(1))
@@ -35,6 +35,6 @@ for path, properties in modems:
try:
context.SetProperty("Active", dbus.Boolean(1), timeout = 100)
except dbus.DBusException as e:
print("Error activating %s: %s" % (path, str(e)))
except dbus.DBusException, e:
print "Error activating %s: %s" % (path, str(e))
exit(2)

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
@@ -10,7 +10,7 @@ manager = dbus.Interface(bus.get_object('org.ofono', '/'),
modems = manager.GetModems()
for path, properties in modems:
print("[ %s ]" % (path))
print "[ %s ]" % (path)
if "org.ofono.VoiceCallManager" not in properties["Interfaces"]:
continue
@@ -22,7 +22,7 @@ for path, properties in modems:
for path, properties in calls:
state = properties["State"]
print("[ %s ] %s" % (path, state))
print "[ %s ] %s" % (path, state)
if state != "incoming":
continue

View File

@@ -1,6 +1,6 @@
#!/usr/bin/python3
#!/usr/bin/python
from gi.repository import GLib
import gobject
import dbus
import dbus.mainloop.glib
@@ -12,23 +12,23 @@ def answer_call(path):
'org.ofono.VoiceCall')
time.sleep(2)
call.Answer()
print(" Voice Call [ %s ] Answered" % (path))
print " Voice Call [ %s ] Answered" % (path)
def voicecalls_call_added(path, properties):
print(" Voice Call [ %s ] Added" % (path))
print " Voice Call [ %s ] Added" % (path)
for key in properties.keys():
val = str(properties[key])
print(" %s = %s" % (key, val))
print()
print " %s = %s" % (key, val)
print
state = properties["State"]
if state == "incoming":
answer_call(path)
def voicecalls_call_removed(path):
print(" Voice Call [ %s ] Removed" % (path))
print()
print " Voice Call [ %s ] Removed" % (path)
print
if __name__ == "__main__":
global vcmanager
@@ -43,7 +43,7 @@ if __name__ == "__main__":
modems = manager.GetModems()
modem = modems[0][0]
print("Using modem %s" % modem)
print "Using modem %s" % modem
vcmanager = dbus.Interface(bus.get_object('org.ofono', modem),
'org.ofono.VoiceCallManager')
@@ -52,6 +52,6 @@ if __name__ == "__main__":
vcmanager.connect_to_signal("CallRemoved", voicecalls_call_removed)
mainloop = GLib.MainLoop()
mainloop = gobject.MainLoop()
mainloop.run()

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import os
import re
@@ -6,7 +6,7 @@ import sys
import subprocess
if (len(sys.argv) < 3):
print("Usage: %s [binary] [log]" % (sys.argv[0]))
print "Usage: %s [binary] [log]" % (sys.argv[0])
sys.exit(1)
binary = sys.argv[1]
@@ -50,8 +50,8 @@ child_stdout.close()
frame_count = len(frames);
count = 0
print("-------- backtrace --------")
print "-------- backtrace --------"
while count < frame_count:
print("[%d]: %s() [%s]" % (count/2, frames[count], frames[count + 1]))
print "[%d]: %s() [%s]" % (count/2, frames[count], frames[count + 1])
count = count + 2
print("---------------------------")
print "---------------------------"

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -21,7 +21,7 @@ ussd = dbus.Interface(bus.get_object('org.ofono', path),
properties = ussd.GetProperties()
state = properties["State"]
print("State: %s" % (state))
print "State: %s" % (state)
if state != "idle":
ussd.Cancel()

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
modems = manager.GetModems()
path = modems[0][0]
print("Disconnecting CDMA Packet Data Service on modem %s..." % path)
print "Disconnecting CDMA Packet Data Service on modem %s..." % path
cm = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.cdma.ConnectionManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
modems = manager.GetModems()
path = modems[0][0]
print("Connecting CDMA Packet Data Service on modem %s..." % path)
print "Connecting CDMA Packet Data Service on modem %s..." % path
cm = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.cdma.ConnectionManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -16,7 +16,7 @@ else:
path, properties = modems[0]
number = sys.argv[1]
print("Using modem %s" % path)
print "Using modem %s" % path
manager = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.cdma.VoiceCallManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
@@ -10,7 +10,7 @@ manager = dbus.Interface(bus.get_object('org.ofono', '/'),
modems = manager.GetModems()
for path, properties in modems:
print("[ %s ]" % (path))
print "[ %s ]" % (path)
if "org.ofono.cdma.VoiceCallManager" not in properties["Interfaces"]:
continue
@@ -22,4 +22,4 @@ for path, properties in modems:
for key in properties.keys():
val = str(properties[key])
print(" %s = %s" % (key, val))
print " %s = %s" % (key, val)

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -17,12 +17,12 @@ for path, properties in modems:
cm = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.cdma.ConnectionManager')
print("Connecting CDMA Packet Data Service on modem %s..." % path)
print "Connecting CDMA Packet Data Service on modem %s..." % path
if len(sys.argv) > 1:
cm.SetProperty("Username", (sys.argv[1]))
print("Setting Username to %s" % (sys.argv[1]))
print "Setting Username to %s" % (sys.argv[1])
if len(sys.argv) > 2:
cm.SetProperty("Password", (sys.argv[2]))
print("Setting Password to %s" % (sys.argv[2]))
print "Setting Password to %s" % (sys.argv[2])

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -19,10 +19,10 @@ elif len(sys.argv) == 3:
old_pin = sys.argv[2]
new_pin = sys.argv[3]
else:
print("%s [PATH] pin_type old_pin new_pin" % (sys.argv[0]))
print "%s [PATH] pin_type old_pin new_pin" % (sys.argv[0])
sys.exit(0)
print("Change %s for modem %s..." % (pin_type, path))
print "Change %s for modem %s..." % (pin_type, path)
simmanager = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.SimManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -27,21 +27,21 @@ for path, properties in modems:
if path == "":
path = connman.AddContext("internet")
print("Created new context %s" % (path))
print "Created new context %s" % (path)
else:
print("Found context %s" % (path))
print "Found context %s" % (path)
context = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.ConnectionContext')
if len(sys.argv) > 1:
context.SetProperty("AccessPointName", sys.argv[1])
print("Setting APN to %s" % (sys.argv[1]))
print "Setting APN to %s" % (sys.argv[1])
if len(sys.argv) > 2:
context.SetProperty("Username", sys.argv[2])
print("Setting username to %s" % (sys.argv[2]))
print "Setting username to %s" % (sys.argv[2])
if len(sys.argv) > 3:
context.SetProperty("Password", sys.argv[3])
print("Setting password to %s" % (sys.argv[3]))
print "Setting password to %s" % (sys.argv[3])

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -27,21 +27,21 @@ for path, properties in modems:
if path == "":
path = connman.AddContext("mms")
print("Created new context %s" % (path))
print "Created new context %s" % (path)
else:
print("Found context %s" % (path))
print "Found context %s" % (path)
context = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.ConnectionContext')
if len(sys.argv) > 1:
context.SetProperty("AccessPointName", sys.argv[1])
print("Setting APN to %s" % (sys.argv[1]))
print "Setting APN to %s" % (sys.argv[1])
if len(sys.argv) > 2:
context.SetProperty("Username", sys.argv[2])
print("Setting username to %s" % (sys.argv[2]))
print "Setting username to %s" % (sys.argv[2])
if len(sys.argv) > 3:
context.SetProperty("Password", sys.argv[3])
print("Setting password to %s" % (sys.argv[3]))
print "Setting password to %s" % (sys.argv[3])

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -21,4 +21,4 @@ manager = dbus.Interface(bus.get_object('org.ofono', path),
mpty = manager.CreateMultiparty()
for path in mpty:
print(path)
print path

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -20,7 +20,7 @@ for path, properties in modems:
contexts = connman.GetContexts()
if (len(contexts) == 0):
print("No context available")
print "No context available"
sys.exit(1)
if len(sys.argv) > 1:
@@ -33,6 +33,6 @@ for path, properties in modems:
try:
context.SetProperty("Active", dbus.Boolean(0))
except dbus.DBusException as e:
print("Error activating %s: %s" % (path, str(e)))
except dbus.DBusException, e:
print "Error activating %s: %s" % (path, str(e))
exit(2)

View File

@@ -1,10 +1,10 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
if (len(sys.argv) < 2):
print("Usage: %s [modem] <number> [hide_callerid]" % (sys.argv[0]))
print "Usage: %s [modem] <number> [hide_callerid]" % (sys.argv[0])
sys.exit(1)
bus = dbus.SystemBus()
@@ -32,11 +32,11 @@ else:
number = sys.argv[2]
hide_callerid = sys.argv[3]
print("Using modem %s" % modem)
print "Using modem %s" % modem
vcm = dbus.Interface(bus.get_object('org.ofono', modem),
'org.ofono.VoiceCallManager')
path = vcm.Dial(number, hide_callerid)
print(path)
print path

View File

@@ -1,24 +1,24 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
from gi.repository import GLib
import gobject
import dbus
import dbus.mainloop.glib
def property_changed(property, value):
if len(value.__str__()) > 0:
print("CF property %s changed to %s" % (property, value))
print "CF property %s changed to %s" % (property, value)
else:
print("CF property %s changed to disabled" % (property))
print "CF property %s changed to disabled" % (property)
if canexit:
mainloop.quit();
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: %s <type>" % (sys.argv[0]))
print("Type can be: all, conditional")
print "Usage: %s <type>" % (sys.argv[0])
print "Type can be: all, conditional"
sys.exit(1)
canexit = False
@@ -41,13 +41,13 @@ if __name__ == "__main__":
try:
cf.DisableAll(type, timeout = 100)
except dbus.DBusException as e:
print("Unable to DisableAll %s" % e)
except dbus.DBusException, e:
print "Unable to DisableAll", e
sys.exit(1);
print("DisableAll successful")
print "DisableAll successful"
canexit = True
mainloop = GLib.MainLoop()
mainloop = gobject.MainLoop()
mainloop.run()

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
modems = manager.GetModems()
path = modems[0][0]
print("Disconnecting GPRS on modem %s..." % path)
print "Disconnecting GPRS on modem %s..." % path
cm = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.ConnectionManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
modems = manager.GetModems()
path = modems[0][0]
print("Disconnecting modem %s..." % path)
print "Disconnecting modem %s..." % path
modem = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.Modem')

View File

@@ -1,10 +1,10 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
if (len(sys.argv) < 2):
print("Usage: %s [modem] icon_id" % (sys.argv[0]))
print "Usage: %s [modem] icon_id" % (sys.argv[0])
sys.exit(1)
bus = dbus.SystemBus()
@@ -21,7 +21,7 @@ elif (len(sys.argv) == 3):
modem = sys.argv[1]
icon = sys.argv[2]
print("Using modem %s" % modem)
print "Using modem %s" % modem
sim = dbus.Interface(bus.get_object('org.ofono', modem),
'org.ofono.SimManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
devices = manager.GetDevices()
path = devices[0][0]
print("Connect device %s..." % path)
print "Connect device %s..." % path
device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
'org.ofono.dundee.Device')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
devices = manager.GetDevices()
path = devices[0][0]
print("Disconnect device %s..." % path)
print "Disconnect device %s..." % path
device = dbus.Interface(bus.get_object('org.ofono.dundee', path),
'org.ofono.dundee.Device')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
modems = manager.GetModems()
path = modems[0][0]
print("Enabling cell broadcast on modem %s..." % path)
print "Enabling cell broadcast on modem %s..." % path
cbs = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.CellBroadcast')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
modems = manager.GetModems()
path = modems[0][0]
print("Connecting modem %s..." % path)
print "Connecting modem %s..." % path
cm = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.ConnectionManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -13,7 +13,7 @@ else:
modems = manager.GetModems()
path = modems[0][0]
print("Connecting modem %s..." % path)
print "Connecting modem %s..." % path
modem = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.Modem')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -17,10 +17,10 @@ elif len(sys.argv) == 3:
pin_type = sys.argv[1]
pin = sys.argv[2]
else:
print("%s [PATH] pin_type pin" % (sys.argv[0]))
print "%s [PATH] pin_type pin" % (sys.argv[0])
sys.exit(0)
print("Enter Pin for modem %s..." % path)
print "Enter Pin for modem %s..." % path
simmanager = dbus.Interface(bus.get_object('org.ofono', path),
'org.ofono.SimManager')

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -8,7 +8,7 @@ bus = dbus.SystemBus()
if len(sys.argv) == 2:
id = sys.argv[1]
else:
print("%s <icon id>" % (sys.argv[0]))
print "%s <icon id>" % (sys.argv[0])
sys.exit(0)
manager = dbus.Interface(bus.get_object("org.ofono", "/"),
@@ -28,4 +28,4 @@ icon = sim.GetIcon(dbus.Byte(int(sys.argv[1])))
xpm = ""
for byte in icon:
xpm += str(byte)
print(xpm)
print xpm

View File

@@ -1,9 +1,9 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
_dbus2py = {
dbus.String : str,
dbus.String : unicode,
dbus.UInt32 : int,
dbus.Int32 : int,
dbus.Int16 : int,
@@ -66,4 +66,4 @@ net_time = dbus.Interface(bus.get_object('org.ofono', path),
time = net_time.GetNetworkTime()
print(pretty(time))
print pretty(time)

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus
import sys
@@ -22,7 +22,7 @@ for entry in operators:
path = entry[0]
properties = entry[1]
print("[ %s ]" % (path))
print "[ %s ]" % (path)
for key in properties.keys():
if key in ["Technologies"]:
@@ -31,7 +31,7 @@ for entry in operators:
val += i + " "
else:
val = str(properties[key])
print(" %s = %s" % (key, val))
print " %s = %s" % (key, val)
print('')
print

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import dbus, sys
@@ -17,4 +17,4 @@ radiosettings = dbus.Interface(bus.get_object('org.ofono', path),
properties = radiosettings.GetProperties()
print("Technology preference: %s" % (properties["TechnologyPreference"]))
print "Technology preference: %s" % (properties["TechnologyPreference"])

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus
@@ -18,7 +18,7 @@ calls = manager.GetCalls()
for path, properties in calls:
state = properties["State"]
print("[ %s ] %s" % (path, state))
print "[ %s ] %s" % (path, state)
if state != "active":
continue

View File

@@ -1,4 +1,4 @@
#!/usr/bin/python3
#!/usr/bin/python
import sys
import dbus

Some files were not shown because too many files have changed in this diff Show More