home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / comm / misc / modem / console.c next >
C/C++ Source or Header  |  1993-09-04  |  3KB  |  136 lines

  1. /*
  2.     This program is copyright 1990, 1993 Stephen Norris. 
  3.     May be freely distributed provided this notice remains intact.
  4. */
  5.  
  6. #include "console.h"
  7. #include "support.h"
  8.  
  9. /* Globals initialized by findWindow() */
  10. struct ConUnit *conUnit=NULL;
  11.  
  12. char    Buffer[64];        /* Used for formatting control strings. */
  13.  
  14. BPTR    OutPut, InPut;
  15.  
  16. int     Width, Height;
  17.  
  18. void
  19. conClose()
  20. {
  21.         if (conUnit != NULL)
  22.                 setRawCon(DOSFALSE);
  23.  
  24.     return;
  25. }
  26.  
  27. int 
  28. conInit()
  29. {
  30.     if (!findWindow())
  31.         return FALSE;
  32.  
  33.     if (!IsInteractive(OutPut = Output()))
  34.         return FALSE;
  35.  
  36.     InPut = Input();
  37.  
  38.     assert(conUnit!=NULL);
  39.  
  40.     setRawCon(DOSTRUE);
  41.  
  42.     Width = conUnit->cu_XMax + 1;
  43.     Height = conUnit->cu_YMax + 1;
  44.  
  45.     return TRUE;
  46. }
  47.  
  48. /* sendpkt code - A. Finkel, P. Lindsay, C. Scheppner  CBM */
  49.  
  50. LONG
  51. setRawCon(LONG toggle)
  52. {                /* DOSTRUE (-1L)  or  DOSFALSE (0L) */
  53.     struct MsgPort *conid;
  54.     struct Process *me;
  55.     LONG    myargs[8], nargs, res1;
  56.  
  57.     me = (struct Process *) FindTask(NULL);
  58.     conid = (struct MsgPort *) me->pr_ConsoleTask;
  59.  
  60.     myargs[0] = toggle;
  61.     nargs = 1;
  62.     res1 = (LONG) sendpkt(conid, ACTION_SCREEN_MODE, myargs, nargs);
  63.     return (res1);
  64. }
  65.  
  66.  
  67. LONG
  68. findWindow()
  69. {                /* inits conWindow and conUnit (global vars) */
  70.     struct InfoData *id;
  71.     struct MsgPort *conid;
  72.     struct Process *me;
  73.     LONG    myargs[8], nargs, res1;
  74.  
  75.     /* Alloc to insure longword alignment */
  76.     id = (struct InfoData *) AllocMem(sizeof(struct InfoData),
  77.                       MEMF_PUBLIC | MEMF_CLEAR);
  78.     if (!id)
  79.         return (0);
  80.     me = (struct Process *) FindTask(NULL);
  81.     conid = (struct MsgPort *) me->pr_ConsoleTask;
  82.  
  83.     myargs[0] = ((ULONG) id) >> 2;
  84.     nargs = 1;
  85.     res1 = (LONG) sendpkt(conid, ACTION_DISK_INFO, myargs, nargs);
  86.     conUnit = (struct ConUnit *)
  87.         ((struct IOStdReq *) id->id_InUse)->io_Unit;
  88.     FreeMem(id, sizeof(struct InfoData));
  89.     return (res1);
  90. }
  91.  
  92. LONG
  93. sendpkt(struct MsgPort * pid, LONG action, LONG args[], LONG nargs)
  94. /* *pid - process indentifier ... (handlers message port ) */
  95. /* action - packet type ... (what you want handler to do)   */
  96. /* args a pointer to a argument list */
  97. /* nargs number of arguments in list  */
  98. {
  99.     struct MsgPort *replyport;
  100.     struct StandardPacket *packet;
  101.  
  102.     LONG    count, *pargs, res1;
  103.  
  104.     replyport = (struct MsgPort *) CreatePort(NULL, 0);
  105.     if (!replyport)
  106.         return (NULL);
  107.  
  108.     packet = (struct StandardPacket *)
  109.         AllocMem((long) sizeof(struct StandardPacket), MEMF_PUBLIC | MEMF_CLEAR);
  110.     if (!packet) {
  111.         DeletePort(replyport);
  112.         return (NULL);
  113.     }
  114.     packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt);
  115.     packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
  116.     packet->sp_Pkt.dp_Port = replyport;
  117.     packet->sp_Pkt.dp_Type = action;
  118.  
  119.     /* copy the args into the packet */
  120.     pargs = &(packet->sp_Pkt.dp_Arg1);    /* address of first argument */
  121.     for (count = 0; count < nargs; count++)
  122.         pargs[count] = args[count];
  123.  
  124.     PutMsg(pid, packet);    /* send packet */
  125.  
  126.     WaitPort(replyport);
  127.     GetMsg(replyport);
  128.  
  129.     res1 = packet->sp_Pkt.dp_Res1;
  130.  
  131.     FreeMem(packet, (long) sizeof(struct StandardPacket));
  132.     DeletePort(replyport);
  133.  
  134.     return (res1);
  135. }
  136.