void rb_generic_player_source_trash_or_delete_entries (RBGenericPlayerSource *source, GList *entries, gboolean _delete) { RBGenericPlayerSourcePrivate *priv = GENERIC_PLAYER_SOURCE_GET_PRIVATE (source); GList *tem; if (priv->read_only != FALSE) return; for (tem = entries; tem != NULL; tem = tem->next) { RhythmDBEntry *entry; const char *uri; GFile *file; GFile *dir; entry = tem->data; uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION); file = g_file_new_for_uri (uri); if (_delete) g_file_delete (file, NULL, NULL); else g_file_trash (file, NULL, NULL); /* now walk up the directory structure and delete empty dirs * until we reach the root or one of the device's audio folders. */ dir = g_file_get_parent (file); while (can_delete_directory (source, dir)) { GFile *parent; char *path; path = g_file_get_path (dir); rb_debug ("trying to delete %s", path); g_free (path); if (g_file_delete (dir, NULL, NULL) == FALSE) { break; } parent = g_file_get_parent (dir); if (parent == NULL) { break; } g_object_unref (dir); dir = parent; } g_object_unref (dir); g_object_unref (file); rhythmdb_entry_delete (priv->db, entry); } rhythmdb_commit (priv->db); }
NTSTATUS can_set_delete_on_close(files_struct *fsp, uint32 dosmode) { /* * Only allow delete on close for writable files. */ if ((dosmode & FILE_ATTRIBUTE_READONLY) && !lp_delete_readonly(SNUM(fsp->conn))) { DEBUG(10,("can_set_delete_on_close: file %s delete on close " "flag set but file attribute is readonly.\n", fsp_str_dbg(fsp))); return NT_STATUS_CANNOT_DELETE; } /* * Only allow delete on close for writable shares. */ if (!CAN_WRITE(fsp->conn)) { DEBUG(10,("can_set_delete_on_close: file %s delete on " "close flag set but write access denied on share.\n", fsp_str_dbg(fsp))); return NT_STATUS_ACCESS_DENIED; } /* * Only allow delete on close for files/directories opened with delete * intent. */ if (!(fsp->access_mask & DELETE_ACCESS)) { DEBUG(10,("can_set_delete_on_close: file %s delete on " "close flag set but delete access denied.\n", fsp_str_dbg(fsp))); return NT_STATUS_ACCESS_DENIED; } /* Don't allow delete on close for non-empty directories. */ if (fsp->is_directory) { SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name)); /* Or the root of a share. */ if (ISDOT(fsp->fsp_name->base_name)) { DEBUG(10,("can_set_delete_on_close: can't set delete on " "close for the root of a share.\n")); return NT_STATUS_ACCESS_DENIED; } return can_delete_directory(fsp->conn, fsp->fsp_name->base_name); } return NT_STATUS_OK; }
static void delete_entries (RBAndroidSource *source, GList *entries) { RBAndroidSourcePrivate *priv = GET_PRIVATE (source); GList *tem; for (tem = entries; tem != NULL; tem = tem->next) { RhythmDBEntry *entry; const char *uri; GFile *file; GFile *dir; entry = tem->data; uri = rhythmdb_entry_get_string (entry, RHYTHMDB_PROP_LOCATION); file = g_file_new_for_uri (uri); g_file_delete (file, NULL, NULL); /* now walk up the directory structure and delete empty dirs * until we reach the root or one of the device's audio folders. */ dir = g_file_get_parent (file); while (can_delete_directory (source, dir)) { GFile *parent; if (g_file_delete (dir, NULL, NULL) == FALSE) { break; } parent = g_file_get_parent (dir); if (parent == NULL) { break; } g_object_unref (dir); dir = parent; } g_object_unref (dir); g_object_unref (file); rhythmdb_entry_delete (priv->db, entry); } rhythmdb_commit (priv->db); }