home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d157 / xicon.lha / Xicon / FindWindow.c < prev    next >
C/C++ Source or Header  |  1988-10-02  |  3KB  |  95 lines

  1. /* Procedures to manage DOS async I/O & find window  87:4:24 */
  2. /* .. adapted from Finkel, Lindsay, and Scheppner --  CBM */
  3.  
  4.  
  5. #include <exec/types.h>
  6. #include <exec/memory.h>
  7. #include <libraries/dos.h>
  8. #include <libraries/dosextens.h>
  9. #include <devices/conunit.h>
  10.  
  11.  
  12.  
  13. /* Globals initialized by findWindow() */
  14. struct Window  *conWindow;
  15. struct ConUnit *conUnit;
  16.  
  17.  
  18.  
  19. struct Window * findWindow(file) LONG file;
  20.  /* inits conWindow and conUnit (global vars)
  21.         and returns window pointer */
  22. {
  23.    struct InfoData *id;
  24.    struct FileHandle *handle;
  25.    struct MsgPort  *conid;
  26.    LONG myarg, res1;
  27.  
  28.    /* Alloc to insure longword alignment */
  29.    id = (struct InfoData *)AllocMem(sizeof(struct InfoData),
  30.                                        MEMF_PUBLIC|MEMF_CLEAR);
  31.    if(! id) return(NULL);
  32.    handle = (struct FileHandle *)(file<<2);
  33.    if (!handle->fh_Port /*Interactive*/) return(NULL);
  34.  
  35.    conid = (struct MsgPort *)handle->fh_Type /* ProcessID (!) */;
  36.    myarg = ((ULONG)id) >> 2;
  37.    res1 = (LONG)sendpkt(conid,ACTION_DISK_INFO,&myarg,1); /* degeneralized */
  38.    conWindow = (struct Window *)id->id_VolumeNode;
  39.    conUnit = (struct ConUnit *) /* USE in WB 1.2 ONLY...(but OK to read it!)*/
  40.                  ((struct IOStdReq *)id->id_InUse)->io_Unit;
  41.    FreeMem(id,sizeof(struct InfoData));
  42.    return(res1 ? conWindow : NULL);
  43. }
  44.  
  45.  
  46. /* sendpkt code - A. Finkel, P. Lindsay, C. Scheppner  CBM */
  47.  
  48.  
  49. sendpkt(pid,action,args,nargs) /* Lattticeified (default LONG) */
  50. struct MsgPort *pid;  /* process indentifier ... (handler's message port ) */
  51. LONG action,          /* packet type ... (what you want handler to do )   */
  52.      *args,           /* a pointer to an argument list */
  53.      nargs;           /* number of arguments in list  */
  54. {
  55.    struct MsgPort        *replyport;
  56.    struct StandardPacket *packet;
  57.  
  58.    LONG  *pargs, res1;
  59.  
  60.    replyport = (struct MsgPort *) CreatePort(NULL,0);
  61.    if(!replyport) return(NULL);
  62.  
  63.    packet = (struct StandardPacket *) 
  64.       AllocMem((long)sizeof(struct StandardPacket),MEMF_PUBLIC|MEMF_CLEAR);
  65.    if(!packet) 
  66.       {
  67.       DeletePort(replyport);
  68.       return(NULL);
  69.       }
  70.  
  71.    packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
  72.    packet->sp_Pkt.dp_Link         = &(packet->sp_Msg);
  73.    packet->sp_Pkt.dp_Port         = replyport;
  74.    packet->sp_Pkt.dp_Type         = action;
  75.  
  76.    /* copy the args into the packet */
  77.    pargs = &(packet->sp_Pkt.dp_Arg1);       /* address of first argument */
  78.    while (nargs--) /* compacter than original */
  79.       *pargs++ = *args++;
  80.  
  81.    PutMsg(pid,packet); /* send packet */
  82.  
  83.    WaitPort(replyport);
  84.    GetMsg(replyport); 
  85.  
  86.    res1 = packet->sp_Pkt.dp_Res1;
  87.  
  88.    FreeMem(packet,(long)sizeof(struct StandardPacket));
  89.    DeletePort(replyport); 
  90.  
  91.    return(res1);
  92. }
  93.  
  94.  
  95.