summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Pessi <ppessi@wilpertti.helmenkalastaja.net>2010-10-13 02:39:40 +0300
committerPekka Pessi <Pekka.Pessi@nokia.com>2010-10-13 11:19:32 +0300
commitd4517fe3387f826151a3a6da6e361283e167fad3 (patch)
tree61a26046e46e0f35f1e87ce03e2798f15710eac5
parentaa1eaedcb3ad687d18ab52faf704069222164d30 (diff)
Use new Modem and ModemService interface.
-rw-r--r--src/ring-connection-manager.c4
-rw-r--r--src/ring-connection.c354
2 files changed, 238 insertions, 120 deletions
diff --git a/src/ring-connection-manager.c b/src/ring-connection-manager.c
index e99cb6d..5b25c8f 100644
--- a/src/ring-connection-manager.c
+++ b/src/ring-connection-manager.c
@@ -41,6 +41,8 @@
#include "ring-connection-manager.h"
#include "ring-connection.h"
+#include "modem/service.h"
+
#include <telepathy-glib/errors.h>
#include <stdio.h>
@@ -62,6 +64,8 @@ ring_connection_manager_init(RingConnectionManager *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self,
RING_TYPE_CONNECTION_MANAGER, RingConnectionManagerPrivate);
+
+ modem_service_refresh (modem_service ());
}
static TpCMProtocolSpec ring_protocols[] = {
diff --git a/src/ring-connection.c b/src/ring-connection.c
index bda967e..056c9e8 100644
--- a/src/ring-connection.c
+++ b/src/ring-connection.c
@@ -48,6 +48,7 @@
#include "ring-extensions/ring-extensions.h"
#include "modem/service.h"
+#include "modem/modem.h"
#include "modem/sim.h"
#include "modem/call.h"
#include "modem/sms.h"
@@ -74,14 +75,19 @@ struct _RingConnectionPrivate
RingTextManager *text;
gchar *modem_path;
- ModemService *modem;
+ Modem *modem;
ModemSIMService *sim;
struct {
- gulong sim_connected, modem_connected;
+ gulong modem_added;
+ gulong modem_removed;
+ gulong modem_interfaces;
+ gulong sim_connected;
gulong imsi_notify;
} signals;
+ guint connecting_source;
+
unsigned anon_mandatory:1;
unsigned sms_reduced_charset:1;
unsigned dispose_has_run:1;
@@ -226,10 +232,6 @@ ring_connection_constructed(GObject *object)
self->sos_handle = tp_handle_ensure(repo, RING_EMERGENCY_SERVICE_URN, NULL, NULL);
g_assert(self->sos_handle != 0);
-
- self->priv->modem = g_object_new(MODEM_TYPE_SERVICE,
- "object-path", self->priv->modem_path,
- NULL);
}
static void
@@ -246,10 +248,10 @@ ring_connection_dispose(GObject *object)
tp_handle_unref(repo, self->anon_handle), self->anon_handle = 0;
tp_handle_unref(repo, self->sos_handle), self->sos_handle = 0;
- g_object_unref(self->priv->modem);
- if (self->priv->sim) {
+ if (self->priv->modem)
+ g_object_unref (self->priv->modem);
+ if (self->priv->sim)
g_object_unref(self->priv->sim);
- }
G_OBJECT_CLASS(ring_connection_parent_class)->dispose(object);
g_assert(self->parent.self_handle == 0); /* unref'd by base class */
@@ -760,14 +762,14 @@ ring_connection_new(TpIntSet *params_present,
char *sms_service_centre = params->sms_service_centre;
return (RingConnection *) g_object_new(RING_TYPE_CONNECTION,
- "protocol", "tel",
- "sms-service-centre", sms_service_centre ? sms_service_centre : "",
- "sms-validity-period", params->sms_validity_period,
- "sms-reduced-charset", params->sms_reduced_charset,
- "anon-modes", params->anon_modes,
- "anon-mandatory", params->anon_mandatory,
- "modem-path", params->modem,
- NULL);
+ "protocol", "tel",
+ "modem-path", params->modem,
+ "sms-service-centre", sms_service_centre ? sms_service_centre : "",
+ "sms-validity-period", params->sms_validity_period,
+ "sms-reduced-charset", params->sms_reduced_charset,
+ "anon-modes", params->anon_modes,
+ "anon-mandatory", params->anon_mandatory,
+ NULL);
}
@@ -903,8 +905,11 @@ ring_connection_create_channel_managers(TpBaseConnection *base)
return channel_managers;
}
+static gboolean ring_connection_connecting_timeout (gpointer);
static void ring_connection_sim_connected(ModemSIMService *, gpointer);
-static void ring_connection_modem_connected(ModemService *, gpointer);
+static void ring_connection_modem_added (ModemService *, Modem *, gpointer);
+static void ring_connection_modem_removed (ModemService *, Modem *, gpointer);
+static void on_modem_interfaces_changed (Modem *, GParamSpec *, gpointer);
static gboolean
ring_connection_start_connecting(TpBaseConnection *base,
@@ -912,6 +917,8 @@ ring_connection_start_connecting(TpBaseConnection *base,
{
RingConnection *self = RING_CONNECTION(base);
RingConnectionPrivate *priv = self->priv;
+ ModemService *modems;
+ Modem *modem;
GError *error = NULL;
DEBUG("called");
@@ -920,26 +927,49 @@ ring_connection_start_connecting(TpBaseConnection *base,
error = NULL;
- priv->signals.modem_connected =
- g_signal_connect(priv->modem, "connected",
- G_CALLBACK(ring_connection_modem_connected),
- self);
+ priv->connecting_source = g_timeout_add_seconds (30,
+ ring_connection_connecting_timeout, self);
- if (!modem_service_connect(priv->modem)) {
- DEBUG("modem_service_connect failed");
- }
+ modems = modem_service ();
+ modem = modem_service_find_modem (modems, priv->modem_path);
- if (!ring_connection_check_status(self)) {
- DEBUG("ring_connection_check_status() failed");
- g_set_error(return_error, TP_ERRORS, TP_ERROR_NOT_AVAILABLE,
- "No cellular modem service available");
- return FALSE;
- }
+ if (modem)
+ {
+ ring_connection_modem_added (modems, modem, self);
+ }
+ else
+ {
+ priv->signals.modem_added = g_signal_connect (modems,
+ "modem-added", G_CALLBACK (ring_connection_modem_added), self);
+ }
+
+ priv->signals.modem_removed = g_signal_connect (modems,
+ "modem-removed", G_CALLBACK (ring_connection_modem_removed), self);
return TRUE;
}
/**
+ * ring_connection_connected
+ *
+ * Called after a connection becomes connected.
+ */
+static void
+ring_connection_connected (TpBaseConnection *base)
+{
+ RingConnection *self = RING_CONNECTION (base);
+ RingConnectionPrivate *priv = self->priv;
+
+ DEBUG ("called");
+
+ if (priv->connecting_source)
+ {
+ g_source_remove (priv->connecting_source);
+ priv->connecting_source = 0;
+ }
+}
+
+/**
* ring_connection_disconnected
*
* Called after a connection becomes disconnected.
@@ -954,9 +984,14 @@ ring_connection_disconnected(TpBaseConnection *base)
DEBUG("called");
+ if (priv->connecting_source)
+ {
+ g_source_remove (priv->connecting_source);
+ priv->connecting_source = 0;
+ }
+
if (priv->sim)
modem_sim_service_disconnect(priv->sim);
- modem_service_disconnect(priv->modem);
}
/** Called after connection has been disconnected.
@@ -972,16 +1007,32 @@ ring_connection_shut_down(TpBaseConnection *base)
DEBUG("called");
+ if (priv->signals.modem_added)
+ {
+ g_signal_handler_disconnect (modem_service (),
+ priv->signals.modem_added);
+ priv->signals.modem_added = 0;
+ }
+
+ if (priv->signals.modem_removed)
+ {
+ g_signal_handler_disconnect (modem_service (),
+ priv->signals.modem_removed);
+ priv->signals.modem_removed = 0;
+ }
+
+ if (priv->signals.modem_interfaces)
+ {
+ g_signal_handler_disconnect(priv->modem,
+ priv->signals.modem_interfaces);
+ priv->signals.modem_interfaces = 0;
+ }
+
if (priv->signals.sim_connected) {
g_signal_handler_disconnect(priv->sim, priv->signals.sim_connected);
priv->signals.sim_connected = 0;
}
- if (priv->signals.modem_connected) {
- g_signal_handler_disconnect(priv->modem, priv->signals.modem_connected);
- priv->signals.modem_connected = 0;
- }
-
if (priv->signals.imsi_notify) {
g_signal_handler_disconnect(priv->sim, priv->signals.imsi_notify);
priv->signals.imsi_notify = 0;
@@ -1000,7 +1051,7 @@ ring_connection_class_init_base_connection(TpBaseConnectionClass *klass)
IMPLEMENT(get_unique_connection_name);
/* IMPLEMENT(connecting) */
- /* IMPLEMENT(connected) */
+ IMPLEMENT (connected);
IMPLEMENT(disconnected);
IMPLEMENT(shut_down);
IMPLEMENT(start_connecting);
@@ -1014,65 +1065,124 @@ ring_connection_class_init_base_connection(TpBaseConnectionClass *klass)
/* ---------------------------------------------------------------------- */
/* RingConnection interface */
+static gboolean
+ring_connection_connecting_timeout (gpointer _self)
+{
+ RingConnection *self = RING_CONNECTION (_self);
+ RingConnectionPrivate *priv = self->priv;
+
+ DEBUG ("enter");
+
+ priv->connecting_source = 0;
+
+ ring_connection_check_status (self);
+
+ return FALSE;
+}
+
static void
-ring_connection_modem_connected(ModemService *modem,
- gpointer _self)
+ring_connection_modem_added (ModemService *modems,
+ Modem *modem,
+ gpointer _self)
{
- RingConnection *self = RING_CONNECTION(_self);
+ RingConnection *self = RING_CONNECTION (_self);
RingConnectionPrivate *priv = self->priv;
+ char const *path;
- DEBUG("enter");
+ DEBUG ("enter");
- if (modem_service_is_connected(modem)) {
- char const *modem_path;
- GError *error = NULL;
+ if (priv->modem)
+ return;
- modem_path = modem_service_get_modem_path(modem);
+ path = modem_get_modem_path (modem);
+ g_assert (path != NULL);
+ g_assert (priv->sim == NULL);
- g_assert(modem_path != NULL);
- g_assert(priv->sim == NULL);
+ if (priv->modem_path && strcmp (priv->modem_path, path))
+ return;
- priv->sim = g_object_new(
- MODEM_TYPE_SIM_SERVICE, "object-path", modem_path, NULL);
+ priv->modem = g_object_ref (modem);
- priv->signals.sim_connected =
- g_signal_connect(priv->sim, "connected",
- G_CALLBACK(ring_connection_sim_connected), self);
+ priv->signals.modem_interfaces = g_signal_connect (modem,
+ "notify::interfaces",
+ G_CALLBACK (on_modem_interfaces_changed), self);
- priv->signals.imsi_notify =
- g_signal_connect(self->priv->sim, "notify::imsi",
- G_CALLBACK(on_imsi_changed), self);
+ on_modem_interfaces_changed (modem, NULL, self);
+}
- if (!modem_sim_service_connect(priv->sim))
- DEBUG("modem_sim_service_connect failed");
+static void
+ring_connection_modem_removed (ModemService *modems,
+ Modem *modem,
+ gpointer _self)
+{
+ TpBaseConnection *base = TP_BASE_CONNECTION (_self);
+ RingConnection *self = RING_CONNECTION (_self);
+ RingConnectionPrivate *priv = self->priv;
- if (modem_service_supports_call(modem)) {
- if (!ring_media_manager_start_connecting(priv->media,
- modem_path, &error)) {
+ DEBUG ("enter");
+
+ if (priv->modem != modem)
+ return;
- DEBUG("ring_media_manager_start_connecting: " GERROR_MSG_FMT,
- GERROR_MSG_CODE(error));
- g_clear_error(&error);
- }
+ if (base->status != TP_CONNECTION_STATUS_DISCONNECTED)
+ {
+ tp_base_connection_change_status (base,
+ TP_CONNECTION_STATUS_DISCONNECTED,
+ TP_CONNECTION_STATUS_REASON_NETWORK_ERROR);
}
+}
- /*
- * XXX if sms atom is added after transition to online
- * we don't ever get text manager connected
- * Only way to use SMS is to start ring after modem is in online
- */
- if (modem_service_supports_sms(modem)) {
- if (!ring_text_manager_start_connecting(priv->text,
- modem_path, &error)) {
-
- DEBUG("ring_text_manager_start_connecting: " GERROR_MSG_FMT,
- GERROR_MSG_CODE(error));
- g_clear_error(&error);
- }
+static void
+on_modem_interfaces_changed (Modem *modem,
+ GParamSpec *spec,
+ gpointer _self)
+{
+ RingConnection *self = RING_CONNECTION (_self);
+ RingConnectionPrivate *priv = self->priv;
+ char const *path = modem_get_modem_path (modem);
+ GError *error = NULL;
+
+ if (modem_supports_sim (modem))
+ {
+ if (!priv->sim)
+ {
+ priv->sim = g_object_new (MODEM_TYPE_SIM_SERVICE,
+ "object-path", path, NULL);
+
+ priv->signals.sim_connected =
+ g_signal_connect (priv->sim, "connected",
+ G_CALLBACK (ring_connection_sim_connected), self);
+
+ priv->signals.imsi_notify =
+ g_signal_connect (self->priv->sim, "notify::imsi",
+ G_CALLBACK (on_imsi_changed), self);
+
+ if (!modem_sim_service_connect (priv->sim))
+ DEBUG ("modem_sim_service_connect failed");
+ }
}
- }
- ring_connection_check_status(self);
+ if (modem_supports_call (modem))
+ {
+ if (!ring_media_manager_start_connecting (priv->media, path, &error))
+ {
+ DEBUG ("ring_media_manager_start_connecting: " GERROR_MSG_FMT,
+ GERROR_MSG_CODE (error));
+ g_clear_error (&error);
+ }
+ }
+
+ if (modem_supports_sms (modem))
+ {
+ if (!ring_text_manager_start_connecting (priv->text, path, &error))
+ {
+ DEBUG ("ring_text_manager_start_connecting: " GERROR_MSG_FMT,
+ GERROR_MSG_CODE (error));
+ g_clear_error (&error);
+ }
+ }
+
+ ring_connection_check_status (self);
}
static void
@@ -1090,60 +1200,64 @@ ring_connection_sim_connected(ModemSIMService *sim,
gboolean
ring_connection_check_status(RingConnection *self)
{
+ TpBaseConnection *base = TP_BASE_CONNECTION (self);
RingConnectionPrivate *priv = self->priv;
- TpConnectionStatus modem, sim, text, media;
+ TpConnectionStatus conn, modem, sim, text, media;
+
+ conn = base->status;
- modem = modem_service_is_connected(priv->modem)
+ modem = !priv->modem
+ ? TP_INTERNAL_CONNECTION_STATUS_NEW
+ : modem_is_powered (priv->modem)
? TP_CONNECTION_STATUS_CONNECTED
- : modem_service_is_connecting(priv->modem)
+ : TP_CONNECTION_STATUS_CONNECTING;
+
+ sim = !priv->sim
+ ? TP_INTERNAL_CONNECTION_STATUS_NEW
+ : modem_sim_service_is_connected (priv->sim)
+ ? TP_CONNECTION_STATUS_CONNECTED
+ : modem_sim_service_is_connecting (priv->sim)
? TP_CONNECTION_STATUS_CONNECTING
: TP_CONNECTION_STATUS_DISCONNECTED;
- if (priv->sim)
- sim = modem_sim_service_is_connected(priv->sim)
- ? TP_CONNECTION_STATUS_CONNECTED
- : modem_sim_service_is_connecting(priv->sim)
- ? TP_CONNECTION_STATUS_CONNECTING
- : TP_CONNECTION_STATUS_DISCONNECTED;
- else
- sim = TP_INTERNAL_CONNECTION_STATUS_NEW;
-
media = ring_media_manager_get_status(priv->media);
text = ring_text_manager_get_status(priv->text);
- DEBUG("MODEM %s, SIM %s, CALL %s, SMS %s",
- ring_connection_status_as_string(modem),
- ring_connection_status_as_string(sim),
- ring_connection_status_as_string(media),
- ring_connection_status_as_string(text));
-
- if (modem == TP_CONNECTION_STATUS_CONNECTING ||
- sim == TP_CONNECTION_STATUS_CONNECTING ||
- media == TP_CONNECTION_STATUS_CONNECTING ||
- text == TP_CONNECTION_STATUS_CONNECTING) {
- /* Not yet */;
- return TRUE;
- }
- else if (modem == TP_CONNECTION_STATUS_CONNECTED &&
+ DEBUG ("%s - MODEM %s, SIM %s, CALL %s, SMS %s%s",
+ ring_connection_status_as_string (conn),
+ ring_connection_status_as_string (modem),
+ ring_connection_status_as_string (sim),
+ ring_connection_status_as_string (media),
+ ring_connection_status_as_string (text),
+ conn != TP_CONNECTION_STATUS_CONNECTING
+ ? ""
+ : priv->connecting_source
+ ? ", timer running" : ", timer expired");
+
+ if (modem == TP_CONNECTION_STATUS_CONNECTED &&
sim == TP_CONNECTION_STATUS_CONNECTED &&
(media == TP_CONNECTION_STATUS_CONNECTED ||
- text == TP_CONNECTION_STATUS_CONNECTED)) {
- tp_base_connection_change_status(
- (TpBaseConnection *)self,
- TP_CONNECTION_STATUS_CONNECTED,
- TP_CONNECTION_STATUS_REASON_REQUESTED);
+ text == TP_CONNECTION_STATUS_CONNECTED))
+ {
+ if (base->status != TP_CONNECTION_STATUS_CONNECTED)
+ tp_base_connection_change_status (base,
+ TP_CONNECTION_STATUS_CONNECTED,
+ TP_CONNECTION_STATUS_REASON_REQUESTED);
+
+ return TRUE;
+ }
+ if (priv->connecting_source)
return TRUE;
- }
- else {
- TpBaseConnection *base = (TpBaseConnection *)self;
- if (base->status != TP_CONNECTION_STATUS_DISCONNECTED) {
- tp_base_connection_change_status(base,
- TP_CONNECTION_STATUS_DISCONNECTED,
- TP_CONNECTION_STATUS_REASON_NETWORK_ERROR);
+
+ if (base->status != TP_CONNECTION_STATUS_DISCONNECTED)
+ {
+ tp_base_connection_change_status (base,
+ TP_CONNECTION_STATUS_DISCONNECTED,
+ TP_CONNECTION_STATUS_REASON_NETWORK_ERROR);
}
- return FALSE;
- }
+
+ return FALSE;
}
char const *