summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2010-11-04 23:37:51 +0200
committerPekka Pessi <Pekka.Pessi@nokia.com>2010-11-05 16:08:53 +0200
commitee488978b926430854a88adb1f3b2f515de07807 (patch)
tree493f1a92862e8ea79926fe7e45f2fb1ef136f7fe
parenta29e16bdd4f28d1aea08be0e16ac58b2cec861a1 (diff)
ring-media-manager: use new call service and call objects
Media manager does not keep track of connection status anymore, but rather the presence of call service object corresponding to org.ofono.VoiceCallManager interface. Also, the MediaChannel call-instance property is now transient: when it is removed channel gets Closed.
-rw-r--r--src/ring-call-channel.c5
-rw-r--r--src/ring-conference-channel.c3
-rw-r--r--src/ring-media-channel.c72
-rw-r--r--src/ring-media-manager.c248
-rw-r--r--src/ring-media-manager.h6
5 files changed, 165 insertions, 169 deletions
diff --git a/src/ring-call-channel.c b/src/ring-call-channel.c
index e23efdb..4ed660e 100644
--- a/src/ring-call-channel.c
+++ b/src/ring-call-channel.c
@@ -953,9 +953,10 @@ ring_call_channel_create_streams(RingMediaChannel *_self,
return FALSE;
}
- if (!modem_call_service_is_connected(self->base.call_service)) {
+ if (self->base.call_service == NULL ||
+ !modem_oface_is_connected (MODEM_OFACE (self->base.call_service))) {
g_set_error(error, TP_ERRORS, TP_ERROR_DISCONNECTED,
- "not connected to call service");
+ "not connected to call service");
return FALSE;
}
diff --git a/src/ring-conference-channel.c b/src/ring-conference-channel.c
index a2ff675..8a06109 100644
--- a/src/ring-conference-channel.c
+++ b/src/ring-conference-channel.c
@@ -1105,6 +1105,8 @@ ring_conference_channel_set_call_instance(RingMediaChannel *_self,
{
DEBUG("(%p, %p): enter", _self, ci);
+#if XXX
+
RingConferenceChannel *self = RING_CONFERENCE_CHANNEL(_self);
RingConferenceChannelPrivate *priv = self->priv;
@@ -1136,6 +1138,7 @@ ring_conference_channel_set_call_instance(RingMediaChannel *_self,
priv->cc = NULL;
}
+#endif
}
static gboolean
diff --git a/src/ring-media-channel.c b/src/ring-media-channel.c
index 0cda7f7..1c20a8c 100644
--- a/src/ring-media-channel.c
+++ b/src/ring-media-channel.c
@@ -324,10 +324,10 @@ ring_media_channel_get_property(GObject *obj,
g_value_set_object(value, self->connection);
break;
case PROP_CALL_SERVICE:
- g_value_set_object(value, self->call_service);
+ g_value_set_pointer(value, self->call_service);
break;
case PROP_CALL_INSTANCE:
- g_value_set_object(value, self->call_instance);
+ g_value_set_pointer(value, self->call_instance);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec);
@@ -375,11 +375,14 @@ ring_media_channel_set_property(GObject *obj,
self->connection = g_value_get_object(value);
break;
case PROP_CALL_SERVICE:
- self->call_service = g_value_get_object(value);
+ if (self->call_service)
+ g_object_unref (self->call_service);
+ self->call_service = g_value_get_pointer (value);
+ if (self->call_service)
+ g_object_ref (MODEM_CALL_SERVICE (self->call_service));
break;
case PROP_CALL_INSTANCE:
- ring_media_channel_set_call_instance(
- self, g_value_get_object(value));
+ ring_media_channel_set_call_instance (self, g_value_get_pointer (value));
break;
case PROP_TONES:
/* media manager owns tones as well as a reference to this channel */
@@ -549,25 +552,24 @@ ring_media_channel_class_init(RingMediaChannelClass *klass)
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS));
- g_object_class_install_property(
- object_class, PROP_CALL_SERVICE,
- g_param_spec_object("call-service",
- "ModemCallService Object",
- "ModemCallService for this channel",
- MODEM_TYPE_CALL_SERVICE,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_STATIC_STRINGS));
-
- g_object_class_install_property(
- object_class, PROP_CALL_INSTANCE,
- g_param_spec_object("call-instance",
- "ModemCall Object",
- "ModemCall instance for this channel",
- MODEM_TYPE_CALL,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT |
- G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_CALL_SERVICE,
+ g_param_spec_pointer ("call-service",
+ "ModemCallService Object",
+ "ModemCallService for this channel",
+ /* MODEM_TYPE_CALL_SERVICE, */
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_CALL_INSTANCE,
+ g_param_spec_pointer ("call-instance",
+ "ModemCall Object",
+ "ModemCall instance for this channel",
+ /* MODEM_TYPE_CALL, */
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
g_object_class_install_property(
object_class, PROP_TONES,
@@ -696,7 +698,7 @@ ring_media_channel_close(RingMediaChannel *self)
RingMediaChannelClass *cls = RING_MEDIA_CHANNEL_GET_CLASS(self);
gboolean ready = TRUE;
- if (priv->closed)
+ if (priv->closed || priv->closing)
return;
priv->closing = TRUE;
@@ -1690,7 +1692,7 @@ void request_hold(TpSvcChannelInterfaceHold *iface,
modem_call_get_state_name(priv->state));
}
else {
- g_object_ref(self);
+ g_object_ref (self);
priv->hold.requested = hold;
priv->control = modem_call_request_hold(instance, hold, response_to_hold, self);
ring_media_channel_queue_request(self, priv->control);
@@ -2042,16 +2044,17 @@ ring_media_channel_send_dialstring(RingMediaChannel *self,
/* Signals from ModemCall */
static void
-ring_media_channel_set_call_instance(RingMediaChannel *self,
- ModemCall *ci)
+ring_media_channel_set_call_instance (RingMediaChannel *self,
+ ModemCall *ci)
{
RingMediaChannelPrivate *priv = self->priv;
+ ModemCall *old = self->call_instance;
- if (ci == self->call_instance)
+ if (ci == old)
return;
if (ci) {
- modem_call_set_handler(self->call_instance = ci, self);
+ modem_call_set_handler(self->call_instance = MODEM_CALL (ci), self);
#define CONNECT(n, f) \
g_signal_connect(ci, n, G_CALLBACK(on_modem_call_ ## f), self)
@@ -2082,7 +2085,12 @@ ring_media_channel_set_call_instance(RingMediaChannel *self,
}
RING_MEDIA_CHANNEL_GET_CLASS(self)->set_call_instance(self, ci);
+
+ if (old)
+ g_object_unref (old);
self->call_instance = ci;
+ if (ci)
+ g_object_ref (ci);
if (ci == NULL && !priv->playing)
ring_media_channel_close(self);
@@ -2315,6 +2323,10 @@ ring_media_channel_play_tone(RingMediaChannel *self,
if (priv->closing)
return;
+ if (1)
+ /* XXX - no tones so far */
+ return;
+
if ((tone >= 0 && !modem_tones_is_playing(priv->tones, 0))
|| priv->playing) {
priv->playing = modem_tones_start_full(priv->tones,
diff --git a/src/ring-media-manager.c b/src/ring-media-manager.c
index 6dec3d3..d3e2911 100644
--- a/src/ring-media-manager.c
+++ b/src/ring-media-manager.c
@@ -76,6 +76,7 @@ enum
{
PROP_NONE,
PROP_CONNECTION,
+ PROP_CALL_SERVICE,
PROP_ANON_MODES,
PROP_CAPABILITY_FLAGS,
N_PROPS
@@ -90,13 +91,10 @@ typedef enum
/* ---------------------------------------------------------------------- */
-static void on_connection_status_changed(RingConnection *connection,
- TpConnectionStatus status,
- TpConnectionStatusReason reason,
- RingMediaManager *self);
+static void ring_media_manager_set_call_service (RingMediaManager *self,
+ ModemCallService *service);
-static void on_modem_call_service_connected(ModemCallService *call_service,
- RingMediaManager *self);
+static void ring_media_manager_connected (RingMediaManager *self);
static void ring_media_manager_disconnect(RingMediaManager *self);
@@ -126,9 +124,9 @@ static void on_media_channel_closed(GObject *chan, RingMediaManager *self);
static gpointer ring_media_manager_lookup_by_peer(RingMediaManager *self,
TpHandle handle);
-static void on_modem_call_emergency_numbers_changed(ModemCallService *,
- char const * const *numbers,
- RingMediaManager *self);
+static void on_modem_call_emergency_numbers_changed (ModemCallService *call_service,
+ GParamSpec *dummy,
+ RingMediaManager *self);
static void on_modem_call_incoming(ModemCallService *call_service,
ModemCall *ci,
@@ -150,6 +148,11 @@ static void on_modem_call_user_connection(ModemCallService *call_service,
gboolean active,
RingMediaManager *self);
+static void on_modem_call_removed (ModemCallService *, ModemCall *,
+ RingMediaManager *);
+
+#define METHOD(i, x) (i ## _ ## x)
+
/* ---------------------------------------------------------------------- */
/* GObject interface */
@@ -164,13 +167,11 @@ struct _RingMediaManagerPrivate
RingMediaChannel *conference; /* Special channel for conference */
- TpConnectionStatus status, cstatus;
-
ModemCallService *call_service;
ModemTones *tones;
struct {
- gulong status_changed, connected, incoming, created;
+ gulong incoming, created, removed;
gulong emergency_numbers, joined, user_connection;
} signals;
@@ -186,26 +187,14 @@ ring_media_manager_init(RingMediaManager *self)
self->priv->channels = g_hash_table_new_full(g_str_hash, g_str_equal,
NULL, g_object_unref);
- self->priv->status = TP_INTERNAL_CONNECTION_STATUS_NEW;
- self->priv->cstatus = TP_INTERNAL_CONNECTION_STATUS_NEW;
-
self->priv->tones = g_object_new(MODEM_TYPE_TONES, NULL);
}
static void
ring_media_manager_constructed(GObject *object)
{
- RingMediaManager *self = RING_MEDIA_MANAGER(object);
- RingMediaManagerPrivate *priv = self->priv;
-
if (G_OBJECT_CLASS(ring_media_manager_parent_class)->constructed)
G_OBJECT_CLASS(ring_media_manager_parent_class)->constructed(object);
-
- priv->call_service = g_object_new(MODEM_TYPE_CALL_SERVICE, NULL);
-
- priv->signals.status_changed =
- g_signal_connect(priv->connection, "status-changed",
- G_CALLBACK(on_connection_status_changed), self);
}
static void
@@ -218,10 +207,8 @@ ring_media_manager_dispose(GObject *object)
return;
priv->dispose_has_run = TRUE;
- ring_media_manager_disconnect(self);
-
- g_object_unref(G_OBJECT(priv->call_service));
- priv->call_service = NULL;
+ g_object_set (object, "call-service", NULL, NULL);
+ g_object_run_dispose (G_OBJECT (priv->tones));
((GObjectClass *) ring_media_manager_parent_class)->dispose(object);
}
@@ -229,6 +216,11 @@ ring_media_manager_dispose(GObject *object)
static void
ring_media_manager_finalize(GObject *object)
{
+ RingMediaManager *self = RING_MEDIA_MANAGER(object);
+ RingMediaManagerPrivate *priv = self->priv;
+
+ g_object_unref (priv->tones);
+ g_hash_table_destroy (priv->channels);
}
static void
@@ -244,6 +236,9 @@ ring_media_manager_get_property(GObject *object,
case PROP_CONNECTION:
g_value_set_object(value, priv->connection);
break;
+ case PROP_CALL_SERVICE:
+ g_value_set_pointer (value, priv->call_service);
+ break;
case PROP_ANON_MODES:
g_value_set_uint(value, priv->anon_modes);
break;
@@ -272,6 +267,10 @@ ring_media_manager_set_property(GObject *object,
priv->connection = g_value_get_object(value);
break;
+ case PROP_CALL_SERVICE:
+ ring_media_manager_set_call_service (self, g_value_get_pointer (value));
+ break;
+
case PROP_ANON_MODES:
priv->anon_modes = g_value_get_uint(value);
break;
@@ -300,8 +299,16 @@ ring_media_manager_class_init(RingMediaManagerClass *klass)
g_object_class_install_property(object_class, PROP_CONNECTION,
ring_param_spec_connection());
+
+ g_object_class_install_property (object_class, PROP_CALL_SERVICE,
+ g_param_spec_pointer ("call-service",
+ "Call Manager Object",
+ "oFono Call Manager",
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property(object_class, PROP_ANON_MODES,
ring_param_spec_anon_modes());
+
g_object_class_install_property(object_class, PROP_CAPABILITY_FLAGS,
ring_param_spec_type_specific_capability_flags(G_PARAM_CONSTRUCT,
RING_MEDIA_CHANNEL_CAPABILITY_FLAGS));
@@ -310,92 +317,50 @@ ring_media_manager_class_init(RingMediaManagerClass *klass)
/* ---------------------------------------------------------------------- */
/* RingMediaManager interface */
-gboolean
-ring_media_manager_start_connecting(RingMediaManager *self,
- char const *modem_path, GError **return_error)
+static void
+ring_media_manager_set_call_service (RingMediaManager *self,
+ ModemCallService *service)
{
- ModemCallService *service;
RingMediaManagerPrivate *priv = self->priv;
- service = priv->call_service;
-
- if (!service) {
- g_set_error(return_error, TP_ERRORS, TP_ERROR_NOT_AVAILABLE,
- "No Call service");
- return FALSE;
- }
-
- if (priv->status != TP_INTERNAL_CONNECTION_STATUS_NEW)
- return TRUE;
+ if (priv->call_service)
+ {
+ ring_media_manager_disconnect (self);
+ }
- priv->status = TP_CONNECTION_STATUS_CONNECTING;
+ if (service)
+ {
+ priv->call_service = g_object_ref (MODEM_CALL_SERVICE (service));
+ ring_media_manager_connected (self);
+ }
+}
- priv->signals.connected =
- g_signal_connect(service, "connected",
- G_CALLBACK(on_modem_call_service_connected), self);
+static void
+ring_media_manager_connected (RingMediaManager *self)
+{
+ RingMediaManagerPrivate *priv = self->priv;
priv->signals.incoming =
- g_signal_connect(service, "incoming",
+ g_signal_connect(priv->call_service, "incoming",
G_CALLBACK(on_modem_call_incoming), self);
priv->signals.created =
- g_signal_connect(service, "created",
+ g_signal_connect(priv->call_service, "created",
G_CALLBACK(on_modem_call_created), self);
+ priv->signals.removed =
+ g_signal_connect(priv->call_service, "removed",
+ G_CALLBACK(on_modem_call_removed), self);
+
priv->signals.user_connection =
- g_signal_connect(service, "user-connection",
+ g_signal_connect(priv->call_service, "user-connection",
G_CALLBACK(on_modem_call_user_connection), self);
priv->signals.emergency_numbers =
- g_signal_connect(service, "emergency-numbers-changed",
+ g_signal_connect(priv->call_service, "notify::emergency-numbers",
G_CALLBACK(on_modem_call_emergency_numbers_changed), self);
- return modem_call_service_connect(service, modem_path);
-}
-
-static void
-on_connection_status_changed(RingConnection *connection,
- TpConnectionStatus status,
- TpConnectionStatusReason reason,
- RingMediaManager *self)
-{
- RingMediaManagerPrivate *priv = self->priv;
-
- priv->cstatus = status;
-
- switch (status) {
- case TP_CONNECTION_STATUS_CONNECTING:
- break;
-
- case TP_CONNECTION_STATUS_CONNECTED:
- if (priv->call_service)
- modem_call_service_resume(priv->call_service);
- break;
-
- case TP_CONNECTION_STATUS_DISCONNECTED:
- ring_media_manager_disconnect(self);
- break;
- }
-}
-
-static void
-on_modem_call_service_connected(ModemCallService *call_service,
- RingMediaManager *self)
-{
- if (modem_call_service_is_connected(call_service))
- self->priv->status = TP_CONNECTION_STATUS_CONNECTED;
- else
- self->priv->status = TP_CONNECTION_STATUS_DISCONNECTED;
-
- ring_connection_check_status(self->priv->connection);
-}
-
-static void
-ring_signal_disconnect(gpointer object, gulong id[1])
-{
- if (*id && object && g_signal_handler_is_connected(object, *id))
- g_signal_handler_disconnect(object, *id);
- *id = 0;
+ modem_call_service_resume (priv->call_service);
}
/** Disconnect from call service */
@@ -404,33 +369,34 @@ ring_media_manager_disconnect(RingMediaManager *self)
{
RingMediaManagerPrivate *priv = self->priv;
ModemCallConference *mcc;
+ GHashTableIter iter[1];
+ GObject *channel;
- ring_signal_disconnect(priv->connection, &priv->signals.status_changed);
- if (priv->call_service) {
- ring_signal_disconnect(priv->call_service, &priv->signals.connected);
- ring_signal_disconnect(priv->call_service, &priv->signals.incoming);
- ring_signal_disconnect(priv->call_service, &priv->signals.created);
- ring_signal_disconnect(priv->call_service, &priv->signals.user_connection);
+ ring_signal_disconnect (priv->call_service, &priv->signals.incoming);
+ ring_signal_disconnect (priv->call_service, &priv->signals.created);
+ ring_signal_disconnect (priv->call_service, &priv->signals.user_connection);
+ ring_signal_disconnect (priv->call_service, &priv->signals.emergency_numbers);
- mcc = modem_call_service_get_conference(priv->call_service);
- ring_signal_disconnect(mcc, &priv->signals.joined);
+ mcc = modem_call_service_get_conference (priv->call_service);
+ ring_signal_disconnect (mcc, &priv->signals.joined);
- modem_call_service_disconnect(priv->call_service);
- }
+ for (g_hash_table_iter_init (iter, priv->channels);
+ g_hash_table_iter_next (iter, NULL, (gpointer)&channel);)
+ {
+ g_object_run_dispose (channel);
+ }
- if (self->priv->channels != NULL) {
- GHashTable *tmp = self->priv->channels;
- self->priv->channels = NULL;
- g_hash_table_destroy(tmp);
- }
+ g_hash_table_remove_all (priv->channels);
- priv->status = TP_CONNECTION_STATUS_DISCONNECTED;
+ if (priv->call_service)
+ g_object_unref (priv->call_service);
+ priv->call_service = NULL;
}
-TpConnectionStatus
-ring_media_manager_get_status(RingMediaManager *self)
+static gboolean
+ring_media_manager_is_connected (RingMediaManager *self)
{
- return self->priv->status;
+ return RING_IS_MEDIA_MANAGER (self) && self->priv->call_service != NULL;
}
/* ---------------------------------------------------------------------- */
@@ -439,30 +405,39 @@ RingEmergencyServiceInfoList *
ring_media_manager_emergency_services(RingMediaManager *self)
{
RingMediaManagerPrivate *priv = RING_MEDIA_MANAGER(self)->priv;
- char const * const * numbers;
+ char const * const * numbers = NULL;
- g_assert(priv->call_service != NULL);
+ /*
+ * If the list is queried without valid call_service,
+ * default emergency number list is returned
+ */
- numbers = modem_call_get_emergency_numbers(priv->call_service);
- return ring_emergency_service_info_list_default(numbers);
+ numbers = modem_call_get_emergency_numbers (priv->call_service);
+
+ return ring_emergency_service_info_list_default ((char **)numbers);
}
static void
-on_modem_call_emergency_numbers_changed(ModemCallService *call_service,
- char const * const *numbers,
- RingMediaManager *self)
+on_modem_call_emergency_numbers_changed (ModemCallService *call_service,
+ GParamSpec *dummy,
+ RingMediaManager *self)
{
RingMediaManagerPrivate *priv = RING_MEDIA_MANAGER(self)->priv;
TpBaseConnection *base = TP_BASE_CONNECTION(priv->connection);
+ gchar **numbers;
RingEmergencyServiceInfoList *services;
- services = ring_emergency_service_info_list_default(numbers);
+ if (base->status != TP_CONNECTION_STATUS_CONNECTED)
+ return;
- if (base->status == TP_CONNECTION_STATUS_CONNECTED)
- tp_svc_connection_interface_service_point_emit_service_points_changed(
- priv->connection, services);
+ g_object_get (call_service, "emergency-numbers", &numbers, NULL);
+ services = ring_emergency_service_info_list_default (numbers);
+
+ METHOD (tp_svc_connection_interface_service_point,
+ emit_service_points_changed) (priv->connection, services);
ring_emergency_service_info_list_free(services);
+ g_strfreev (numbers);
}
/* ---------------------------------------------------------------------- */
@@ -481,7 +456,7 @@ ring_media_manager_add_capabilities(RingMediaManager *self,
if (id == NULL)
return;
- if (priv->status != TP_CONNECTION_STATUS_CONNECTED)
+ if (!ring_media_manager_is_connected (self))
return;
/* XXX - should check if we are in emergency call mode only status */
@@ -644,7 +619,7 @@ ring_media_manager_foreach_channel_class(TpChannelManager *_self,
RingMediaManager *self = RING_MEDIA_MANAGER(_self);
/* If we're not connected, calls aren't supported. */
- if (self->priv->status != TP_CONNECTION_STATUS_CONNECTED)
+ if (self->priv->call_service == NULL)
return;
func(_self,
@@ -740,7 +715,7 @@ ring_media_requestotron(RingMediaManager *self,
TpHandle handle;
/* If we're not connected, calls aren't supported. */
- if (self->priv->status != TP_CONNECTION_STATUS_CONNECTED)
+ if (self->priv->call_service == NULL)
return FALSE;
handle = tp_asv_get_uint32 (properties,
@@ -1113,7 +1088,7 @@ on_modem_call_incoming(ModemCallService *call_service,
TpHandle handle;
GError *error = NULL;
- if (priv->status != TP_CONNECTION_STATUS_CONNECTED)
+ if (!ring_media_manager_is_connected (self))
return;
channel = modem_call_get_handler(modem_call);
@@ -1178,7 +1153,7 @@ on_modem_call_created(ModemCallService *call_service,
char const *sos;
GError *error = NULL;
- if (priv->status != TP_CONNECTION_STATUS_CONNECTED)
+ if (!ring_media_manager_is_connected (self))
return;
channel = modem_call_get_handler(modem_call);
@@ -1295,6 +1270,17 @@ on_modem_call_conference_joined(ModemCallConference *mcc,
}
#endif
+static void
+on_modem_call_removed (ModemCallService *call_service,
+ ModemCall *modem_call,
+ RingMediaManager *self)
+{
+ RingCallChannel *channel;
+
+ channel = modem_call_get_handler (modem_call);
+ if (channel)
+ g_object_set (channel, "call-instance", NULL, NULL);
+}
/* ---------------------------------------------------------------------- */
static void
diff --git a/src/ring-media-manager.h b/src/ring-media-manager.h
index 2e4c2c4..2b1b5fd 100644
--- a/src/ring-media-manager.h
+++ b/src/ring-media-manager.h
@@ -64,12 +64,6 @@ GType ring_media_manager_get_type(void);
#define RING_MEDIA_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), \
RING_TYPE_MEDIA_MANAGER, RingMediaManagerClass))
-gboolean ring_media_manager_start_connecting(RingMediaManager *,
- char const *modem_path,
- GError **return_error);
-
-TpConnectionStatus ring_media_manager_get_status(RingMediaManager *);
-
RingMediaChannel *ring_media_manager_lookup(RingMediaManager *self,
char const *object_path);