home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d9xx
/
d913
/
assignprefs.lha
/
AssignPrefs
/
Source
/
AssignPrefs.c
next >
Wrap
C/C++ Source or Header
|
1993-10-03
|
18KB
|
695 lines
/*-- AutoRev header do NOT edit!
*
* Program : AssignPrefs.c
* Copyright : © 1993 by Digital Dimensions
* Author : Thomas Frieden
* Creation Date : 14-Jul-93
* Current version : 1.02
* Translator : AztecC
*
* REVISION HISTORY
*
* Date Version Comment
* --------- ------- ------------------------------------------
* 14-Jul-93 0.0 First version
* 30-Jul-93 0.1 Working editor, to do assigning and icon
* 31-Jul-93 1.0 Omega version, icon stuff included
* 31-Jul-93 1.01 Minor bug fixes
* 31-Jul-93 1.02 Major bug fixes
*
*-- REV_END --*/
#include "globals.h"
#include "gadgets.h"
#define PNAME "AssignPrefs V1.02"
#define PRINT(x) if (wb) ShowRequest(x,"OK"); else printf("%s\n",x)
char version[] = "$VER: AssignPrefs 1.02";
char defname[256] = "envarc:assignprefs";
char fname[256];
char FileName[256];
char printme[256];
char Name[256];
char Path[256];
char *Types[] = {"Locked", "Path", "Add", "Late"};
LONG parse[3];
BYTE AssType = 0;
BOOL SaveIcons = TRUE, wb = FALSE;
struct List AssignList;
struct AssignNode {
struct Node an_Node;
char an_Name[256];
char an_Path[256];
};
struct AssignNode *akt, *cnode;
extern struct DiskObject *def_assign;
char *NodeName;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Library *GadToolsBase;
struct Library *UtilityBase;
struct Library *AslBase;
struct Library *DiskfontBase;
struct Library *IconBase;
void CloseAll() {
CloseMainWindow();
CloseDownScreen();
if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
if (GfxBase) CloseLibrary((struct Library *)GfxBase);
if (GadToolsBase) CloseLibrary( GadToolsBase);
if (UtilityBase) CloseLibrary( UtilityBase);
if (AslBase) CloseLibrary( AslBase);
if (DiskfontBase) CloseLibrary( DiskfontBase);
if (IconBase) CloseLibrary( IconBase);
}
void OpenAll() {
IntuitionBase = (struct IntuitionBase *)
OpenLibrary((APTR)"intuition.library",37L);
if (!IntuitionBase) {
printf("Need OS2.0 to run \n");
CloseAll();
exit(30);
}
GfxBase = (struct GfxBase *)
OpenLibrary((APTR)"graphics.library",0);
GadToolsBase = OpenLibrary((APTR)"gadtools.library",0);
UtilityBase = OpenLibrary((APTR)"utility.library",0);
AslBase = OpenLibrary((APTR)"asl.library",0);
DiskfontBase = OpenLibrary((APTR)"diskfont.library",0);
IconBase = OpenLibrary((APTR)"icon.library",0);
}
long ShowRequest(char *text, char *gads) {
struct EasyStruct es;
es.es_StructSize=sizeof(struct EasyStruct);
es.es_Flags=0;
es.es_Title=(UBYTE *)PNAME " © 1993 Digital Dimensions";
es.es_TextFormat=(UBYTE *)text;
es.es_GadgetFormat=(UBYTE *)gads;
return EasyRequestArgs(NULL,&es,NULL,NULL);
}
BOOL FileRequest(BOOL dironly, BOOL Save) {
struct FileRequester *request;
BOOL result;
static char dir[256] = "";
if (!dironly) {
if (Save)
request=(struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASL_Hail, "Select file to save... ",
ASL_Window, MainWnd,
ASL_FuncFlags, FILF_SAVE,
ASL_Dir, dir,
TAG_DONE);
else
request=(struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASL_Hail, "Select file to open...",
ASL_Window, MainWnd,
ASL_Dir, dir,
TAG_DONE);
} else {
request=(struct FileRequester *)AllocAslRequestTags(ASL_FileRequest,
ASL_Hail, "Select directory to assign...",
ASL_Window, MainWnd,
ASL_ExtFlags1, FIL1F_NOFILES,
ASL_Dir, dir,
TAG_DONE);
}
if (request==NULL)
return(FALSE);
result = AslRequest(request,NULL);
if (result==FALSE) {
FreeAslRequest(request);
return FALSE;
}
strncpy(FileName,(char *)(request->rf_Dir),256);
strncpy(dir,(char *)(request->rf_Dir),256);
if (!dironly) AddPart((STRPTR)FileName,request->rf_File,256);
FreeAslRequest(request);
return(TRUE);
}
struct AssignNode *NewNode() {
return(AllocVec(sizeof(struct AssignNode),MEMF_CLEAR|MEMF_PUBLIC));
}
void FreeList() {
struct AssignNode *nnode;
nnode = (struct AssignNode *)1L;
while (nnode) {
nnode = (struct AssignNode *)RemHead(&AssignList);
if (nnode) {
FreeVec(nnode->an_Node.ln_Name);
FreeVec(nnode);
}
}
}
void AssList() {
struct AssignNode *nnode;
BPTR lock;
char printme[256];
nnode = (struct AssignNode *)1L;
while (nnode) {
nnode = (struct AssignNode *)RemHead(&AssignList);
if (nnode) {
switch(nnode->an_Node.ln_Pri) {
case 0: if (lock = Lock((STRPTR)nnode->an_Path, SHARED_LOCK)) {
if (!(AssignLock((STRPTR)nnode->an_Name,lock))) {
sprintf(printme,"Error assigning %s", nnode->an_Name);
PRINT(printme);
}
} else {
sprintf(printme,"Cannot Lock %s",nnode->an_Path);
PRINT(printme);
}
break;
case 1: if (!(AssignPath((STRPTR)nnode->an_Name,(STRPTR)nnode->an_Path))) {
sprintf(printme,"Error assigning %s", nnode->an_Name);
PRINT(printme);
}
break;
case 2: if (lock = Lock((STRPTR)nnode->an_Path, SHARED_LOCK)) {
if (!(AssignAdd((STRPTR)nnode->an_Name,lock))) {
sprintf(printme,"Error assigning %s", nnode->an_Name);
PRINT(printme);
}
} else {
sprintf(printme,"Cannot Lock %s", nnode->an_Path);
PRINT(printme);
}
break;
case 3: if (!(AssignLate((STRPTR)nnode->an_Name, (STRPTR)nnode->an_Path))) {
sprintf(printme, "Error assigning %s", nnode->an_Name);
PRINT(printme);
}
break;
}
FreeVec(nnode->an_Node.ln_Name);
FreeVec(nnode);
}
}
}
void AddNode(BOOL Update) {
if (strlen(Name) != 0) {
if (!cnode) {
if (strlen(Path)==0) {
FileRequest(TRUE,FALSE);
strcpy(Path,FileName);
}
akt = NewNode();
NodeName = AllocVec(80,MEMF_CLEAR|MEMF_PUBLIC);
sprintf(NodeName,"%20.20s: %-32.32s - %s", Name, Path, Types[AssType]);
akt->an_Node.ln_Name = NodeName;
akt->an_Node.ln_Pri = (BYTE)AssType;
strcpy(akt->an_Name,Name);
strcpy(akt->an_Path,Path);
AddTail(&AssignList,(struct Node *)akt);
if (Update) {
GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
GTLV_Labels, &AssignList,
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
GTST_String, (ULONG)"",
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
GTST_String, (ULONG)"",
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
GTCY_Active, 0,
TAG_DONE);
}
AssType = 0;
strcpy(Path,"");
strcpy(Name,"");
} else {
sprintf(cnode->an_Node.ln_Name,
"%20.20s: %-32.32s - %s", Name, Path,
Types[AssType]);
cnode->an_Node.ln_Pri = (BYTE)AssType;
strcpy(cnode->an_Name,Name);
strcpy(cnode->an_Path,Path);
if (Update) {
GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
GTLV_Labels, &AssignList,
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
GTST_String, (ULONG)"",
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
GTST_String, (ULONG)"",
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
GTCY_Active, 0,
TAG_DONE);
}
AssType = 0;
strcpy(Path,"");
strcpy(Name,"");
cnode=NULL;
}
} else {
ActivateGadget(MainGadgets[GDX_ap_AssName], MainWnd, NULL);
}
}
void DelNode() {
if (cnode) {
Remove((struct Node *)cnode);
FreeVec(cnode->an_Node.ln_Name);
FreeVec(cnode);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
GTLV_Labels, &AssignList,
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
GTST_String, (ULONG)"",
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
GTST_String, (ULONG)"",
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
GTCY_Active, 0,
TAG_DONE);
AssType = 0;
strcpy(Name,"");
strcpy(Path,"");
}
cnode = 0L;
}
void LoadList(char *name, BOOL show) {
BPTR fh;
ULONG len;
LONG Type,*t;
struct AssignNode *anode;
char buffer[1024];
char st[81];
struct RDArgs *par,*ap;
par = (struct RDArgs *)AllocDosObject(DOS_RDARGS,TAG_DONE);
if (!par) {
PRINT("Error in AllocDosObject");
return;
}
fh = Open((STRPTR)name, MODE_OLDFILE);
if (!fh)
return;
while (TRUE) {
if (!(FGets(fh,(STRPTR)&buffer,1024))) break;
par->RDA_Flags |= RDAF_NOPROMPT;
par->RDA_Source.CS_Buffer = (UBYTE *)&buffer;
par->RDA_Source.CS_Length = strlen(buffer);
par->RDA_Source.CS_CurChr = 0L;
ap = ReadArgs((STRPTR)"Name/K/A,Path/K/A,Type/N/A",(LONG *)parse,par);
if (!ap) {
PRINT("Error in AssignPrefs file. Wrong format!");
Close(fh);
FreeList();
if (show)
GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
GTLV_Labels, &AssignList,
TAG_DONE);
return;
}
strcpy(Name,(char *)parse[0]);
strcpy(Path,(char *)parse[1]);
t = (LONG *)parse[2];
Type = *t;
anode = AllocVec(sizeof(struct AssignNode),MEMF_CLEAR);
anode->an_Node.ln_Name = AllocVec(90,MEMF_CLEAR);
strcpy(anode->an_Name,Name);
strcpy(anode->an_Path,Path);
anode->an_Node.ln_Pri = (BYTE)Type;
AddTail(&AssignList,(struct Node *)anode);
FreeArgs(ap);
}
Close(fh);
FreeDosObject(DOS_RDARGS,par);
anode = (struct AssignNode *)AssignList.lh_Head;
while (anode->an_Node.ln_Succ) {
sprintf(st,"%20.20s: %-32.32s - %s", anode->an_Name, anode->an_Path,
Types[anode->an_Node.ln_Pri]);
strcpy(anode->an_Node.ln_Name,st);
anode = (struct AssignNode *)anode->an_Node.ln_Succ;
}
strcpy(Name,"");
strcpy(Path,"");
if (show) GT_SetGadgetAttrs(MainGadgets[GDX_ap_List], MainWnd, NULL,
GTLV_Labels, &AssignList,
TAG_DONE);
}
void SaveIcon(char *name) {
struct DiskObject *dob;
BOOL FreeMe = TRUE;
dob = (struct DiskObject *)GetDiskObject((char *)"env:sys/def_assign");
if (dob == NULL) {
dob = (struct DiskObject *)&def_assign;
FreeMe = FALSE;
}
if (!(PutDiskObject((STRPTR)name,dob)))
ShowRequest("Error writing Icon","OK");
if (FreeMe) FreeDiskObject(dob);
}
void SaveList(char *name) {
BPTR fh;
ULONG len;
struct AssignNode *anode;
char buffer[1024];
fh = Open((STRPTR)name, MODE_NEWFILE);
anode = (struct AssignNode *)(AssignList.lh_Head);
while (anode->an_Node.ln_Succ) {
sprintf(buffer,"Name=%s Path=\"%s\" Type=%d\n",anode->an_Name,anode->an_Path,anode->an_Node.ln_Pri);
len = Write(fh,&buffer,strlen(buffer));
if (len != strlen(buffer)) {
ShowRequest("Error writing file","OK");
Close(fh);
return;
}
anode = (struct AssignNode *)anode->an_Node.ln_Succ;
}
Close(fh);
if (SaveIcons) SaveIcon(name);
}
BOOL ProcessMenu(USHORT Code) {
UWORD mm,ss,ii;
BOOL running = TRUE;
mm = MENUNUM(Code);
ii = ITEMNUM(Code);
ss = SUBNUM(Code);
switch(mm) {
case 0: switch(ii) {
case 0: if (!(FileRequest(FALSE,FALSE))) break;
FreeList();
LoadList(FileName,TRUE);
break;
case 1: if (!(FileRequest(FALSE,FALSE))) break;
LoadList(FileName,TRUE);
break;
case 2: if (!(FileRequest(FALSE,TRUE))) break;
SaveList(FileName);
break;
case 4: ShowRequest("AssignPrefs V1.0\n© 1993 by DIgital DImensions\n"
"Written by Thomas Frieden\n\nFor bug reports and Questions write to:\n"
"Thomas Frieden\nSchlossstr. 176\n54293 Trier\n"
"email: inf02@uni-trier.de","Great, man");
break;
case 6: running = FALSE;
break;
}
break;
case 1: switch(ii) {
case 0: FreeList();
LoadList(defname,TRUE);
break;
}
break;
case 2: switch(ii) {
case 0: SaveIcons = !SaveIcons;
break;
}
break;
}
return(running);
}
void main(int argc, char **argv) {
struct IntuiMessage *imsg;
ULONG Class;
USHORT Code;
SHORT Id,i;
BOOL running = TRUE;
BOOL use = FALSE;
BPTR lock,oldlock;
struct RDArgs *ap;
struct WBStartup *wbs;
struct WBArg *wba;
struct DiskObject *dob;
UBYTE **ta, *s;
if (argc != 0) {
wb = FALSE;
ap = ReadArgs((APTR)"FILE,USE/S",parse,NULL);
if (!ap) {
FreeArgs(ap);
PrintFault(IoErr(),NULL);
CloseAll();
exit(IoErr());
} else {
FreeArgs(ap);
if (parse[0]) strcpy(fname,(char *)parse[0]);
if (parse[1]) use = TRUE;
}
}
if (use) {
if (strlen(fname) == 0)
strcpy(fname,defname);
NewList(&AssignList);
LoadList(fname,FALSE);
AssList();
CloseAll();
exit(0);
}
OpenAll();
if (argc == 0) {
wb = TRUE;
wbs = (struct WBStartup *)argv;
wba = wbs->sm_ArgList;
if (wbs->sm_NumArgs > 1) {
NameFromLock(wba[1].wa_Lock,(STRPTR)fname,256);
AddPart((STRPTR)fname,(STRPTR)wba[1].wa_Name,256);
oldlock = CurrentDir(wba[1].wa_Lock);
dob = (struct DiskObject *)GetDiskObject(wba[1].wa_Name);
CurrentDir(oldlock);
if (dob) {
if (dob->do_ToolTypes) {
ta = (UBYTE **)dob->do_ToolTypes;
if (s = (UBYTE *)FindToolType((char **)ta,"ACTION")) {
if (MatchToolValue(s,(UBYTE *)"USE")) use = TRUE;
if (MatchToolValue(s,(UBYTE *)"use")) use = TRUE;
if (MatchToolValue(s,(UBYTE *)"POPUP")) use = FALSE;
if (MatchToolValue(s,(UBYTE *)"popup")) use = FALSE;
}
}
}
} else {
oldlock = CurrentDir(wba->wa_Lock);
dob = (struct DiskObject *)GetDiskObject(wba->wa_Name);
CurrentDir(oldlock);
if (dob) {
if (dob->do_ToolTypes) {
ta = (UBYTE **)dob->do_ToolTypes;
if (s = (UBYTE *)FindToolType((char **)ta,"ACTION")) {
if (MatchToolValue(s,(UBYTE *)"USE")) use = TRUE;
if (MatchToolValue(s,(UBYTE *)"use")) use = TRUE;
if (MatchToolValue(s,(UBYTE *)"POPUP")) use = FALSE;
if (MatchToolValue(s,(UBYTE *)"popup")) use = FALSE;
}
if (s = (UBYTE *)FindToolType((char **)ta,"FILE")) strcpy(defname, (char *)s);
}
FreeDiskObject(dob);
};
}
}
if (strlen(fname) == 0)
strcpy(fname,defname);
if (use) {
NewList(&AssignList);
LoadList(fname,FALSE);
AssList();
CloseAll();
exit(0);
}
SetupScreen();
OpenMainWindow();
NewList(&AssignList);
cnode = NULL;
LoadList(fname,TRUE);
while(running) {
WaitPort(MainWnd->UserPort);
while(imsg = GT_GetIMsg(MainWnd->UserPort)) {
Class = imsg->Class;
Code = imsg->Code;
if (Class == IDCMP_GADGETUP || Class == IDCMP_GADGETDOWN)
Id = ((struct Gadget *)(imsg->IAddress))->GadgetID;
GT_ReplyIMsg(imsg);
switch(Class) {
case IDCMP_MENUPICK:
running = ProcessMenu(Code);
break;
case IDCMP_VANILLAKEY:
switch(Code) {
case 'a':
case 'A':
AddNode(TRUE);
break;
case 'q':
case 'Q':
running = FALSE;
break;
case 'n':
case 'N':
ActivateGadget(MainGadgets[GDX_ap_AssName], MainWnd, NULL);
break;
case 'p':
case 'P':
ActivateGadget(MainGadgets[GDX_ap_Path], MainWnd, NULL);
break;
case 't':
AssType++;
AssType = AssType & 3;
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
GTCY_Active, AssType,
TAG_DONE);
break;
case 'T':
AssType--;
AssType = AssType & 3;
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
GTCY_Active, AssType,
TAG_DONE);
break;
case 'd':
case 'D':
DelNode();
break;
case 's':
case 'S':
SaveList(defname);
break;
}
break;
case IDCMP_REFRESHWINDOW:
GT_BeginRefresh(MainWnd);
GT_EndRefresh(MainWnd,TRUE);
break;
case IDCMP_GADGETUP:
switch(Id) {
case GD_ap_Cancel:
running = FALSE;
break;
case GD_ap_AssName:
strcpy(Name, (char *)GetString(MainGadgets[GDX_ap_AssName]));
ActivateGadget(MainGadgets[GDX_ap_Path],MainWnd,NULL);
break;
case GD_ap_Path:
strcpy(Path, (char *)GetString(MainGadgets[GDX_ap_Path]));
if (strlen(Path)==0) {
if (FileRequest(TRUE,FALSE)) {
strcpy(Path,FileName);
if (strlen(Path) == 0) {
lock = Lock((STRPTR)"Ram:",SHARED_LOCK);
oldlock = CurrentDir(lock);
NameFromLock(oldlock,(STRPTR)Path,256);
CurrentDir(oldlock);
UnLock(lock);
}
GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
GTST_String, Path,
TAG_DONE);
}
}
break;
case GD_ap_AssType:
AssType = Code;
break;
case GD_ap_List:
cnode = (struct AssignNode *)AssignList.lh_Head;
for (i=0;i<Code;i++)
cnode=(struct AssignNode *)cnode->an_Node.ln_Succ;
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssName], MainWnd, NULL,
GTST_String, (ULONG)cnode->an_Name,
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_Path], MainWnd, NULL,
GTST_String, (ULONG)cnode->an_Path,
TAG_DONE);
GT_SetGadgetAttrs(MainGadgets[GDX_ap_AssType], MainWnd, NULL,
GTCY_Active, (ULONG)cnode->an_Node.ln_Pri,
TAG_DONE);
strcpy(Name, cnode->an_Name);
strcpy(Path, cnode->an_Path);
AssType = cnode->an_Node.ln_Pri;
break;
case GD_ap_Add:
AddNode(TRUE);
break;
case GD_ap_Del:
DelNode();
break;
case GD_ap_Save:
SaveList(defname);
break;
}
break;
}
}
}
FreeList();
CloseAll();
exit(0);
}