@@ -153,6 +153,7 @@ static void RecordMovieDialog();
153153static void PlayMovieDialog ();
154154static void StopMovie ();
155155static void ImportBackupDialog ();
156+ static void ExportBackupDialog ();
156157static void OpenNdsDialog ();
157158static void SaveStateDialog ();
158159static void LoadStateDialog ();
@@ -245,6 +246,7 @@ static const char *ui_description =
245246#endif
246247" <separator/>"
247248" <menuitem action='importbackup'/>"
249+ " <menuitem action='exportbackup'/>"
248250" <separator/>"
249251" <menuitem action='recordmovie'/>"
250252" <menuitem action='playmovie'/>"
@@ -439,6 +441,7 @@ static const GtkActionEntry action_entries[] = {
439441 { " savestateto" , NULL , " Save state _to ..." , NULL , NULL , SaveStateDialog },
440442 { " loadstatefrom" , NULL , " Load state _from ..." , NULL , NULL , LoadStateDialog },
441443 { " importbackup" , NULL , " _Import backup from ..." , NULL , NULL , ImportBackupDialog },
444+ { " exportbackup" , NULL , " _Export backup to ..." , NULL , NULL , ExportBackupDialog },
442445 { " recordmovie" , NULL , " Record movie _to ..." , NULL , NULL , RecordMovieDialog },
443446 { " playmovie" , NULL , " Play movie _from ..." , NULL , NULL , PlayMovieDialog },
444447 { " stopmovie" , NULL , " Stop movie" , NULL , NULL , StopMovie },
@@ -1187,7 +1190,7 @@ static void PlayMovieDialog()
11871190 gtk_widget_destroy (pFileSelection);
11881191}
11891192
1190- static void ImportBackupDialog ( )
1193+ static void ImportExportBackupDialog ( bool is_export )
11911194{
11921195 GtkFileFilter *pFilter_dsm, *pFilter_any;
11931196 GtkWidget *pFileSelection;
@@ -1201,20 +1204,23 @@ static void ImportBackupDialog()
12011204
12021205 pFilter_dsm = gtk_file_filter_new ();
12031206 gtk_file_filter_add_pattern (pFilter_dsm, " *.sav" );
1204- gtk_file_filter_set_name (pFilter_dsm, " Battery save file (.sav)" );
1207+ gtk_file_filter_set_name (pFilter_dsm, " Raw/No$GBA Save format (.sav)" );
12051208
12061209 pFilter_any = gtk_file_filter_new ();
12071210 gtk_file_filter_add_pattern (pFilter_any, " *" );
12081211 gtk_file_filter_set_name (pFilter_any, " All files" );
12091212
12101213 /* Creating the selection window */
1211- pFileSelection = gtk_file_chooser_dialog_new (" Import backup from..." ,
1214+ pFileSelection = gtk_file_chooser_dialog_new (
1215+ is_export?" Export Backup Memory To ..." : " Import backup from..." ,
12121216 GTK_WINDOW (pParent),
1213- GTK_FILE_CHOOSER_ACTION_OPEN,
1217+ is_export?GTK_FILE_CHOOSER_ACTION_SAVE: GTK_FILE_CHOOSER_ACTION_OPEN,
12141218 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1215- GTK_STOCK_OPEN, GTK_RESPONSE_OK,
1219+ is_export?GTK_STOCK_SAVE:GTK_STOCK_OPEN,
1220+ GTK_RESPONSE_OK,
12161221 NULL );
1217- gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE );
1222+ if (is_export)
1223+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (pFileSelection), TRUE );
12181224
12191225 /* Only the dialog window is accepting events: */
12201226 gtk_window_set_modal (GTK_WINDOW (pFileSelection), TRUE );
@@ -1226,11 +1232,27 @@ static void ImportBackupDialog()
12261232 switch (gtk_dialog_run (GTK_DIALOG (pFileSelection))) {
12271233 case GTK_RESPONSE_OK:
12281234 sPath = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (pFileSelection));
1229- struct stat st; int ret;
1230- if (stat (sPath , &st) != -1 ) {
1231- ret = MMU_new.backupDevice .importData (sPath , st.st_size );
1232- NDS_Reset (); // reboot game
1235+ int ret;
1236+ if (is_export) {
1237+ ret = MMU_new.backupDevice .exportData (sPath );
1238+ } else {
1239+ ret = false ;
1240+ struct stat st;
1241+ if (stat (sPath , &st) != -1 ) {
1242+ ret = MMU_new.backupDevice .importData (sPath , st.st_size );
1243+ }
12331244 }
1245+ if (ret == false ) {
1246+ GtkWidget *pDialog = gtk_message_dialog_new (GTK_WINDOW (pWindow),
1247+ GTK_DIALOG_MODAL,
1248+ GTK_MESSAGE_ERROR,
1249+ GTK_BUTTONS_OK,
1250+ is_export?" Unable to export:\n %s" :" Unable to import:\n %s" , sPath );
1251+ gtk_dialog_run (GTK_DIALOG (pDialog));
1252+ gtk_widget_destroy (pDialog);
1253+ } else if (!is_export) {
1254+ NDS_Reset (); // reboot game
1255+ }
12341256 g_free (sPath );
12351257 break ;
12361258 default :
@@ -1239,6 +1261,15 @@ static void ImportBackupDialog()
12391261 gtk_widget_destroy (pFileSelection);
12401262}
12411263
1264+ static void ImportBackupDialog ()
1265+ {
1266+ ImportExportBackupDialog (false );
1267+ }
1268+
1269+ static void ExportBackupDialog ()
1270+ {
1271+ ImportExportBackupDialog (true );
1272+ }
12421273
12431274static void SaveStateDialog ()
12441275{
0 commit comments