/*
 * Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Yokogawa Electric Corporation,
 * YDC Corporation, IPA (Information-technology Promotion Agency, Japan).
 * All rights reserved.
 * 
 * Redistribution and use of this software in source and binary forms, with 
 * or without modification, are permitted provided that the following 
 * conditions and disclaimer are agreed and accepted by the user:
 * 
 * 1. Redistributions of source code must retain the above copyright 
 * notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the following disclaimer in the 
 * documentation and/or other materials provided with the distribution.
 * 
 * 3. Neither the names of the copyrighters, the name of the project which 
 * is related to this software (hereinafter referred to as "project") nor 
 * the names of the contributors may be used to endorse or promote products 
 * derived from this software without specific prior written permission.
 * 
 * 4. No merchantable use may be permitted without prior written 
 * notification to the copyrighters. However, using this software for the 
 * purpose of testing or evaluating any products including merchantable 
 * products may be permitted without any notification to the copyrighters.
 * 
 * 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHTERS, THE PROJECT AND 
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING 
 * BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 * FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.  IN NO EVENT SHALL THE 
 * COPYRIGHTERS, THE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT,STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 * THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $TAHI: v6eval/lib/Pz/MmObject.h,v 1.52 2005/05/09 09:35:24 akisada Exp $
 */
#if !defined(__MmObject_h__)
#define	__MmObject_h__	1
#include "pzCommon.h"
#include "McObject.h"
class ItPosition;
class WObject;
class PObject;
class WControl;
class PvOctets;
class ICVoverwriter;
//======================================================================
// META MEMBER OBJECT
class MmObject:public MObject {
private:
	McObject* compound_;
public:
	MmObject(CSTR);
virtual	~MmObject();
virtual	int32_t token() const;
virtual	PObject* tokenObject(int,CSTR) const;
virtual	void compound(MObject*);
virtual	McObject* compound() const;
};

//======================================================================
// META MEMBER DECORATOR OBJECT (message sending decorator MmObject)
class MmDecorator:public MmObject {
private:
	MmObject* body_;
protected:
	MmObject* body()const{return body_;}
public:
	MmDecorator(MmObject* body);
virtual	~MmDecorator();
	void set_body(MmObject* body);
	const MmObject* get_body()const{return body_;}
//----------------------------------------------------------------------
virtual void print() const;
virtual int32_t token() const;
virtual PObject* tokenObject(int=0,CSTR=0) const;
//----------------------------------------------------------------------
virtual	void postProcess(void*);
virtual void stepPostion(ItPosition&) const;
virtual	McObject* compound() const;
virtual	void compound(MObject*);
virtual	uint32_t objectLength(const PObject* =0,const WObject* =0) const;
virtual	uint16_t width() const;
virtual	MObject* findMember(CSTR) const;
//----------------------------------------------------------------------
virtual	bool generate(WControl&,WObject*,OCTBUF&) const;
virtual	bool geneAuto(WControl&,WObject*,OCTBUF&) const;
virtual	bool geneFix(WControl&,WObject*,OCTBUF&) const;
virtual	bool encodeNumber(WControl&,const ItPosition&,OCTBUF&,const PvNumber&) const;
virtual	bool encodeOctets(WControl&,const ItPosition&,OCTBUF&,const PvOctets&) const;
virtual PvObject* geneAutoValue(WObject*) const;
virtual PvObject* evalAutoValue(WObject*) const;
virtual bool overwrite_ICV(ICVControl& c,
		const ItPosition& at,OCTBUF& buf,const TObject* t)const;
//----------------------------------------------------------------------
virtual	bool disused() const;	//disuse evaluate
virtual	bool isEqual(const MObject*) const;
virtual bool containsMc(const MObject*) const;
virtual	bool comparableMeta(const MObject*) const;
virtual int32_t DataLinkLayer_Type() const;
virtual int32_t protocolFamily() const;
virtual int32_t protocolType() const;
virtual int32_t headerType() const;
virtual int32_t optionType() const;
virtual int32_t optionCode() const;
virtual int32_t icmpv6Type() const;
virtual int32_t mobilityType() const;
virtual int32_t vrrpVersion() const;
virtual bool ISAKMP_encryption() const;
virtual int32_t rrType() const;
virtual int32_t hardwareType() const;
virtual int32_t authProto() const;
virtual int32_t icmpv4Type() const;
virtual int32_t igmpType() const;
virtual int32_t upperPort() const;
virtual int32_t dhcpv6Type() const;
virtual int32_t DOIvalue() const;
virtual int32_t notify_value() const;
virtual int32_t ProtocolID() const;
virtual int32_t IDtype() const;
virtual int32_t SITvalue() const;
virtual int32_t duidType() const;
#if !defined(NOT_USE_SNMP)
virtual int32_t pduType() const;
#endif //NOT_USE_SNMP
virtual const TypevsMcDict* get_dict() const;
virtual uint32_t alignment_requirement() const;//1,2,4,8,0(no alignment)
virtual	bool icvUpdate(const PaObject&,PvOctets*) const;
virtual	WObject* compose(WControl&,WObject* w_parent,const PObject* po) const;
virtual	RObject* reverse(RControl&,RObject* r_parent,ItPosition&,OCTBUF&) const;
virtual	RObject* rreverse(RControl&,RObject* r_parent,ItPosition&,OCTBUF&) const;
virtual	void composeList(WControl&,
		WObject* w_parent,const PObjectList& pls) const;
virtual	void describe(const PObject*) const;
};

//======================================================================
// DECORATOR MULTIPLE MEMBERS
class MmMultiple:public MmDecorator { //more than 0
private:
	METH_HC_MLC	METH_HC_MLC_;
public:
	MmMultiple(MmObject*,METH_HC_MLC meth);
virtual	~MmMultiple();
// COMPOSE/REVERSE INTERFACE --------------------------------------------------
virtual	void composeList(WControl&,
		WObject* w_parent,const PObjectList& pls) const;
virtual RObject* reverse(RControl&,RObject* r_parent,ItPosition&,OCTBUF&) const;
};

//======================================================================
// ELEMENT MEMBERS
class MmElement:public MmObject {
private:
	uint32_t type_;
	uint32_t offset_;
	const PObject*		generater_;
	const PObject*		evaluater_;
	const ICVoverwriter*	ICVoverwriter_;
	METH_HC_ForIPinfo	METH_HC_ForIPinfo_;
public:
	MmElement(CSTR,
		const PObject* =0,const PObject* =0,const ICVoverwriter* ow=0,
		METH_HC_ForIPinfo meth=0);
virtual	~MmElement();
inline	const PObject* generater() const;
inline	const PObject* evaluater() const;
inline	void generater(const PObject*);
inline	void evaluater(const PObject*);
// AUTO FUNCTION
virtual	bool geneAuto(WControl&,WObject*,OCTBUF&) const;
virtual	PvObject* geneAutoValue(WObject*) const;
virtual	PvObject* evalAutoValue(WObject*) const;
//----------------------------------------------------------------------
// LENGTH AND WIDTH/OFFSET
virtual	void stepPostion(ItPosition&) const;	
virtual	void postProcess(void*);
	uint32_t offset() const;
	void offset(uint32_t);
virtual	uint16_t position() const;
virtual	void position(uint16_t);
virtual void print() const;
// COMPOSE/REVERSE INTERFACE --------------------------------------------------
virtual	WObject* compose(WControl&,WObject* w_parent,const PObject* pl) const;
virtual RObject* reverse(RControl&,RObject* r_parent,ItPosition&,OCTBUF&) const;
// COMPOSE/REVERSE PROTECTED MmElement* ---------------------------------------
protected:
virtual	void composeList(WControl&,
		WObject* w_parent,const PObjectList& pls) const;
virtual	WObject* composeWm(WControl&,WObject* w_parent,const PObject* pl) const;
virtual ItPosition length_for_reverse(RControl&,ItPosition& at,OCTBUF& buf) const;
virtual RObject* reverseRm(RControl&,RObject* r_parent,
		const ItPosition& at,const ItPosition& size,PvObject* pv) const;
virtual PvObject* reversePv(RControl&,
		const ItPosition& at,const ItPosition& size,const OCTBUF&)const;
// GENERATE INTERFACE ---------------------------------------------------------
virtual bool generate(WControl& c,WObject* w_self,OCTBUF& buf)const;
// OVERWRITE ICV
virtual bool overwrite_ICV(ICVControl& c,
		const ItPosition& at,OCTBUF& buf,const TObject* t)const;
};

inline uint32_t MmElement::offset() const {return offset_;}
inline void MmElement::offset(uint32_t o) {offset_=o;}
inline uint16_t MmElement::position() const {return 0;}
inline void MmElement::position(uint16_t) {}
inline const PObject* MmElement::generater() const {return generater_;}
inline const PObject* MmElement::evaluater() const {return evaluater_;}
inline void MmElement::generater(const PObject* p) {generater_=p;}
inline void MmElement::evaluater(const PObject* p) {evaluater_=p;}


//======================================================================
// META MEMBER UINT(Number)
class MmUint:public MmElement {
private:
	uint16_t width_;
	uint16_t position_;
public:
	MmUint(CSTR,uint16_t,const PObject* =0,const PObject* =0,
		const ICVoverwriter* ow=0,METH_HC_ForIPinfo meth=0);
virtual	~MmUint();
//----------------------------------------------------------------------
virtual	void encode(uint32_t,const ItPosition&,OCTBUF&) const;
virtual	bool encodeNumber(WControl&,const ItPosition&,OCTBUF&,const PvNumber&) const;
//----------------------------------------------------------------------
virtual	uint32_t rdecode(ItPosition&,const OCTBUF&,bool&) const;
virtual	uint32_t decode(const ItPosition&,const OCTBUF&) const;
virtual	uint32_t value(const ItPosition&,const OCTBUF&) const;
//----------------------------------------------------------------------
inline	uint16_t width() const;
virtual	uint16_t position() const;
virtual	void position(uint16_t);
// COMPOSE/REVERSE PROTECTED MmUint -------------------------------------------
virtual PvObject* reversePv(RControl&,
		const ItPosition& at,const ItPosition& size,const OCTBUF&)const;
};

inline uint16_t MmUint::width() const {return width_;}
inline uint16_t MmUint::position() const {return position_;}
inline void MmUint::position(uint16_t o) {position_=o;}

//-----------------------------------------------------------------------
class MmHostUint:public MmUint {
public:
	MmHostUint(CSTR,uint16_t,const PObject* =0,const PObject* =0,
		const ICVoverwriter* ow=0,METH_HC_ForIPinfo meth=0);
virtual	~MmHostUint();
virtual	void encode(uint32_t,const ItPosition&,OCTBUF&) const;
virtual	uint32_t decode(const ItPosition&,const OCTBUF&) const;
};

//======================================================================
// META MEMBER VARIABLE OCTSTR
class MmVarOctets:public MmElement {
public:
	MmVarOctets(CSTR,const PObject* =0,const PObject* =0,
		const ICVoverwriter* ow=0,METH_HC_ForIPinfo meth=0);
virtual	~MmVarOctets();
//----------------------------------------------------------------------
virtual	uint32_t objectLength(const PObject* =0,const WObject* =0) const;
virtual	bool encodeOctets(WControl&,
		const ItPosition& at,OCTBUF& dst,const PvOctets&) const;
virtual bool encodeNumber(WControl&,
		const ItPosition& at,OCTBUF& dst,const PvNumber& n)const;
// COMPOSE/REVERSE INTERFACE --------------------------------------------------
virtual ItPosition length_for_reverse(RControl&,ItPosition&,OCTBUF&) const;
virtual PvObject* reversePv(RControl&,
		const ItPosition& at,const ItPosition& size,const OCTBUF&)const;
};

//======================================================================
// META MEMBER OCTSTR HAS FIX LENGTH
class MmOctets:public MmElement {
private:
	uint32_t length_;
public:
	MmOctets(CSTR,uint32_t,const PObject* =0,const PObject* =0,
		const ICVoverwriter* ow=0,METH_HC_ForIPinfo meth=0);
virtual	~MmOctets();
//----------------------------------------------------------------------
virtual	bool encodeOctets(WControl&,const ItPosition&,OCTBUF&,const PvOctets&) const;
virtual	uint32_t objectLength(const PObject* =0,const WObject* =0) const;
};
inline	uint32_t MmOctets::objectLength(const PObject*,const WObject*) const {return length_;}

//======================================================================
// IPv4 ADDRESS
class MmV4Addr:public MmOctets {
public:
	MmV4Addr(CSTR,const PObject* =0,const PObject* =0,
		const ICVoverwriter* ow=0,METH_HC_ForIPinfo meth=0);
virtual	~MmV4Addr();
// COMPOSE/REVERSE PROTECTED MmUint -------------------------------------------
virtual PvObject* reversePv(RControl&,
		const ItPosition& at,const ItPosition& size,const OCTBUF&)const;
};

//======================================================================
// IPv6 ADDRESS
class MmV6Addr:public MmOctets {
public:
	MmV6Addr(CSTR,const PObject* =0,const PObject* =0,
		const ICVoverwriter* ow=0,METH_HC_ForIPinfo meth=0);
virtual	~MmV6Addr();
// COMPOSE/REVERSE PROTECTED MmUint -------------------------------------------
virtual PvObject* reversePv(RControl&,
		const ItPosition& at,const ItPosition& size,const OCTBUF&)const;
};

//======================================================================
// ETHER ADDRESS
class MmEther:public MmOctets {
public:
	MmEther(CSTR,const PObject* =0,const PObject* =0,
		const ICVoverwriter* ow=0,METH_HC_ForIPinfo meth=0);
virtual	~MmEther();
// COMPOSE/REVERSE PROTECTED MmUint -------------------------------------------
virtual PvObject* reversePv(RControl&,
		const ItPosition& at,const ItPosition& size,const OCTBUF&)const;
};

//////////////////////////////////////////////////////////////////////////////
// ICV overwrite Items

class ICVoverwriter {
public:
	ICVoverwriter(){}
virtual	bool overwrite(ICVControl&,
		const ItPosition& at,OCTBUF& buf,const TObject* t)const;
};

class ICV_Zero : public ICVoverwriter{
public:
	ICV_Zero():ICVoverwriter(){}
virtual	bool overwrite(ICVControl&,
		const ItPosition& at,OCTBUF& buf,const TObject* t)const;
};
class ICV_HC : public ICVoverwriter{
	const McObject*	meta_;
	METH_HC_OWICV	METH_HC_OWICV_;
public:
	ICV_HC(const McObject* m,METH_HC_OWICV hc):ICVoverwriter(),
		meta_(m),METH_HC_OWICV_(hc){}
virtual	bool overwrite(ICVControl&,
		const ItPosition& at,OCTBUF& buf,const TObject* t)const;
};
//////////////////////////////////////////////////////////////////////////////

#endif


syntax highlighted by Code2HTML, v. 0.9.1