//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / 
//
//File: mibtree.h
//
//Version: $Revision: 1.27 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/10/19 18:16:53 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Sami Raatikainen
//
//Description:
//      This class is the interface for accessing mib-objects.
//      Holds root-object (mibNode) through which every object
//      in the tree may be accessed.
//      SNMP-methods (get/getNext/set) and inserting methods for
//      different type of objects implemented.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History: 

#ifndef __MIB_MIBTREE_H__
#define __MIB_MIBTREE_H__

class VarBind;
class mibDestination;

#include <typeinfo>
#include "pf/types.h"
#include "mibobject.h"

class mibTree
{
    private:
        mibObject *_root;
        mibObject *getObject(asnUtil::oidList &oidList_) const;
        void checkObject(mibObject *object_) const;
       
        void insertColumn(const string &oid_, mibObject *newObj_);
        void insertLeaf(const string &oid_, mibObject *newObj_);
        
    public:
        mibTree(void);
        virtual ~mibTree(void);

        // for ILMI
        void get(VarBind *varBind_) const;
        void set(VarBind *varBind_);
        void getNext(VarBind *varBind_) const;

        void stringToVarBind(VarBind *varBind_,
                             const string &sname_,
                             const string &svalue_ = "");
        void varBindToString(VarBind *varBind_,
                             string &sname_,
                             string &svalue_);

        // inserting objects into the tree
        void insertNode(const string &objectID_);
        void insertTable(const string &objectID_);

        void insertAsnIntColumn(const string &objectID_,
                                mibDestination *dest_);
        void insertAsnOctsColumn(const string &objectID_,
                                 mibDestination *dest_);
        void insertAsnOidColumn(const string &objectID_,
                                mibDestination *dest_);

        void insertAsnIntLeaf(const string &objectID_,
                              mibDestination *dest_,
                              bool write_ = 0);
        void insertAsnOctsLeaf(const string &objectID_,
                              mibDestination *dest_,
                              bool write_ = 0);
        void insertAsnOidLeaf(const string &objectID_,
                              mibDestination *dest_,
                              bool write_ = 0);
        
        // methods for tables, more methods may be needed,
        // types of parameters may change (AsnOid/string)?!
        void insertRow(const string &tableOid_, const string &rowOid_);
        void insertRow(const string &objectID_);
        void deleteRow(const string &objectID_);
        void clearTable(const string &tableOid_);
};

#endif // __MIB_MIBTREE_H__
