home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
tcp
/
Networking
/
TCP
/
Clients
/
MuiADT
/
src
/
adt.c
next >
Wrap
C/C++ Source or Header
|
1994-09-01
|
39KB
|
1,325 lines
/*
* Yes, yes, yes. No running commentary throughout the code, but I understand it
* (I think)
* (Yeah, have no fear, I remember now)
*/
void __regargs __chkabort(void);
void __regargs __chkabort(void) {}
#include "adt.h"
LONG __stack = 8192;
#define FILE_PAGE 0
#define README_PAGE 1
#define GET_PAGE 2
#define FILE_NEW_PAGE 3
#define FILE_RECENT_PAGE 0
#define FILE_ALL_PAGE 1
#define FILE_TAGGED_PAGE 2
struct Library *MUIMasterBase, *childSocketBase;
static APTR win, hosts_win, add_host_win, config_win;
static APTR mainpage, lvpage, recentlv, shortlv, taggedlv, newlv, hostslv, readtext, getlv;
static APTR adt_statusobj, read_next_but, read_can_but, get_abort_but;
static APTR host_add_but, host_del_but, host_up_but, host_down_but, host_cancel_but, host_connect_but;
static APTR host_add_country, host_add_site, host_add_dir, host_add_done;
APTR get_gauge, app;
static APTR cfg_but, sort_but, view_but, read_but, name_but, get_but, host_but, quit_but;
static APTR search_str, search_next, search_can;
static APTR def_sort_but, def_view_but, def_getdir, def_tmpdir, def_uncomp, def_done;
static LONG sorttype=0, viewtype=0;
static LONG readpos;
static BOOL gotrecent=FALSE, gotshort=FALSE, gotnew=FALSE;
static BOOL sortrecent=TRUE, sortshort=TRUE, sortnew=TRUE, sorttagged=TRUE;
extern BOOL connected;
struct HostLineRec *host=NULL;
struct PrefsRec prefs;
static const char *SortEntries[] = { "Name", "Age", "Dir", NULL };
static const char *ViewEntries[] = { "New", "Recent", "All", "Tagged", NULL };
/*************************/
/* Init & Fail Functions */
/*************************/
static VOID fail(APTR app,char *str)
{
if (app)
MUI_DisposeObject(app);
if (MUIMasterBase)
CloseLibrary(MUIMasterBase);
if (str)
{
puts(str);
exit(20);
}
exit(0);
}
static VOID init(VOID)
{
if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)))
fail(NULL,"Failed to open "MUIMASTER_NAME".");
}
/*
* Breaks a string at the token 'mark', returning a pointer to the begining
* of the string (from the adt1.3 distribution)
*/
char *gettok(char **ptr, char mark, int *toklen)
{
char *t, *start = *ptr;
if( (t=(char*)strchr(*ptr,mark))) {
*t=0;
*ptr=t+1;
}
*toklen = t - start + 1;
return start;
}
/*
* File listview hooks
*/
__saveds __asm struct FileLineRec *file_const_func(REG(a0) struct Hook *hook,
REG(a2) APTR mem_pool,
REG(a1) char *line)
{
register struct FileLineRec *flr;
char *ln = line;
LONG fsize;
register char *dir, *name, *readme, *descr;
int dirlen, namelen, readmelen, descrlen, nothanks;
flr = (struct FileLineRec *)AllocMem(sizeof(struct FileLineRec), MEMF_ANY);
sscanf(gettok(&ln, '@', ¬hanks), "%lx", &flr->time);
if (flr->time > prefs.thistime)
prefs.thistime = flr->time;
dir = gettok(&ln, '@', &dirlen);
name = gettok(&ln, ';', &namelen);
sscanf(gettok(&ln, '@', ¬hanks), "%lx", &fsize);
readme = gettok(&ln, '@', &readmelen);
descr = gettok(&ln, '\n', &descrlen);
flr->recsize = dirlen + namelen + 5 + readmelen + descrlen;
flr->dir = AllocMem(flr->recsize, MEMF_ANY|MEMF_CLEAR);
flr->name = flr->dir + dirlen;
flr->size = flr->name + namelen;
flr->readme = flr->size + 5;
flr->descr = flr->readme + readmelen;
strcpy(flr->dir, dir);
strcpy(flr->name, name);
flr->intsize = fsize;
if (fsize < 1000) sprintf(flr->size, "%dB", fsize);
else if (fsize < 1000000) sprintf(flr->size, "%dK", fsize / 1024);
else if (fsize < 10000000) sprintf(flr->size, "%.1fM", fsize / 1048576.0);
else if (fsize < 1000000000) sprintf(flr->size, "%dM", fsize / 1048576);
else strcpy(flr->size, "big");
strcpy(flr->readme, readme);
strcpy(flr->descr, descr);
if(flr->readme[strlen(flr->readme)-1] == ';') {
flr->readme[strlen(flr->readme)-1] = '\0';
flr->flags |= FLAG_README;
}
return(flr);
}
static struct Hook file_const_hook = {
{NULL, NULL},
(void *)file_const_func,
NULL, NULL
};
__saveds __asm LONG file_dest_func(REG(a0) struct Hook *hook,
REG(a2) APTR mem_pool,
REG(a1) struct FileLineRec *flr)
{
FreeMem(flr->dir, flr->recsize);
FreeMem(flr, sizeof(struct FileLineRec));
return(0);
}
static struct Hook file_dest_hook = {
{NULL, NULL},
(void *)file_dest_func,
NULL, NULL
};
__saveds __asm LONG file_disp_func(REG(a0) struct Hook *hook,
REG(a2) char *array[],
REG(a1) struct FileLineRec *flinerec)
{
if (flinerec) {
if (HAS_README(flinerec)) array[0] = "*";
else array[0] = "";
array[1] = flinerec->name;
array[2] = flinerec->dir;
array[3] = flinerec->size;
array[4] = flinerec->descr;
} else {
array[0] = "";
array[1] = "\033c\0338Name";
array[2] = "\033c\0338Dir";
array[3] = "\033c\0338Size";
array[4] = "\033c\0338Description";
}
return(0);
}
static struct Hook file_disp_hook = {
{NULL, NULL},
(void *)file_disp_func,
NULL, NULL
};
__saveds __asm LONG file_cmp_func(REG(a1) struct FileLineRec *line1,
REG(a2) struct FileLineRec *line2)
{
switch(sorttype) {
case 0:
return(stricmp(line1->name, line2->name));
break;
case 1:
if ((line1->time - line2->time) < 0)
return(1);
else if ((line1->time - line2->time) > 0)
return(-1);
else return(0);
break;
case 2:
return(stricmp(line1->dir, line2->dir));
break;
}
}
static struct Hook file_cmp_hook = {
{NULL, NULL},
(void *)file_cmp_func,
NULL, NULL
};
/*
* Host listview hooks
*/
__saveds __asm struct HostLineRec *host_const_func(REG(a0) struct Hook *hook,
REG(a2) APTR mem_pool,
REG(a1) char *line)
{
register struct HostLineRec *hlr;
register char *country, *site;
char *ln=line;
int dummy;
hlr = (struct HostLineRec *)AllocMem(sizeof(struct HostLineRec), MEMF_ANY);
country = gettok(&ln, ':', &dummy);
site = gettok(&ln, ':', &dummy);
if (country == NULL || site == NULL)
return(NULL);
strcpy(hlr->country, country);
strcpy(hlr->host, site);
strcpy(hlr->dir, ln);
return(hlr);
}
static struct Hook host_const_hook = {
{NULL, NULL},
(void *)host_const_func,
NULL, NULL
};
__saveds __asm LONG host_dest_func(REG(a0) struct Hook *hook,
REG(a2) APTR mem_pool,
REG(a1) struct HostLineRec *hlinerec)
{
FreeMem(hlinerec, sizeof(struct HostLineRec));
return(0);
}
static struct Hook host_dest_hook = {
{NULL, NULL},
(void *)host_dest_func,
NULL, NULL
};
__saveds __asm LONG host_disp_func(REG(a0) struct Hook *hook,
REG(a2) char *array[],
REG(a1) struct HostLineRec *hlinerec)
{
if (hlinerec) {
array[0] = hlinerec->country;
array[1] = hlinerec->host;
array[2] = hlinerec->dir;
} else {
array[0] = "\033c\0338Country";
array[1] = "\033c\0338Host";
array[2] = "\033c\0338Directory";
}
return(0);
}
static struct Hook host_disp_hook = {
{NULL, NULL},
(void *)host_disp_func,
NULL, NULL
};
__saveds __asm LONG host_cmp_func(REG(a1) struct HostLineRec *line1,
REG(a2) struct HostLineRec *line2)
{
return(stricmp(line1->host, line2->host));
}
static struct Hook host_cmp_hook = {
{NULL, NULL},
(void *)host_cmp_func,
NULL, NULL
};
main(int argc, char *argv[])
{
BOOL running = TRUE;
/* Initialise default prefs. */
prefs.defsort = 0;
prefs.defview = 0;
strcpy(prefs.getdir, "RAM:");
strcpy(prefs.tmpdir, "RAM:");
strcpy(prefs.defcfg, "ENV:MUIAdt.prefs");
strcpy(prefs.uncomp, "uncompress");
prefs.server[0] = '\0';
prefs.lasttime = 0;
prefs.thistime = 0;
/* Check for bsdsocket.library */
if (childSocketBase = OpenLibrary("bsdsocket.library", 2L))
CloseLibrary(childSocketBase);
else
exit(20);
init();
app = ApplicationObject,
MUIA_Application_Title, "MUIAdt",
MUIA_Application_Version, "$VER: MUIadt 1.3 (1/9/94)",
MUIA_Application_Copyright, "© 1994 by Jem Atahan",
MUIA_Application_Author, "Jem Atahan",
MUIA_Application_Description, "AmiNet Download Tool",
MUIA_Application_Base, "MADT",
SubWindow, win = WindowObject,
MUIA_Window_ID, MAKE_ID('M','A','I','N'),
MUIA_Window_Title, "MUIAdt",
MUIA_Window_Width, MUIV_Window_Width_Visible(80),
MUIA_Window_Height, MUIV_Window_Height_Visible(60),
/* Main Window */
WindowContents, mainpage = PageGroup,
/* Files Page */
Child, VGroup,
Child, lvpage = PageGroup,
Child, recentlv = ListviewObject,
MUIA_Listview_MultiSelect, TRUE,
MUIA_Listview_DoubleClick, TRUE,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_Format, "W=1,W=200,W=50,W=10 P=\033r,W=600",
MUIA_List_Title, TRUE,
MUIA_List_ConstructHook, &file_const_hook,
MUIA_List_DestructHook, &file_dest_hook,
MUIA_List_CompareHook, &file_cmp_hook,
MUIA_List_DisplayHook, &file_disp_hook,
End,
End,
Child, shortlv = ListviewObject,
MUIA_Listview_MultiSelect, TRUE,
MUIA_Listview_DoubleClick, TRUE,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_Format, "W=1,W=200,W=50,W=10 P=\033r,W=600",
MUIA_List_Title, TRUE,
MUIA_List_ConstructHook, &file_const_hook,
MUIA_List_DestructHook, &file_dest_hook,
MUIA_List_CompareHook, &file_cmp_hook,
MUIA_List_DisplayHook, &file_disp_hook,
End,
End,
Child, taggedlv = ListviewObject,
MUIA_Listview_MultiSelect, TRUE,
MUIA_Listview_DoubleClick, TRUE,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_Format, "W=1,W=200,W=50,W=10 P=\033r,W=600",
MUIA_List_Title, TRUE,
MUIA_List_ConstructHook, &file_const_hook,
MUIA_List_DestructHook, &file_dest_hook,
MUIA_List_CompareHook, &file_cmp_hook,
MUIA_List_DisplayHook, &file_disp_hook,
End,
End,
Child, newlv = ListviewObject,
MUIA_Listview_MultiSelect, TRUE,
MUIA_Listview_DoubleClick, TRUE,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_Format, "W=1,W=200,W=50,W=10 P=\033r,W=600",
MUIA_List_Title, TRUE,
MUIA_List_ConstructHook, &file_const_hook,
MUIA_List_DestructHook, &file_dest_hook,
MUIA_List_CompareHook, &file_cmp_hook,
MUIA_List_DisplayHook, &file_disp_hook,
End,
End,
End,
Child, HGroup,
MUIA_Weight, 1,
Child, KeyLabel1("Sort by:", 's'), Child, sort_but = KeyCycle(SortEntries, 's'),
Child, KeyLabel1("View:", 'v'), Child, view_but = KeyCycle(ViewEntries, 'v'),
Child, VSpace(0),
Child, read_but = KeyButton("Readme", 'r'),
Child, name_but = PopobjectObject,
MUIA_Popstring_String, Label1(""),
MUIA_Popstring_Button, KeyButton("Name", 'n'),
MUIA_Popobject_Object, VGroup,
GroupFrame,
Child, KeyLabel1("\33cSearch for:", 'r'),
Child, search_str = KeyString("", 256, 'r'),
Child, search_next = KeyButton("Next", 'x'),
Child, search_can = KeyButton("Cancel", 'a'),
End,
End,
Child, get_but = KeyButton("Download", 'd'),
Child, host_but = KeyButton("Host", 'h'),
Child, cfg_but = KeyButton("Config", 'c'),
Child, quit_but = KeyButton("Quit", 'q'),
End,
Child, adt_statusobj = TextObject,
TextFrame,
MUIA_Background, MUII_TextBack,
MUIA_Text_PreParse, "\033c\0338",
End,
End,
/* Readme Page */
Child, VGroup,
Child, TextObject,
TextFrame,
MUIA_Background, MUII_TextBack,
MUIA_Text_PreParse, "\033c\033b\0338",
MUIA_Text_Contents, "Readme file",
End,
Child, ListviewObject,
MUIA_Weight, 200,
MUIA_Listview_Input, FALSE,
MUIA_Listview_List, readtext = FloattextObject,
MUIA_Frame, MUIV_Frame_ReadList,
MUIA_Background, MUII_TextBack,
MUIA_Floattext_TabSize, 4,
MUIA_Floattext_Justify, TRUE,
End,
End,
Child, HGroup,
Child, read_next_but = KeyButton("Next", 'x'),
Child, read_can_but = KeyButton("Cancel", 'c'),
Child, HSpace(13),
End,
End,
/* Downloading Page */
Child, VGroup,
Child, TextObject,
TextFrame,
MUIA_Background, MUII_TextBack,
MUIA_Text_PreParse, "\033c\033b\0338",
MUIA_Text_Contents, "Downloading",
End,
Child, getlv = ListviewObject,
MUIA_Listview_Input, FALSE,
MUIA_Listview_DoubleClick, FALSE,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_Format, "W=1,W=200,W=50,W=10 P=\033r,W=600",
MUIA_List_Title, TRUE,
MUIA_List_ConstructHook, &file_const_hook,
MUIA_List_DestructHook, &file_dest_hook,
MUIA_List_CompareHook, &file_cmp_hook,
MUIA_List_DisplayHook, &file_disp_hook,
End,
End,
Child, HGroup,
Child, VGroup,
MUIA_Weight, 50,
Child, get_abort_but = KeyButton("Abort", 'a'),
Child, VSpace(13),
End,
Child, VGroup,
GroupSpacing(1),
MUIA_Weight, 400,
Child, get_gauge = GaugeObject,
GaugeFrame,
MUIA_Gauge_Horiz, TRUE,
End,
Child, ScaleObject,
MUIA_Scale_Horiz, TRUE,
End,
End,
Child, HSpace(13),
End,
End,
End,
End,
/* Hosts Window */
SubWindow, hosts_win = WindowObject,
MUIA_Window_ID, MAKE_ID('H','O','S','T'),
MUIA_Window_Title, "MUIAdt Hosts",
MUIA_Window_Width, MUIV_Window_Width_Visible(60),
MUIA_Window_Height, MUIV_Window_Height_Visible(35),
WindowContents, HGroup,
Child, hostslv = ListviewObject,
MUIA_Weight, 400,
MUIA_Listview_MultiSelect, FALSE,
MUIA_Listview_DoubleClick, TRUE,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_Format, ",,",
MUIA_List_Title, TRUE,
MUIA_List_ConstructHook, &host_const_hook,
MUIA_List_DestructHook, &host_dest_hook,
MUIA_List_CompareHook, &host_cmp_hook,
MUIA_List_DisplayHook, &host_disp_hook,
End,
End,
Child, VGroup,
MUIA_Weight, 1,
Child, VSpace(0),
Child, host_add_but = KeyButton("Add", 'a'),
Child, host_del_but = KeyButton("Delete", 'l'),
/* Child, host_up_but = KeyButton("Up", 'u'),
Child, host_down_but = KeyButton("Down", 'd'),*/
Child, VSpace(0),
Child, host_connect_but = KeyButton("Connect", 'c'),
Child, host_cancel_but = KeyButton("Cancel", 'n'),
Child, VSpace(0),
End,
End,
End,
/* Add Host Window */
SubWindow, add_host_win = WindowObject,
MUIA_Window_ID, MAKE_ID('A','D','D','H'),
MUIA_Window_Title, "Add a host",
WindowContents, VGroup,
Child, HGroup,
Child, KeyLabel1("Country", 'c'),
Child, host_add_country = StringObject,
StringFrame,
MUIA_ControlChar, 'c',
MUIA_String_MaxLen, 30,
MUIA_String_Reject, ":",
End,
End,
Child, HGroup,
Child, KeyLabel1("Site", 's'),
Child, host_add_site = StringObject,
StringFrame,
MUIA_ControlChar, 's',
MUIA_String_MaxLen, 30,
MUIA_String_Reject, ":",
End,
End,
Child, HGroup,
Child, KeyLabel1("Directory", 'r'),
Child, host_add_dir = StringObject,
StringFrame,
MUIA_ControlChar, 'r',
MUIA_String_MaxLen, 30,
MUIA_String_Reject, ":",
End,
End,
Child, host_add_done = KeyButton("Done", 'd'),
End,
End,
/* Config Window */
SubWindow, config_win = WindowObject,
MUIA_Window_ID, MAKE_ID('C','O','N','F'),
MUIA_Window_Title, "MUIAdt Config Options",
WindowContents, VGroup,
Child, HGroup, Child, KeyLabel1("Default Sort by:", 's'), Child, def_sort_but = KeyCycle(SortEntries, 's'), End,
Child, HGroup, Child, KeyLabel1("Default View by:", 'v'), Child, def_view_but = KeyCycle(ViewEntries, 'v'), End,
Child, HGroup,
Child, KeyLabel1("Download Directory:", 'd'),
Child, def_getdir = PopaslObject,
MUIA_Popstring_String, KeyString("", 256, 'd'),
MUIA_Popstring_Button, PopButton(MUII_PopDrawer),
ASLFR_TitleText , "Please select a drawer...",
ASLFR_DrawersOnly, TRUE,
End,
End,
Child, HGroup,
Child, KeyLabel1("Temporary Directory:", 't'),
Child, def_tmpdir = PopaslObject,
MUIA_Popstring_String, KeyString("", 256, 't'),
MUIA_Popstring_Button, PopButton(MUII_PopDrawer),
ASLFR_TitleText , "Please select a drawer...",
ASLFR_DrawersOnly, TRUE,
End,
End,
Child, HGroup,
Child, KeyLabel1("Uncompress Command:", 'u'),
Child, def_uncomp = KeyString("", 256, 'u'),
End,
Child, HGroup, Child, HSpace(0), Child, def_done = KeyButton("Done", 'o'), Child, HSpace(0), End,
End,
End,
End;
if (!app) fail(app, "Couldn't create application.");
/* Respond to option button presses */
DoMethod(sort_but, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime, app, 2, MUIM_Application_ReturnID, ID_Sort);
DoMethod(view_but, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime, app, 2, MUIM_Application_ReturnID, ID_View);
DoMethod(read_but, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_Readme);
DoMethod(get_but, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_Get);
DoMethod(host_but, MUIM_Notify, MUIA_Pressed, FALSE, hosts_win, 3, MUIM_Set, MUIA_Window_Open, TRUE);
DoMethod(cfg_but, MUIM_Notify, MUIA_Pressed, FALSE, config_win, 3, MUIM_Set, MUIA_Window_Open, TRUE);
DoMethod(quit_but, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
/* Respond to buttons in the name search popup */
DoMethod(search_str, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, app, 2, MUIM_Application_ReturnID, ID_Name);
DoMethod(search_next, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_Name);
DoMethod(search_can, MUIM_Notify, MUIA_Pressed, FALSE, name_but, 2, MUIM_Popstring_Close, TRUE);
/* Respond to double clicking in one of the file listviews */
DoMethod(recentlv, MUIM_Notify, MUIA_Listview_DoubleClick,TRUE, app, 2, MUIM_Application_ReturnID, ID_Readme);
DoMethod(shortlv, MUIM_Notify, MUIA_Listview_DoubleClick,TRUE, app, 2, MUIM_Application_ReturnID, ID_Readme);
DoMethod(newlv, MUIM_Notify, MUIA_Listview_DoubleClick,TRUE, app, 2, MUIM_Application_ReturnID, ID_Readme);
DoMethod(taggedlv, MUIM_Notify, MUIA_Listview_DoubleClick,TRUE, app, 2, MUIM_Application_ReturnID, ID_Readme);
/* Respond to the readme page buttons */
DoMethod(read_next_but, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_ReadNext);
DoMethod(read_can_but, MUIM_Notify, MUIA_Pressed, FALSE, mainpage, 3, MUIM_Set, MUIA_Group_ActivePage, FILE_PAGE);
/* Respond to the download abort button */
DoMethod(get_abort_but, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_GetAbort);
/**/DoMethod(get_abort_but, MUIM_Notify, MUIA_Pressed, FALSE, mainpage, 3, MUIM_Set, MUIA_Group_ActivePage, FILE_PAGE);
/* Respond to events in the hosts window */
DoMethod(hosts_win, MUIM_Window_SetCycleChain, hostslv, host_add_but, host_del_but, host_connect_but, host_cancel_but, NULL);
set(hosts_win, MUIA_Window_ActiveObject, hostslv);
DoMethod(hosts_win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, hosts_win, 3, MUIM_Set, MUIA_Window_Open, FALSE);
DoMethod(hostslv, MUIM_Notify, MUIA_Listview_DoubleClick,TRUE, app, 2, MUIM_Application_ReturnID, ID_HostsConnect);
DoMethod(host_add_but, MUIM_Notify, MUIA_Pressed, FALSE, add_host_win, 3, MUIM_Set, MUIA_Window_Open, TRUE);
DoMethod(host_del_but, MUIM_Notify, MUIA_Pressed, FALSE, hostslv, 2, MUIM_List_Remove, MUIV_List_Remove_Active);
DoMethod(host_connect_but, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_HostsConnect);
DoMethod(host_cancel_but, MUIM_Notify, MUIA_Pressed, FALSE, hosts_win, 3, MUIM_Set, MUIA_Window_Open, FALSE);
/* Respond to events in the add a host window */
DoMethod(add_host_win, MUIM_Window_SetCycleChain, host_add_country, host_add_site, host_add_dir, host_add_done, NULL);
DoMethod(add_host_win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, add_host_win, 3, MUIM_Set, MUIA_Window_Open, FALSE);
DoMethod(host_add_done, MUIM_Notify, MUIA_Pressed, FALSE, add_host_win, 3, MUIM_Set, MUIA_Window_Open, FALSE);
DoMethod(host_add_done, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_AddHost);
/* Respond to the config page buttons */
DoMethod(config_win, MUIM_Window_SetCycleChain, def_sort_but, def_view_but, def_getdir, def_tmpdir, def_uncomp, def_done, NULL);
DoMethod(config_win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, config_win, 3, MUIM_Set, MUIA_Window_Open, 0);
DoMethod(def_done, MUIM_Notify, MUIA_Pressed, FALSE, app, 2, MUIM_Application_ReturnID, ID_Config);
/* Get Prefs */
if (read_prefs()) adt_status("Welcome new user.");
else adt_status("Welcome.");
/* Start the window up then */
DoMethod(win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
set(win, MUIA_Window_Open, TRUE);
while (running) {
ULONG signal;
switch (DoMethod(app, MUIM_Application_Input, &signal))
{
case MUIV_Application_ReturnID_Quit:
running = FALSE;
break;
case ID_Sort: {
int page;
sortrecent = sortshort = sortnew = sorttagged = TRUE;
get(sort_but, MUIA_Cycle_Active, &sorttype);
get(lvpage, MUIA_Group_ActivePage, &page);
switch(page) {
case FILE_RECENT_PAGE:
DoMethod(recentlv, MUIM_List_Sort);
sortrecent = FALSE;
break;
case FILE_ALL_PAGE:
DoMethod(shortlv, MUIM_List_Sort);
sortshort = FALSE;
break;
case FILE_TAGGED_PAGE:
DoMethod(taggedlv, MUIM_List_Sort);
sorttagged = FALSE;
break;
case FILE_NEW_PAGE:
DoMethod(newlv, MUIM_List_Sort);
sortnew = FALSE;
break;
}
break;
}
case ID_View:
if (connected) {
get(view_but, MUIA_Cycle_Active, &viewtype);
switch(viewtype) {
case 0:
show_new();
break;
case 1:
show_recent();
break;
case 2:
show_short();
break;
case 3:
show_tagged();
break;
}
} else adt_status("Not Connected");
set(win, MUIA_Window_ActiveObject, currentlv());
break;
case ID_Readme: {
APTR curntlv;
struct FileLineRec *flr;
readpos = -1;
curntlv = currentlv();
DoMethod(curntlv, MUIM_List_NextSelected, &readpos);
if (readpos == -1) break;
DoMethod(curntlv, MUIM_List_GetEntry, readpos, &flr);
if (HAS_README(flr)) readme(flr->dir, flr->readme);
break;
}
case ID_ReadNext: {
APTR curntlv;
struct FileLineRec *flr;
curntlv = currentlv();
DoMethod(curntlv, MUIM_List_NextSelected, &readpos);
if (readpos == -1) {
set(mainpage, MUIA_Group_ActivePage, FILE_PAGE);
break;
}
DoMethod(curntlv, MUIM_List_GetEntry, readpos, &flr);
if (HAS_README(flr)) readme(flr->dir, flr->readme);
break;
}
case ID_Name: {
LONG pos;
struct FileLineRec *flr;
char *str;
register BOOL stop = FALSE;
register int srclen, destlen;
register int i;
get(search_str, MUIA_String_Contents, &str);
srclen = strlen(str);
get(currentlv(), MUIA_List_Active, &pos);
if (pos < 0) pos = 0;
else pos++;
for(;!stop;pos++) {
DoMethod(currentlv(), MUIM_List_GetEntry, pos, &flr);
if (!flr) break;
destlen = strlen(flr->name);
for (i=0;i<=destlen-srclen&&!stop;i++) {
if (!strnicmp(str, &flr->name[i], srclen)) {
set(currentlv(), MUIA_List_Active, pos);
stop=TRUE;
}
}
}
break;
}
case ID_Get: {
LONG page, pos=-1, pos2;
struct FileLineRec *flr, *flr2;
BOOL stop=FALSE;
int result=0;
if (connected) {
DoMethod(currentlv(), MUIM_List_NextSelected, &pos);
if (pos == -1) break;
DoMethod(getlv, MUIM_List_Clear, NULL);
get(lvpage, MUIA_Group_ActivePage, &page);
switch(page) {
case FILE_RECENT_PAGE:
copy_tagged(getlv); break;
case FILE_ALL_PAGE:
copy_tagged(getlv); break;
case FILE_TAGGED_PAGE:
copy_tagged(getlv); break;
case FILE_NEW_PAGE:
copy_tagged(getlv); break;
}
set(mainpage, MUIA_Group_ActivePage, GET_PAGE);
pos = 0;
while(result != 2) {
char file[256], local[256];
DoMethod(getlv, MUIM_List_GetEntry, pos, &flr);
if (!flr) break;
joinpaths(file, flr->dir, flr->name);
joinpaths(local, prefs.getdir, flr->name);
result = get_file(file, local, flr->intsize);
if (!result) {
stop = FALSE;
pos2 = -1;
while(!stop) {
DoMethod(currentlv(), MUIM_List_NextSelected, &pos2);
if (pos2 == -1) break;
DoMethod(currentlv(), MUIM_List_GetEntry, pos2, &flr2);
if (flr2->time == flr->time) {
DoMethod(currentlv(), MUIM_List_Select, pos2, MUIV_List_Select_Off, NULL);
stop = TRUE;
}
}
DoMethod(getlv, MUIM_List_Remove, pos);
}
else {
/* printf("error getting %s\n", file); */
pos++;
}
}
/* Copy remaining entries back to lvpage */
set(mainpage, MUIA_Group_ActivePage, FILE_PAGE);
}
break;
}
case ID_HostsConnect: {
char *error;
LONG pos=-1;
struct HostLineRec *hlr;
/* Connect to a host and download the default file list */
DoMethod(hostslv, MUIM_List_NextSelected, &pos);
if (pos >= 0) {
set(win, MUIA_Window_Sleep, TRUE);
set(hosts_win, MUIA_Window_Open, FALSE);
gotrecent = gotshort = gotnew = FALSE;
DoMethod(recentlv, MUIM_List_Clear, NULL);
DoMethod(newlv, MUIM_List_Clear, NULL);
DoMethod(shortlv, MUIM_List_Clear, NULL);
{
char file[256];
joinpaths(file, prefs.tmpdir, "RECENT.adt");
remove(file);
joinpaths(file, prefs.tmpdir, "SHORT.adt");
remove(file);
}
pos=-1;
DoMethod(hostslv, MUIM_List_NextSelected, &pos);
DoMethod(hostslv, MUIM_List_GetEntry, pos, &hlr);
adt_status("Connecting");
if (!(error = ftp_connect(hlr->host, hlr->dir))) {
adt_status("Connected");
DoMethod(app, MUIM_Application_ReturnID, ID_View);
set(mainpage, MUIA_Group_ActivePage, FILE_PAGE);
host = hlr;
} else if (error[0] == '*') {
adt_status(error+1);
fail(app, error+1);
} else adt_status(error);
set(win, MUIA_Window_Sleep, FALSE);
}
break;
}
case ID_Config: {
char *tmp;
get(def_sort_but, MUIA_Cycle_Active, &prefs.defsort);
get(def_view_but, MUIA_Cycle_Active, &prefs.defview);
get(def_getdir, MUIA_String_Contents, &tmp);
strcpy(prefs.getdir, tmp);
get(def_tmpdir, MUIA_String_Contents, &tmp);
strcpy(prefs.tmpdir, tmp);
get(def_uncomp, MUIA_String_Contents, &tmp);
strcpy(prefs.uncomp, tmp);
set(config_win, MUIA_Window_Open, FALSE);
break;
}
case ID_AddHost: {
char line[100], *country, *site, *dir;
get(host_add_country, MUIA_String_Contents, &country);
get(host_add_site, MUIA_String_Contents, &site);
get(host_add_dir, MUIA_String_Contents, &dir);
sprintf(line, "%s:%s:%s", country, site, dir);
DoMethod(hostslv, MUIM_List_InsertSingle, line, MUIV_List_Insert_Bottom);
set(host_add_country, MUIA_String_Contents, "");
set(host_add_site, MUIA_String_Contents, "");
set(host_add_dir, MUIA_String_Contents, "");
}
}
if (signal) Wait(signal);
}
{
char file[256];
joinpaths(file, prefs.tmpdir, "RECENT.adt");
remove(file);
joinpaths(file, prefs.tmpdir, "SHORT.adt");
remove(file);
}
if (write_prefs(prefs.defcfg)) MUI_Request(app,win,0,NULL,"OK", "Can't save prefs.");
/* Save to envarc: if defcfg is env: */
if (!strnicmp(prefs.defcfg, "env:", 4)) {
char file[256];
sprintf(file, "envarc:%s", prefs.defcfg + 4);
if (write_prefs(file)) MUI_Request(app,win,0,NULL,"OK", "Can't save prefs to ENVARC:");
}
fail(app, NULL);
}
void adt_status(char *msg)
{
set(adt_statusobj, MUIA_Text_Contents, msg);
}
/*------------- config file format ----------------
# comment
server = <default server>
prevcall = <time of last call>
getdir = <download directory>
tmpdir = <temporary directory>
defsort = <default sort method (integer)>
defview = <default view method (integer)>
uncompress = <uncompress command>
site = <country> <site> <directory>
*/
int read_prefs()
{
FILE *fp;
char line[256], *tag;
int length, retval;
if (fp = fopen(prefs.defcfg, "r")) {
retval = 0;
while (fgets(line, 256, fp)) {
if (line[0] != '#') {
length = strlen(line);
if (line[length-1] == '\n') line[length-1] = '\0';
for (tag=line; *tag!='=' && *tag!='\0'; tag++);
tag++;
for (; *tag==' '; tag++);
if (*tag == '\0') continue;
if (!strnicmp(line, "server", 6))
strcpy(prefs.server, tag);
if (!strnicmp(line, "prevcall", 8))
sscanf(tag, "%lx", &prefs.lasttime);
if (!strnicmp(line, "getdir", 6))
strcpy(prefs.getdir, tag);
if (!strnicmp(line, "tmpdir", 6))
strcpy(prefs.tmpdir, tag);
if (!strnicmp(line, "defsort", 7))
sscanf(tag, "%lx", &prefs.defsort);
if (!strnicmp(line, "defview", 7))
sscanf(tag, "%lx", &prefs.defview);
if (!strnicmp(line, "uncompress", 10))
strcpy(prefs.uncomp, tag);
if (!strnicmp(line, "site", 4))
DoMethod(hostslv, MUIM_List_InsertSingle, tag, MUIV_List_Insert_Bottom);
}
}
fclose(fp);
} else {
int i;
/* If no config file is found, use the default host sites. */
for (i=0;DefHostList[i]!=NULL;i++) {
DoMethod(hostslv, MUIM_List_InsertSingle, DefHostList[i], MUIV_List_Insert_Bottom);
}
retval = 1;
}
prefs.thistime = prefs.lasttime;
set(sort_but, MUIA_Cycle_Active, prefs.defsort);
set(view_but, MUIA_Cycle_Active, prefs.defview);
set(def_sort_but, MUIA_Cycle_Active, prefs.defsort);
set(def_view_but, MUIA_Cycle_Active, prefs.defview);
set(def_getdir, MUIA_String_Contents, prefs.getdir);
set(def_tmpdir, MUIA_String_Contents, prefs.tmpdir);
set(def_uncomp, MUIA_String_Contents, prefs.uncomp);
return(retval);
}
int write_prefs(char *file)
{
FILE *fp;
struct HostLineRec *hlr;
int i;
if (!(fp = fopen(file, "w"))) return(1);
fputs("# This is a MUIAdt config file\n", fp);
fprintf(fp, "server = %s\n", prefs.server);
fprintf(fp, "prevcall = %lx\n", prefs.thistime);
fprintf(fp, "getdir = %s\n", prefs.getdir);
fprintf(fp, "tmpdir = %s\n", prefs.tmpdir);
fprintf(fp, "defsort = %lx\n", prefs.defsort);
fprintf(fp, "defview = %lx\n", prefs.defview);
fprintf(fp, "uncompress = %s\n", prefs.uncomp);
for(i=0;;i++)
{
DoMethod(hostslv, MUIM_List_GetEntry, i, &hlr);
if (!hlr) break;
fprintf(fp, "site = %s:%s:%s\n", hlr->country, hlr->host, hlr->dir);
}
fclose(fp);
return(0);
}
void joinpaths(char *str, char *path, char *file)
{
if (strlen(path)) {
if (path[strlen(path)-1] == '/' || path[strlen(path)-1] == ':')
sprintf(str, "%s%s", path, file);
else
sprintf(str, "%s/%s", path, file);
} else strcpy(str, file);
}
int get_recent(void)
{
int retval=0;
char local[256], command[256];
set(recentlv, MUIA_List_Quiet, TRUE);
joinpaths(local, prefs.tmpdir, "RECENT.adt.Z");
adt_status("Downloading RECENT list");
if (!get_file("info/adt/RECENT.adt.Z", local, 0)) {
sprintf(command, "%s \"%s\"", prefs.uncomp, local);
system(command);
local[strlen(local)-2] = '\0';
if (get_parse(local, recentlv) == 0) gotrecent=TRUE;
else retval = 2;
} else {
adt_status("Error downloading RECENT list");
retval = 1;
}
return(retval);
}
void show_new()
{
LONG pos, numfiles;
struct FileLineRec *flr;
char temp[20], line[256];
set(win, MUIA_Window_Sleep, TRUE);
set(newlv, MUIA_List_Quiet, TRUE);
if (!gotrecent) get_recent();
if (gotrecent) {
if (!gotnew) {
for(pos=0;;pos++) {
DoMethod(recentlv, MUIM_List_GetEntry, pos, &flr);
if (!flr) break;
if (flr->time > prefs.lasttime) {
sprintf(line, "%lx@%s@%s;%lx@%s;@%s\n", flr->time, flr->dir, flr->name, flr->intsize, flr->readme, flr->descr);
DoMethod(newlv, MUIM_List_InsertSingle, line, MUIV_List_Insert_Bottom);
}
}
gotnew = TRUE;
}
if (sortnew) {
DoMethod(newlv, MUIM_List_Sort, NULL);
sortnew = FALSE;
}
clone_tagged(newlv);
get(newlv, MUIA_List_Entries, &numfiles);
sprintf(temp, "New files (%d)", numfiles);
adt_status(temp);
}
set(lvpage, MUIA_Group_ActivePage, FILE_NEW_PAGE);
set(newlv, MUIA_List_Quiet, FALSE);
set(recentlv, MUIA_List_Quiet, FALSE);
set(win, MUIA_Window_Sleep, FALSE);
}
void show_recent()
{
LONG numfiles;
char temp[20];
set(win, MUIA_Window_Sleep, TRUE);
if (!gotrecent) get_recent();
if (gotrecent) {
if (sortrecent) {
DoMethod(recentlv, MUIM_List_Sort, NULL);
sortrecent = FALSE;
}
clone_tagged(recentlv);
get(recentlv, MUIA_List_Entries, &numfiles);
sprintf(temp, "Recent files (%d)", numfiles);
adt_status(temp);
}
set(lvpage, MUIA_Group_ActivePage, FILE_RECENT_PAGE);
set(recentlv, MUIA_List_Quiet, FALSE);
set(win, MUIA_Window_Sleep, FALSE);
}
void show_short()
{
LONG numfiles;
char temp[20];
set(win, MUIA_Window_Sleep, TRUE);
set(shortlv, MUIA_List_Quiet, TRUE);
if (!gotshort) {
char local[256], command[256];
joinpaths(local, prefs.tmpdir, "SHORT.adt.Z");
adt_status("Downloading LONG list");
if (!get_file("info/adt/SHORT.adt.Z", local, 0)) {
sprintf(command, "%s \"%s\"", prefs.uncomp, local);
system(command);
local[strlen(local)-2] = '\0';
if(!get_parse(local, shortlv)) gotshort=TRUE;
} else adt_status("Error downloading LONG list");
}
if (gotshort) {
if (sortshort) {
DoMethod(shortlv, MUIM_List_Sort, NULL);
sortshort = FALSE;
}
clone_tagged(shortlv);
get(shortlv, MUIA_List_Entries, &numfiles);
sprintf(temp, "All files (%d)", numfiles);
adt_status(temp);
}
set(lvpage, MUIA_Group_ActivePage, FILE_ALL_PAGE);
set(shortlv, MUIA_List_Quiet, FALSE);
set(win, MUIA_Window_Sleep, FALSE);
}
void show_tagged()
{
char temp[40];
LONG numfiles;
set(taggedlv, MUIA_List_Quiet, TRUE);
DoMethod(taggedlv, MUIM_List_Clear, NULL);
copy_tagged(taggedlv);
if (sorttagged) {
DoMethod(taggedlv, MUIM_List_Sort, NULL);
sorttagged = FALSE;
}
set(lvpage, MUIA_Group_ActivePage, FILE_TAGGED_PAGE);
set(taggedlv, MUIA_List_Quiet, FALSE);
get(taggedlv, MUIA_List_Entries, &numfiles);
sprintf(temp, "Tagged files (%d)", numfiles);
adt_status(temp);
}
void readme(char *dir, char *name)
{
char fullpath[256], local[256], *buffer;
int fh;
struct stat st;
char adt_status_text[100], temp[100], *ptr;
set(win, MUIA_Window_Sleep, TRUE);
get(adt_statusobj, MUIA_Text_Contents, &ptr);
strcpy(adt_status_text, ptr);
sprintf(temp, "Downloading %s", name);
adt_status(temp);
/* download readme and put it in the readme page */
joinpaths(fullpath, dir, name);
joinpaths(local, prefs.tmpdir, name);
if (!get_file(fullpath, local, 0) && (fh = open(local, O_RDONLY))) {
stat(local, &st);
if (buffer = AllocMem(st.st_size, MEMF_ANY|MEMF_CLEAR)) {
read(fh, buffer, st.st_size);
set(readtext, MUIA_Floattext_Text, buffer);
set(mainpage, MUIA_Group_ActivePage, README_PAGE);
close(fh);
FreeMem(buffer, st.st_size);
}
}
remove(local);
adt_status(adt_status_text);
set(win, MUIA_Window_Sleep, FALSE);
}
APTR currentlv()
{
LONG page;
get(lvpage, MUIA_Group_ActivePage, &page);
switch(page) {
case FILE_RECENT_PAGE:
return(recentlv); break;
case FILE_ALL_PAGE:
return(shortlv); break;
case FILE_TAGGED_PAGE:
return(taggedlv); break;
case FILE_NEW_PAGE:
return(newlv); break;
}
}
int get_file(char *dir, char *file, int size)
{
return(ftp_get(dir, size, file));
}
static APTR beforetagged=NULL;
void clone_tagged(APTR destlv)
{
APTR curntlv;
LONG pos=-1;
struct FileLineRec *srcflr, *destflr;
curntlv = currentlv();
/* Clone tagged from the previous listview if switching from tagged lv
(because tagged lines will not hold same positions relative to other lv's) */
if (curntlv == taggedlv && destlv != taggedlv) curntlv = beforetagged;
if (curntlv != destlv) {
DoMethod(destlv, MUIM_List_Select, MUIV_List_Select_All, MUIV_List_Select_Off, NULL);
for (;;) {
DoMethod(curntlv, MUIM_List_NextSelected, &pos);
if (pos == -1) break;
DoMethod(curntlv, MUIM_List_GetEntry, pos, &srcflr);
DoMethod(destlv, MUIM_List_GetEntry, pos, &destflr);
if (destflr && (srcflr->time == destflr->time)) {
DoMethod(destlv, MUIM_List_Select, pos, MUIV_List_Select_On, NULL);
}
}
}
}
void copy_tagged(APTR destlv)
{
APTR curntlv;
LONG pos=-1;
struct FileLineRec *flr;
char line[256];
curntlv = currentlv();
if (destlv == taggedlv) beforetagged = curntlv;
for (;;) {
DoMethod(curntlv, MUIM_List_NextSelected, &pos);
if (pos == -1) break;
DoMethod(curntlv, MUIM_List_GetEntry, pos, &flr);
sprintf(line, "%lx@%s@%s;%lx@%s;@%s\n", flr->time, flr->dir, flr->name, flr->intsize, flr->readme, flr->descr);
DoMethod(destlv, MUIM_List_InsertSingle, line, MUIV_List_Insert_Bottom);
}
}
void copy_all(APTR destlv)
{
APTR curntlv;
LONG pos;
struct FileLineRec *flr;
char line[256];
curntlv = currentlv();
for (pos=0;;pos++){
DoMethod(curntlv, MUIM_List_GetEntry, pos, &flr);
if (!flr) break;
sprintf(line, "%lx@%s@%s;%lx@%s;@%s\n", flr->time, flr->dir, flr->name, flr->intsize, flr->readme, flr->descr);
DoMethod(destlv, MUIM_List_InsertSingle, line, MUIV_List_Insert_Bottom);
}
}
int get_parse(char *file, APTR lv)
{
FILE *fp;
char temp[40];
int version=0, err=0;
DoMethod(lv, MUIM_List_Clear, NULL);
adt_status("Parsing file list");
if (!(fp = fopen(file, "r"))) {
adt_status("Error: Uncompress failed");
return(1);
}
if (fscanf(fp, "adt-v%d\n", &version) != 1) {
fclose(fp);
sprintf(temp, "Error parsing %s file list", file);
adt_status(temp);
return(1);
}
/* switch(version) {
case 1: */
err = adt_parse_v1(fp, lv);
/* break;
} */
fclose(fp);
return(err);
}
int adt_parse_v1(FILE *in, APTR lv)
{
char lnbuf[256];
while (fgets(lnbuf, 256, in))
DoMethod(lv, MUIM_List_InsertSingle, lnbuf, MUIV_List_Insert_Bottom);
return(0);
}