* 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., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
*
* Author: Alexander Larsson <alexl@redhat.com>
* David Zeuthen <davidz@redhat.com>
#include "glibintl.h"
-#include "gioalias.h"
struct _GUnionVolumeMonitor {
GVolumeMonitor parent;
#define g_union_volume_monitor_get_type _g_union_volume_monitor_get_type
G_DEFINE_TYPE (GUnionVolumeMonitor, g_union_volume_monitor, G_TYPE_VOLUME_MONITOR);
-static GStaticRecMutex the_volume_monitor_mutex = G_STATIC_REC_MUTEX_INIT;
+static GRecMutex the_volume_monitor_mutex;
static GUnionVolumeMonitor *the_volume_monitor = NULL;
g_union_volume_monitor_dispose (GObject *object)
{
GUnionVolumeMonitor *monitor;
-
+ GVolumeMonitor *child_monitor;
+ GList *l;
+
monitor = G_UNION_VOLUME_MONITOR (object);
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
the_volume_monitor = NULL;
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+
+ for (l = monitor->monitors; l != NULL; l = l->next)
+ {
+ child_monitor = l->data;
+ g_object_run_dispose (G_OBJECT (child_monitor));
+ }
+
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
G_OBJECT_CLASS (g_union_volume_monitor_parent_class)->dispose (object);
}
res = NULL;
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
for (l = monitor->monitors; l != NULL; l = l->next)
{
res = g_list_concat (res, g_volume_monitor_get_mounts (child_monitor));
}
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
return res;
}
res = NULL;
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
for (l = monitor->monitors; l != NULL; l = l->next)
{
res = g_list_concat (res, g_volume_monitor_get_volumes (child_monitor));
}
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
return res;
}
res = NULL;
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
for (l = monitor->monitors; l != NULL; l = l->next)
{
res = g_list_concat (res, g_volume_monitor_get_connected_drives (child_monitor));
}
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
return res;
}
volume = NULL;
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
for (l = monitor->monitors; l != NULL; l = l->next)
{
}
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
return volume;
}
mount = NULL;
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
for (l = monitor->monitors; l != NULL; l = l->next)
{
}
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
return mount;
}
}
static void
+child_drive_stop_button (GVolumeMonitor *child_monitor,
+ GDrive *child_drive,
+ GUnionVolumeMonitor *union_monitor)
+{
+ g_signal_emit_by_name (union_monitor,
+ "drive-stop-button",
+ child_drive);
+}
+
+static void
g_union_volume_monitor_add_monitor (GUnionVolumeMonitor *union_monitor,
GVolumeMonitor *volume_monitor)
{
g_signal_connect (volume_monitor, "drive-disconnected", (GCallback)child_drive_disconnected, union_monitor);
g_signal_connect (volume_monitor, "drive-changed", (GCallback)child_drive_changed, union_monitor);
g_signal_connect (volume_monitor, "drive-eject-button", (GCallback)child_drive_eject_button, union_monitor);
+ g_signal_connect (volume_monitor, "drive-stop-button", (GCallback)child_drive_stop_button, union_monitor);
}
static void
g_signal_handlers_disconnect_by_func (child_monitor, child_drive_disconnected, union_monitor);
g_signal_handlers_disconnect_by_func (child_monitor, child_drive_changed, union_monitor);
g_signal_handlers_disconnect_by_func (child_monitor, child_drive_eject_button, union_monitor);
+ g_signal_handlers_disconnect_by_func (child_monitor, child_drive_stop_button, union_monitor);
}
static GType
*
* Gets the volume monitor used by gio.
*
- * Returns: a reference to the #GVolumeMonitor used by gio. Call
+ * Returns: (transfer full): a reference to the #GVolumeMonitor used by gio. Call
* g_object_unref() when done with it.
**/
GVolumeMonitor *
{
GVolumeMonitor *vm;
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
if (the_volume_monitor)
vm = G_VOLUME_MONITOR (g_object_ref (the_volume_monitor));
vm = G_VOLUME_MONITOR (the_volume_monitor);
}
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
return vm;
}
-/**
- * _g_mount_get_for_mount_path:
- * @mountpoint: a string.
- * @cancellable: a #GCancellable, or %NULL
- *
- * Returns: a #GMount for given @mount_path or %NULL.
- **/
GMount *
-_g_mount_get_for_mount_path (const char *mount_path,
+_g_mount_get_for_mount_path (const gchar *mount_path,
GCancellable *cancellable)
{
GNativeVolumeMonitorClass *klass;
if (klass->get_mount_for_mount_path)
{
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
mount = klass->get_mount_for_mount_path (mount_path, cancellable);
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
}
/* TODO: How do we know this succeeded? Keep in mind that the native
*
* If the return value is not %NULL, the caller must associate the
* returned #GVolume object with the #GMount. This involves returning
- * it in it's g_mount_get_volume() implementation. The caller must
+ * it in its g_mount_get_volume() implementation. The caller must
* also listen for the "removed" signal on the returned object
- * and give up it's reference when handling that signal
+ * and give up its reference when handling that signal
*
* Similary, if implementing g_volume_monitor_adopt_orphan_mount(),
* the implementor must take a reference to @mount and return it in
- * it's g_volume_get_mount() implemented. Also, the implementor must
- * listen for the "unmounted" signal on @mount and give up it's
+ * its g_volume_get_mount() implemented. Also, the implementor must
+ * listen for the "unmounted" signal on @mount and give up its
* reference upon handling that signal.
*
* There are two main use cases for this function.
* One is when implementing a user space file system driver that reads
* blocks of a block device that is already represented by the native
* volume monitor (for example a CD Audio file system driver). Such
- * a driver will generate it's own #GMount object that needs to be
- * assoicated with the #GVolume object that represents the volume.
+ * a driver will generate its own #GMount object that needs to be
+ * associated with the #GVolume object that represents the volume.
*
* The other is for implementing a #GVolumeMonitor whose sole purpose
* is to return #GVolume objects representing entries in the users
* "favorite servers" list or similar.
*
- * Returns: the #GVolume object that is the parent for @mount or %NULL
+ * Returns: (transfer full): the #GVolume object that is the parent for @mount or %NULL
* if no wants to adopt the #GMount.
+ *
+ * Deprecated: 2.20: Instead of using this function, #GVolumeMonitor
+ * implementations should instead create shadow mounts with the URI of
+ * the mount they intend to adopt. See the proxy volume monitor in
+ * gvfs for an example of this. Also see g_mount_is_shadowed(),
+ * g_mount_shadow() and g_mount_unshadow() functions.
*/
GVolume *
g_volume_monitor_adopt_orphan_mount (GMount *mount)
volume = NULL;
- g_static_rec_mutex_lock (&the_volume_monitor_mutex);
+ g_rec_mutex_lock (&the_volume_monitor_mutex);
for (l = the_volume_monitor->monitors; l != NULL; l = l->next)
{
}
}
- g_static_rec_mutex_unlock (&the_volume_monitor_mutex);
+ g_rec_mutex_unlock (&the_volume_monitor_mutex);
return volume;
}
-
-
-#define __G_UNION_VOLUME_MONITOR_C__
-#include "gioaliasdef.c"