home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 1
/
GoldFishApril1994_CD1.img
/
d2xx
/
d242
/
filereq
/
filereq.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-08-30
|
39KB
|
1,314 lines
/****************************************************************************
* *
* File Requester *
* *
* (c) Copyright 1989 Jonathan Potter *
* *
* This program is freely redistributable, although all rights to it remain *
* with the author. It may be used freely in any program as long as this *
* notice remains intact, however, if you do this, please mention the *
* author in the program. If you wish to use this in a commercial program *
* of any kind, you must register with a $15 donation. *
* Please send donations, bug reports, comments and suggestions to : *
* *
* Jonathan Potter *
* 3 William Street *
* Clarence Park 5034 *
* South Australia *
* Australia *
* *
* Ph : (08) 2932788 home *
* *
****************************************************************************/
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuitionbase.h>
#include <libraries/dosextens.h>
#include <graphics/gfxbase.h>
#include "filereq.h"
#define FILEBASE 1
#define DEVICEBASE 6
#define DRAWERBASE 11
#define FILENAME 16
#define DRAWERNAME 17
#define DEVICENAME 18
#define FILENAMEUP 19
#define DRAWERUP 20
#define DEVICEUP 21
#define FILENAMEDOWN 22
#define DRAWERDOWN 23
#define DEVICEDOWN 24
#define FILENAMEPOS 25
#define DRAWERPOS 26
#define DEVICEPOS 27
#define OKAY 28
#define CANCEL 29
#define RENAME 30
#define DELETE 31
#define MAKEDIR 32
#define PARENT 33
#define SUPEROKAY 34
/* Image-Ed Sprite generation */
/* Start of Sprite Data */
static USHORT BusySpriteData[]={
0x0000, 0x0000,
0x3c00, 0x3c00,
0x7e00, 0x4200,
0x7e00, 0x4200,
0x7e00, 0x4200,
0x7e00, 0x4200,
0x7e00, 0x7e00,
0xff00, 0x8100,
0xef00, 0x9100,
0xef00, 0x9100,
0xe300, 0x9d00,
0xff00, 0x8100,
0xff00, 0x8100,
0x7e00, 0x7e00,
0x7e00, 0x4200,
0x7e00, 0x4200,
0x7eee, 0x42ee,
0x7eaa, 0x42ee,
0x3cee, 0x3cee,
0xffff, 0xffff
};
/* End of Sprite Data */
/* End of Image-Ed Sprite generation */
/* Image-Ed Image generation */
/* Start of Image data */
static USHORT UpArrow1ImageData[]={
/* Plane 0 */
0x0040, 0x0000, 0x01f0, 0x0000, 0x07fc, 0x0000, 0x1fff, 0x0000,
0x7fff, 0xc000, 0xffff, 0xe000, 0x03f8, 0x0000, 0x03f8, 0x0000,
0x03f8, 0x0000, 0x03f8, 0x0000,
/* Plane 1 */
0x0030, 0x0000, 0x000c, 0x0000, 0x0003, 0x0000, 0x0000, 0xc000,
0x0000, 0x3000, 0x0000, 0x1800, 0x0006, 0x0000, 0x0006, 0x0000,
0x0006, 0x0000, 0x0006, 0x0000
};
/* End of Image data */
static struct Image UpArrow1Image={
0,0, /* LeftEdge, TopEdge */
21,10,2, /* Width, Height, Depth */
&UpArrow1ImageData[0], /* ImageData */
0x3,0x0, /* PlanePick, PlaneOnOff */
NULL /* Next Image */
};
/* Start of Image data */
static USHORT UpArrow2ImageData[]={
/* Plane 0 */
0x0010, 0x0000, 0x007c, 0x0000, 0x01ff, 0x0000, 0x07ff, 0xc000,
0x1fff, 0xf000, 0x3fff, 0xf800, 0x00fe, 0x0000, 0x00fe, 0x0000,
0x00fe, 0x0000, 0x00fe, 0x0000,
/* Plane 1 */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000
};
/* End of Image data */
static struct Image UpArrow2Image={
0,0, /* LeftEdge, TopEdge */
21,10,2, /* Width, Height, Depth */
&UpArrow2ImageData[0], /* ImageData */
0x3,0x0, /* PlanePick, PlaneOnOff */
NULL /* Next Image */
};
/* Start of Image data */
static USHORT DownArrow1ImageData[]={
/* Plane 0 */
0x03f8, 0x0000, 0x03f8, 0x0000, 0x03f8, 0x0000, 0x03f8, 0x0000,
0xffff, 0xe000, 0x7fff, 0xc000, 0x1fff, 0x0000, 0x07fc, 0x0000,
0x01f0, 0x0000, 0x0040, 0x0000,
/* Plane 1 */
0x0006, 0x0000, 0x0006, 0x0000, 0x0006, 0x0000, 0x0006, 0x0000,
0x0000, 0x1800, 0x0000, 0x3000, 0x0000, 0xc000, 0x0003, 0x0000,
0x000c, 0x0000, 0x0030, 0x0000
};
/* End of Image data */
static struct Image DownArrow1Image={
0,0, /* LeftEdge, TopEdge */
21,10,2, /* Width, Height, Depth */
&DownArrow1ImageData[0], /* ImageData */
0x3,0x0, /* PlanePick, PlaneOnOff */
NULL /* Next Image */
};
/* Start of Image data */
static USHORT DownArrow2ImageData[]={
/* Plane 0 */
0x00fe, 0x0000, 0x00fe, 0x0000, 0x00fe, 0x0000, 0x00fe, 0x0000,
0x3fff, 0xf800, 0x1fff, 0xf000, 0x07ff, 0xc000, 0x01ff, 0x0000,
0x007c, 0x0000, 0x0010, 0x0000,
/* Plane 1 */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000
};
/* End of Image data */
static struct Image DownArrow2Image={
0,0, /* LeftEdge, TopEdge */
21,10,2, /* Width, Height, Depth */
&DownArrow2ImageData[0], /* ImageData */
0x3,0x0, /* PlanePick, PlaneOnOff */
NULL /* Next Image */
};
/* End of Image-Ed Image generation */
static struct TextAttr TopazText={
(STRPTR)"topaz.font",8,0,0};
static char filenamebuffer[32], drawernamebuffer[236], devicenamebuffer[32];
static char filetextbuffer[5][16], drawertextbuffer[5][16], devicetextbuffer[5][16];
static short border1_xy[]={
-1,-1,120,-1,120,40,-1,40,-1,-1};
static struct Border border1={
0,0,2,0,JAM1,5,border1_xy,NULL};
static short border2_xy[]={
-1,-1,120,-1,120,8,-1,8,-1,-1};
static struct Border border2={
0,0,2,0,JAM1,5,border2_xy,NULL};
static struct PropInfo
filenameprop={AUTOKNOB|FREEVERT,0,0,0,0x1000},
drawerprop={AUTOKNOB|FREEVERT,0,0,0,0x1000},
deviceprop={AUTOKNOB|FREEVERT,0,0,0,0x1000};
static struct Image filenameimage, drawerimage, deviceimage;
static struct StringInfo
filenamesinfo={(STRPTR)filenamebuffer,NULL,0,32,0},
drawernamesinfo={(STRPTR)drawernamebuffer,NULL,0,236,0},
devicenamesinfo={(STRPTR)devicenamebuffer,NULL,0,32,0};
static struct IntuiText
filetext[5]={
{1,0,JAM2,0,0,&TopazText,(STRPTR)filetextbuffer[0],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)filetextbuffer[1],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)filetextbuffer[2],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)filetextbuffer[3],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)filetextbuffer[4],NULL}},
drawertext[5]={
{1,0,JAM2,0,0,&TopazText,(STRPTR)drawertextbuffer[0],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)drawertextbuffer[1],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)drawertextbuffer[2],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)drawertextbuffer[3],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)drawertextbuffer[4],NULL}},
devicetext[5]={
{1,0,JAM2,0,0,&TopazText,(STRPTR)devicetextbuffer[0],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)devicetextbuffer[1],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)devicetextbuffer[2],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)devicetextbuffer[3],NULL},
{1,0,JAM2,0,0,&TopazText,(STRPTR)devicetextbuffer[4],NULL}},
filenametext={
3,1,JAM2,44,-54,&TopazText,(UBYTE *)"File",NULL},
drawernametext={
3,1,JAM2,36,-54,&TopazText,(UBYTE *)"Drawer",NULL},
devicenametext={
3,1,JAM2,36,-54,&TopazText,(UBYTE *)"Volume",NULL},
parenttext={
3,2,JAM2,0,0,&TopazText,(UBYTE *)" PARENT ",NULL},
okaytext={
3,2,JAM2,0,0,&TopazText,(UBYTE *)" OKAY ",NULL},
canceltext={
3,2,JAM2,0,0,&TopazText,(UBYTE *)" CANCEL ",NULL},
renametext={
3,2,JAM2,0,0,&TopazText,(UBYTE *)" RENAME ",NULL},
deletetext={
3,2,JAM2,0,0,&TopazText,(UBYTE *)" DELETE ",NULL},
makedirtext={
3,2,JAM2,0,0,&TopazText,(UBYTE *)" MAKE DIR ",NULL};
static struct Gadget
filegadget[5]={
{&filegadget[1],10,23,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border1,NULL,
&filetext[0],NULL,NULL,FILEBASE,NULL},
{&filegadget[2],10,31,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&filetext[1],NULL,NULL,FILEBASE+1,NULL},
{&filegadget[3],10,39,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&filetext[2],NULL,NULL,FILEBASE+2,NULL},
{&filegadget[4],10,47,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&filetext[3],NULL,NULL,FILEBASE+3,NULL},
{NULL,10,55,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&filetext[4],NULL,NULL,FILEBASE+4,NULL}},
devicegadget[5]={
{&devicegadget[1],10,90,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border1,NULL,
&devicetext[0],NULL,NULL,DEVICEBASE,NULL},
{&devicegadget[2],10,98,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&devicetext[1],NULL,NULL,DEVICEBASE+1,NULL},
{&devicegadget[3],10,106,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&devicetext[2],NULL,NULL,DEVICEBASE+2,NULL},
{&devicegadget[4],10,114,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&devicetext[3],NULL,NULL,DEVICEBASE+3,NULL},
{&filegadget[0],10,122,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&devicetext[4],NULL,NULL,DEVICEBASE+4,NULL}},
drawergadget[5]={
{&drawergadget[1],159,23,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border1,NULL,
&drawertext[0],NULL,NULL,DRAWERBASE,NULL},
{&drawergadget[2],159,31,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&drawertext[1],NULL,NULL,DRAWERBASE+1,NULL},
{&drawergadget[3],159,39,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&drawertext[2],NULL,NULL,DRAWERBASE+2,NULL},
{&drawergadget[4],159,47,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&drawertext[3],NULL,NULL,DRAWERBASE+3,NULL},
{&devicegadget[0],159,55,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,NULL,NULL,
&drawertext[4],NULL,NULL,DRAWERBASE+4,NULL}},
filenamegadget={
&drawergadget[0],10,67,120,8,GADGHCOMP,RELVERIFY|TOGGLESELECT,STRGADGET,
(APTR)&border2,NULL,&filenametext,NULL,(APTR)&filenamesinfo,FILENAME,NULL},
drawernamegadget={
&filenamegadget,159,67,120,8,GADGHCOMP,RELVERIFY|TOGGLESELECT,STRGADGET,
(APTR)&border2,NULL,&drawernametext,NULL,(APTR)&drawernamesinfo,DRAWERNAME,NULL},
devicenamegadget={
&drawernamegadget,10,134,120,8,GADGHCOMP,RELVERIFY|TOGGLESELECT,STRGADGET,
(APTR)&border2,NULL,&devicenametext,NULL,(APTR)&devicenamesinfo,DEVICENAME,NULL},
filenameupgadget={
&devicenamegadget,134,23,21,10,GADGHIMAGE|GADGIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
(APTR)&UpArrow1Image,(APTR)&UpArrow2Image,NULL,NULL,NULL,FILENAMEUP,NULL},
drawerupgadget={
&filenameupgadget,283,23,21,10,GADGHIMAGE|GADGIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
(APTR)&UpArrow1Image,(APTR)&UpArrow2Image,NULL,NULL,NULL,DRAWERUP,NULL},
deviceupgadget={
&drawerupgadget,134,90,21,10,GADGHIMAGE|GADGIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
(APTR)&UpArrow1Image,(APTR)&UpArrow2Image,NULL,NULL,NULL,DEVICEUP,NULL},
filedowngadget={
&deviceupgadget,134,65,21,10,GADGHIMAGE|GADGIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
(APTR)&DownArrow1Image,(APTR)&DownArrow2Image,NULL,NULL,NULL,FILENAMEDOWN,NULL},
drawerdowngadget={
&filedowngadget,283,65,21,10,GADGHIMAGE|GADGIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
(APTR)&DownArrow1Image,(APTR)&DownArrow2Image,NULL,NULL,NULL,DRAWERDOWN,NULL},
devicedowngadget={
&drawerdowngadget,134,132,21,10,GADGHIMAGE|GADGIMAGE,GADGIMMEDIATE|RELVERIFY,BOOLGADGET,
(APTR)&DownArrow1Image,(APTR)&DownArrow2Image,NULL,NULL,NULL,DEVICEDOWN,NULL},
filenamepropgadget={
&devicedowngadget,134,34,21,30,GADGHCOMP,GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY,PROPGADGET,
(APTR)&filenameimage,NULL,NULL,NULL,(APTR)&filenameprop,FILENAMEPOS,NULL},
drawerpropgadget={
&filenamepropgadget,283,34,21,30,GADGHCOMP,GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY,PROPGADGET,
(APTR)&drawerimage,NULL,NULL,NULL,(APTR)&drawerprop,DRAWERPOS,NULL},
devicepropgadget={
&drawerpropgadget,134,101,21,30,GADGHCOMP,GADGIMMEDIATE|FOLLOWMOUSE|RELVERIFY,PROPGADGET,
(APTR)&deviceimage,NULL,NULL,NULL,(APTR)&deviceprop,DEVICEPOS,NULL},
parentgadget={
&devicepropgadget,159,79,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border2,NULL,
&parenttext,NULL,NULL,PARENT,NULL},
okaygadget={
&parentgadget,159,90,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border2,NULL,
&okaytext,NULL,NULL,OKAY,NULL},
cancelgadget={
&okaygadget,159,101,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border2,NULL,
&canceltext,NULL,NULL,CANCEL,NULL},
renamegadget={
&cancelgadget,159,112,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border2,NULL,
&renametext,NULL,NULL,RENAME,NULL},
deletegadget={
&renamegadget,159,123,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border2,NULL,
&deletetext,NULL,NULL,DELETE,NULL},
makedirgadget={
&deletegadget,159,134,120,8,GADGHCOMP,RELVERIFY,BOOLGADGET,(APTR)&border2,NULL,
&makedirtext,NULL,NULL,MAKEDIR,NULL};
static struct NewWindow fr_window={
8,25,311,147,1,3,
GADGETUP|GADGETDOWN|MOUSEMOVE|MOUSEBUTTONS|DISKINSERTED|DISKREMOVED,
SMART_REFRESH|NOCAREREFRESH|ACTIVATE|RMBTRAP,
NULL,NULL,(STRPTR)"File request",NULL,NULL,0,0,0,0,CUSTOMSCREEN};
static struct Window *fr_Window;
static struct IntuiMessage *fr_Msg;
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct DosLibrary *DosBase;
static struct direntry {
struct direntry *next;
char name[35];
};
static struct direntry
*FirstFileEntry, *FileEntry,
*FirstDrawerEntry, *DrawerEntry,
*FirstDeviceEntry, *DeviceEntry;
static int deviceentries=0, fileentries=0, drawerentries=0;
static int deviceoffset=0, fileoffset=0, draweroffset=0;
static int olddeviceoffset=-1, oldfileoffset=-1, olddraweroffset=-1;
static char *nullstring=" ";
static BOOL SortOn;
file_request(dest_scr,hail,x,y,device,directory,filename,so)
struct Screen *dest_scr;
char *hail;
int x,y;
char *device, *directory, *filename;
BOOL so;
{
int Class, Code, GadgetID, i;
SortOn=so;
if (!IntuitionBase) return(NO_INTUITION);
if (!GfxBase) return(NO_GRAPHICS);
if (!DosBase) return(NO_DOS);
if (!directory) return(NO_DIRECTORY);
if (!filename) return(NO_FILENAME);
if (!device) return(NO_DEVICE);
if (!dest_scr) fr_window.Type=WBENCHSCREEN;
else fr_window.Screen=dest_scr;
if (x>-1 && fr_window.Screen->Width>=x+fr_window.Width) fr_window.LeftEdge=x;
if (y>-1 && fr_window.Screen->Height>=y+fr_window.Height) fr_window.TopEdge=y;
if (hail) fr_window.Title=hail;
strncpy(filenamebuffer,filename,32);
strncpy(drawernamebuffer,directory,236);
strncpy(devicenamebuffer,device,32);
if (strlen(devicenamebuffer)==0) strcpy(devicenamebuffer,":");
fr_Window=(struct Window *) OpenWindow(&fr_window);
if (!fr_Window) return(OPENWINDOW_FAILED);
SetAPen(fr_Window->RPort,1);
RectFill(fr_Window->RPort,3,11,307,144);
SetAPen(fr_Window->RPort,0);
RectFill(fr_Window->RPort,10,90,129,129);
RectFill(fr_Window->RPort,10,23,129,62);
RectFill(fr_Window->RPort,159,23,278,62);
AddGList(fr_Window,&makedirgadget,-1,-1,35,NULL);
RefreshGList(&makedirgadget,fr_Window,NULL,-1);
SetAPen(fr_Window->RPort,1);
ActivateGadget(&filenamegadget,fr_Window,NULL);
i=get_devicenames();
if (i==CANCEL) {
close_req();
goto quit_req;
}
if (i==OKAY || i==SUPEROKAY) {
close_req();
goto do_okay;
}
i=get_filenames();
if (i==CANCEL) {
close_req();
goto quit_req;
}
if (i==OKAY || i==SUPEROKAY) {
close_req();
goto do_okay;
}
FOREVER {
Wait(1<<fr_Window->UserPort->mp_SigBit);
while (fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort)) {
Class=fr_Msg->Class; Code=fr_Msg->Code;
if (Class==GADGETDOWN || Class==GADGETUP)
GadgetID=((struct Gadget *) fr_Msg->IAddress)->GadgetID;
ReplyMsg((struct Message *) fr_Msg);
i=do_idcmp(Class,Code,GadgetID);
if (i==CANCEL) {
close_req();
goto quit_req;
break;
}
if (i==OKAY || i==SUPEROKAY) {
close_req();
goto do_okay;
}
}
}
quit_req:
return(FALSE);
do_okay:
strcpy(device,devicenamebuffer);
strcpy(directory,drawernamebuffer);
strcpy(filename,filenamebuffer);
return(TRUE);
}
static close_req()
{
if (fr_Window) CloseWindow(fr_Window);
deallocate_entries(7);
return(0);
}
static DOSDisk(device)
struct DeviceList *device;
{
struct MsgPort *port;
BOOL result;
struct InfoData *info;
struct StandardPacket *packet;
result=FALSE;
info=(struct InfoData *) AllocMem(sizeof(struct InfoData),MEMF_CLEAR);
packet=(struct StandardPacket *) AllocMem(sizeof(struct StandardPacket),MEMF_CLEAR);
port=(struct MsgPort *) CreatePort(NULL,0);
if (port&&info&&packet) {
packet->sp_Msg.mn_Node.ln_Type=NT_MESSAGE;
packet->sp_Msg.mn_Node.ln_Name=(char *)&packet->sp_Pkt;
packet->sp_Msg.mn_ReplyPort=port;
packet->sp_Pkt.dp_Link=&packet->sp_Msg;
packet->sp_Pkt.dp_Type=ACTION_DISK_INFO;
packet->sp_Pkt.dp_Arg1=((LONG)info>>2);
packet->sp_Pkt.dp_Port=port;
PutMsg(device->dl_Task,&packet->sp_Msg);
WaitPort(port);
if (info->id_DiskType==ID_DOS_DISK) result=TRUE;
}
if (port) DeletePort(port);
if (info) FreeMem(info, sizeof(struct InfoData));
if (packet) FreeMem(packet, sizeof(struct StandardPacket));
return(result);
}
static get_devicenames()
{
struct RootNode *rootnode;
struct DosInfo *dosinfo;
struct DeviceList *devlist;
struct FileLock *lock;
struct InfoData *data;
struct FileInfoBlock *finfo;
UBYTE devname[32];
int Class, Code, GadgetID;
int ret=0;
FirstDeviceEntry=NULL; DeviceEntry=NULL;
data=(struct InfoData *)AllocMem(sizeof(struct InfoData),MEMF_CLEAR);
finfo=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR);
rootnode=(struct RootNode *) DosBase->dl_Root;
dosinfo=(struct DosInfo *) BADDR(rootnode->rn_Info);
Forbid();
busy();
devlist=(struct DeviceList *) BADDR(dosinfo->di_DevInfo);
while (devlist) {
while (fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort)) {
Class=fr_Msg->Class; Code=fr_Msg->Code;
if (Class==GADGETDOWN || Class==GADGETUP)
GadgetID=((struct Gadget *) fr_Msg->IAddress)->GadgetID;
ReplyMsg((struct Message *) fr_Msg);
if (Class==GADGETUP && do_idtype(GadgetID)) goto defin;
unbusy();
ret=do_idcmp(Class,Code,GadgetID);
busy();
if (ret==SUPEROKAY) goto fin;
}
if (devlist->dl_Type!=DLT_DEVICE || !devlist->dl_Task) {
devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
continue;
}
if (!DOSDisk(devlist)) {
devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
continue;
}
conbstr((BPTR)devlist->dl_Name,devname);
strcat(devname,":");
lock=(struct FileLock *) Lock(devname,ACCESS_READ);
if (lock==NULL) goto fin;
Info(lock,data);
Examine(lock,finfo);
if (FirstDeviceEntry==NULL) {
FirstDeviceEntry=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
strncpy(FirstDeviceEntry->name,finfo->fib_FileName,32);
strcat(FirstDeviceEntry->name,":");
DeviceEntry=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
FirstDeviceEntry->next=DeviceEntry;
strncpy(DeviceEntry->name,devname,32);
deviceentries+=2;
}
else {
DeviceEntry->next=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
DeviceEntry=DeviceEntry->next;
strncpy(DeviceEntry->name,finfo->fib_FileName,32);
strcat(DeviceEntry->name,":");
DeviceEntry->next=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
DeviceEntry=DeviceEntry->next;
strncpy(DeviceEntry->name,devname,32);
deviceentries+=2;
}
UnLock(lock);
devlist=(struct DeviceList *) BADDR(devlist->dl_Next);
DeviceEntry->next=NULL;
DisplayDevices(FALSE);
}
goto fin;
defin:
unbusy();
ret=do_idcmp(Class,Code,GadgetID);
fin:
Permit();
if (data) FreeMem(data,sizeof(struct InfoData));
if (finfo) FreeMem(finfo,sizeof(struct FileInfoBlock));
if (deviceentries && SortOn) Sort(FirstDeviceEntry,deviceentries);
olddeviceoffset=-1;
DisplayDevices(TRUE);
unbusy();
return(ret);
}
static DisplayDevices(clear)
BOOL clear;
{
struct direntry *work;
int a,b;
if (deviceoffset==olddeviceoffset && clear) return(0);
olddeviceoffset=deviceoffset;
if (clear) {
SetAPen(fr_Window->RPort,0);
RectFill(fr_Window->RPort,10,90,129,129);
SetAPen(fr_Window->RPort,1);
}
work=FirstDeviceEntry;
for (a=0;a<deviceoffset;a++) {
work=work->next;
if (!work) return(0);
}
for (b=0;b<5;b++) {
strncpy(devicetextbuffer[b],work->name,15);
if (!work) strncpy(devicetextbuffer[b],nullstring,15);
work=work->next;
}
RefreshGList(&devicegadget[0],fr_Window,NULL,5);
}
static conbstr(in,out)
BSTR in;
char *out;
{
register UBYTE *ch;
register int len,i;
ch=(UBYTE *) BADDR(in);
len=(int) *(ch++);
len=(len>20)?20:len;
for (i=0;i<len;i++) out[i]=*(ch++);
out[i]='\0';
return(0);
}
static get_filenames()
{
struct FileLock *lock;
struct FileInfoBlock *finfo;
int Class, Code, GadgetID;
int ret;
char directory[400];
strcpy(directory,devicenamebuffer);
strcat(directory,drawernamebuffer);
FirstFileEntry=NULL; FirstDrawerEntry=NULL;
FileEntry=NULL; DrawerEntry=NULL;
finfo=(struct FileInfoBlock *) AllocMem(sizeof(struct FileInfoBlock),MEMF_CLEAR);
busy();
Forbid();
lock=(struct FileLock *) Lock(directory,ACCESS_READ);
if (lock==NULL) goto fin;
Examine(lock,finfo);
while (ExNext(lock,finfo)) {
while (fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort)) {
Class=fr_Msg->Class; Code=fr_Msg->Code;
if (Class==GADGETDOWN || Class==GADGETUP)
GadgetID=((struct Gadget *) fr_Msg->IAddress)->GadgetID;
ReplyMsg((struct Message *) fr_Msg);
if (Class==GADGETUP && do_idtype(GadgetID)) goto defin;
unbusy();
ret=do_idcmp(Class,Code,GadgetID);
busy();
if (ret==SUPEROKAY) goto fin;
}
if (finfo->fib_DirEntryType>0) {
if (FirstDrawerEntry==NULL) {
FirstDrawerEntry=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
strncpy(FirstDrawerEntry->name,finfo->fib_FileName,32);
DrawerEntry=FirstDrawerEntry;
++drawerentries;
}
else {
DrawerEntry->next=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
DrawerEntry=DrawerEntry->next;
strncpy(DrawerEntry->name,finfo->fib_FileName,32);
++drawerentries;
}
DrawerEntry->next=NULL;
DisplayDrawers(FALSE);
}
else {
if (FirstFileEntry==NULL) {
FirstFileEntry=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
strncpy(FirstFileEntry->name,finfo->fib_FileName,32);
FileEntry=FirstFileEntry;
++fileentries;
}
else {
FileEntry->next=(struct direntry *) AllocMem((sizeof(struct direntry)),MEMF_CLEAR);
FileEntry=FileEntry->next;
strncpy(FileEntry->name,finfo->fib_FileName,32);
++fileentries;
}
FileEntry->next=NULL;
DisplayFiles(FALSE);
}
}
defin:
unbusy();
ret=do_idcmp(Class,Code,GadgetID);
busy();
fin:
if (lock) UnLock(lock);
Permit();
if (finfo) FreeMem(finfo,sizeof(struct FileInfoBlock));
if (drawerentries && SortOn) Sort(FirstDrawerEntry,drawerentries);
if (fileentries && SortOn) Sort(FirstFileEntry,fileentries);
olddraweroffset=-1; oldfileoffset=-1;
DisplayDrawers(TRUE); DisplayFiles(TRUE);
unbusy();
return(ret);
}
static DisplayFiles(clear)
BOOL clear;
{
struct direntry *work;
int a,b;
if (fileoffset==oldfileoffset && clear) return(0);
oldfileoffset=fileoffset;
if (clear) {
SetAPen(fr_Window->RPort,0);
RectFill(fr_Window->RPort,10,23,129,62);
SetAPen(fr_Window->RPort,1);
}
work=FirstFileEntry;
for (a=0;a<fileoffset;a++) {
work=work->next;
if (!work) return(0);
}
for (b=0;b<5;b++) {
strncpy(filetextbuffer[b],work->name,15);
if (!work) strncpy(filetextbuffer[b],nullstring,15);
work=work->next;
}
RefreshGList(&filegadget[0],fr_Window,NULL,5);
}
static DisplayDrawers(clear)
BOOL clear;
{
struct direntry *work;
int a,b;
if (draweroffset==olddraweroffset && clear) return(0);
olddraweroffset=draweroffset;
if (clear) {
SetAPen(fr_Window->RPort,0);
RectFill(fr_Window->RPort,159,23,278,62);
SetAPen(fr_Window->RPort,1);
}
work=FirstDrawerEntry;
for (a=0;a<draweroffset;a++) {
work=work->next;
if (!work) return(0);
}
for (b=0;b<5;b++) {
strncpy(drawertextbuffer[b],work->name,15);
if (!work) strncpy(drawertextbuffer[b],nullstring,15);
work=work->next;
}
RefreshGList(&drawergadget[0],fr_Window,NULL,5);
}
static deallocate_entries(which)
int which;
{
struct direntry *work;
if (which&1) {
work=FirstDeviceEntry;
while (work) {
DeviceEntry=work->next;
if (work) FreeMem(work,(sizeof(struct direntry)));
work=DeviceEntry;
}
FirstDeviceEntry=NULL; DeviceEntry=NULL;
deviceentries=0; deviceoffset=0; olddeviceoffset=-1;
}
if (which&2) {
work=FirstDrawerEntry;
while (work) {
DrawerEntry=work->next;
if (work) FreeMem(work,(sizeof(struct direntry)));
work=DrawerEntry;
}
FirstDrawerEntry=NULL; DrawerEntry=NULL;
drawerentries=0; draweroffset=0; olddraweroffset=-1;
}
if (which&4) {
work=FirstFileEntry;
while (work) {
FileEntry=work->next;
if (work) FreeMem(work,(sizeof(struct direntry)));
work=FileEntry;
}
FirstFileEntry=NULL; FileEntry=NULL;
fileentries=0; fileoffset=0; oldfileoffset=-1;
}
return(0);
}
static doposprop(vertpot,wp)
long vertpot;
int wp;
{
register int i,a;
if (wp==0) a=deviceentries;
else if (wp==1) a=drawerentries;
else a=fileentries;
i=(a-5)*vertpot/0xffff;
if (i>(a-5)) i=a-5;
if (i<0) i=0;
if (wp==0) {
deviceoffset=i;
DisplayDevices(TRUE);
}
else if (wp==1) {
draweroffset=i;
DisplayDrawers(TRUE);
}
else {
fileoffset=i;
DisplayFiles(TRUE);
}
return(0);
}
static getnewdevice()
{
if (strlen(devicenamebuffer)==0) {
strcpy(devicenamebuffer,":");
RefreshGList(&devicenamegadget,fr_Window,NULL,1);
}
if (strlen(devicenamebuffer)>0) {
if (devicenamebuffer[(strlen(devicenamebuffer)-1)]!=':') {
strcat(devicenamebuffer,":");
RefreshGList(&devicenamegadget,fr_Window,NULL,1);
}
}
deallocate_entries(6);
drawernamebuffer[0]='\0';
RefreshGList(&drawernamegadget,fr_Window,NULL,1);
DisplayDrawers(TRUE);
DisplayFiles(TRUE);
return(get_filenames());
}
static getnewdrawer()
{
if (strlen(drawernamebuffer)>0) {
if (drawernamebuffer[(strlen(drawernamebuffer)-1)]!='/') {
strcat(drawernamebuffer,"/");
RefreshGList(&drawernamegadget,fr_Window,NULL,1);
}
}
ActivateGadget(&filenamegadget,fr_Window,NULL);
deallocate_entries(6);
DisplayFiles(TRUE);
DisplayDrawers(TRUE);
return(get_filenames());
}
static do_parent()
{
int i,b;
if (strlen(drawernamebuffer)==0) return(0);
i=strlen(drawernamebuffer)-1;
if (drawernamebuffer[i]=='/') --i;
for (b=i;b>-1;b--) if (drawernamebuffer[b]=='/') break;
if (b<0) b=0;
drawernamebuffer[b]='\0';
RefreshGList(&drawernamegadget,fr_Window,NULL,1);
return(getnewdrawer());
}
static getnew_drawer(which)
int which;
{
int i,b;
struct direntry *work;
i=draweroffset+which;
work=FirstDrawerEntry;
if (!work) return(FALSE);
for (b=0;b<i;b++) work=work->next;
if (!work) return(FALSE);
if (strlen(drawernamebuffer)+strlen(work->name)>236) return(FALSE);
strcat(drawernamebuffer,work->name);
RefreshGList(&drawernamegadget,fr_Window,NULL,1);
return(getnewdrawer());
}
static getnew_device(which)
int which;
{
int i,b;
struct direntry *work;
i=deviceoffset+which;
work=FirstDeviceEntry;
if (!work) return(FALSE);
for (b=0;b<i;b++) work=work->next;
if (!work) return(FALSE);
strcpy(devicenamebuffer,work->name);
RefreshGList(&devicenamegadget,fr_Window,NULL,1);
return(getnewdevice());
}
static getnew_file(which)
int which;
{
int i,b;
struct direntry *work;
i=fileoffset+which;
work=FirstFileEntry;
if (!work) return(FALSE);
for (b=0;b<i;b++) work=work->next;
if (!work) return(FALSE);
if ((strcmp(filenamebuffer,work->name))==0) return(SUPEROKAY);
strcpy(filenamebuffer,work->name);
RefreshGList(&filenamegadget,fr_Window,NULL,1);
return(FALSE);
}
static do_idtype(GadgetID)
int GadgetID;
{
switch (GadgetID) {
case CANCEL:
case OKAY:
case FILENAME:
case DRAWERNAME:
case DEVICENAME:
case DRAWERBASE:
case DRAWERBASE+1:
case DRAWERBASE+2:
case DRAWERBASE+3:
case DRAWERBASE+4:
case DEVICEBASE:
case DEVICEBASE+1:
case DEVICEBASE+2:
case DEVICEBASE+3:
case DEVICEBASE+4:
case RENAME:
case DELETE:
case MAKEDIR:
case PARENT:
return(TRUE);
default:
return(FALSE);
}
}
static do_idcmp(Class,Code,GadgetID)
int Class, Code, GadgetID;
{
int ret;
fr_Msg=NULL;
switch (Class) {
case GADGETDOWN:
case MOUSEMOVE:
switch (GadgetID) {
case FILENAMEPOS:
doposprop((filenameprop.VertPot),2);
break;
case DRAWERPOS:
doposprop((drawerprop.VertPot),1);
break;
case DEVICEPOS:
doposprop((deviceprop.VertPot),0);
break;
case FILENAMEUP:
while (!(fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort))) {
if (fileoffset==0) break;
--fileoffset;
DisplayFiles(TRUE);
doprops(&filenamepropgadget,fileentries,fileoffset);
}
if (fr_Msg) ReplyMsg((struct Message *) fr_Msg);
break;
case FILENAMEDOWN:
while (!(fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort))) {
if (fileoffset>=fileentries-5) break;
++fileoffset;
DisplayFiles(TRUE);
doprops(&filenamepropgadget,fileentries,fileoffset);
}
if (fr_Msg) ReplyMsg((struct Message *) fr_Msg);
break;
case DRAWERUP:
while (!(fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort))) {
if (draweroffset==0) break;
--draweroffset;
DisplayDrawers(TRUE);
doprops(&drawerpropgadget,drawerentries,draweroffset);
}
if (fr_Msg) ReplyMsg((struct Message *) fr_Msg);
break;
case DRAWERDOWN:
while (!(fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort))) {
if (draweroffset>=drawerentries-5) break;
++draweroffset;
DisplayDrawers(TRUE);
doprops(&drawerpropgadget,drawerentries,draweroffset);
}
if (fr_Msg) ReplyMsg((struct Message *) fr_Msg);
break;
case DEVICEUP:
while (!(fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort))) {
if (deviceoffset==0) break;
--deviceoffset;
DisplayDevices(TRUE);
doprops(&devicepropgadget,deviceentries,deviceoffset);
}
if (fr_Msg) ReplyMsg((struct Message *) fr_Msg);
break;
case DEVICEDOWN:
while (!(fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort))) {
if (deviceoffset>=deviceentries-5) break;
++deviceoffset;
DisplayDevices(TRUE);
doprops(&devicepropgadget,deviceentries,deviceoffset);
}
if (fr_Msg) ReplyMsg((struct Message *) fr_Msg);
break;
}
if (GadgetID!=FILENAMEPOS && GadgetID!=DRAWERPOS && GadgetID!=DEVICEPOS)
ActivateGadget(&filenamegadget,fr_Window,NULL);
break;
case GADGETUP:
switch (GadgetID) {
case CANCEL:
ret=CANCEL;
break;
case OKAY:
ret=OKAY;
break;
case DRAWERNAME:
ret=getnewdrawer();
break;
case DEVICENAME:
ActivateGadget(&drawernamegadget,fr_Window,NULL);
ret=getnewdevice();
break;
case FILENAME:
ret=OKAY;
break;
case DRAWERBASE:
case DRAWERBASE+1:
case DRAWERBASE+2:
case DRAWERBASE+3:
case DRAWERBASE+4:
ret=getnew_drawer((GadgetID-DRAWERBASE));
break;
case DEVICEBASE:
case DEVICEBASE+1:
case DEVICEBASE+2:
case DEVICEBASE+3:
case DEVICEBASE+4:
ActivateGadget(&drawernamegadget,fr_Window,NULL);
ret=getnew_device((GadgetID-DEVICEBASE));
break;
case FILEBASE:
case FILEBASE+1:
case FILEBASE+2:
case FILEBASE+3:
case FILEBASE+4:
ret=getnew_file((GadgetID-FILEBASE));
break;
case PARENT:
do_parent();
ret=PARENT;
break;
case DELETE:
do_delete();
ret=DELETE;
break;
case RENAME:
do_rename();
ret=RENAME;
break;
case MAKEDIR:
do_makedir();
ret=MAKEDIR;
break;
}
switch (GadgetID) {
case DEVICENAME:
case DEVICEBASE:
case DEVICEBASE+1:
case DEVICEBASE+2:
case DEVICEBASE+3:
case DEVICEBASE+4:
ActivateGadget(&drawernamegadget,fr_Window,NULL);
break;
default:
ActivateGadget(&filenamegadget,fr_Window,NULL);
}
return(ret);
break;
case DISKINSERTED:
case DISKREMOVED:
deallocate_entries(1);
olddeviceoffset=-1;
DisplayDevices(TRUE);
get_devicenames();
break;
default:
if (!GadgetID) ActivateGadget(&filenamegadget,fr_Window,NULL);
break;
}
return(GadgetID);
}
static Sort(which,count)
struct direntry *which;
int count;
{
register int gap,i,j;
register struct direntry *file1, *file2;
char *hail;
hail=fr_Window->Title;
SetWindowTitles(fr_Window,"Please wait... Sorting...",-1);
busy();
for (gap=count/2;gap>0;gap/=2)
for (i=gap;i<count;i++)
for (j=i-gap;j>=0;j-=gap) {
file1=(struct direntry *) getentry(j,which);
file2=(struct direntry *) getentry((j+gap),which);
if (mystrcmp(file1->name,file2->name)<=0) break;
#ifdef LATTICE
swmem(file1->name,file2->name,32);
#else
swapmem(file1->name,file2->name,32);
#endif
}
SetWindowTitles(fr_Window,hail,-1);
unbusy();
return(0);
}
static getentry(h,which)
int h;
struct direntry *which;
{
struct direntry *work;
register int a;
work=which;
for (a=0;a<h;a++) work=work->next;
return(work);
}
static mystrcmp(s,t)
char s[], t[];
{
register int i;
i=0;
while (toupper(s[i])==toupper(t[i]))
if (s[i++]=='\0') return(0);
return(toupper(s[i])-toupper(t[i]));
}
static doprops(gadget,entries,offset)
struct Gadget *gadget;
register int entries;
register int offset;
{
register long vertpot;
struct PropInfo *pinfo;
if (entries<=5) return(0);
vertpot=(offset*0xffff)/(entries-5);
pinfo=(struct PropInfo *)&(gadget->SpecialInfo);
if (vertpot==pinfo->VertPot) return(0);
NewModifyProp(gadget,fr_Window,NULL,AUTOKNOB|FREEVERT,0,vertpot,0,0x1000,1);
}
static do_delete()
{
int Class, Code, GadgetID, i;
char file[400];
struct direntry *work, *work1;
char *hail;
if (strlen(filenamebuffer)==0) return(0);
hail=fr_Window->Title;
SetWindowTitles(fr_Window,"OKAY to confirm, or CANCEL to cancel",-1);
FOREVER {
Wait(1<<fr_Window->UserPort->mp_SigBit);
while (fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort)) {
Class=fr_Msg->Class; Code=fr_Msg->Code;
if (Class==GADGETUP) GadgetID=((struct Gadget *) fr_Msg->IAddress)->GadgetID;
ReplyMsg((struct Message *) fr_Msg);
if (Class!=GADGETUP) break;
if (GadgetID!=OKAY && GadgetID!=CANCEL) break;
if (GadgetID==CANCEL) {
SetWindowTitles(fr_Window,hail,-1);
return(FALSE);
}
busy();
SetWindowTitles(fr_Window,"Please wait...",-1);
strcpy(file,devicenamebuffer);
strcat(file,drawernamebuffer);
strcat(file,filenamebuffer);
i=DeleteFile(file);
if (!i) {
SetWindowTitles(fr_Window,"Delete failed.",-1);
DisplayBeep(NULL);
Delay(50);
}
if (i) {
work=FirstFileEntry;
strcpy(file,filenamebuffer);
strcpy(filenamebuffer,"");
RefreshGList(&filenamegadget,fr_Window,NULL,1);
--fileentries;
while ((strcmp(work->name,file)!=0)) {
work1=work;
work=work->next;
if (!work) break;
}
if (work->next) {
if (work1) work1->next=work->next;
if (work==FirstFileEntry) FirstFileEntry=work->next;
}
else {
if (work1) work1->next=NULL;
if (work==FirstFileEntry) FirstFileEntry=NULL;
}
if (work) FreeMem(work,(sizeof(struct direntry)));
oldfileoffset=-1;
if (fileoffset>0) --fileoffset;
DisplayFiles(TRUE);
doprops(&filenamepropgadget,fileentries,fileoffset);
}
SetWindowTitles(fr_Window,hail,-1);
unbusy();
return(i);
}
}
}
static do_rename()
{
int Class, Code, GadgetID, i;
char file1[400], file2[400], file[32];
struct direntry *work, *work1;
char *hail;
if (strlen(filenamebuffer)==0) return(0);
hail=fr_Window->Title;
SetWindowTitles(fr_Window,"Enter new name and choose OKAY",-1);
strcpy(file,filenamebuffer);
strcpy(file1,devicenamebuffer);
strcat(file1,drawernamebuffer);
strcat(file1,filenamebuffer);
ActivateGadget(&filenamegadget,fr_Window,NULL);
FOREVER {
Wait(1<<fr_Window->UserPort->mp_SigBit);
while (fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort)) {
Class=fr_Msg->Class; Code=fr_Msg->Code;
if (Class==GADGETUP) GadgetID=((struct Gadget *) fr_Msg->IAddress)->GadgetID;
ReplyMsg((struct Message *) fr_Msg);
if (Class!=GADGETUP) break;
if (GadgetID!=OKAY) break;
busy();
SetWindowTitles(fr_Window,"Please wait...",-1);
strcpy(file2,devicenamebuffer);
strcat(file2,drawernamebuffer);
strcat(file2,filenamebuffer);
i=Rename(file1,file2);
if (!i) {
SetWindowTitles(fr_Window,"Rename failed.",-1);
DisplayBeep(NULL);
Delay(50);
strcpy(filenamebuffer,file);
RefreshGList(&filenamegadget,fr_Window,NULL,1);
}
if (i) {
work=FirstFileEntry;
while ((strcmp(work->name,file)!=0)) {
work1=work;
work=work->next;
if (!work) break;
}
strcpy(work->name,filenamebuffer);
oldfileoffset=-1;
if (SortOn) Sort(FirstFileEntry,fileentries);
DisplayFiles(TRUE);
doprops(&filenamepropgadget,fileentries,fileoffset);
}
SetWindowTitles(fr_Window,hail,-1);
unbusy();
return(i);
}
}
}
static do_makedir()
{
int Class, Code, GadgetID;
char file1[400], file2[400];
struct FileLock *i;
char *hail;
hail=fr_Window->Title;
SetWindowTitles(fr_Window,"Enter new dir. name, OKAY or CANCEL",-1);
strcpy(file1,drawernamebuffer);
ActivateGadget(&drawernamegadget,fr_Window,NULL);
FOREVER {
Wait(1<<fr_Window->UserPort->mp_SigBit);
while (fr_Msg=(struct IntuiMessage *) GetMsg(fr_Window->UserPort)) {
Class=fr_Msg->Class; Code=fr_Msg->Code;
if (Class==GADGETUP) GadgetID=((struct Gadget *) fr_Msg->IAddress)->GadgetID;
ReplyMsg((struct Message *) fr_Msg);
if (Class!=GADGETUP) break;
if (GadgetID!=OKAY && GadgetID!=CANCEL) break;
if (GadgetID==CANCEL) {
strcpy(drawernamebuffer,file1);
RefreshGList(&drawernamegadget,fr_Window,NULL,1);
SetWindowTitles(fr_Window,hail,-1);
return(FALSE);
}
busy();
SetWindowTitles(fr_Window,"Please wait...",-1);
strcpy(file2,devicenamebuffer);
strcat(file2,drawernamebuffer);
i=(struct FileLock *) CreateDir(file2);
if (!i) {
SetWindowTitles(fr_Window,"Make Dir failed.",-1);
DisplayBeep(NULL);
Delay(50);
strcpy(drawernamebuffer,file1);
RefreshGList(&drawernamegadget,fr_Window,NULL,1);
}
if (i) {
UnLock(i);
getnewdrawer();
}
SetWindowTitles(fr_Window,hail,-1);
unbusy();
return(TRUE);
}
}
}
static busy()
{
SetPointer(fr_Window,&BusySpriteData[0],18,16,0,0);
return(0);
}
static unbusy()
{
ClearPointer(fr_Window);
return(0);
}