aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy
diff options
context:
space:
mode:
Diffstat (limited to 'libempathy')
-rw-r--r--libempathy/empathy-camera-monitor.c164
-rw-r--r--libempathy/empathy-camera-monitor.h13
-rw-r--r--libempathy/empathy-gsettings.h2
-rw-r--r--libempathy/empathy-message.c6
4 files changed, 158 insertions, 27 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 5a9fa95f8..96c869da4 100644
--- a/libempathy/empathy-gsettings.h
+++ b/libempathy/empathy-gsettings.h
@@ -53,6 +53,8 @@ G_BEGIN_DECLS
#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"
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);