~ubuntu-branches/ubuntu/jaunty/gvfs/jaunty-updates

« back to all changes in this revision

Viewing changes to monitor/proxy/gproxyshadowmount.c

  • Committer: Bazaar Package Importer
  • Author(s): Sebastien Bacher
  • Date: 2009-04-03 16:51:09 UTC
  • mfrom: (1.1.40 upstream)
  • Revision ID: james.westby@ubuntu.com-20090403165109-0o6vhzslynkby3yt
Tags: 1.2.1-0ubuntu1
* New upstream version:
  - Fix duplicate CD audio icons after remount
  - Fix problems mounting encrypted volumes
  - Handle usernames with @ in them better in uris
  - trash: handle weird filenames correctly
  - sftp: Fix various error conditions
  - volume monitors: emit pre-unmount signals
  - smb: Fix various error conditions
  - fuse: Make sure closing a file flushed the file on the backend
* debian/patches/90_svn_update.patch:
  - the change is the new version

Show diffs side-by-side

added added

removed removed

Lines of Context:
49
49
 
50
50
  GProxyVolume *volume;
51
51
  GMount *real_mount;
 
52
  gulong pre_unmount_signal_id;
 
53
  gboolean real_mount_shadowed;
52
54
  GFile *root;
53
55
};
54
56
 
73
75
 
74
76
  g_proxy_shadow_mount_remove (mount);
75
77
 
 
78
  if (mount->real_mount != NULL)
 
79
    {
 
80
      g_object_unref (mount->real_mount);
 
81
      mount->real_mount = NULL;
 
82
    }
 
83
  
76
84
  if (mount->volume_monitor != NULL)
77
85
    g_object_unref (mount->volume_monitor);
78
86
 
104
112
{
105
113
}
106
114
 
 
115
static void
 
116
real_mount_pre_unmount_cb (GVolumeMonitor    *volume_monitor,
 
117
                           GMount            *mount,
 
118
                           GProxyShadowMount *shadow_mount)
 
119
{
 
120
  if (mount == shadow_mount->real_mount)
 
121
    g_signal_emit_by_name (shadow_mount->volume_monitor, "mount-pre-unmount", shadow_mount);
 
122
}
 
123
 
107
124
void
108
125
g_proxy_shadow_mount_remove (GProxyShadowMount *mount)
109
126
{
110
 
  if (mount->real_mount != NULL)
 
127
  if (mount->real_mount_shadowed)
111
128
    {
112
129
      g_mount_unshadow (mount->real_mount);
113
130
      signal_emit_in_idle (mount->real_mount, "changed", NULL);
114
131
      signal_emit_in_idle (mount->volume_monitor, "mount-changed", mount->real_mount);
115
 
      g_object_unref (mount->real_mount);
116
 
      mount->real_mount = NULL;
 
132
      mount->real_mount_shadowed = FALSE;
 
133
 
 
134
      if (mount->pre_unmount_signal_id != 0)
 
135
        {
 
136
          g_signal_handler_disconnect (mount, mount->pre_unmount_signal_id);
 
137
          mount->pre_unmount_signal_id = 0;
 
138
        }
117
139
    }
118
140
}
119
141
 
138
160
  mount->volume_monitor = g_object_ref (volume_monitor);
139
161
  mount->volume = g_object_ref (volume);
140
162
  mount->real_mount = g_object_ref (real_mount);
 
163
  mount->real_mount_shadowed = TRUE;
141
164
  mount->root = activation_root;
142
165
 
143
166
  g_mount_shadow (mount->real_mount);
144
167
  signal_emit_in_idle (mount->real_mount, "changed", NULL);
145
168
  signal_emit_in_idle (mount->volume_monitor, "mount-changed", mount->real_mount);
146
169
 
 
170
  mount->pre_unmount_signal_id = g_signal_connect (mount->volume_monitor, "mount-pre-unmount",
 
171
                                                   G_CALLBACK (real_mount_pre_unmount_cb), mount);
 
172
 
147
173
  g_object_set_data (G_OBJECT (mount),
148
174
                     "g-proxy-shadow-mount-volume-monitor-name",
149
175
                     (gpointer) g_type_name (G_TYPE_FROM_INSTANCE (volume_monitor)));
274
300
  GObject *object;
275
301
  GAsyncReadyCallback callback;
276
302
  gpointer user_data;
277
 
} EjectWrapperOp;
 
303
} AsyncWrapperOp;
278
304
 
279
305
static void
280
 
eject_wrapper_callback (GObject *source_object,
 
306
async_wrapper_callback (GObject *source_object,
281
307
                        GAsyncResult *res,
282
308
                        gpointer user_data)
283
309
{
284
 
  EjectWrapperOp *data  = user_data;
 
310
  AsyncWrapperOp *data  = user_data;
285
311
  data->callback (data->object, res, data->user_data);
286
312
  g_object_unref (data->object);
287
313
  g_free (data);
288
314
}
289
315
 
 
316
static AsyncWrapperOp *
 
317
setup_async_wrapper (GMount *mount,
 
318
                     GAsyncReadyCallback  callback,
 
319
                     gpointer             user_data)
 
320
{
 
321
  AsyncWrapperOp *data;
 
322
  
 
323
  data = g_new0 (AsyncWrapperOp, 1);
 
324
  data->object = g_object_ref (mount);
 
325
  data->callback = callback;
 
326
  data->user_data = user_data;
 
327
  return data;
 
328
}
 
329
                     
 
330
 
290
331
static void
291
332
g_proxy_shadow_mount_eject (GMount              *mount,
292
333
                            GMountUnmountFlags   flags,
295
336
                            gpointer             user_data)
296
337
{
297
338
  GProxyShadowMount *proxy_shadow_mount = G_PROXY_SHADOW_MOUNT (mount);
298
 
  EjectWrapperOp *data;
 
339
  AsyncWrapperOp *data;
299
340
 
 
341
  data = setup_async_wrapper (mount, callback, user_data);
300
342
  G_LOCK (proxy_shadow_mount);
301
 
  data = g_new0 (EjectWrapperOp, 1);
302
 
  data->object = g_object_ref (mount);
303
 
  data->callback = callback;
304
 
  data->user_data = user_data;
305
 
  g_volume_eject (G_VOLUME (proxy_shadow_mount->volume), flags, cancellable, eject_wrapper_callback, data);
 
343
  g_volume_eject (G_VOLUME (proxy_shadow_mount->volume),
 
344
                  flags, cancellable,
 
345
                  async_wrapper_callback, data);
306
346
  G_UNLOCK (proxy_shadow_mount);
307
347
}
308
348
 
329
369
                              gpointer             user_data)
330
370
{
331
371
  GProxyShadowMount *proxy_shadow_mount = G_PROXY_SHADOW_MOUNT (mount);
 
372
  AsyncWrapperOp *data;
332
373
 
 
374
  data = setup_async_wrapper (mount, callback, user_data);
333
375
  g_mount_unmount (proxy_shadow_mount->real_mount,
334
376
                   flags,
335
377
                   cancellable,
336
 
                   callback,
337
 
                   user_data);
 
378
                   async_wrapper_callback, data);
338
379
}
339
380
 
340
381
static gboolean
357
398
                                         gpointer             user_data)
358
399
{
359
400
  GProxyShadowMount *proxy_shadow_mount = G_PROXY_SHADOW_MOUNT (mount);
 
401
  AsyncWrapperOp *data;
360
402
 
 
403
  data = setup_async_wrapper (mount, callback, user_data);
361
404
  g_mount_guess_content_type (proxy_shadow_mount->real_mount,
362
405
                              force_rescan,
363
406
                              cancellable,
364
 
                              callback,
365
 
                              user_data);
 
407
                              async_wrapper_callback, data);
366
408
}
367
409
 
368
410
static char **