home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 3
/
PDCD_3.iso
/
internet
/
www
/
!HTTP
/
c
/
Main
Wrap
Text File
|
1994-10-25
|
7KB
|
197 lines
#include "DeskLib:Dialog.h" /* High-level dialogue windows */
#include "DeskLib:Error.h" /* Error despatcher */
#include "DeskLib:Event.h" /* Event despatcher */
#include "DeskLib:EventMsg.h" /* Wimp Message event dispatcher */
#include "DeskLib:File.h" /* Low level file handling */
#include "DeskLib:GFX.h" /* Graphics routines (GFX_Wait) */
#include "DeskLib:Handler.h" /* Default/example event handlers */
#include "DeskLib:Hourglass.h" /* Hourglass module interfaces */
#include "DeskLib:Icon.h" /* Icon handling automation */
#include "TimsLib:Menu.h" /* Menu create & show support */
#include "TimsLib:Msgs.h" /* Message translation code */
#include "DeskLib:Resource.h" /* Handles finding resource files */
#include "DeskLib:Screen.h" /* Getting screen size info, etc */
#include "DeskLib:Sound.h" /* Sound System control */
#include "DeskLib:SWI.h"
#include "TimsLib:SWIs.h"
#include "DeskLib:Template.h" /* Template loading and caching */
#include "DeskLib:WimpSWIs.h" /* Low-level WIMP commands */
#include "DeskLib:Window.h" /* Window handling automation */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "http.h"
#include "requester.h"
#include "Utils.h"
static linklist_header requests = {NULL, NULL};
static BOOL quit = FALSE; /* Set to TRUE to quit the app. */
static menu mainmenu = NULL; /* Pointer to our main menu */
static window_handle info_w = 0;
#define VERSION __TIME__" "__DATE__
static BOOL HTTP_Rx(event_pollblock *event, void *reference)
{
arcweb_msg *webmsg;
char buffer[512];
http_req *ptr;
for (ptr = (http_req *) LinkList_FirstItem(&requests); ptr != NULL;
ptr = (http_req *) LinkList_NextItem((linklist_header *) ptr))
{
if (ptr->sentmsg.header.myref == event->data.message.header.yourref)
{
sprintf(buffer, "copy %s %s ~c~vfd", event->data.message.data.bytes, ptr->webfile);
OSCLI(buffer);
webmsg = (arcweb_msg *) ptr->webmsg.data.bytes;
if (webmsg->flags & arcweb_FLAGS_image_fetch)
File_SetType(ptr->webfile, 0xFFF);
else
File_SetType(ptr->webfile, 0x345);
/* ptr->webmsg.header.yourref = ptr->webmsg.header.myref; */
ptr->webmsg.header.action = message_ARCWEBDONE;
webmsg->data.fetch_done.expiry.use_default_expiry = -1;
Wimp_SendMessage(event_SENDWANTACK, &ptr->webmsg, ptr->sender, 0);
LinkList_Unlink(&requests, (linklist_header *) ptr);
free(ptr->webfile);
free(ptr);
}
}
return(TRUE);
}
static BOOL FetchRequest(event_pollblock *event, void *reference)
{
arcweb_msg *webmsg = (arcweb_msg *) event->data.message.data.bytes;
char webfile[256], site[80];
char *colon;
http_req *req;
int port, slash, sender;
message_block sendmsg;
if (strnicmp(webmsg->data.fetch_request.URL, "http:", 5) == 0)
{
/* SWI(0, 0, 0x104);
printf("%s \n", webmsg->data.fetch_request.URL); */
event->data.message.header.yourref = event->data.message.header.myref;
sender = event->data.message.header.sender;
Wimp_SendMessage(event_ACK, &event->data.message,
event->data.message.header.sender, 0);
SWI(6, 0, OS_Args, 7, webmsg->data.fetch_request.localfile, webfile, 256, 256, 256);
File_Close(webmsg->data.fetch_request.localfile);
slash = strcspn(&webmsg->data.fetch_request.URL[7], "/");
strncpy(site, &webmsg->data.fetch_request.URL[7], slash);
site[slash] = '\0';
colon = strchr(site, ':');
if (colon != NULL)
{
port = atoi(&colon[1]);
colon[0] = '\0';
}
else
{
port = 80;
}
sprintf(sendmsg.data.bytes, "trf %s %d \"GET %s\"", site, port, &webmsg->data.fetch_request.URL[7 + slash]);
sendmsg.header.size = 256;
sendmsg.header.myref = 0;
sendmsg.header.yourref = 0;
sendmsg.header.action = 0x823F0;
Wimp_SendMessage(event_SEND, &sendmsg, 0, 0);
if (webmsg->flags & arcweb_FLAGS_image_fetch)
webmsg->flags = ((webmsg->flags & 0x66BE0000) | 0x40000695);
else
webmsg->flags = ((webmsg->flags & 0x66BE0000) | 0x40000345);
req = (http_req *) malloc(sizeof(http_req));
req->sentmsg = sendmsg;
req->webmsg = event->data.message;
req->webfile = strdup(webfile);
req->sender = sender;
LinkList_AddToTail(&requests, (linklist_header *) req);
}
return(TRUE);
}
static BOOL MenuWarn(event_pollblock *event, void *reference)
{
if (info_w == 0)
{
info_w = Window_Create("ProgInfo", 0);
Event_Claim(event_CLOSE, info_w, event_ANY, Handler_CloseWindow, NULL);
Icon_SetText(info_w, 4, VERSION);
}
Wimp_CreateSubMenu((menu_block *) info_w,
event->data.message.data.menuwarn.openpos.x,
event->data.message.data.menuwarn.openpos.y);
return(TRUE);
}
static void MenuChoice(void *handle, int *hit)
{
switch(hit[0])
{
case 0:
if (info_w == 0)
{
info_w = Window_Create("ProgInfo", 0);
Icon_SetText(info_w, 4, VERSION);
Event_Claim(event_CLOSE, info_w, event_ANY, Handler_CloseWindow, NULL);
}
Window_Show(info_w, open_UNDERPOINTER);
break;
case 1:
quit = TRUE;
break;
}
}
int main()
{
icon_handle baricon;
char appname[64];
Resource_Initialise("HTTP"); /* resources in <HTTP$Dir> */
Msgs_LoadFile("messages");
Msgs_Lookup("app.name:HTTP", appname, 64);
Event_Initialise(appname);
EventMsg_Initialise();
Screen_CacheModeInfo();
EventMsg_Claim(message_MODECHANGE, event_ANY, Handler_ModeChange, NULL);
baricon = Icon_BarIcon("!http", iconbar_RIGHT);
mainmenu = Menu_New("HTTP", ">Info|Quit");
Menu_AttachMenu(mainmenu, window_ICONBAR, baricon, MenuChoice, NULL);
EventMsg_Claim(message_MENUWARNING, event_ANY, MenuWarn, NULL);
Event_Claim(event_REDRAW, event_ANY, event_ANY, Handler_NullRedraw, NULL);
Event_Claim(event_OPEN, event_ANY, event_ANY, Handler_OpenWindow, NULL);
Template_Initialise();
Template_UseOutlineFonts();
Template_LoadFile("Templates");
Window_AutoHelp(event_ANY, event_ANY);
EventMsg_Claim(message_ARCWEBFETCH, event_ANY, FetchRequest, NULL);
EventMsg_Claim(0x823F1, event_ANY, HTTP_Rx, NULL);
while (!quit)
Event_Poll();
Template_ClearAll();
return(0);
}