home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / packery / xpk_source / xpkmaster / hook_fh.c < prev    next >
C/C++ Source or Header  |  1996-10-19  |  3KB  |  130 lines

  1. #ifndef XPKMASTER_HOOK_FH_C
  2. #define XPKMASTER_HOOK_FH_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        hook_fh.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: hook_fh.c 1.0 (06.10.96)
  9.     Author:        SDI
  10.     Distribution:    PD
  11.     Description:    File IO hooks
  12.  
  13.  1.0   06.10.96 : first real version
  14. */
  15.  
  16. #include <exec/types.h>
  17. #include <pragma/dos_lib.h>
  18. #include <pragma/exec_lib.h>
  19. #include "xpkmaster.h"
  20.  
  21. static LONG allociobuf(struct XpkMasterMsg *msg);
  22. static void freeiobuf(struct XpkMasterMsg *msg);
  23.  
  24. #ifdef __MAXON__
  25.   #define __asm
  26. #endif
  27.  
  28. /****************************** read-from-fh hook **************************/
  29. static LONG __asm fhinfunc(register __a1 struct XpkMasterMsg *msg)
  30. {
  31.   LONG wanted;
  32.  
  33.   switch(msg->xmm_Type)
  34.   {
  35.   case XIO_SEEK:
  36.     if((msg->xmm_Size = Seek(msg->xmm_FH, msg->xmm_Size, OFFSET_CURRENT))<0)
  37.       return XPKERR_IOERRIN;
  38.     msg->xmm_Ptr = (STRPTR) 42;    /* something > 0 */
  39.     break;
  40.   case XIO_GETBUF:
  41.     if(allociobuf(msg))
  42.       return XPKERR_NOMEM;
  43.     msg->xmm_Ptr = msg->xmm_Buf;
  44.     break;
  45.   case XIO_READ:
  46.     if(!msg->xmm_Ptr)
  47.     {
  48.       if(allociobuf(msg))
  49.         return XPKERR_NOMEM;
  50.       msg->xmm_Ptr = msg->xmm_Buf;
  51.     }
  52.     wanted = msg->xmm_Size;
  53.     if((msg->xmm_Size = Read(msg->xmm_FH, msg->xmm_Ptr, wanted)) != wanted)
  54.       return msg->xmm_Size >= 0 ? XPKERR_TRUNCATED : XPKERR_IOERRIN;
  55.     break;
  56.   case XIO_ABORT:
  57.   case XIO_FREE:
  58.     freeiobuf(msg);
  59.     if(msg->xmm_Flags & XMF_PRIVFH)
  60.       Close(msg->xmm_FH),
  61.     msg->xmm_FH = 0;
  62.     break;
  63.   }
  64.   return 0;
  65. }
  66.  
  67. struct Hook fhinhook = { {0}, (ULONG (*) ()) fhinfunc, 0, 0};
  68.  
  69. /****************************** write-to-fh hook **************************/
  70.  
  71. static LONG __asm fhoutfunc(register __a1 struct XpkMasterMsg *msg)
  72. {
  73.   LONG wanted;
  74.  
  75.   switch(msg->xmm_Type)
  76.   {
  77.   case XIO_GETBUF:
  78.     if(allociobuf(msg))
  79.       return XPKERR_NOMEM;
  80.     msg->xmm_Ptr = msg->xmm_Buf;
  81.     break;
  82.   case XIO_WRITE:
  83.     wanted = msg->xmm_Size;
  84.     if((msg->xmm_Size = Write(msg->xmm_FH, msg->xmm_Ptr, wanted)) != wanted)
  85.       return XPKERR_IOERROUT;
  86.     break;
  87.   case XIO_SEEK:
  88.     if((msg->xmm_Size = Seek(msg->xmm_FH, msg->xmm_Size, OFFSET_CURRENT))<0)
  89.       return XPKERR_IOERROUT;
  90.     msg->xmm_Ptr = (STRPTR) 42;    /* something > 0 */
  91.     break;
  92.   case XIO_ABORT:
  93.   case XIO_FREE:
  94.     freeiobuf (msg);
  95.     if(msg->xmm_Flags & XMF_PRIVFH)
  96.     {
  97.       Close(msg->xmm_FH);
  98.       msg->xmm_FH = 0L;
  99.     }
  100.     break;
  101.   }
  102.   return 0;
  103. }
  104.  
  105. struct Hook fhouthook = { {0}, (ULONG (*) ()) fhoutfunc,0 ,0};
  106.  
  107. /**************** free fh I/O buf ***************/
  108. static void freeiobuf(struct XpkMasterMsg *msg)
  109. {
  110.   if(msg->xmm_BufLen)
  111.   {
  112.     FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
  113.     msg->xmm_BufLen = 0;
  114.   }
  115. }
  116.  
  117. /**************** alloc fh I/O buf ***************/
  118. static LONG allociobuf(struct XpkMasterMsg *msg)
  119. {
  120.   if(msg->xmm_BufLen >= msg->xmm_Size)
  121.     return 0;
  122.   freeiobuf(msg);
  123.   if(!(msg->xmm_Buf = (STRPTR) AllocMem(msg->xmm_Size, msg->xmm_MemType)))
  124.     return XPKERR_NOMEM;
  125.   msg->xmm_BufLen = msg->xmm_Size;
  126.   return 0;
  127. }
  128.  
  129. #endif /* XPKMASTER_HOOK_FH_C */
  130.