/**************************************************************************** * * * 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 #include #include #include #include #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<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;anext; 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;iUserPort)) { 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;anext; 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;anext; 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;bnext; 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;bnext; 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;bnext; 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=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;anext; 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<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<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<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); }