/*
**    NoClick
**
**        © 1996 by Timo C. Nentwig
**        All Rights Reserved !
**
**        Tcn@oxygen.in-berlin.de
**
**
*/

/// #include

#include "GST.h"
#include "Protos.h"

///
/// proto

proto  BOOL __regargs HandleCx     (CxMsg *Msg);
proto  VOID           QuitCx       (VOID);
proto  BOOL           SetupCx      (VOID);

///

struct MsgPort   *CxPort;
CxObj            *Broker;

/// HandleCx ()

    /*
     *    FUNCTION    Handle commodity events.
     *
     *    EXAMPLE     HandleCx (Msg);
     *
     */

BOOL __regargs
HandleCx (CxMsg *Msg)
{

    ULONG    MsgID   = CxMsgID   (Msg),
             MsgType = CxMsgType (Msg);

    ReplyMsg ((struct Message *) Msg);

    switch (MsgType)
    {

            // Commodity events

        case CXM_COMMAND:

            switch (MsgID)
            {

                case CXCMD_DISABLE:     ActivateCxObj (Broker, FALSE);
                                        DriveClick (FALSE);
                                        break;

                case CXCMD_ENABLE:      ActivateCxObj (Broker, TRUE);
                                        DriveClick (TRUE);
                                        break;

                case CXCMD_KILL:        return (TRUE);
                                        break;

            }

    }

    return (FALSE);

}

///
/// QuitCx ()

    /*
     *    FUNCTION    Shut down program.
     *
     *    EXAMPLE     QuitCx ();
     *
     */

VOID
QuitCx (VOID)
{

    if (Broker)
    {

        DeleteCxObjAll (Broker);
        Broker = NULL;

    }

    if (CxPort)
    {

        struct    Message   *Message;

        RemPort (CxPort);

        while (Message = GetMsg (CxPort))
        {

            ReplyMsg (Message);

        }

        DeleteMsgPort (CxPort);

        CxPort = NULL;

    }

}

///
/// SetupCx ()

    /*
     *    FUNCTION    Setup commoditiy stuff.
     *
     *    NOTE
     *
     *    EXAMPLE     SetupCx ();
     *
     */

BOOL
SetupCx (VOID)
{

    QuitCx();

    if (CxPort = CreateMsgPort())
    {

        struct    NewBroker    NBroker;
        LONG                   BrokerError;

        NBroker . nb_Version         = NB_VERSION;
        NBroker . nb_Name            = PRG_TITLE;
        NBroker . nb_Title           = PRG_TITLE " " PRG_VERSION " © " PRG_YEAR " by " PRG_AUTHOR;
        NBroker . nb_Descr           = "Disable drive clicking";
        NBroker . nb_Unique          = NBU_UNIQUE | NBU_NOTIFY;
        NBroker . nb_Flags           = 0;
        NBroker . nb_Pri             = Set -> Cx . Priority;
        NBroker . nb_ReservedChannel = 0;

        CxPort -> mp_Node . ln_Name = NBroker . nb_Name;

        AddPort (CxPort);

        NBroker . nb_Port = CxPort;

        if (Broker = CxBroker (&NBroker, &BrokerError))
        {

            ActivateCxObj (Broker,TRUE);
            return (TRUE);

        }
        else
        {

            switch (BrokerError)
            {

                case CBERR_SYSERR:      FPrintf (Output(), PRG_TITLE ": Couldn't create broker\nSystem error\n");
                                        break;

                case CBERR_DUP:         FPrintf (Output(), PRG_TITLE ": Already running\n");
                                        break;

                case CBERR_VERSION:     FPrintf (Output(), PRG_TITLE ": Wrong NewBroker structure version\n");
                                        break;

                default:                FPrintf (Output(), PRG_TITLE ": Could't create broker\nReason unknown !\n");
                                        break;

            }

        }

    }

    return (FALSE);

}

///


