/*
 * PrinterManager.c :
 * ------------------
 * Auteur        : Xavier Mertens
 * Version   $VER: 1.00 
 * Création      : 14 May 1993 - 14:37
 * Modification  : -
 * Langage       : SAS/C V6.2
 * Compatibilité : 2.x - 3.0
 * Description   : Petit programme de configuration de l'imprimante.
 * Remarque(s)   : - Inferface générée par GadToolsBox V1.3
 *                 - Nécessite la fonte Scala/8.
 * Historique    : V1.00 : Création.
 */

#include "pm.h"  /* Fichiers entêtes */

int CXBRK(void) { return(0); }    /* Aucune interruption ne sera tolérée! */
int chkabort(void) { return(0); }

struct IntuitionBase *IntuitionBase;
struct GfxBase       *GfxBase;
struct GadToolsBase  *GadToolsBase;
struct Screen        *Scr;
struct Window        *PMWnd;
struct Gadget        *PMGList,
                     *gad;
struct Gadget        *PMGadgets[6];
struct IntuiMessage  *imsg;
struct EasyStruct    AboutRequester={              /* Requester A Propos */
                      sizeof(struct EasyStruct),
                      0,
                      (UBYTE *)"A Propos...",
                      (UBYTE *)"%s",
                      (UBYTE *)"Merci"
                     },
                     ProblemRequester={            /* Requester en cas d'erreur */
                      sizeof(struct EasyStruct),
                      0,
                      (UBYTE *)"Erreur...",
                      (UBYTE *)"%s",
                      (UBYTE *)"Quitter"
                     };
union printerIO {
  struct IOStdReq ios;
  struct IODRPReq  iodrp;
  struct IOPrtCmdReq iopc;
};

UWORD PMLeft = 81,    /* Position de la fenêtre */
      PMTop = 39,
      PMWidth = 221,
      PMHeight = 60;

UBYTE *PMWdt = (UBYTE *)"PM v1.00"; /* Titre de la fenêtre */
APTR VisualInfo = NULL;

BOOL Condensed=FALSE,  /* Différents modes disponibles */
     Nlq      =FALSE,
     Us        =FALSE,
     Reset    =FALSE;

struct TextAttr Scala8={
  (STRPTR)"Scala.font",8,0x00,0x20};

/* -- Routine principale ---------------------------------------------------- */

__stdargs __main(char *argv){ 
  ULONG imsgClass;
  UWORD imsgCode;
  BOOL end=FALSE;

  OpenAll();

  while(!end){ /* Boucle principale */
    Wait(1<<PMWnd->UserPort->mp_SigBit);
    while((!end) && (imsg=GT_GetIMsg(PMWnd->UserPort))){
      gad=(struct Gadget *)imsg->IAddress;
      imsgClass=imsg->Class;
      imsgCode =imsg->Code;
      GT_ReplyIMsg(imsg);
      switch(imsgClass){
        case IDCMP_GADGETUP:
          switch(gad->GadgetID){
            case GADGET_COND:  /* Mode condensé (132 col) */
              Condensed=SWITCH(Condensed);
              break;
            case GADGET_US:     /* Mode US char set */ 
              Us=SWITCH(Us);
              break;
            case GADGET_RESET: /* Reset */
              Reset=SWITCH(Reset);
              break;
            case GADGET_NLQ:   /* Mode NLQ */
              Nlq=SWITCH(Nlq);
              break;
            case GADGET_OK:    /* C'est parti */
              if(!SendCodes())
                EasyRequest(NULL,&ProblemRequester,NULL,PRT_ERREUR);
              end = TRUE;
              break;
            case GADGET_HELP:  /* Informations */
              EasyRequest(NULL,&AboutRequester,NULL,A_PROPOS);
              break;
          }
          break;
        case IDCMP_CLOSEWINDOW:
          end = TRUE;
          break;
        default:
          break;
      }
    }
  }
  CloseAll(0);
}

/* Routine SENDCODES() : Configuration de l'imprimante */

BOOL SendCodes(){
  union printerIO *request;
  struct Port *printerPort;
  if(!(printerPort = (struct Port *)CreatePort(NULL,NULL)))
    return(FALSE);
  if(!(request = (union printerIO *)CreateExtIO((struct MsgPort *)printerPort,sizeof(union printerIO)))){
    DeletePort((struct MsgPort *)printerPort);
    return(FALSE);
  }
  if(OpenDevice("printer.device",0,(struct IORequest *)request,0)){
    DeleteExtIO((struct IORequest *)request);
    DeletePort((struct MsgPort *)printerPort);
    return(FALSE);
  }
  if(Reset)
    if(PrintCommand(request,aRIS,0,0,0,0)){
      CloseDevice((struct IORequest *)request);
      DeleteExtIO((struct IORequest *)request);
      DeletePort((struct MsgPort *)printerPort);
      return(FALSE);
    }
  if(Nlq)
    if(PrintCommand(request,aDEN2,0,0,0,0)){
      CloseDevice((struct IORequest *)request);
      DeleteExtIO((struct IORequest *)request);
      DeletePort((struct MsgPort *)printerPort);
      return(FALSE);
    }
  if(Us)
    if(PrintCommand(request,aFNT0,0,0,0,0)){
      CloseDevice((struct IORequest *)request);
      DeleteExtIO((struct IORequest *)request);
      DeletePort((struct MsgPort *)printerPort);
      return(FALSE);
    }
  if(Condensed)
    if(PrintCommand(request,aSHORP4,0,0,0,0)){
      CloseDevice((struct IORequest *)request);
      DeleteExtIO((struct IORequest *)request);
      DeletePort((struct MsgPort *)printerPort);
      return(FALSE);
    }
  CloseDevice((struct IORequest *)request);
  DeleteExtIO((struct IORequest *)request);
  DeletePort((struct MsgPort *)printerPort);
  return(TRUE);
}

/* Routine PRINTCOMMAND : Envoi des codes */

int PrintCommand(union printerIO *request,int command,int p0,int p1,int p2,int p3){
  request->iopc.io_Command     = PRD_PRTCOMMAND;
  request->iopc.io_PrtCommand = command;
  request->iopc.io_Parm0      = p0;
  request->iopc.io_Parm1      = p1;
  request->iopc.io_Parm2      = p2;
  request->iopc.io_Parm3      = p3;
  return(DoIO((struct IORequest *)request));
}

/* Routine OPENALL() : Ouverture des ressources nécessaires */

void OpenAll(){
  if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",OS_VERSION)) ||
     !(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",OS_VERSION)) ||
     !(GadToolsBase=(struct GadToolsBase *)OpenLibrary("gadtools.library",OS_VERSION)))
    CloseAll(5);
  if(!(Scr=LockPubScreen(NULL)))
    CloseAll(5);
  if(!(VisualInfo=GetVisualInfo(Scr,TAG_DONE)))
    CloseAll(5);
  if(OpenPMWindow())
    CloseAll(5);
}

/* Routine CLOSEALL() : Libère les ressources et termine le programme */  

void CloseAll(int errnumber){
  if(VisualInfo)     FreeVisualInfo(VisualInfo);
  if(Scr)            UnlockPubScreen(NULL,Scr);
  if(PMWnd)          CloseWindow( PMWnd );
  if(PMGList)       FreeGadgets( PMGList );
  if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
  if(GfxBase)        CloseLibrary((struct Library *)GfxBase);
  if(GadToolsBase)  CloseLibrary((struct Library *)GadToolsBase);
  __exit(errnumber);
}

/* Routine OPENPMWINDOW : Installation de l'interface (fentre/gadgets/...) */

int OpenPMWindow(){
  struct NewGadget     ng;
  struct Gadget       *g;
  UWORD               offx, offy;

  offx = Scr->WBorLeft;
  offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;

  if ( ! ( g = CreateContext( &PMGList )))
    return( 1L );

    ng.ng_LeftEdge        =    offx + 2;
    ng.ng_TopEdge         =    offy + 29;
    ng.ng_Width           =    115;
    ng.ng_Height          =    14;
    ng.ng_GadgetText      =    (UBYTE *)"Condensed";
    ng.ng_TextAttr        =    &Scala8;
    ng.ng_GadgetID        =    GD_Gadget00;
    ng.ng_Flags           =    PLACETEXT_IN;
    ng.ng_VisualInfo      =    VisualInfo;

    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );

    g->Activation        |= GACT_TOGGLESELECT;

    PMGadgets[ 0 ] = g;

    ng.ng_TopEdge         =    offy + 43;
    ng.ng_GadgetText      =    (UBYTE *)"US Char Set";
    ng.ng_GadgetID        =    GD_Gadget10;

    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );

    g->Activation        |= GACT_TOGGLESELECT;

    PMGadgets[ 1 ] = g;

    ng.ng_TopEdge         =    offy + 1;
    ng.ng_GadgetText      =    (UBYTE *)"Reset";
    ng.ng_GadgetID        =    GD_Gadget20;

    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );

    PMGadgets[ 2 ] = g;

    g->Activation        |= GACT_TOGGLESELECT;

    ng.ng_TopEdge         =    offy + 15;
    ng.ng_GadgetText      =    (UBYTE *)"NLQ";
    ng.ng_GadgetID        =    GD_Gadget30;

    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );

    PMGadgets[ 3 ] = g;

    g->Activation        |= GACT_TOGGLESELECT;

    ng.ng_LeftEdge        =    offx + 117;
    ng.ng_TopEdge         =    offy + 1;
    ng.ng_Width           =    58;
    ng.ng_Height          =    56;
    ng.ng_GadgetText      =    (UBYTE *)"Ok";
    ng.ng_GadgetID        =    GD_Gadget40;

    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );

    PMGadgets[ 4 ] = g;

    ng.ng_LeftEdge        =    offx + 175;
    ng.ng_Width           =    36;
    ng.ng_GadgetText      =    (UBYTE *)"?";
    ng.ng_GadgetID        =    GD_Gadget50;

    g = CreateGadget( BUTTON_KIND, g, &ng, TAG_DONE );

    PMGadgets[ 5 ] = g;

    if ( ! g )
        return( 2L );

    if ( ! ( PMWnd = OpenWindowTags( NULL,
                    WA_Left,          PMLeft,
                    WA_Top,           PMTop,
                    WA_Width,         PMWidth,
                    WA_Height,        PMHeight + offy,
                    WA_IDCMP,         BUTTONIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
                    WA_Flags,         WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
                    WA_Gadgets,       PMGList,
                    WA_Title,         PMWdt,
                    WA_PubScreen,     Scr,
                    TAG_DONE )))
        return( 4L );

    GT_RefreshWindow( PMWnd, NULL );

    return( 0L );
}

/* Eof */
