#include "empathy-avatar-chooser.h"
#include <glib/gi18n-lib.h>
+#include <tp-account-widgets/tpaw-camera-monitor.h>
#ifdef HAVE_CHEESE
#include <cheese-avatar-chooser.h>
#endif /* HAVE_CHEESE */
-#include "empathy-camera-monitor.h"
#include "empathy-gsettings.h"
#include "empathy-images.h"
#include "empathy-ui-utils.h"
GtkFileFilter *filter;
#ifdef HAVE_CHEESE
GtkWidget *picture_button;
- EmpathyCameraMonitor *monitor;
+ TpawCameraMonitor *monitor;
#endif
if (self->priv->chooser_dialog != NULL)
_("Take a picture..."), EMPATHY_AVATAR_CHOOSER_RESPONSE_WEBCAM);
/* Button is sensitive only if there is one camera connected */
- monitor = empathy_camera_monitor_dup_singleton ();
+ monitor = tpaw_camera_monitor_dup_singleton ();
g_object_set_data_full (G_OBJECT (picture_button),
"monitor", monitor, g_object_unref);
#include "empathy-individual-menu.h"
#include <glib/gi18n-lib.h>
+#include <tp-account-widgets/tpaw-camera-monitor.h>
#include "empathy-account-selector-dialog.h"
#include "empathy-call-utils.h"
-#include "empathy-camera-monitor.h"
#include "empathy-chatroom-manager.h"
#include "empathy-gtk-enum-types.h"
#include "empathy-images.h"
{
GtkWidget *item;
GtkWidget *image;
- EmpathyCameraMonitor *monitor;
+ TpawCameraMonitor *monitor;
g_return_val_if_fail (FOLKS_IS_INDIVIDUAL (individual), NULL);
/* Only follow available cameras if the contact can do Video calls */
if (gtk_widget_get_sensitive (item))
{
- monitor = empathy_camera_monitor_dup_singleton ();
+ monitor = tpaw_camera_monitor_dup_singleton ();
g_object_set_data_full (G_OBJECT (item),
"monitor", monitor, g_object_unref);
g_object_bind_property (monitor, "available", item, "sensitive",
#include <glib/gi18n-lib.h>
#include <telepathy-glib/proxy-subclass.h>
#include <tp-account-widgets/tpaw-builder.h>
+#include <tp-account-widgets/tpaw-camera-monitor.h>
#include "action-chain-internal.h"
#include "empathy-account-chooser.h"
#include "empathy-call-utils.h"
-#include "empathy-camera-monitor.h"
#include "empathy-geometry.h"
#include "empathy-gsettings.h"
#include "empathy-images.h"
EmpathyContact *selected_contact;
EmpathyContact *events_contact;
- EmpathyCameraMonitor *camera_monitor;
+ TpawCameraMonitor *camera_monitor;
GBinding *button_video_binding;
/* Used to cancel logger calls when no longer needed */
self->priv->chain = _tpl_action_chain_new_async (NULL, NULL, NULL);
- self->priv->camera_monitor = empathy_camera_monitor_dup_singleton ();
+ self->priv->camera_monitor = tpaw_camera_monitor_dup_singleton ();
self->priv->log_manager = tpl_log_manager_dup_singleton ();
#include "empathy-new-call-dialog.h"
#include <glib/gi18n-lib.h>
+#include <tp-account-widgets/tpaw-camera-monitor.h>
#include "empathy-call-utils.h"
-#include "empathy-camera-monitor.h"
#include "empathy-contact-chooser.h"
#include "empathy-images.h"
#include "empathy-ui-utils.h"
GtkWidget *button_audio;
GtkWidget *button_video;
- EmpathyCameraMonitor *monitor;
+ TpawCameraMonitor *monitor;
};
/* Re-use the accept and ok Gtk response so we are sure they won't be used
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
EMPATHY_TYPE_NEW_CALL_DIALOG, EmpathyNewCallDialogPriv);
- self->priv->monitor = empathy_camera_monitor_dup_singleton ();
+ self->priv->monitor = tpaw_camera_monitor_dup_singleton ();
content = gtk_dialog_get_content_area (GTK_DIALOG (self));
$(GEOCODE_CFLAGS) \
$(NETWORK_MANAGER_CFLAGS) \
$(CONNMAN_CFLAGS) \
- $(UDEV_CFLAGS) \
$(GOA_CFLAGS) \
$(UOA_CFLAGS) \
$(WARN_CFLAGS) \
libempathy_headers = \
action-chain-internal.h \
empathy-auth-factory.h \
- empathy-camera-monitor.h \
empathy-chatroom-manager.h \
empathy-chatroom.h \
empathy-client-factory.h \
$(libempathy_headers) \
action-chain.c \
empathy-auth-factory.c \
- empathy-camera-monitor.c \
empathy-chatroom-manager.c \
empathy-chatroom.c \
empathy-client-factory.c \
+++ /dev/null
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Authors: Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
- */
-
-#include "config.h"
-#include "empathy-camera-monitor.h"
-
-#include <tp-account-widgets/cheese-camera-device-monitor.h>
-
-#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include "empathy-debug.h"
-
-struct _EmpathyCameraMonitorPrivate
-{
- TpawCameraDeviceMonitor *empathy_monitor;
- GQueue *cameras;
- gint num_cameras;
-};
-
-enum
-{
- PROP_0,
- 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 (TpawCameraDeviceMonitor *device,
- gchar *id,
- gchar *filename,
- gchar *product_name,
- gint api_version,
- EmpathyCameraMonitor *self)
-{
- EmpathyCamera *camera;
-
- if (self->priv->cameras == NULL)
- return;
-
- camera = empathy_camera_new (id, filename, product_name);
-
- 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
-on_camera_removed (TpawCameraDeviceMonitor *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
-empathy_camera_monitor_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EmpathyCameraMonitor *self = (EmpathyCameraMonitor *) object;
-
- switch (prop_id)
- {
- case PROP_AVAILABLE:
- g_value_set_boolean (value, self->priv->num_cameras > 0);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-empathy_camera_monitor_dispose (GObject *object)
-{
- EmpathyCameraMonitor *self = EMPATHY_CAMERA_MONITOR (object);
-
- tp_clear_object (&self->priv->empathy_monitor);
-
- g_queue_foreach (self->priv->cameras,
- empathy_camera_monitor_free_camera_foreach, NULL);
- tp_clear_pointer (&self->priv->cameras, g_queue_free);
-
- G_OBJECT_CLASS (empathy_camera_monitor_parent_class)->dispose (object);
-}
-
-static void
-empathy_camera_monitor_constructed (GObject *object)
-{
- EmpathyCameraMonitor *self = (EmpathyCameraMonitor *) object;
-
- G_OBJECT_CLASS (empathy_camera_monitor_parent_class)->constructed (object);
-
- tpaw_camera_device_monitor_coldplug (self->priv->empathy_monitor);
-}
-
-static void
-empathy_camera_monitor_class_init (EmpathyCameraMonitorClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = empathy_camera_monitor_dispose;
- object_class->constructed = empathy_camera_monitor_constructed;
- object_class->get_property = empathy_camera_monitor_get_property;
-
- g_object_class_install_property (object_class, PROP_AVAILABLE,
- 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_generic,
- 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_generic,
- G_TYPE_NONE, 1, EMPATHY_TYPE_CAMERA);
-
- g_type_class_add_private (object_class,
- sizeof (EmpathyCameraMonitorPrivate));
-}
-
-static void
-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->empathy_monitor = tpaw_camera_device_monitor_new ();
-
- g_signal_connect (self->priv->empathy_monitor, "added",
- G_CALLBACK (on_camera_added), self);
- g_signal_connect (self->priv->empathy_monitor, "removed",
- G_CALLBACK (on_camera_removed), self);
-
-#ifndef HAVE_UDEV
- /* No udev, assume there are cameras present */
- self->priv->num_cameras = 1;
-#endif
-}
-
-EmpathyCameraMonitor *
-empathy_camera_monitor_dup_singleton (void)
-{
- 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)
-{
- g_return_val_if_fail (EMPATHY_IS_CAMERA_MONITOR (self), FALSE);
-
- return self->priv->num_cameras > 0;
-}
+++ /dev/null
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Authors: Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
- */
-
-#ifndef __EMPATHY_CAMERA_MONITOR_H__
-#define __EMPATHY_CAMERA_MONITOR_H__
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-#define EMPATHY_TYPE_CAMERA_MONITOR (empathy_camera_monitor_get_type ())
-#define EMPATHY_CAMERA_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_CAMERA_MONITOR, EmpathyCameraMonitor))
-#define EMPATHY_CAMERA_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EMPATHY_TYPE_CAMERA_MONITOR, EmpathyCameraMonitorClass))
-#define EMPATHY_IS_CAMERA_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_CAMERA_MONITOR))
-#define EMPATHY_IS_CAMERA_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_CAMERA_MONITOR))
-#define EMPATHY_CAMERA_MONITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_CAMERA_MONITOR, EmpathyCameraMonitorClass))
-
-typedef struct _EmpathyCameraMonitor EmpathyCameraMonitor;
-typedef struct _EmpathyCameraMonitorClass EmpathyCameraMonitorClass;
-typedef struct _EmpathyCameraMonitorPrivate EmpathyCameraMonitorPrivate;
-
-struct _EmpathyCameraMonitor
-{
- GObject parent;
- EmpathyCameraMonitorPrivate *priv;
-};
-
-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__ */
#include <farstream/fs-element-added-notifier.h>
#include <farstream/fs-utils.h>
#include <tp-account-widgets/tpaw-builder.h>
+#include <tp-account-widgets/tpaw-camera-monitor.h>
#include "empathy-about-dialog.h"
#include "empathy-audio-sink.h"
#include "empathy-call-utils.h"
#include "empathy-call-window-fullscreen.h"
#include "empathy-camera-menu.h"
-#include "empathy-camera-monitor.h"
#include "empathy-dialpad-widget.h"
#include "empathy-geometry.h"
#include "empathy-gsettings.h"
EmpathyContact *contact;
- EmpathyCameraMonitor *camera_monitor;
+ TpawCameraMonitor *camera_monitor;
CallState call_state;
gboolean outgoing;
DEBUG ("Swapping the camera");
- cameras = empathy_camera_monitor_get_cameras (self->priv->camera_monitor);
+ cameras = tpaw_camera_monitor_get_cameras (self->priv->camera_monitor);
current_cam = empathy_video_src_dup_device (
EMPATHY_GST_VIDEO_SRC (self->priv->video_input));
for (l = cameras; l != NULL; l = l->next)
{
- EmpathyCamera *camera = l->data;
+ TpawCamera *camera = l->data;
if (!tp_strdiff (camera->device, current_cam))
{
- EmpathyCamera *next;
+ TpawCamera *next;
if (l->next != NULL)
next = l->next->data;
}
static void
-empathy_call_window_camera_added_cb (EmpathyCameraMonitor *monitor,
- EmpathyCamera *camera,
+empathy_call_window_camera_added_cb (TpawCameraMonitor *monitor,
+ TpawCamera *camera,
EmpathyCallWindow *self)
{
- const GList *cameras = empathy_camera_monitor_get_cameras (monitor);
+ const GList *cameras = tpaw_camera_monitor_get_cameras (monitor);
gtk_action_set_visible (self->priv->menu_swap_camera,
g_list_length ((GList *) cameras) >= 2);
}
static void
-empathy_call_window_camera_removed_cb (EmpathyCameraMonitor *monitor,
- EmpathyCamera *camera,
+empathy_call_window_camera_removed_cb (TpawCameraMonitor *monitor,
+ TpawCamera *camera,
EmpathyCallWindow *self)
{
- const GList *cameras = empathy_camera_monitor_get_cameras (monitor);
+ const GList *cameras = tpaw_camera_monitor_get_cameras (monitor);
gtk_action_set_visible (self->priv->menu_swap_camera,
g_list_length ((GList *) cameras) >= 2);
empathy_set_css_provider (GTK_WIDGET (self));
gtk_action_set_sensitive (priv->menu_fullscreen, FALSE);
- priv->camera_monitor = empathy_camera_monitor_dup_singleton ();
+ priv->camera_monitor = tpaw_camera_monitor_dup_singleton ();
g_object_bind_property (priv->camera_monitor, "available",
priv->camera_button, "sensitive",
can_send_video = priv->video_input != NULL &&
empathy_contact_can_voip_video (priv->contact) &&
- empathy_camera_monitor_get_available (priv->camera_monitor);
+ tpaw_camera_monitor_get_available (priv->camera_monitor);
g_object_get (priv->handler, "call-channel", &call, NULL);
#include "config.h"
#include "empathy-camera-menu.h"
-#include "empathy-camera-monitor.h"
+#include <tp-account-widgets/tpaw-camera-monitor.h>
+
#include "empathy-gsettings.h"
#define DEBUG_FLAG EMPATHY_DEBUG_VOIP
/* Queue of GtkRadioActions. */
GQueue *cameras;
- EmpathyCameraMonitor *camera_monitor;
+ TpawCameraMonitor *camera_monitor;
GSettings *settings;
};
static void
empathy_camera_menu_add_camera (EmpathyCameraMenu *self,
- EmpathyCamera *camera)
+ TpawCamera *camera)
{
GtkRadioAction *action;
GSList *group;
}
static void
-empathy_camera_menu_camera_added_cb (EmpathyCameraMonitor *monitor,
- EmpathyCamera *camera,
+empathy_camera_menu_camera_added_cb (TpawCameraMonitor *monitor,
+ TpawCamera *camera,
EmpathyCameraMenu *self)
{
empathy_camera_menu_add_camera (self, camera);
}
static void
-empathy_camera_menu_camera_removed_cb (EmpathyCameraMonitor *monitor,
- EmpathyCamera *camera,
+empathy_camera_menu_camera_removed_cb (TpawCameraMonitor *monitor,
+ TpawCamera *camera,
EmpathyCameraMenu *self)
{
GList *l;
{
const GList *cameras;
- cameras = empathy_camera_monitor_get_cameras (self->priv->camera_monitor);
+ cameras = tpaw_camera_monitor_get_cameras (self->priv->camera_monitor);
for (; cameras != NULL; cameras = g_list_next (cameras))
{
- EmpathyCamera *camera = cameras->data;
+ TpawCamera *camera = cameras->data;
empathy_camera_menu_add_camera (self, camera);
}
self->priv->anchor_action);
g_object_unref (self->priv->anchor_action);
- self->priv->camera_monitor = empathy_camera_monitor_new ();
+ self->priv->camera_monitor = tpaw_camera_monitor_new ();
tp_g_signal_connect_object (self->priv->camera_monitor, "added",
G_CALLBACK (empathy_camera_menu_camera_added_cb), self, 0);
tpaw-account-widget-sip.c \
tpaw-builder.c \
tpaw-calendar-button.c \
+ tpaw-camera-monitor.c \
tpaw-connection-managers.c \
tpaw-contactinfo-utils.c \
tpaw-keyring.c \
tpaw-account-widget-sip.h \
tpaw-builder.h \
tpaw-calendar-button.h \
+ tpaw-camera-monitor.h \
tpaw-connection-managers.h \
tpaw-contactinfo-utils.h \
tpaw-keyring.h \
--- /dev/null
+/*
+ * Copyright (C) 2011 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
+ */
+
+#include "config.h"
+#include "tpaw-camera-monitor.h"
+
+#include <tp-account-widgets/cheese-camera-device-monitor.h>
+
+#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
+#include "empathy-debug.h"
+
+struct _TpawCameraMonitorPrivate
+{
+ TpawCameraDeviceMonitor *tpaw_monitor;
+ GQueue *cameras;
+ gint num_cameras;
+};
+
+enum
+{
+ PROP_0,
+ PROP_AVAILABLE,
+};
+
+enum
+{
+ CAMERA_ADDED,
+ CAMERA_REMOVED,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+G_DEFINE_TYPE (TpawCameraMonitor, tpaw_camera_monitor, G_TYPE_OBJECT);
+
+static TpawCameraMonitor *manager_singleton = NULL;
+
+static TpawCamera *
+tpaw_camera_new (const gchar *id,
+ const gchar *device,
+ const gchar *name)
+{
+ TpawCamera *camera = g_slice_new (TpawCamera);
+
+ camera->id = g_strdup (id);
+ camera->device = g_strdup (device);
+ camera->name = g_strdup (name);
+
+ return camera;
+}
+
+static TpawCamera *
+tpaw_camera_copy (TpawCamera *camera)
+{
+ return tpaw_camera_new (camera->id, camera->device, camera->name);
+}
+
+static void
+tpaw_camera_free (TpawCamera *camera)
+{
+ g_free (camera->id);
+ g_free (camera->device);
+ g_free (camera->name);
+
+ g_slice_free (TpawCamera, camera);
+}
+
+G_DEFINE_BOXED_TYPE (TpawCamera, tpaw_camera,
+ tpaw_camera_copy, tpaw_camera_free)
+
+static gint
+tpaw_camera_find (gconstpointer a,
+ gconstpointer b)
+{
+ const TpawCamera *camera = a;
+ const gchar *id = b;
+
+ return g_strcmp0 (camera->id, id);
+}
+
+static void
+tpaw_camera_monitor_free_camera_foreach (gpointer data,
+ gpointer user_data)
+{
+ tpaw_camera_free (data);
+}
+
+static void
+on_camera_added (TpawCameraDeviceMonitor *device,
+ gchar *id,
+ gchar *filename,
+ gchar *product_name,
+ gint api_version,
+ TpawCameraMonitor *self)
+{
+ TpawCamera *camera;
+
+ if (self->priv->cameras == NULL)
+ return;
+
+ camera = tpaw_camera_new (id, filename, product_name);
+
+ 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
+on_camera_removed (TpawCameraDeviceMonitor *device,
+ gchar *id,
+ TpawCameraMonitor *self)
+{
+ TpawCamera *camera;
+ GList *l;
+
+ if (self->priv->cameras == NULL)
+ return;
+
+ l = g_queue_find_custom (self->priv->cameras, id, tpaw_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);
+
+ tpaw_camera_free (camera);
+}
+
+const GList *
+tpaw_camera_monitor_get_cameras (TpawCameraMonitor *self)
+{
+ if (self->priv->cameras != NULL)
+ return self->priv->cameras->head;
+ else
+ return NULL;
+}
+
+static void
+tpaw_camera_monitor_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ TpawCameraMonitor *self = (TpawCameraMonitor *) object;
+
+ switch (prop_id)
+ {
+ case PROP_AVAILABLE:
+ g_value_set_boolean (value, self->priv->num_cameras > 0);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+tpaw_camera_monitor_dispose (GObject *object)
+{
+ TpawCameraMonitor *self = TPAW_CAMERA_MONITOR (object);
+
+ tp_clear_object (&self->priv->tpaw_monitor);
+
+ g_queue_foreach (self->priv->cameras,
+ tpaw_camera_monitor_free_camera_foreach, NULL);
+ tp_clear_pointer (&self->priv->cameras, g_queue_free);
+
+ G_OBJECT_CLASS (tpaw_camera_monitor_parent_class)->dispose (object);
+}
+
+static void
+tpaw_camera_monitor_constructed (GObject *object)
+{
+ TpawCameraMonitor *self = (TpawCameraMonitor *) object;
+
+ G_OBJECT_CLASS (tpaw_camera_monitor_parent_class)->constructed (object);
+
+ tpaw_camera_device_monitor_coldplug (self->priv->tpaw_monitor);
+}
+
+static void
+tpaw_camera_monitor_class_init (TpawCameraMonitorClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = tpaw_camera_monitor_dispose;
+ object_class->constructed = tpaw_camera_monitor_constructed;
+ object_class->get_property = tpaw_camera_monitor_get_property;
+
+ g_object_class_install_property (object_class, PROP_AVAILABLE,
+ 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_generic,
+ G_TYPE_NONE, 1, TPAW_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_generic,
+ G_TYPE_NONE, 1, TPAW_TYPE_CAMERA);
+
+ g_type_class_add_private (object_class,
+ sizeof (TpawCameraMonitorPrivate));
+}
+
+static void
+tpaw_camera_monitor_init (TpawCameraMonitor *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+ TPAW_TYPE_CAMERA_MONITOR, TpawCameraMonitorPrivate);
+
+ self->priv->cameras = g_queue_new ();
+
+ self->priv->tpaw_monitor = tpaw_camera_device_monitor_new ();
+
+ g_signal_connect (self->priv->tpaw_monitor, "added",
+ G_CALLBACK (on_camera_added), self);
+ g_signal_connect (self->priv->tpaw_monitor, "removed",
+ G_CALLBACK (on_camera_removed), self);
+
+#ifndef HAVE_UDEV
+ /* No udev, assume there are cameras present */
+ self->priv->num_cameras = 1;
+#endif
+}
+
+TpawCameraMonitor *
+tpaw_camera_monitor_dup_singleton (void)
+{
+ GObject *retval;
+
+ if (manager_singleton)
+ {
+ retval = g_object_ref (manager_singleton);
+ }
+ else
+ {
+ retval = g_object_new (TPAW_TYPE_CAMERA_MONITOR, NULL);
+
+ manager_singleton = TPAW_CAMERA_MONITOR (retval);
+ g_object_add_weak_pointer (retval, (gpointer) &manager_singleton);
+ }
+
+ return TPAW_CAMERA_MONITOR (retval);
+}
+
+TpawCameraMonitor *
+tpaw_camera_monitor_new (void)
+{
+ return TPAW_CAMERA_MONITOR (
+ g_object_new (TPAW_TYPE_CAMERA_MONITOR, NULL));
+}
+
+gboolean tpaw_camera_monitor_get_available (TpawCameraMonitor *self)
+{
+ g_return_val_if_fail (TPAW_IS_CAMERA_MONITOR (self), FALSE);
+
+ return self->priv->num_cameras > 0;
+}
--- /dev/null
+/*
+ * Copyright (C) 2011 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
+ */
+
+#ifndef __TPAW_CAMERA_MONITOR_H__
+#define __TPAW_CAMERA_MONITOR_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+#define TPAW_TYPE_CAMERA_MONITOR (tpaw_camera_monitor_get_type ())
+#define TPAW_CAMERA_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TPAW_TYPE_CAMERA_MONITOR, TpawCameraMonitor))
+#define TPAW_CAMERA_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), TPAW_TYPE_CAMERA_MONITOR, TpawCameraMonitorClass))
+#define TPAW_IS_CAMERA_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TPAW_TYPE_CAMERA_MONITOR))
+#define TPAW_IS_CAMERA_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TPAW_TYPE_CAMERA_MONITOR))
+#define TPAW_CAMERA_MONITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TPAW_TYPE_CAMERA_MONITOR, TpawCameraMonitorClass))
+
+typedef struct _TpawCameraMonitor TpawCameraMonitor;
+typedef struct _TpawCameraMonitorClass TpawCameraMonitorClass;
+typedef struct _TpawCameraMonitorPrivate TpawCameraMonitorPrivate;
+
+struct _TpawCameraMonitor
+{
+ GObject parent;
+ TpawCameraMonitorPrivate *priv;
+};
+
+struct _TpawCameraMonitorClass
+{
+ GObjectClass parent_class;
+};
+
+typedef struct
+{
+ gchar *id;
+ gchar *device;
+ gchar *name;
+} TpawCamera;
+
+#define TPAW_TYPE_CAMERA (tpaw_camera_get_type ())
+GType tpaw_camera_get_type (void) G_GNUC_CONST;
+
+GType tpaw_camera_monitor_get_type (void) G_GNUC_CONST;
+
+TpawCameraMonitor *tpaw_camera_monitor_dup_singleton (void);
+TpawCameraMonitor *tpaw_camera_monitor_new (void);
+
+gboolean tpaw_camera_monitor_get_available (TpawCameraMonitor *self);
+
+const GList * tpaw_camera_monitor_get_cameras (TpawCameraMonitor *self);
+
+G_END_DECLS
+#endif /* __TPAW_CAMERA_MONITOR_H__ */