/******************  window.c  *******************
 *                                               *
 *                                               *
 *                     hyper                     *
 *                                               *
 *                  © by Koessi                  *
 *                                               *
 *              Sunday, 23 Aug 1992              *
 *                                               *
 *                                               *
 *************************************************/


#include "defs.h"

Prototype void OpenRexx(void);
Prototype void CloseRexx(void);
Prototype void SendRxMsg(char *);
Prototype int  GetRxMsg(void);

Prototype MSGP *rexx_port;
MSGP           *rexx_port = NULL;

/*************************************************
 *                                               *
 *                                               *
 *    FUNCTION: OpenRexx                         *
 *                                               *
 *                                               *
 *    INPUT:    void                             *
 *                                               *
 *    OUTPUT:   void                             *
 *                                               *
 *    NOTE:                                      *
 *                                               *
 *************************************************/


void
OpenRexx(void)
{
  MSGP *port;
  if (port = CreateMsgPort())
  {
    port->mp_Node.ln_Name = portname;
    AddPort(rexx_port = port);
  }
}

/*************************************************
 *                                               *
 *                                               *
 *    FUNCTION: CloseRexx                        *
 *                                               *
 *                                               *
 *    INPUT:    void                             *
 *                                               *
 *    OUTPUT:   void                             *
 *                                               *
 *    NOTE:                                      *
 *                                               *
 *************************************************/


void
CloseRexx(void)
{
  MSGP *port;
  if (port = rexx_port)
  {
    MSG *rx_msg;
    while (rx_msg = GetMsg(port))
      ReplyMsg(rx_msg);
    RemPort(port);
    DeleteMsgPort(port);
  }
}
/*************************************************
 *                                               *
 *                                               *
 *    FUNCTION: GetRxMsg                         *
 *                                               *
 *                                               *
 *    INPUT:    void                             *
 *                                               *
 *    OUTPUT:   int                              *
 *                                               *
 *    NOTE:                                      *
 *                                               *
 *************************************************/


int
GetRxMsg(void)
{
  char *buf = charbuffer;
  RMSG *rmsg;
  if (rmsg = (RMSG *)GetMsg(rexx_port))
  {
    char *s = rmsg->rm_Args[0];
    char *d = buf;
    while (*d++ = *s++);

    ReplyMsg(rmsg);

    backmode = FALSE;
    if (NewNode(buf) == NEWNODE_DOCNOTFOUND)    /*  doc not found */
    {
      return((LoadDoc()) ? (*buf)
                         ? NewNode(buf) : NEWNODE_DOCNOTFOUND
                                        : NEWNODE_DOCNOTFOUND);
    }
  }
  return(0);
}

/*************************************************
 *                                               *
 *                                               *
 *    FUNCTION: SendRxMsg                        *
 *                                               *
 *                                               *
 *    INPUT:    char *msgtxt                     *
 *                                               *
 *    OUTPUT:   void                             *
 *                                               *
 *    NOTE:                                      *
 *                                               *
 *************************************************/

void
SendRxMsg(char *msgtxt)
{
#ifdef DEBUG
  PutStr("sending '");
  PutStr(msgtxt);
  PutStr("'\n");
#endif

  MSGP *reply_port;
  MSGP *rx_port;
  void *rx_msg;

  if (reply_port = CreateMsgPort())
  {
    if (rx_msg = AllocVec(sizeof(RMSG), MPC))
    {
      ((struct Node *)rx_msg)->ln_Type      = NT_MESSAGE;
      ((MSG         *)rx_msg)->mn_ReplyPort = reply_port;
      ((MSG         *)rx_msg)->mn_Length    = sizeof(RMSG);
      ((RMSG        *)rx_msg)->rm_Args[0]   = msgtxt;

      Forbid();
      if (rx_port = (MSGP *)FindPort(portname))
      {
        PutMsg(rx_port, (MSG *)rx_msg);
        Permit();
        WaitPort(reply_port);
        ReplyMsg(GetMsg(reply_port));
      }
      else
        Permit();

      FreeVec(rx_msg);
    }
    DeleteMsgPort(reply_port);
  }
}












