home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / desklib / examples / DeskLib / Examples / Widget5 / !Widget5 / c / ATrans next >
Encoding:
Text File  |  1995-05-12  |  10.3 KB  |  317 lines

  1. /*
  2.  *  ATrans.c Andrew's Transfer library
  3.  *
  4.  *  Provides very simple routines for loading and saving in the desktop
  5.  */
  6.  
  7. #include "DeskLib:Event.h"
  8. #include "DeskLib:EventMsg.h"
  9. #include "DeskLib:Msgs.h"
  10. #include "DeskLib:WimpSWIs.h"
  11. #include "DeskLib:Error.h"
  12. #include "DeskLib:StringCR.h"
  13. #include "DeskLib:KernelSWIs.h"
  14. #include "DeskLib:DragASpr.h"
  15. #include "DeskLib:SWI.h"
  16. #include "ATrans.h"
  17. /* #include "MyHeader.h" */
  18. #include "MySwis.h"
  19. #include "kernel.h"
  20.  
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <stdlib.h>
  24.  
  25. static ATrans_defblock defblock;
  26. static BOOL initialised = FALSE;
  27.  
  28. /* responds to messages */
  29. BOOL ATrans_message(event_pollblock *event, void *reference)
  30. {
  31.   int *buffer;
  32.   int size;
  33.   event_type mess;
  34.   BOOL truefalse;
  35.                                                  
  36.   switch(event->data.message.header.action)
  37.   {
  38.      case message_DATASAVE:
  39.      if((event->data.message.header.sender != event_taskhandle) &&
  40.      ((defblock.checkload)(event->data.message.data.datasave.filetype,FALSE))){
  41.         strcpy(event->data.message.data.datasave.leafname, "<Wimp$Scrap>");
  42.         event->data.message.data.datasave.estsize = -1;
  43.         event->data.message.header.yourref = event->data.message.header.myref;
  44.         event->data.message.header.action = message_DATASAVEACK;
  45.         event->data.message.header.size = 60;
  46.         Wimp_SendMessage(event_USERMESSAGE,
  47.                          &event->data.message,
  48.                          event->data.message.header.sender,
  49.                          0);
  50.      }
  51.      return(TRUE);
  52.      break;
  53.  
  54.      case message_DATASAVEACK:
  55.      if( event->data.message.header.yourref == defblock.ref ){
  56.         event->data.message.data.datasaveack.estsize = defblock.size;
  57.         event->data.message.header.yourref = event->data.message.header.myref;
  58.         event->data.message.header.action = message_DATALOAD;
  59.         Wimp_SendMessage(event_USERMESSAGERECORDED,
  60.                          &event->data.message,
  61.                          event->data.message.data.datasaveack.window,
  62.                          event->data.message.data.datasaveack.icon);
  63.         (defblock.savefile)(event->data.message.data.datasaveack.filename,
  64.                             defblock.type,
  65.                             (event->data.message.data.datasaveack.estsize!=-1));
  66.         defblock.ref = event->data.message.header.myref;
  67.         Wimp_CreateMenu((menu_ptr) -1, 0, 0); /* remove any menu from screen */
  68.       }
  69.       return(TRUE);
  70.       break;
  71.  
  72.       case message_DATALOAD:
  73.       if( (event->data.message.header.sender != event_taskhandle) &&
  74.       ((defblock.checkload)(event->data.message.data.dataload.filetype,FALSE))){
  75.          event->data.message.header.yourref = event->data.message.header.myref;
  76.          event->data.message.header.action = message_DATALOADACK;
  77.          Wimp_SendMessage(event_USERMESSAGE,
  78.                           &event->data.message,
  79.                           event->data.message.header.sender,
  80.                           0);
  81.       if( strcmp(event->data.message.data.dataload.filename,"<Wimp$Scrap>") != 0)
  82.           truefalse = TRUE;
  83.       else
  84.           truefalse = FALSE;
  85.          (defblock.loadfile)(event->data.message.data.dataload.filename,
  86.                              event->data.message.data.dataload.filetype,
  87.                              truefalse);
  88.       if( truefalse == FALSE )
  89.          OSCLI("Remove <Wimp$Scrap>");                       
  90.       }
  91.       return(TRUE);
  92.       break;
  93.  
  94.       case message_DATAOPEN:
  95.       if((defblock.checkload)(event->data.message.data.datasave.filetype,TRUE)){
  96.          event->data.message.header.yourref = event->data.message.header.myref;
  97.          event->data.message.header.action = message_DATALOADACK;
  98.          Wimp_SendMessage(event_USERMESSAGE,
  99.                           &event->data.message,
  100.                           event->data.message.header.sender,
  101.                           0);
  102.          (defblock.loadfile)(event->data.message.data.dataload.filename,
  103.                              event->data.message.data.dataload.filetype,
  104.                              TRUE);
  105.       }
  106.       return(TRUE);
  107.       break;
  108.  
  109.       case message_RAMFETCH:
  110.       buffer = malloc(event->data.message.data.ramfetch.buffsize);
  111.       size = (defblock.sendblock)(buffer,
  112.                                   event->data.message.data.ramfetch.buffsize,
  113.                                   defblock.type);
  114.       Wimp_TransferBlock(event_taskhandle,
  115.                          buffer,
  116.                          event->data.message.header.sender,
  117.                          event->data.message.data.ramfetch.buffer,
  118.                          size);
  119.       free(buffer);
  120.       if(size < event->data.message.data.ramfetch.buffsize)
  121.          mess = event_USERMESSAGE;
  122.       else
  123.          mess = event_USERMESSAGERECORDED;
  124.       event->data.message.header.yourref = event->data.message.header.myref;
  125.       event->data.message.header.action = message_RAMTRANSMIT;
  126.       event->data.message.data.ramtransmit.byteswritten = size;
  127.       Wimp_SendMessage(mess,
  128.                        &event->data.message,
  129.                        event->data.message.header.sender,
  130.                        0);
  131.       return(TRUE);
  132.       break;
  133.   }
  134.  
  135.   return(FALSE);
  136. }
  137.  
  138. /* acknowledges messages */
  139. BOOL ATrans_acknowledge(event_pollblock *event, void *reference)
  140. {
  141.   char err_msg[61];
  142.   
  143.   switch(event->data.message.header.action)
  144.   {
  145.      case message_DATALOAD:
  146.      if(defblock.savefile == NULL)
  147.         return(TRUE);
  148.      if( event->data.message.header.yourref == defblock.ref){
  149.         if(strcmp(event->data.message.data.dataload.filename,"<Wimp$Scrap>")==0)
  150.            OSCLI("Remove <Wimp$Scrap>");
  151.         Msgs_Lookup("msg.rdied", err_msg, 60);
  152.         Error_Report(1, err_msg);
  153.      }
  154.      return(TRUE);
  155.      break;
  156.  
  157.      case message_RAMTRANSMIT:
  158.      if(defblock.sendblock == NULL)
  159.         return(TRUE);
  160.      Msgs_Lookup("msg.rdied", err_msg, 60);
  161.      Error_Report(1, err_msg);
  162.      return(TRUE);
  163.      break;
  164.    }
  165.  
  166.    return(FALSE);
  167. }
  168.  
  169. /* called when drag is terminated to save file */
  170. BOOL ATrans_savedrag(event_pollblock *event, void *reference)
  171. {
  172.   int solid;
  173.   mouse_block    ptr;
  174.   /* icon_block     iconblock; */
  175.  
  176.   if(defblock.dragging == FALSE)
  177.      return(FALSE);
  178.  
  179.   OS_Byte(osbyte_READCMOSRAM, 28, 0, NULL, &solid);
  180.  
  181.   if((solid & 2) == 2)
  182.      DragASprite_Stop();
  183.   else
  184.      Wimp_DragBox((drag_block *) -1);
  185.  
  186.   defblock.dragging = FALSE;
  187.  
  188.   Wimp_GetPointerInfo( &ptr);
  189.  
  190.   event->data.message.header.size            = 80;
  191.   event->data.message.header.yourref         = 0;
  192.   event->data.message.header.action          = message_DATASAVE;
  193.   event->data.message.data.datasave.window   = ptr.window;
  194.   event->data.message.data.datasave.icon     = ptr.icon;
  195.   event->data.message.data.datasave.pos      = ptr.pos;
  196.   event->data.message.data.datasave.estsize  = defblock.size;
  197.   event->data.message.data.datasave.filetype = defblock.type;
  198.  
  199.   strcpy(event->data.message.data.datasave.leafname, LeafName(defblock.file));
  200.  
  201.   Wimp_SendMessage(event_SENDWANTACK,
  202.                    &event->data.message,
  203.                    (message_destinee) ptr.window,
  204.                    ptr.icon);
  205.  
  206.   defblock.ref = event->data.message.header.myref;
  207.  
  208.   return(TRUE);
  209. }
  210.  
  211. /* call this when the file icon is dragged */
  212. void ATrans_startdrag(char *filename, int filetype, int filesize,
  213.                       window_handle window, icon_handle icon, sprite_area area)
  214. {
  215.   char spritename[15];
  216.   char number[5];
  217.   drag_block     draginfo;
  218.   int solid;
  219.   wimp_rect bound;
  220.   int block[20];
  221.   int winminx, winminy, winmaxx, winmaxy;
  222.   _kernel_swi_regs r;
  223.  
  224.   OS_Byte(osbyte_READCMOSRAM, 28, 0, NULL, &solid);
  225.  
  226.   block[0] = window;
  227.   r.r[1] = (int) block; 
  228.   _kernel_swi( SWI_XOS_Bit | SWI_Wimp_GetWindowState, &r, &r );
  229.   winminx = block[1];
  230.   winminy = block[2];
  231.   winmaxx = block[3];
  232.   winmaxy = block[4];
  233.  
  234.   block[0] = window;
  235.   block[1] = icon;
  236.   r.r[1] = (int) block;
  237.   _kernel_swi( SWI_XOS_Bit | SWI_Wimp_GetIconState, &r, &r );
  238.  
  239.   bound.min.x = winminx + block[2];
  240.   bound.max.x = winminx + block[4];
  241.   bound.min.y = winminy + block[3] + (winmaxy - winminy);
  242.   bound.max.y = winminy + block[5] + (winmaxy - winminy);
  243.  
  244.   if((solid & 2) == 2){
  245.      strcpy(spritename, "file_");
  246.      if(filetype < 0x100)
  247.         strcat(spritename, "0");
  248.      if(filetype < 0x10)
  249.         strcat(spritename, "0");
  250.      sprintf(number,"%x", filetype);
  251.      strcat(spritename, number);
  252.  
  253.      if(area == (sprite_area) 1)
  254.         DragASprite_Start(0xC5, (void *) 1, spritename, &bound, (wimp_rect *) 0);
  255.      if(area == (sprite_area) 0)
  256.         DragASprite_Start(0xC5, (void *) 0, spritename, &bound, (wimp_rect *) 0);
  257.      if((area != (sprite_area) 1) && (area != (sprite_area) 0))
  258.         DragASprite_Start(0xC5, area, spritename, &bound, (wimp_rect *) 0);
  259.   }
  260.   else{
  261.  
  262.   draginfo.window            = 0;
  263.   draginfo.type              = drag_FIXEDBOX;
  264.   draginfo.screenrect        = bound;
  265.   draginfo.parent.min.x      = 0;
  266.   draginfo.parent.min.y      = 0;
  267.   draginfo.parent.max.x      = 10000;
  268.   draginfo.parent.max.y      = 10000;
  269.   Wimp_DragBox( &draginfo);
  270.   }
  271.  
  272.   defblock.type = filetype;
  273.   strcpy(defblock.file, filename);
  274.   defblock.size = filesize;
  275.   defblock.dragging = TRUE;
  276. }
  277.  
  278. /* initialised event handlers and stores addresses of callback routines */
  279. void ATrans_Init(ATrans_checkload checkload,
  280.                  ATrans_loadfile loadfile,
  281.                  ATrans_savefile savefile,
  282.                  ATrans_sendblock sendblock)
  283. {
  284.  
  285.   if(initialised == TRUE){
  286.      Error_ReportInternal(0,"ATrans can only be initialised once at present");
  287.      return;
  288.   }
  289.  
  290.   defblock.checkload = checkload;
  291.   defblock.loadfile = loadfile;
  292.   defblock.savefile = savefile;
  293.   defblock.sendblock = sendblock;
  294.  
  295.   Event_Claim(event_USERDRAG, event_ANY, event_ANY, ATrans_savedrag, NULL);
  296.  
  297.   if(defblock.checkload != NULL)
  298.      EventMsg_Claim(message_DATASAVE, event_ANY, ATrans_message, NULL);
  299.   if(defblock.savefile != NULL)
  300.      EventMsg_Claim(message_DATASAVEACK, event_ANY, ATrans_message, NULL);
  301.   if((defblock.loadfile != NULL) && (defblock.checkload != NULL))
  302.      EventMsg_Claim(message_DATALOAD, event_ANY, ATrans_message, NULL);
  303.   if((defblock.loadfile != NULL) && (defblock.checkload != NULL))
  304.      EventMsg_Claim(message_DATAOPEN, event_ANY, ATrans_message, NULL);
  305.   if(defblock.sendblock != NULL)
  306.      EventMsg_Claim(message_RAMFETCH, event_ANY, ATrans_message, NULL);
  307.  
  308.   if((defblock.savefile != NULL) || (defblock.sendblock != NULL))
  309.      Event_Claim(event_USERMESSAGEACK, event_ANY, event_ANY, ATrans_acknowledge, NULL);
  310.   
  311. }
  312.  
  313.  
  314.         
  315.  
  316.  
  317.