From ef4b975884f4a1a738e8199e7c182317d7a5ff79 Mon Sep 17 00:00:00 2001 From: Bryce Denney Date: Thu, 29 Aug 2002 20:13:05 +0000 Subject: [PATCH] - add "Create Image" button to floppy dialog, and make it actually work --- bochs/gui/siminterface.cc | 63 ++++++++++++++++++++++++++++++++++++++- bochs/gui/siminterface.h | 4 ++- bochs/gui/wxdialog.cc | 57 ++++++++++++++++++++++++++++++++++- bochs/gui/wxdialog.h | 7 +++-- bochs/gui/wxmain.h | 3 +- 5 files changed, 127 insertions(+), 7 deletions(-) diff --git a/bochs/gui/siminterface.cc b/bochs/gui/siminterface.cc index 5ab44b43e..7e700d306 100644 --- a/bochs/gui/siminterface.cc +++ b/bochs/gui/siminterface.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: siminterface.cc,v 1.47 2002-08-29 14:59:37 bdenney Exp $ +// $Id: siminterface.cc,v 1.48 2002-08-29 20:13:03 bdenney Exp $ ///////////////////////////////////////////////////////////////////////// // // See siminterface.h for description of the siminterface concept. @@ -74,6 +74,7 @@ public: virtual int ask_filename (char *filename, int maxlen, char *prompt, char *the_default, int flags); // called at a regular interval, currently by the keyboard handler. virtual void periodic (); + virtual int create_disk_image (const char *filename, int sectors, Boolean overwrite); }; bx_param_c * @@ -303,6 +304,7 @@ bx_real_sim_c::get_cdrom_options (int drive, bx_cdrom_options *out) } char *floppy_type_names[] = { "none", "1.2M", "1.44M", "2.88M", "720K", "360K", NULL }; +int floppy_type_n_sectors[] = { -1, 80*2*15, 80*2*18, 80*2*36, 80*2*9, 40*2*9 }; int n_floppy_type_names = 6; char *floppy_status_names[] = { "ejected", "inserted", NULL }; int n_floppy_status_names = 2; @@ -412,6 +414,65 @@ bx_real_sim_c::periodic () #endif } +// create a disk image file called filename, size=512 bytes * sectors. +// If overwrite is true and the file exists, returns -1 without changing it. +// Otherwise, opens up the image and starts writing. Returns -2 if +// the image could not be opened, or -3 if there are failures during +// write, e.g. disk full. +// +// wxWindows: This may be called from the gui thread. +int +bx_real_sim_c::create_disk_image ( + const char *filename, + int sectors, + Boolean overwrite) +{ + FILE *fp; + if (!overwrite) { + // check for existence first + fp = fopen (filename, "r"); + if (fp) { + // yes it exists + fclose (fp); + return -1; + } + } + fp = fopen (filename, "w"); + if (fp == NULL) { +#ifdef HAVE_PERROR + char buffer[1024]; + sprintf (buffer, "while opening '%s' for writing", filename); + perror (buffer); + // not sure how to get this back into the CI +#endif + return -2; + } + int sec = sectors; + /* + * seek to sec*512-1 and write a single character. + * can't just do: fseek(fp, 512*sec-1, SEEK_SET) + * because 512*sec may be too large for signed int. + */ + while (sec > 0) + { + /* temp <-- min(sec, 4194303) + * 4194303 is (int)(0x7FFFFFFF/512) + */ + int temp = ((sec < 4194303) ? sec : 4194303); + fseek(fp, 512*temp, SEEK_CUR); + sec -= temp; + } + + fseek(fp, -1, SEEK_CUR); + if (fputc('\0', fp) == EOF) + { + fclose (fp); + return -3; + } + fclose (fp); + return 0; +} + ///////////////////////////////////////////////////////////////////////// // define methods of bx_param_* and family ///////////////////////////////////////////////////////////////////////// diff --git a/bochs/gui/siminterface.h b/bochs/gui/siminterface.h index f39ec8a3e..a4e5678b5 100644 --- a/bochs/gui/siminterface.h +++ b/bochs/gui/siminterface.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: siminterface.h,v 1.50 2002-08-29 14:59:37 bdenney Exp $ +// $Id: siminterface.h,v 1.51 2002-08-29 20:13:05 bdenney Exp $ ///////////////////////////////////////////////////////////////////////// // // Before I can describe what this file is for, I have to make the @@ -700,6 +700,7 @@ public: #define BX_FLOPPY_GUESS 20 // decide based on image size extern char *floppy_type_names[]; +extern int floppy_type_n_sectors[]; extern int n_floppy_type_names; extern char *floppy_status_names[]; extern int n_floppy_status_names; @@ -810,6 +811,7 @@ public: virtual int ask_filename (char *filename, int maxlen, char *prompt, char *the_default, int flags) {return -1;} // called at a regular interval, currently by the keyboard handler. virtual void periodic () {} + virtual int create_disk_image (const char *filename, int sectors, Boolean overwrite) {return -3;} }; extern bx_simulator_interface_c *SIM; diff --git a/bochs/gui/wxdialog.cc b/bochs/gui/wxdialog.cc index 0d8a631f3..a074dfb48 100644 --- a/bochs/gui/wxdialog.cc +++ b/bochs/gui/wxdialog.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////// -// $Id: wxdialog.cc,v 1.5 2002-08-29 20:09:54 bdenney Exp $ +// $Id: wxdialog.cc,v 1.6 2002-08-29 20:13:05 bdenney Exp $ ///////////////////////////////////////////////////////////////// // // misc/wxdialog.cc @@ -162,6 +162,7 @@ void LogMsgAskDialog::ShowHelp () // disk image file // filename // browse button +// create button // capacitySizer (horizontal): // capacity text // capacity choice box @@ -211,6 +212,8 @@ FloppyConfigDialog::FloppyConfigDialog( buttonSizer->Add (btn, 0, wxALL, 5); btn = new wxButton (this, wxCANCEL, "Cancel"); buttonSizer->Add (btn, 0, wxALL, 5); + btn = new wxButton (this, ID_Create, "Create Image"); + buttonSizer->Add (btn, 0, wxALL, 5); btn = new wxButton (this, wxOK, "Ok"); buttonSizer->Add (btn, 0, wxALL, 5); // create filename and diskImageRadioBtn so that we can tweak them before @@ -339,6 +342,16 @@ void FloppyConfigDialog::OnEvent(wxCommandEvent& event) SetFilename (fdialog->GetPath().c_str ()); } break; + case ID_Create: + // create disk image with name and capacity determined by the filename + // and capacity fields of this dialog. Call + // SIM->create_image (filename, sectors, overwrite=0) first which + // will create the file if it doesn't already exist. If it exists, + // it will return a code that says so, and we can ask the user + // "are you sure you want to overwrite?". If so call again with + // overwrite=1. + CreateImage (); + break; case wxCANCEL: EndModal (-1); break; @@ -348,6 +361,48 @@ void FloppyConfigDialog::OnEvent(wxCommandEvent& event) } } +void FloppyConfigDialog::CreateImage () +{ + int cap = capacity->GetSelection (); + wxLogDebug ("capacity=%d\n", cap); + wxLogDebug ("capacity string=%s\n", capacity->GetString (cap).c_str()); + if (capacity->GetString (cap).Cmp ("none") == 0 + || !(cap>=0 && capGetValue ().c_str (), + filename->GetValue ().Length ()); + wxLogDebug ("filename = '%s'\n", name); + if (strlen (name) < 1) { + wxMessageBox("You must type a file name for the new disk image.", "Bad Filename", wxOK | wxICON_ERROR ); + return; + } + // try first with overwrite flag = 0 + int ret = SIM->create_disk_image (name, floppy_type_n_sectors[cap], 0); + if (ret == -1) { // already exists + int answer = wxMessageBox ("File exists. Do you want to overwrite it?", + "File exists", wxYES_NO | wxCENTER); + if (answer == wxYES) + ret = SIM->create_disk_image (name, floppy_type_n_sectors[cap], 1); + else + return; // wxNO + } + if (ret == -2) { + wxMessageBox("I could not create the disk image. Check for permission problems or available disk space.", "Failed", wxOK | wxICON_ERROR ); + return; + } + wxASSERT (ret==0); + wxString s; + s.Printf ("Created a %s disk image called '%s'.", + capacity->GetString (cap).c_str (), + filename->GetValue ().c_str ()); + wxMessageBox(s, "Image Created", wxOK | wxICON_INFORMATION); +} + void FloppyConfigDialog::ShowHelp () { wxMessageBox("No help is available yet.", "No Help", wxOK | wxICON_ERROR ); diff --git a/bochs/gui/wxdialog.h b/bochs/gui/wxdialog.h index 7e4451cea..fe9fb59ed 100644 --- a/bochs/gui/wxdialog.h +++ b/bochs/gui/wxdialog.h @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////// -// $Id: wxdialog.h,v 1.5 2002-08-29 20:09:54 bdenney Exp $ +// $Id: wxdialog.h,v 1.6 2002-08-29 20:13:05 bdenney Exp $ //////////////////////////////////////////////////////////////////// // // wxWindows dialogs for Bochs @@ -77,7 +77,7 @@ DECLARE_EVENT_TABLE() // | Hint: To create a disk image, choose the name and capacity | // | above, then click Ok. | // | | -// | [ Help ] [ Cancel ] [ Ok ] | +// | [ Help ] [ Cancel ] [ Create Image ] [ Ok ] | // +---------------------------------------------------------------+ // To use this dialog: // After constructor, use AddRadio () to add radio buttons, SetFilename() @@ -97,7 +97,7 @@ public: #define FLOPPY_CONFIG_TITLE "Configure %s" #define FLOPPY_CONFIG_INSTRS "Select the device or image to use when simulating %s." #define FLOPPY_CONFIG_CAP "What is the capacity of this disk?" -#define FLOPPY_CONFIG_HINT "Hint: To create a disk image, choose the name and capacity above, then click Ok." +#define FLOPPY_CONFIG_HINT "To create a disk image, choose the file name and capacity, then click on \"Create Image\"." #define FLOPPY_CONFIG_DISKIMG "Disk image file: " private: void Init (); // called automatically by ShowModal() @@ -128,6 +128,7 @@ public: void SetDriveName (const char *name); void SetValidateFunc (validateFunc_t v) { validate = v; } void AddRadio (char *description, char *filename); + void CreateImage (); DECLARE_EVENT_TABLE() }; diff --git a/bochs/gui/wxmain.h b/bochs/gui/wxmain.h index 9b9096f4b..c42f9e52b 100644 --- a/bochs/gui/wxmain.h +++ b/bochs/gui/wxmain.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////// -// $Id: wxmain.h,v 1.8 2002-08-29 14:59:37 bdenney Exp $ +// $Id: wxmain.h,v 1.9 2002-08-29 20:13:05 bdenney Exp $ ///////////////////////////////////////////////////////////////// // This file defines variables and classes that the wxWindows .cc files // share. It should be included only by wx.cc and wxmain.cc. @@ -72,6 +72,7 @@ enum ID_Filename, ID_FilenameText, ID_Browse, + ID_Create, // dialog box: HDConfigDialog ID_Enable, ID_Cylinders,