diff options
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/empathy-camera-monitor.c | 164 | ||||
-rw-r--r-- | libempathy/empathy-camera-monitor.h | 13 | ||||
-rw-r--r-- | libempathy/empathy-gsettings.h | 5 | ||||
-rw-r--r-- | libempathy/empathy-message.c | 6 | ||||
-rw-r--r-- | libempathy/empathy-server-sasl-handler.c | 2 | ||||
-rw-r--r-- | libempathy/empathy-tp-contact-list.c | 14 |
6 files changed, 175 insertions, 29 deletions
diff --git a/libempathy/empathy-camera-monitor.c b/libempathy/empathy-camera-monitor.c index 3d80d40b7..3b5221eb8 100644 --- a/libempathy/empathy-camera-monitor.c +++ b/libempathy/empathy-camera-monitor.c @@ -34,6 +34,7 @@ struct _EmpathyCameraMonitorPrivate { CheeseCameraDeviceMonitor *cheese_monitor; + GQueue *cameras; gint num_cameras; }; @@ -43,10 +44,69 @@ enum PROP_AVAILABLE, }; +enum +{ + CAMERA_ADDED, + CAMERA_REMOVED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + G_DEFINE_TYPE (EmpathyCameraMonitor, empathy_camera_monitor, G_TYPE_OBJECT); static EmpathyCameraMonitor *manager_singleton = NULL; +static EmpathyCamera * +empathy_camera_new (const gchar *id, + const gchar *device, + const gchar *name) +{ + EmpathyCamera *camera = g_slice_new (EmpathyCamera); + + camera->id = g_strdup (id); + camera->device = g_strdup (device); + camera->name = g_strdup (name); + + return camera; +} + +static EmpathyCamera * +empathy_camera_copy (EmpathyCamera *camera) +{ + return empathy_camera_new (camera->id, camera->device, camera->name); +} + +static void +empathy_camera_free (EmpathyCamera *camera) +{ + g_free (camera->id); + g_free (camera->device); + g_free (camera->name); + + g_slice_free (EmpathyCamera, camera); +} + +G_DEFINE_BOXED_TYPE (EmpathyCamera, empathy_camera, + empathy_camera_copy, empathy_camera_free) + +static gint +empathy_camera_find (gconstpointer a, + gconstpointer b) +{ + const EmpathyCamera *camera = a; + const gchar *id = b; + + return g_strcmp0 (camera->id, id); +} + +static void +empathy_camera_monitor_free_camera_foreach (gpointer data, + gpointer user_data) +{ + empathy_camera_free (data); +} + static void on_camera_added (CheeseCameraDeviceMonitor *device, gchar *id, @@ -55,10 +115,19 @@ on_camera_added (CheeseCameraDeviceMonitor *device, gint api_version, EmpathyCameraMonitor *self) { + EmpathyCamera *camera = empathy_camera_new (id, filename, product_name); + + if (self->priv->cameras == NULL) + return; + + g_queue_push_tail (self->priv->cameras, camera); + self->priv->num_cameras++; if (self->priv->num_cameras == 1) g_object_notify (G_OBJECT (self), "available"); + + g_signal_emit (self, signals[CAMERA_ADDED], 0, camera); } static void @@ -66,10 +135,37 @@ on_camera_removed (CheeseCameraDeviceMonitor *device, gchar *id, EmpathyCameraMonitor *self) { + EmpathyCamera *camera; + GList *l; + + if (self->priv->cameras == NULL) + return; + + l = g_queue_find_custom (self->priv->cameras, id, empathy_camera_find); + + g_return_if_fail (l != NULL); + + camera = l->data; + + g_queue_delete_link (self->priv->cameras, l); + self->priv->num_cameras--; if (self->priv->num_cameras == 0) g_object_notify (G_OBJECT (self), "available"); + + g_signal_emit (self, signals[CAMERA_REMOVED], 0, camera); + + empathy_camera_free (camera); +} + +const GList * +empathy_camera_monitor_get_cameras (EmpathyCameraMonitor *self) +{ + if (self->priv->cameras != NULL) + return self->priv->cameras->head; + else + return NULL; } static void @@ -98,31 +194,11 @@ empathy_camera_monitor_dispose (GObject *object) tp_clear_object (&self->priv->cheese_monitor); - G_OBJECT_CLASS (empathy_camera_monitor_parent_class)->dispose (object); -} - -static GObject * -empathy_camera_monitor_constructor (GType type, - guint n_props, - GObjectConstructParam *props) -{ - GObject *retval; - - if (manager_singleton) - { - retval = g_object_ref (manager_singleton); - } - else - { - retval = - G_OBJECT_CLASS (empathy_camera_monitor_parent_class)-> - constructor (type, n_props, props); + g_queue_foreach (self->priv->cameras, + empathy_camera_monitor_free_camera_foreach, NULL); + tp_clear_pointer (&self->priv->cameras, g_queue_free); - manager_singleton = EMPATHY_CAMERA_MONITOR (retval); - g_object_add_weak_pointer (retval, (gpointer) & manager_singleton); - } - - return retval; + G_OBJECT_CLASS (empathy_camera_monitor_parent_class)->dispose (object); } static void @@ -141,7 +217,6 @@ empathy_camera_monitor_class_init (EmpathyCameraMonitorClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->dispose = empathy_camera_monitor_dispose; - object_class->constructor = empathy_camera_monitor_constructor; object_class->constructed = empathy_camera_monitor_constructed; object_class->get_property = empathy_camera_monitor_get_property; @@ -149,6 +224,20 @@ empathy_camera_monitor_class_init (EmpathyCameraMonitorClass *klass) g_param_spec_boolean ("available", "Available", "Camera available", TRUE, G_PARAM_READABLE)); + signals[CAMERA_ADDED] = + g_signal_new ("added", G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + 0, NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, EMPATHY_TYPE_CAMERA); + + signals[CAMERA_REMOVED] = + g_signal_new ("removed", G_OBJECT_CLASS_TYPE (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + 0, NULL, NULL, + g_cclosure_marshal_VOID__BOXED, + G_TYPE_NONE, 1, EMPATHY_TYPE_CAMERA); + g_type_class_add_private (object_class, sizeof (EmpathyCameraMonitorPrivate)); } @@ -159,6 +248,8 @@ empathy_camera_monitor_init (EmpathyCameraMonitor *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_CAMERA_MONITOR, EmpathyCameraMonitorPrivate); + self->priv->cameras = g_queue_new (); + self->priv->cheese_monitor = cheese_camera_device_monitor_new (); g_signal_connect (self->priv->cheese_monitor, "added", @@ -175,7 +266,28 @@ empathy_camera_monitor_init (EmpathyCameraMonitor *self) EmpathyCameraMonitor * empathy_camera_monitor_dup_singleton (void) { - return g_object_new (EMPATHY_TYPE_CAMERA_MONITOR, NULL); + GObject *retval; + + if (manager_singleton) + { + retval = g_object_ref (manager_singleton); + } + else + { + retval = g_object_new (EMPATHY_TYPE_CAMERA_MONITOR, NULL); + + manager_singleton = EMPATHY_CAMERA_MONITOR (retval); + g_object_add_weak_pointer (retval, (gpointer) &manager_singleton); + } + + return EMPATHY_CAMERA_MONITOR (retval); +} + +EmpathyCameraMonitor * +empathy_camera_monitor_new (void) +{ + return EMPATHY_CAMERA_MONITOR ( + g_object_new (EMPATHY_TYPE_CAMERA_MONITOR, NULL)); } gboolean empathy_camera_monitor_get_available (EmpathyCameraMonitor *self) diff --git a/libempathy/empathy-camera-monitor.h b/libempathy/empathy-camera-monitor.h index d2d9bb89e..f627f7b58 100644 --- a/libempathy/empathy-camera-monitor.h +++ b/libempathy/empathy-camera-monitor.h @@ -46,11 +46,24 @@ struct _EmpathyCameraMonitorClass GObjectClass parent_class; }; +typedef struct +{ + gchar *id; + gchar *device; + gchar *name; +} EmpathyCamera; + +#define EMPATHY_TYPE_CAMERA (empathy_camera_get_type ()) +GType empathy_camera_get_type (void) G_GNUC_CONST; + GType empathy_camera_monitor_get_type (void) G_GNUC_CONST; EmpathyCameraMonitor *empathy_camera_monitor_dup_singleton (void); +EmpathyCameraMonitor *empathy_camera_monitor_new (void); gboolean empathy_camera_monitor_get_available (EmpathyCameraMonitor *self); +const GList * empathy_camera_monitor_get_cameras (EmpathyCameraMonitor *self); + G_END_DECLS #endif /* __EMPATHY_CAMERA_MONITOR_H__ */ diff --git a/libempathy/empathy-gsettings.h b/libempathy/empathy-gsettings.h index 9c7efb35b..d326981d4 100644 --- a/libempathy/empathy-gsettings.h +++ b/libempathy/empathy-gsettings.h @@ -51,6 +51,11 @@ G_BEGIN_DECLS #define EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN "sounds-contact-login" #define EMPATHY_PREFS_SOUNDS_CONTACT_LOGOUT "sounds-contact-logout" +#define EMPATHY_PREFS_CALL_SCHEMA EMPATHY_PREFS_SCHEMA ".call" +#define EMPATHY_PREFS_CALL_SOUND_VOLUME "volume" +#define EMPATHY_PREFS_CALL_CAMERA_DEVICE "camera-device" +#define EMPATHY_PREFS_CALL_ECHO_CANCELLATION "echo-cancellation" + #define EMPATHY_PREFS_CHAT_SCHEMA EMPATHY_PREFS_SCHEMA ".conversation" #define EMPATHY_PREFS_CHAT_SHOW_SMILEYS "graphical-smileys" #define EMPATHY_PREFS_CHAT_SHOW_CONTACTS_IN_ROOMS "show-contacts-in-rooms" diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c index 1c18cf53c..06b3308c5 100644 --- a/libempathy/empathy-message.c +++ b/libempathy/empathy-message.c @@ -787,6 +787,7 @@ empathy_message_new_from_tp_message (TpMessage *tp_msg, gint64 timestamp; gint64 original_timestamp; const GHashTable *part = tp_message_peek (tp_msg, 0); + gboolean is_backlog; g_return_val_if_fail (TP_IS_MESSAGE (tp_msg), NULL); @@ -799,6 +800,9 @@ empathy_message_new_from_tp_message (TpMessage *tp_msg, original_timestamp = tp_asv_get_int64 (part, "original-message-received", NULL); + is_backlog = (flags & TP_CHANNEL_TEXT_MESSAGE_FLAG_SCROLLBACK) == + TP_CHANNEL_TEXT_MESSAGE_FLAG_SCROLLBACK; + message = g_object_new (EMPATHY_TYPE_MESSAGE, "body", body, "token", tp_message_get_token (tp_msg), @@ -807,7 +811,7 @@ empathy_message_new_from_tp_message (TpMessage *tp_msg, "timestamp", timestamp, "original-timestamp", original_timestamp, "flags", flags, - "is-backlog", flags & TP_CHANNEL_TEXT_MESSAGE_FLAG_SCROLLBACK, + "is-backlog", is_backlog, "incoming", incoming, "tp-message", tp_msg, NULL); diff --git a/libempathy/empathy-server-sasl-handler.c b/libempathy/empathy-server-sasl-handler.c index 8c7fe8847..b06d7bf4c 100644 --- a/libempathy/empathy-server-sasl-handler.c +++ b/libempathy/empathy-server-sasl-handler.c @@ -288,7 +288,7 @@ empathy_server_sasl_handler_class_init (EmpathyServerSASLHandlerClass *klass) oclass->get_property = empathy_server_sasl_handler_get_property; oclass->set_property = empathy_server_sasl_handler_set_property; oclass->dispose = empathy_server_sasl_handler_dispose; - oclass->dispose = empathy_server_sasl_handler_finalize; + oclass->finalize = empathy_server_sasl_handler_finalize; g_type_class_add_private (klass, sizeof (EmpathyServerSASLHandlerPriv)); diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c index d947e7284..11990a9a2 100644 --- a/libempathy/empathy-tp-contact-list.c +++ b/libempathy/empathy-tp-contact-list.c @@ -821,7 +821,19 @@ list_get_contact_blocking_capabilities_cb (TpProxy *conn, EmpathyTpContactListPriv *priv = GET_PRIV (list); TpContactBlockingCapabilities caps; - g_return_if_fail (G_VALUE_HOLDS_UINT (value)); + if (in_error != NULL) { + DEBUG ("Get(Blocking, ContactBlockingCapabilities) on %s failed: %s", + tp_proxy_get_object_path (conn), + in_error->message); + return; + } + + if (!G_VALUE_HOLDS_UINT (value)) { + DEBUG ("Get(Blocking, ContactBlockingCapabilities) on %s returned a %s, not a uint", + tp_proxy_get_object_path (conn), + G_VALUE_TYPE_NAME (value)); + return; + } caps = g_value_get_uint (value); |