1
0
mirror of https://github.com/ctm/executor.git synced 2025-01-12 14:29:52 +00:00

206 lines
4.7 KiB
C

#include "go.h"
#include "xfer.h"
#include "disk.proto.h"
#include "inithotband.proto.h"
#include "alerts.proto.h"
/* TODO: move to .h file */
#define FLOPPYDRIVE 1
#define NAMEVOLDIALOG 203
#define VOLNAMEITEM 2
#define FORMATTEXTITEM 3
void
checkfordisk (void)
{
ParamBlockRec pb;
OSErr e;
EventRecord ev;
short i;
EvQEl *qp;
/* Tell Executor/DOS to check for disks. */
if (executor_p ())
unixmount (0);
pb.ioParam.ioVRefNum = FLOPPYDRIVE;
e = PBMountVol (&pb);
resetvolumes ();
}
void
format (void)
{
ParamBlockRec pb;
OSErr e;
short vrefnum, doit, type, itemhit;
Rect r;
long free;
Str255 s;
Handle h;
DialogPtr dp;
pb.ioParam.ioVRefNum = FLOPPYDRIVE;
e = PBMountVol (&pb);
switch (e)
{
case volOnLinErr:
case noErr:
e = GetVInfo (FLOPPYDRIVE, s, &vrefnum, &free);
pb.ioParam.ioVRefNum = vrefnum;
pb.ioParam.ioNamePtr = 0;
PBUnmountVol (&pb);
#ifdef THINK_C
doit = (ask ((StringPtr) "\pErase the floppy disk", s) == OK);
#else
doit = (ask ("\pErase the floppy disk", s) == ok);
#endif
if (!doit)
{
pb.ioParam.ioVRefNum = FLOPPYDRIVE;
PBMountVol (&pb);
}
break;
case badMDBErr:
case extFSErr:
case noMacDskErr:
case ioErr:
#ifdef THINK_C
doit = (ask ((StringPtr) "\pFormat the floppy disk", (StringPtr) "\p") == OK);
#else
doit = (ask ("\pFormat the floppy disk", (StringPtr) "\p") == ok);
#endif
break;
case paramErr:
case memFullErr:
case nsDrvErr:
case tmfoErr:
default:
ParamText ((StringPtr)
"\pThe floppy disk could not be formatted because an error occurred.",
0, 0, 0);
#ifdef THINK_C
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
#else
StopAlert (FOUR_PARAM_ALERT, (ModalFilterUPP) 0);
#endif
doit = false;
break;
}
if (doit)
{
dp = GetNewDialog (NAMEVOLDIALOG, 0, (WindowPtr) - 1);
MoveWindow (dp, (qd.screenBits.bounds.right - qd.screenBits.bounds.left -
dp->portRect.right + dp->portRect.left) / 2, 80, true);
ShowWindow (dp);
SelectWindow (dp);
#ifdef THINK_C
ModalDialog ((ProcPtr) 0, &itemhit);
#else
ModalDialog ((ModalFilterUPP) 0, &itemhit);
#endif
GetDItem (dp, VOLNAMEITEM, &type, &h, &r);
GetIText (h, s);
ParamText (s, 0, 0, 0);
EraseRect (&r);
OffsetRect (&r, -1000, -1000);
SetDItem (dp, VOLNAMEITEM, type, h, &r);
GetDItem (dp, FORMATTEXTITEM, &type, &h, &r);
SetIText (h, (StringPtr) "\pFormatting Disk ^0.");
e = DIFormat (FLOPPYDRIVE);
if (e != noErr)
{
ParamText ((StringPtr) "\pThe format failed.", 0, 0, 0);
#ifdef THINK_C
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
#else
StopAlert (FOUR_PARAM_ALERT, (ModalFilterUPP) 0);
#endif
DisposeDialog (dp);
/*-->*/ return;
}
SetIText (h, (StringPtr) "\pVerifying Disk ^0.");
e = DIVerify (FLOPPYDRIVE);
if (e != noErr)
{
ParamText ((StringPtr) "\pThe format could not be verified.", 0, 0, 0);
#ifdef THINK_C
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
#else
StopAlert (FOUR_PARAM_ALERT, (ModalFilterUPP) 0);
#endif
DisposeDialog (dp);
/*-->*/ return;
}
SetIText (h, (StringPtr) "\pInitializing Disk ^0.");
e = DIZero (FLOPPYDRIVE, s);
if (e != noErr)
{
ParamText ((StringPtr) "\pZeroing the disk failed.", 0, 0, 0);
#ifdef THINK_C
StopAlert (FOUR_PARAM_ALERT, (ProcPtr) 0);
#else
StopAlert (FOUR_PARAM_ALERT, (ModalFilterUPP) 0);
#endif
}
DisposeDialog (dp);
pb.ioParam.ioVRefNum = FLOPPYDRIVE;
e = PBMountVol (&pb);
}
resetvolumes ();
}
OSErr
get_HParamBlockRec_from_ControlHandle (HParamBlockRec * hpbp, ControlHandle c)
{
Str255 s;
mystr255copy (s, (*c)->contrlTitle);
hpbp->volumeParam.ioNamePtr = s;
hpbp->volumeParam.ioVRefNum = 0;
hpbp->volumeParam.ioVolIndex = -1;
return PBHGetVInfo (hpbp, false);
}
void
goeject ()
{
ParamBlockRec pb;
OSErr e;
short vrefnum;
WindowPeek wp, nextwp;
ControlHandle c;
HParamBlockRec hpb;
e = get_HParamBlockRec_from_ControlHandle (&hpb, (**g_selection)[0]);
if (e == noErr)
{
vrefnum = hpb.volumeParam.ioVRefNum;
#ifdef THINK_C
for (wp = WindowList; wp != 0; wp = nextwp)
{
#else
for (wp = LMGetWindowList (); wp != 0; wp = nextwp)
{
#endif
nextwp = wp->nextWindow;
if ((WindowPtr) wp != g_hotband && wp->windowKind == userKind &&
(*(opendirinfo **) wp->refCon)->vrefnum == vrefnum)
{
disposedirwindow (wp);
}
}
pb.ioParam.ioVRefNum = vrefnum;
pb.ioParam.ioNamePtr = 0;
e = PBEject (&pb);
/* FIXME - shouldn't we complain if this fails? */
if (e == noErr)
e = UnmountVol (0, vrefnum);
if (e == noErr)
disable_menu_item (eject_menuid);
resetvolumes ();
}
}