home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / internet / www / !HTTP / c / Main
Text File  |  1994-10-25  |  7KB  |  197 lines

  1. #include "DeskLib:Dialog.h"            /* High-level dialogue windows     */
  2. #include "DeskLib:Error.h"             /* Error despatcher                */
  3. #include "DeskLib:Event.h"             /* Event despatcher                */
  4. #include "DeskLib:EventMsg.h"          /* Wimp Message event dispatcher   */
  5. #include "DeskLib:File.h"              /* Low level file handling         */
  6. #include "DeskLib:GFX.h"               /* Graphics routines (GFX_Wait)    */
  7. #include "DeskLib:Handler.h"           /* Default/example event handlers  */
  8. #include "DeskLib:Hourglass.h"         /* Hourglass module interfaces     */
  9. #include "DeskLib:Icon.h"              /* Icon handling automation        */
  10. #include "TimsLib:Menu.h"              /* Menu create & show support      */
  11. #include "TimsLib:Msgs.h"              /* Message translation code        */
  12. #include "DeskLib:Resource.h"          /* Handles finding resource files  */
  13. #include "DeskLib:Screen.h"            /* Getting screen size info, etc   */
  14. #include "DeskLib:Sound.h"             /* Sound System control            */
  15. #include "DeskLib:SWI.h"
  16. #include "TimsLib:SWIs.h"
  17. #include "DeskLib:Template.h"          /* Template loading and caching    */
  18. #include "DeskLib:WimpSWIs.h"          /* Low-level WIMP commands         */
  19. #include "DeskLib:Window.h"            /* Window handling automation      */
  20.  
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24.  
  25. #include "http.h"
  26. #include "requester.h"
  27. #include "Utils.h"
  28.  
  29. static linklist_header requests = {NULL, NULL};
  30.  
  31. static BOOL quit      = FALSE;     /* Set to TRUE to quit the app.    */
  32. static menu mainmenu  = NULL;      /* Pointer to our main menu        */
  33.  
  34. static window_handle info_w = 0;
  35.  
  36. #define VERSION __TIME__"  "__DATE__
  37.  
  38. static BOOL HTTP_Rx(event_pollblock *event, void *reference)
  39. {
  40.   arcweb_msg *webmsg;
  41.   char buffer[512];
  42.   http_req *ptr;
  43.  
  44.   for (ptr = (http_req *) LinkList_FirstItem(&requests); ptr != NULL;
  45.        ptr = (http_req *) LinkList_NextItem((linklist_header *) ptr))
  46.   {
  47.     if (ptr->sentmsg.header.myref == event->data.message.header.yourref)
  48.     {
  49.       sprintf(buffer, "copy %s %s ~c~vfd", event->data.message.data.bytes, ptr->webfile);
  50.       OSCLI(buffer);
  51.       webmsg = (arcweb_msg *) ptr->webmsg.data.bytes;
  52.       if (webmsg->flags & arcweb_FLAGS_image_fetch)
  53.         File_SetType(ptr->webfile, 0xFFF);
  54.       else
  55.         File_SetType(ptr->webfile, 0x345);
  56. /*      ptr->webmsg.header.yourref = ptr->webmsg.header.myref; */
  57.       ptr->webmsg.header.action  = message_ARCWEBDONE;
  58.       webmsg->data.fetch_done.expiry.use_default_expiry = -1;
  59.       Wimp_SendMessage(event_SENDWANTACK, &ptr->webmsg, ptr->sender, 0);
  60.       LinkList_Unlink(&requests, (linklist_header *) ptr);
  61.       free(ptr->webfile);
  62.       free(ptr);
  63.     }
  64.   }
  65.   return(TRUE);
  66. }
  67.  
  68. static BOOL FetchRequest(event_pollblock *event, void *reference)
  69. {
  70.   arcweb_msg *webmsg = (arcweb_msg *) event->data.message.data.bytes;
  71.   char webfile[256], site[80];
  72.   char *colon;
  73.   http_req *req;
  74.   int port, slash, sender;
  75.   message_block sendmsg;
  76.  
  77.   if (strnicmp(webmsg->data.fetch_request.URL, "http:", 5) == 0)
  78.   {
  79.     /* SWI(0, 0, 0x104);
  80.     printf("%s           \n", webmsg->data.fetch_request.URL); */
  81.     event->data.message.header.yourref = event->data.message.header.myref;
  82.     sender = event->data.message.header.sender;
  83.     Wimp_SendMessage(event_ACK, &event->data.message,
  84.                      event->data.message.header.sender, 0);
  85.     SWI(6, 0, OS_Args, 7, webmsg->data.fetch_request.localfile, webfile, 256, 256, 256);
  86.     File_Close(webmsg->data.fetch_request.localfile);
  87.     slash = strcspn(&webmsg->data.fetch_request.URL[7], "/");
  88.     strncpy(site, &webmsg->data.fetch_request.URL[7], slash);
  89.     site[slash] = '\0';
  90.     colon = strchr(site, ':');
  91.     if (colon != NULL)
  92.     {
  93.       port = atoi(&colon[1]);
  94.       colon[0] = '\0';
  95.     }
  96.     else
  97.     {
  98.       port = 80;
  99.     }
  100.     sprintf(sendmsg.data.bytes, "trf %s %d \"GET %s\"", site, port, &webmsg->data.fetch_request.URL[7 + slash]);
  101.     sendmsg.header.size    = 256;
  102.     sendmsg.header.myref   = 0;
  103.     sendmsg.header.yourref = 0;
  104.     sendmsg.header.action  = 0x823F0;
  105.     Wimp_SendMessage(event_SEND, &sendmsg, 0, 0);
  106.  
  107.     if (webmsg->flags & arcweb_FLAGS_image_fetch)
  108.       webmsg->flags = ((webmsg->flags & 0x66BE0000) | 0x40000695);
  109.     else
  110.       webmsg->flags = ((webmsg->flags & 0x66BE0000) | 0x40000345);
  111.     req = (http_req *) malloc(sizeof(http_req));
  112.     req->sentmsg = sendmsg;
  113.     req->webmsg  = event->data.message;
  114.     req->webfile = strdup(webfile);
  115.     req->sender  = sender;
  116.     LinkList_AddToTail(&requests, (linklist_header *) req);
  117.   }
  118.   return(TRUE);
  119. }
  120.  
  121. static BOOL MenuWarn(event_pollblock *event, void *reference)
  122. {
  123.   
  124.   if (info_w == 0)
  125.   {
  126.     info_w = Window_Create("ProgInfo", 0);
  127.     Event_Claim(event_CLOSE, info_w, event_ANY, Handler_CloseWindow, NULL);
  128.     Icon_SetText(info_w, 4, VERSION);
  129.   }
  130.   Wimp_CreateSubMenu((menu_block *) info_w,
  131.                      event->data.message.data.menuwarn.openpos.x,
  132.                      event->data.message.data.menuwarn.openpos.y);
  133.  
  134.   return(TRUE);
  135. }
  136.  
  137. static void MenuChoice(void *handle, int *hit)
  138. {
  139.   switch(hit[0])
  140.   {
  141.     case 0:
  142.       if (info_w == 0)
  143.       {
  144.         info_w = Window_Create("ProgInfo", 0);
  145.         Icon_SetText(info_w, 4, VERSION);
  146.         Event_Claim(event_CLOSE, info_w, event_ANY, Handler_CloseWindow, NULL);
  147.       }
  148.       Window_Show(info_w,  open_UNDERPOINTER);
  149.       break;
  150.  
  151.     case 1:
  152.       quit = TRUE;
  153.       break;
  154.   }
  155. }
  156.  
  157. int main()
  158. {
  159.   icon_handle baricon;
  160.   char        appname[64];
  161.  
  162.   Resource_Initialise("HTTP");   /* resources in <HTTP$Dir> */
  163.  
  164.   Msgs_LoadFile("messages");
  165.   Msgs_Lookup("app.name:HTTP", appname, 64);
  166.  
  167.   Event_Initialise(appname);
  168.   EventMsg_Initialise();
  169.  
  170.   Screen_CacheModeInfo();
  171.   EventMsg_Claim(message_MODECHANGE, event_ANY, Handler_ModeChange, NULL);
  172.  
  173.   baricon  = Icon_BarIcon("!http", iconbar_RIGHT);
  174.   mainmenu = Menu_New("HTTP", ">Info|Quit");
  175.   Menu_AttachMenu(mainmenu, window_ICONBAR, baricon, MenuChoice, NULL);
  176.   EventMsg_Claim(message_MENUWARNING, event_ANY, MenuWarn,    NULL);
  177.  
  178.   Event_Claim(event_REDRAW, event_ANY, event_ANY, Handler_NullRedraw, NULL);
  179.   Event_Claim(event_OPEN,   event_ANY, event_ANY, Handler_OpenWindow, NULL);
  180.  
  181.   Template_Initialise();
  182.   Template_UseOutlineFonts();
  183.   Template_LoadFile("Templates");
  184.  
  185.   Window_AutoHelp(event_ANY, event_ANY);
  186.  
  187.   EventMsg_Claim(message_ARCWEBFETCH, event_ANY, FetchRequest, NULL);
  188.   EventMsg_Claim(0x823F1,  event_ANY, HTTP_Rx,  NULL);
  189.  
  190.   while (!quit)
  191.     Event_Poll();
  192.  
  193.   Template_ClearAll();
  194.  
  195.   return(0);
  196. }
  197.