//=========================================================================
// Summary  :
// Filename : MMBehavior.h
// Author   : Gil Jones
// Project  :
// Revision : 1
// Created  : 2001/11/01
// Modified : 2001/11/01
//=========================================================================
// Description :  Behavior alteration messages
//=========================================================================

#ifndef _MMBEHAVIOR_H
#define _MMBEHAVIOR_H

#include "ModemMessage.h"
#include "MMUtils.h"

#define BehaviorTimeOut 60 //seconds
#define BehaviorArrayTimeOut 60 //seconds

/*
CLASS: MMBehavior

AUTHOR: Gil Jones

This class implements two modem message: MMBehavior, which processes the
information associated with a single behavior attribute change, and 
MMBehaviorArray, which processes the data associated with multiple 
attribute changes to a single state.
*/

#define MAX_BEHAVIOR_NAME_LENGTH 32
#define MAX_BEHAVIOR_DATA_LENGTH 64

class MMBehavior : public MMConvertible
{
 public:
    
    MMBehavior() {};
    MMBehavior(const ModemMessage *pMM);
    MMBehavior(short stateNum, short priorityNum, short nameSize, char* name, short dataSize, char* data);
    
    //success message
    MMBehavior(short success);

    virtual const char* pcRead(const char* sourceBuffer);
    virtual char* pcWrite(char* destBuffer) const;
    virtual ModemMessage::Type tGetMessageType() const
	{ return ModemMessage::tMMBehavior; };
    virtual int iGetDefaultTimeout() const
	{ return BehaviorTimeOut; };
 
    short getStateNum(void)
	{ return _stateNum; };
    short getPriorityNum(void)
	{ return _priorityNum; };
    void getName(char* nameBuf)
	{
	    fprintf(stdout, "Monkey:%s\n", _name);
	    //fprintf(stdout, "Name size: %d\n", _nameSize);
	    strncpy(nameBuf, _name, _nameSize);
	};
    void getData(char* dataBuf)
	{
	    fprintf(stdout, "Data monkey: %s\n", _data);
	    strncpy(dataBuf, _data, _dataSize);
	};
    
    short getSuccess()
	{
	    return _success;
	}
    
 protected:

    short _stateNum;
    short _priorityNum;
    char _name[32];
    short _nameSize;
    char _data[64];
    short _dataSize;
    short _success;
   
};

class MMBehaviorArray : public MMConvertible
{

 public:
    
    MMBehaviorArray() {};
    MMBehaviorArray(const ModemMessage *pMM);
    MMBehaviorArray(short numChanges, short* states, short* priorities, short* nameSizes, 
		    char** names, short* dataSizes, char** data);

    MMBehaviorArray(short numSuc, short* successes);

    ~MMBehaviorArray();

    virtual const char* pcRead(const char* sourceBuffer);
    virtual char* pcWrite(char* destbuffer) const;
    virtual ModemMessage::Type tGetMessageType() const
	{ return ModemMessage::tMMBehaviorArray; };
    virtual int iGetDefaultTimeout() const
	{ return BehaviorTimeOut; };

    short getNumChanges(void)
	{ return _numChanges; };
    short getNumSuccesses(void)
	{ return _numSuccesses; };
    short getSinglePriority(int i);
    void getAllPriorities(short* p);
    short getSingleState(int i);
    void getAllStates(short* p);
    void getSingleName(int i, char* nameBuf);
    void getAllNames(char** nameBufs);
    void getSingleData(int i, char* datatBuf);
    void getAllData(char** dataBufs);
    short getSingleSuccess(int i);
    void getAllSuccesses(short* m);

 protected:

    short _numChanges;
    short _numSuccesses;
    short* _states;
    short* _priorities;
    
    short* _nameSizes;
    short* _dataSizes;

    short* _successes;

    typedef char Name[32];
    typedef char Data[64];

    Name* _names;
    Data* _data;
};

#endif
    
