#ifndef MTETRIGGER_H
#define MTETRIGGER_H

extern oid    _sysUpTime_instance[];
extern size_t _sysUpTime_inst_len;
    /*
     * Flags relating to the mteTriggerTable and related tables
     */
#define MTE_TRIGGER_FLAG_DELTA   0x01    /* for mteTriggerSampleType       */
#define MTE_TRIGGER_FLAG_VWILD   0x02    /* for mteTriggerValueIDWildcard  */
#define MTE_TRIGGER_FLAG_CWILD   0x04    /* for mteTriggerContextWildcard  */
#define MTE_TRIGGER_FLAG_DWILD   0x08    /* for mteTriggerDeltaDIDWildcard */
#define MTE_TRIGGER_FLAG_SYSUPT  0x10    /* using default mteTriggerDeltaID */

#define MTE_TRIGGER_FLAG_BSTART  0x20    /* for mteTriggerBooleanStartup   */

#define MTE_TRIGGER_FLAG_ENABLED 0x0100  /* for mteTriggerEnabled          */
#define MTE_TRIGGER_FLAG_ACTIVE  0x0200  /* for mteTriggerEntryStatus      */
#define MTE_TRIGGER_FLAG_FIXED   0x0400  /* for snmpd.conf persistence     */
#define MTE_TRIGGER_FLAG_VALID   0x0800  /* for row creation/undo          */


    /*
     * Values for the mteTriggerTest field
     */
#define MTE_TRIGGER_EXISTENCE  0x80    /* mteTriggerTest values */
#define MTE_TRIGGER_BOOLEAN    0x40
#define MTE_TRIGGER_THRESHOLD  0x20

    /*
     * Values for the mteTriggerSampleType field
     */
#define MTE_SAMPLE_ABSOLUTE       1    /* mteTriggerSampleType values */
#define MTE_SAMPLE_DELTA          2

    /*
     * Values for the mteTriggerDeltaDiscontinuityIDType field
     */
#define MTE_DELTAD_TTICKS         1
#define MTE_DELTAD_TSTAMP         2
#define MTE_DELTAD_DATETIME       3

    /*
     * Values for the mteTriggerExistenceTest 
     *   and mteTriggerExistenceStartup fields
     */
#define MTE_EXIST_PRESENT      0x80
#define MTE_EXIST_ABSENT       0x40
#define MTE_EXIST_CHANGED      0x20

    /*
     * Values for the mteTriggerBooleanComparison field
     */
#define MTE_BOOL_UNEQUAL          1
#define MTE_BOOL_EQUAL            2
#define MTE_BOOL_LESS             3
#define MTE_BOOL_LESSEQUAL        4
#define MTE_BOOL_GREATER          5
#define MTE_BOOL_GREATEREQUAL     6

    /*
     * Values for the mteTriggerThresholdStartup field
     */
#define MTE_THRESH_START_RISE     1
#define MTE_THRESH_START_FALL     2
#define MTE_THRESH_START_RISEFALL 3
        /* Note that RISE and FALL values can be used for bit-wise
           tests as well, since RISEFALL = RISE | FALL */


    /*
     * Flags to indicate which triggers are armed, and ready to fire.
     */
#define MTE_ARMED_TH_RISE       0x01
#define MTE_ARMED_TH_FALL       0x02
#define MTE_ARMED_TH_DRISE      0x04
#define MTE_ARMED_TH_DFALL      0x08
#define MTE_ARMED_BOOLEAN       0x10
#define MTE_ARMED_ALL           0x1f

    /*
     * All Event-MIB OCTET STRING objects are either short (32-character)
     *   tags, or SnmpAdminString/similar values (i.e. 255 characters)
     */
#define MTE_STR1_LEN	32
#define MTE_STR2_LEN	255

/*
 * Data structure for a (combined) trigger row.  Covers delta samples,
 *   and all types (Existence, Boolean and Threshold) of trigger.
 */
struct mteTrigger {
    /*
     * Index values 
     */
    char            mteOwner[MTE_STR1_LEN+1];
    char            mteTName[MTE_STR1_LEN+1];

    /*
     * Column values for the main mteTriggerTable
     */
    char            mteTriggerComment[MTE_STR2_LEN+1];
    char            mteTriggerTest;
    oid             mteTriggerValueID[MAX_OID_LEN];
    size_t          mteTriggerValueID_len;
    char            mteTriggerTarget[ MTE_STR2_LEN+1];
    char            mteTriggerContext[MTE_STR2_LEN+1];
    u_long          mteTriggerFrequency;
    char            mteTriggerOOwner[ MTE_STR1_LEN+1];
    char            mteTriggerObjects[MTE_STR1_LEN+1];

    netsnmp_session *session;
    long            flags;

    /*
     * Column values for the mteTriggerDeltaTable
     */
    oid             mteDeltaDiscontID[MAX_OID_LEN];
    size_t          mteDeltaDiscontID_len;
    long            mteDeltaDiscontIDType;

    /*
     * Column values for Existence tests (mteTriggerExistenceTable)
     */
    char            mteTExTest;
    char            mteTExStartup;
    char            mteTExObjOwner[MTE_STR1_LEN+1];
    char            mteTExObjects[ MTE_STR1_LEN+1];
    char            mteTExEvOwner[ MTE_STR1_LEN+1];
    char            mteTExEvent[   MTE_STR1_LEN+1];

    /*
     * Column values for Boolean tests (mteTriggerBooleanTable)
     */
    long            mteTBoolComparison;
    long            mteTBoolValue;
    char            mteTBoolObjOwner[MTE_STR1_LEN+1];
    char            mteTBoolObjects[ MTE_STR1_LEN+1];
    char            mteTBoolEvOwner[ MTE_STR1_LEN+1];
    char            mteTBoolEvent[   MTE_STR1_LEN+1];

    /*
     * Column values for Threshold tests (mteTriggerThresholdTable)
     */
    long            mteTThStartup;
    long            mteTThRiseValue;
    long            mteTThFallValue;
    long            mteTThDRiseValue;
    long            mteTThDFallValue;
    char            mteTThObjOwner[  MTE_STR1_LEN+1];
    char            mteTThObjects[   MTE_STR1_LEN+1];
    char            mteTThRiseOwner[ MTE_STR1_LEN+1];
    char            mteTThRiseEvent[ MTE_STR1_LEN+1];
    char            mteTThFallOwner[ MTE_STR1_LEN+1];
    char            mteTThFallEvent[ MTE_STR1_LEN+1];
    char            mteTThDRiseOwner[MTE_STR1_LEN+1];
    char            mteTThDRiseEvent[MTE_STR1_LEN+1];
    char            mteTThDFallOwner[MTE_STR1_LEN+1];
    char            mteTThDFallEvent[MTE_STR1_LEN+1];

    /*
     *  Additional fields for operation of the Trigger tables:
     *     monitoring...
     */
    unsigned int    alarm;
    long            sysUpTime;
    netsnmp_variable_list *old_results;
    netsnmp_variable_list *old_deltaDs;

    /*
     *  ... stats...
     */
    long            count;

    /*
     *  ... and firing.
     */
    char           *mteTriggerXOwner;
    char           *mteTriggerXObjects;
    netsnmp_variable_list *mteTriggerFired;
};

  /*
   * Container structure for the (combined) mteTrigger*Tables,
   * and routine to create this.
   */
extern netsnmp_tdata *trigger_table_data;
extern void      init_trigger_table_data(void);

void          init_mteTrigger(void);
void               mteTrigger_removeEntry(netsnmp_tdata_row *row);
netsnmp_tdata_row *mteTrigger_createEntry(const char *mteOwner,
                                          char *mteTriggerName, int fixed);
void               mteTrigger_enable(    struct mteTrigger *entry );
void               mteTrigger_disable(   struct mteTrigger *entry );

long mteTrigger_getNumEntries(int max);

#endif                          /* MTETRIGGER_H */
