/* * Will save only the selected files in the file list */ static gint Save_Selected_Files_With_Answer (gboolean force_saving_files) { gint toreturn; GList *etfilelist = NULL; etfilelist = et_application_window_browser_get_selected_files (ET_APPLICATION_WINDOW (MainWindow)); toreturn = Save_List_Of_Files (etfilelist, force_saving_files); g_list_free (etfilelist); return toreturn; }
/* * Write a playlist * - 'playlist_name' in file system encoding (not UTF-8) */ static gboolean write_playlist (EtPlaylistDialog *self, GFile *file, GError **error) { EtPlaylistDialogPrivate *priv; GFile *parent; GFileOutputStream *ostream; GString *to_write; GList *l; GList *etfilelist = NULL; gchar *basedir; gchar *temp; EtPlaylistContent playlist_content; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); priv = et_playlist_dialog_get_instance_private (self); ostream = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, error); if (!ostream) { g_assert (error == NULL || *error != NULL); return FALSE; } /* 'base directory' where is located the playlist. Used also to write file with a * relative path for file located in this directory and sub-directories */ parent = g_file_get_parent (file); basedir = g_file_get_path (parent); g_object_unref (parent); playlist_content = g_settings_get_enum (MainSettings, "playlist-content"); /* 1) First line of the file (if playlist content is not set to "write only * list of files") */ if (playlist_content != ET_PLAYLIST_CONTENT_FILENAMES) { gsize bytes_written; to_write = g_string_new ("#EXTM3U\r\n"); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT "bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); } if (g_settings_get_boolean (MainSettings, "playlist-selected-only")) { etfilelist = et_application_window_browser_get_selected_files (ET_APPLICATION_WINDOW (MainWindow)); } else { etfilelist = ETCore->ETFileList; } for (l = etfilelist; l != NULL; l = g_list_next (l)) { const ET_File *etfile; const gchar *filename; gint duration; etfile = (ET_File *)l->data; filename = ((File_Name *)etfile->FileNameCur->data)->value; duration = ((ET_File_Info *)etfile->ETFileInfo)->duration; if (g_settings_get_boolean (MainSettings, "playlist-relative")) { // Keep only files in this directory and sub-dirs if ( strncmp(filename,basedir,strlen(basedir))==0 ) { gsize bytes_written; /* 2) Write the header. */ switch (playlist_content) { case ET_PLAYLIST_CONTENT_FILENAMES: /* No header written. */ break; case ET_PLAYLIST_CONTENT_EXTENDED: /* Header has extended information. */ temp = g_path_get_basename (filename); to_write = g_string_new ("#EXTINF:"); /* Must be written in system encoding (not UTF-8). */ g_string_append_printf (to_write, "%d,%s\r\n", duration, temp); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT "bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); g_free (temp); break; case ET_PLAYLIST_CONTENT_EXTENDED_MASK: { /* Header uses information generated from a mask. */ gchar *mask = filename_from_display (gtk_entry_get_text (GTK_ENTRY (priv->content_mask_entry))); /* Special case: do not replace illegal characters and * do not check if there is a directory separator in * the mask. */ gchar *filename_generated_utf8 = et_scan_generate_new_filename_from_mask (etfile, mask, TRUE); gchar *filename_generated = filename_from_display (filename_generated_utf8); to_write = g_string_new ("#EXTINF:"); /* Must be written in system encoding (not UTF-8). */ g_string_append_printf (to_write, "%d,%s\r\n", duration, filename_generated); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT "bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); g_free (mask); g_free (filename_generated_utf8); break; } default: g_assert_not_reached (); break; } /* 3) Write the file path. */ if (g_settings_get_boolean (MainSettings, "playlist-dos-separator")) { gchar *filename_conv = g_strdup(filename+strlen(basedir)+1); convert_forwardslash_to_backslash (filename_conv); to_write = g_string_new (filename_conv); /* Must be written in system encoding (not UTF-8)*/ to_write = g_string_append (to_write, "\r\n"); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT "bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); g_free(filename_conv); }else { to_write = g_string_new (filename+strlen(basedir)+1); /* Must be written in system encoding (not UTF-8)*/ to_write = g_string_append (to_write, "\r\n"); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT "bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); } } } else /* !ETSettings:playlist-relative */ { gsize bytes_written; /* 2) Write the header. */ switch (playlist_content) { case ET_PLAYLIST_CONTENT_FILENAMES: /* No header written. */ break; case ET_PLAYLIST_CONTENT_EXTENDED: /* Header has extended information. */ temp = g_path_get_basename (filename); to_write = g_string_new ("#EXTINF:"); /* Must be written in system encoding (not UTF-8). */ g_string_append_printf (to_write, "%d,%s\r\n", duration, temp); g_free (temp); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT" bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); break; case ET_PLAYLIST_CONTENT_EXTENDED_MASK: { /* Header uses information generated from a mask. */ gchar *mask = filename_from_display (gtk_entry_get_text (GTK_ENTRY (priv->content_mask_entry))); /* Special case: do not replace illegal characters and * do not check if there is a directory separator in * the mask. */ gchar *filename_generated_utf8 = et_scan_generate_new_filename_from_mask (etfile, mask, TRUE); gchar *filename_generated = filename_from_display (filename_generated_utf8); to_write = g_string_new ("#EXTINF:"); /* Must be written in system encoding (not UTF-8). */ g_string_append_printf (to_write, "%d,%s\r\n", duration, filename_generated); g_free (filename_generated); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT" bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); g_free (mask); g_free (filename_generated_utf8); } break; default: g_assert_not_reached (); break; } /* 3) Write the file path. */ if (g_settings_get_boolean (MainSettings, "playlist-dos-separator")) { gchar *filename_conv = g_strdup(filename); convert_forwardslash_to_backslash(filename_conv); to_write = g_string_new (filename_conv); /* Must be written in system encoding (not UTF-8)*/ to_write = g_string_append (to_write, "\r\n"); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT" bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); g_free(filename_conv); }else { to_write = g_string_new (filename); /* Must be written in system encoding (not UTF-8)*/ to_write = g_string_append (to_write, "\r\n"); if (!g_output_stream_write_all (G_OUTPUT_STREAM (ostream), to_write->str, to_write->len, &bytes_written, NULL, error)) { g_debug ("Only %" G_GSIZE_FORMAT " bytes out of %" G_GSIZE_FORMAT" bytes of data were written", bytes_written, to_write->len); g_assert (error == NULL || *error != NULL); g_string_free (to_write, TRUE); g_object_unref (ostream); return FALSE; } g_string_free (to_write, TRUE); } } } if (g_settings_get_boolean (MainSettings, "playlist-selected-only")) { g_list_free (etfilelist); } g_assert (error == NULL || *error == NULL); g_object_unref (ostream); g_free(basedir); return TRUE; }