home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / wps / com / zocdev / tap / tap.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-02  |  4.1 KB  |  140 lines

  1. /***********************************************************************
  2. *                                                                      *
  3. *   A tap listener is an independent applications that  opens a queue  *
  4. *   to receive information about file operations occuring in file      *
  5. *   transfers (e.g. via ZMODEM).                                       *
  6. *   These informations can be used for add-in applications like        *
  7. *   auto-unzippers or online viewers.                                  *
  8. *                                                                      *
  9. *   ------------------------------------------------------------------ *
  10. *                                                                      *
  11. *   This tap listener program is queue driven and just lists all       *
  12. *   events, that come in through the queue.                            *
  13. *                                                                      *
  14. *   ------------------------------------------------------------------ *
  15. *                                                                      *
  16. *   Manufacturing: ICC -Ss TAP.C                                       *
  17. *                                                                      *
  18. *   ------------------------------------------------------------------ *
  19. *                                                                      *
  20. *   No copyright by Markus Schmidt, 1993                               *
  21. *                                                                      *
  22. ***********************************************************************/
  23.  
  24. #define INCL_DOSFILEMGR
  25. // #define INCL_WINWINDOWMGR
  26. #define INCL_DOSQUEUES
  27. #define INCL_DOSMEMMGR
  28. #define INCL_NOCOMMON
  29.  
  30. #include <os2.h>
  31. #include <stdio.h>
  32.  
  33. #include "tap.h"
  34.  
  35. int main()
  36. {
  37.     int i;
  38.     long size;
  39.     char szQueName[]= TAP_QUEUE_NAME;
  40.     HQUEUE hq= 0;
  41.  
  42.  
  43.     // Find a free name and create a data queue to receive info
  44.     for (i= 0; i<TAP_MAX && hq==0; i++) {
  45.         DosCreateQueue(&hq, QUE_FIFO, szQueName);
  46.         szQueName[strlen(szQueName)-1]++;
  47.     }
  48.  
  49.     if (hq) {
  50.         REQUESTDATA rqd;
  51.         ULONG length;
  52.         VOID *data;
  53.         BYTE prio;
  54.         TAP_HOSTINFO *phi;
  55.         char *pcdata;
  56.  
  57.  
  58.         do {
  59.             // read message from queue
  60.             DosReadQueue(hq, 
  61.                     &rqd,        // ulData-field for eventcode
  62.                     &length,    // field for data length or offset
  63.                     &data,        // field for data pointer
  64.                     0,             // get first element from queue
  65.                     0,            // wait synchronously for data
  66.                     &prio,        // element priority
  67.                     0);            // no semaphore
  68.  
  69.             // dump it
  70.             printf("%d %p %4d  =>", rqd.ulData, data, length);
  71.  
  72.             // react according to event
  73.             switch (rqd.ulData) {
  74.  
  75.                 case TAP_EVENT_HOSTINFO:
  76.                         phi= data;
  77.                         printf("HOSTINFO %s V%s\n", phi->szHostName,
  78.                                                     phi->szHostVers);
  79.                         break;
  80.  
  81.                 case TAP_EVENT_OPENFORREAD:
  82.                 case TAP_EVENT_OPENFORWRITE:
  83.                 case TAP_EVENT_OPENFORAPPEND:
  84.                         // data:    filename '\0' "<size>" 
  85.                         //          (size is decimal ascii, "0" if not avail)
  86.                         // length:    strlen(filename)+1
  87.  
  88.                         size= atoi((char*)data+strlen(data)+1);
  89.                         printf("OPEN FILE %s (%ld bytes)\n", data, size);
  90.                         break;
  91.  
  92.                 case TAP_EVENT_READBLOCK:
  93.                 case TAP_EVENT_WRITEBLOCK:
  94.                         // data:    block of data
  95.                         // length:    length of block
  96.                         pcdata= data;
  97.                         printf("DATA %d BYTES, %02x %02x ... \n", 
  98.                                 length, pcdata[0], pcdata[1]);
  99.                         break;
  100.  
  101.                 case TAP_EVENT_READBYTE:
  102.                         // data:    (UCHAR)data
  103.                         // length:    1
  104.                         printf("DATA 1 BYTE, %02x \n", (UCHAR)(LONG)data);
  105.                         break;
  106.  
  107.                 case TAP_EVENT_SEEK:
  108.                         // data:    NULL
  109.                         // length:    new offset into file
  110.                         printf("SEEK TO POS %d\n", length);
  111.                         break;
  112.  
  113.                 case TAP_EVENT_CLOSE:
  114.                         // data:    NULL
  115.                         // length:    0
  116.                         printf("CLOSE\n");
  117.                         break;
  118.  
  119.                 default:
  120.                         // other events are legal and should be
  121.                         // ignored
  122.                         printf("PANIC: UNKNOWN EVENT (maybe a future event)\n");
  123.                         break;
  124.             }
  125.  
  126.             // free blocks of data
  127.             if (data!=NULL)
  128.                 DosFreeMem(data);
  129.  
  130.         } while (rqd.ulData!=TAP_EVENT_CLOSE);
  131.  
  132.     }
  133.  
  134.     // Destroy queue
  135.     DosCloseQueue(hq);
  136.  
  137.     // terminate
  138.     return (0);
  139. }
  140.