/*
 * 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/PObject.h,v 1.48 2005/05/09 09:35:24 akisada Exp $
 */
#if !defined(__PObject_h__)
#define __PObject_h__	1
#include <stdarg.h>
#include "CmTypes.h"
#include "pzCommon.h"
struct timeval;
class MObject;
class TObject;
class WObject;
class WControl;
class RObject;
class PvObject;
class PvOctets;
class PvNumber;
class PvV6Addr;
class PvName;
class PObjectList;

class PObject {
private:
	CSTR file_;
	int line_;
public:
	PObject(CSTR=0,int=0);
	PObject(const PObject&);
virtual	~PObject();
	bool isEqual(const PObject*) const;
	bool isEqualObject(const PObject*) const;
virtual CSTR metaString() const;
virtual CSTR nameString() const;
virtual const MObject* findMember(CSTR) const;
// COMPOSE INTERFACE ----------------------------------------------------------
virtual	WObject* selfCompose(WControl&,WObject* w_parent) const;
virtual bool check_nameCompose(WControl&,WObject* w_parent,const PvName&) const;
// COMPOSE INTERFACE(for Collection elementsPerform) --------------------------
	void vselfCompose(void* v,va_list ap) const;
	void vmatchselfCompose(void* v,va_list ap) const;
//----------------------------------------------------------------------
virtual	const MObject* meta() const;
virtual	bool isEqualMeta(const MObject*) const;
virtual	int32_t compareOctets(const PvOctets&) const;
virtual	int32_t compareNumber(int32_t) const;
virtual	int32_t compareTimeval(const timeval&) const;
virtual	int32_t compareCalc() const;
virtual	int32_t compareObject(const PObject&) const;
virtual	int32_t compareObjectWith(WControl&,const PObject&) const;
//----------------------------------------------------------------------
// Parse TREE interface
public:
virtual	PObject* rvalue(PObject*);
virtual	PObject* name(PObject*);
virtual	PObject* member(PObject*);
virtual	PObject* argument(PObject*);
virtual const PObject* rvalue() const;
virtual const PObjectList& members()const;
virtual const PObjectList& args()const;
virtual	int32_t intValue(bool&) const;
virtual	CSTR strValue(bool&) const;
virtual	COCTSTR octetsValue(bool&) const;
virtual	PvOctets* octetString() const;
virtual	bool isV6Addr() const;
virtual	bool isOctets() const;
virtual	bool isName() const;
virtual	uint32_t operation() const;
//----------------------------------------------------------------------
virtual	void generateNotAllow(CSTR) const;
virtual	bool generate(WControl&,WObject*,OCTBUF&) const;
virtual	PvObject* generateValue(WObject*) const;
virtual	PvObject* evaluateValue(WObject*) const;
virtual	bool generateV6Addr(PvV6Addr&) const;
virtual	bool evaluateV6Addr(PvV6Addr&) const;
virtual	bool generateOctetsWith(PvOctets&,WObject*) const;
//----------------------------------------------------------------------
// SA MEMBER YAC INTERFACE
virtual PObject* pad_member(PObject*);
virtual PObject* crypt_member(PObject*);
virtual PObject* auth_member(PObject*);
virtual PObject* bsa_member(PObject*);
virtual PObject* ike_p2_hash_member(PObject*);
virtual PObject* dhcpauth_member(PObject*);
//----------------------------------------------------------------------
virtual	PObject* unary(PObject*);
virtual	PObject* node(PObject*,PObject*);
virtual	const PObject* lvalue() const;
virtual	const PObject* unary() const;
virtual bool matchesWith(const PObject&) const;
virtual	const PObject* corresponding(const PObject&) const;
virtual	const PObject* correspondingMeta(const MObject*) const;
public:
inline	int line() const;
inline	CSTR file() const;
virtual	void error(CSTR,...) const;
virtual	void print() const;
virtual	void printConvert() const;
virtual void printArgument() const;
virtual void log(uint32_t=0) const;
virtual	uint16_t width() const;
virtual	uint32_t length() const;
virtual	uint32_t objectLength(const WObject*) const;
};
inline	int PObject::line() const {return line_;}
inline	CSTR PObject::file() const {return file_;}

#include "CmCltn.h"
interfaceCmList(PObjectList,PObject);
#include "CmQueue.h"
class PoQueue:public CmQueue {
private:
	PObject* object_;
public:
	PoQueue(PObject* =0);
virtual	~PoQueue();
inline	PObject* object() const;
inline	void object(PObject*);
virtual	PObject* pop();
virtual	PObject* push(PObject*);
};
inline	PObject* PoQueue::object() const {return object_;}
inline	void PoQueue::object(PObject* o) {object_=o;}
#endif


syntax highlighted by Code2HTML, v. 0.9.1