/* $Id: init.c,v 1.2 1993/06/11 16:29:21 Rhialto Exp $
 * $Log: init.c,v $
 * Revision 1.2  1993/06/11  16:29:21  Rhialto
 * First real RCS checkin
 *
 */

/*
 *  INIT.C
 */

#include "defs.h"
#include <clib/alib_protos.h>
#include "exec/types.h"
#include "devices/printer.h"
#include "devices/prtbase.h"

Prototype void DevInit(void);
Prototype void DevExpunge(void);
Prototype int MsgRender(long ct, long x, long y, long status);

extern struct PrinterData *PD;
extern struct PrinterExtendedData *PED;

/*
 * The message interface.
 */

struct PrtMsg {
    struct Message  pm_Msg;
    long	    pm_Type;
#define PM_RENDER   1
#define PM_OPEN     2
#define PM_CLOSE  3
#define PM_DOSPECIAL 4
#define PM_CONVFUNC 5

};
#define pm_rc	    pm_Type

struct RenderMsg {
    struct PrtMsg   rm_PrtMsg;
    long	    rm_ct;
    long	    rm_x;
    long	    rm_y;
    long	    rm_status;
};

struct PrtMsg   pm;
struct RenderMsg rm;


long SyncMsg(struct PrtMsg *m) {
  struct MsgPort *ProcPort;
  m->pm_Msg.mn_ReplyPort = (struct MsgPort*)FindTask(0); /* this cast is safe -- we'll
							    uncast this later */
  Forbid();
  ProcPort = FindPort("FAXPRINTERMP");
  if (ProcPort) PutMsg(ProcPort, &m->pm_Msg);
  Permit();
  
  if (ProcPort) {
    do {
      Wait(SIGF_SINGLE);
    } while (m->pm_Msg.mn_Node.ln_Type != NT_REPLYMSG);
  }
  
  return m->pm_rc;
}

int MsgRender(long ct, long x, long y, long status) {
  rm.rm_PrtMsg.pm_Type = PM_RENDER;
  rm.rm_ct = ct;
  rm.rm_x = x;
  rm.rm_y = y;
  rm.rm_status = status;

  if (status == 5) {
    SetDensity(x & SPECIAL_DENSITYMASK);
  }
  return SyncMsg((struct PrtMsg*)&rm.rm_PrtMsg);
}

int Close(struct printerIO *ior) {
  pm.pm_Type = PM_CLOSE;
  SyncMsg(&pm);
  
  return(0);
}

int Open(struct printerIO* ior) {
  rm.rm_PrtMsg.pm_Type = PM_OPEN;
  /* the casts here are safe -- we're going to uncast them when this message
     gets to the faxprinterdaemon */
  rm.rm_ct = (long)PED;
  rm.rm_x = 0;
  rm.rm_y = 0;
  rm.rm_status = (long)PD;

  SyncMsg((struct PrtMsg*)&rm);
  
  return(0);
}

#define LPI             7
#define CPI             15
#define QUALITY         17
#define INIT_LEN        30
#define LPP             7
#define FORM_LEN        11
#define LEFT_MARG       3
#define RIGHT_MARG      7
#define MARG_LEN        12

int DoSpecial(UWORD* command, char outputBuffer[], BYTE* vline, BYTE* currentVMI, BYTE* crlfFlag, UBYTE Parms[]) {
  rm.rm_PrtMsg.pm_Type = PM_DOSPECIAL;
  rm.rm_ct = 0;
  rm.rm_x = 0;
  rm.rm_y = *vline;
  rm.rm_status = *command;

  return SyncMsg((struct PrtMsg*)&rm);
}

int ConvFunc(char* buf, char c, int flag) {
  rm.rm_PrtMsg.pm_Type = PM_CONVFUNC;
  rm.rm_ct = 0;
  rm.rm_x = 0;
  rm.rm_y = flag;
  rm.rm_status = c;

  SyncMsg((struct PrtMsg*)&rm);

  buf[0] = '\0';
  return(0); /* -1 == pass all chars back to the printer device */
}

