#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/execbase.h>
#include <inline/alib.h>
#include "structs.h"

extern struct tm_settings dftm;

struct TestSettingsMessage
{
    struct Message ts_Message;
    ULONG ts_NewSettings;
    ULONG ts_type;
};

struct TestSettingsMessage      *ts_msg;
struct MsgPort                  *p_port;
struct MsgPort                  *p_reply;

BOOL SafePutToPort(struct Message *message, char *portname)
{
    struct MsgPort *port;

    Forbid();
    port = (struct MsgPort *)FindPort(portname);
    if (port) PutMsg(port, (struct Message *) message);
    Permit();
    return(port ? TRUE : FALSE);
}

InitDoSettings()
{
    if(
       ( ts_msg   = (struct TestSettingsMessage *) AllocMem   ( sizeof(struct TestSettingsMessage), MEMF_PUBLIC | MEMF_CLEAR ) ) &&
       ( p_reply  = (struct MsgPort *)             CreatePort ( 0, 0 ) )
      )  return (1L);
    else return (0L);
}

ClearDoSettings()
{
    if(ts_msg)  FreeMem( ts_msg, sizeof(struct TestSettingsMessage) );
    if(p_reply) DeletePort ( p_reply );
}

ULONG DoSettings(ULONG my_type)
{
    if(p_reply)
    if(ts_msg)
    {
        ts_msg->ts_Message.mn_Node.ln_Type = NT_MESSAGE;
        ts_msg->ts_Message.mn_ReplyPort = p_reply;
        ts_msg->ts_Message.mn_Length = sizeof ( struct TestSettingsMessage );
        ts_msg->ts_NewSettings=(ULONG)&dftm;
        ts_msg->ts_type=my_type;

        if (SafePutToPort((struct Message *)ts_msg, "TinyMeter"))
        {
            WaitPort(p_reply);
            ts_msg=(struct TestSettingsMessage *)GetMsg(p_reply);
            return(ts_msg->ts_NewSettings);
        }
        else return(0L);
    }
    else return (0L);
}

