/*
 * 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/PvOctets.h,v 1.35 2003/12/04 04:59:47 akisada Exp $
 */
#if !defined(__PvOctets_h__)
#define	__PvOctets_h__	1
#include "pzCommon.h"
#include "PvObject.h"
class ItPosition;
class WControl;
class WObject;
class RObject;
class PvIfName;
//======================================================================
class PvOctets:public PvObject {
private:
	uint32_t allocated_;
	uint32_t length_;
	OCTSTR buffer_;
public:
	uint32_t length() const;
virtual	uint16_t bitWidth() const;
	COCTSTR string(uint32_t =0) const;
	OCTSTR buffer(uint32_t =0);
	PvOctets();
	PvOctets(const PvOctets&);
	PvOctets(uint32_t,OCTSTR=0,bool=false);
virtual	PvObject* shallowCopy() const;
virtual	~PvOctets();
	PvOctets* substr(uint32_t,uint32_t,PvOctets* =0);
	PvOctets* set(uint32_t,OCTSTR=0);
//----------------------------------------------------------------------
// ENCODING INTERFACE
//	RA: stand for Right Adjust 
//	LA: stand for Left Adjust 
	void encodeLA(octet,const ItPosition&,uint16_t);
	void encodeRA(octet,const ItPosition&,uint16_t);
	void encodeLAs(COCTSTR,const ItPosition&,uint16_t);
	void encodeRAs(COCTSTR,const ItPosition&,uint16_t);
	void encodeNUint(uint32_t,const ItPosition&,uint16_t);
	void encodeUint(uint32_t,const ItPosition&,uint16_t);
	void encode(const ItPosition&,const PvOctets&);
	void encodeZero(const ItPosition& at,const ItPosition& size);
//----------------------------------------------------------------------
	octet decodeLA(const ItPosition&,uint16_t) const;
	octet decodeRA(const ItPosition&,uint16_t) const;
	void decodeLAs(OCTSTR,const ItPosition&,uint16_t) const;
	void decodeRAs(OCTSTR,const ItPosition&,uint16_t) const;
	uint32_t decodeNUint(const ItPosition&,uint16_t) const;
	uint32_t decodeUint(const ItPosition&,uint16_t) const;
//----------------------------------------------------------------------
	uint32_t sum1Octet() const;
	uint32_t sum2Octets() const;
	uint32_t sum4Octets() const;
//----------------------------------------------------------------------
virtual	int32_t compareWidth(const PvOctets&,uint32_t) const;
virtual	int32_t compareOctets(const PvOctets&) const;
virtual	int32_t compareObject(const PObject&) const;
virtual	bool generate(WControl&,WObject*,OCTBUF&) const;
//----------------------------------------------------------------------
	PvOctets& operator=(const PvOctets&);
//----------------------------------------------------------------------
	uint32_t hash() const;
	bool isEqual(const PvOctets*) const;
virtual	COCTSTR octetsValue(bool&) const;
virtual	PvOctets* octetString() const;
virtual	int32_t addressFamily() const;
//----------------------------------------------------------------------
virtual	void zero();
virtual	void fill();
virtual	void print() const;
virtual	void dump(CSTR=0) const;
virtual	void log(uint32_t=0) const;
//----------------------------------------------------------------------
inline	int32_t remainLength(uint32_t) const;
inline	PvOctets* left(uint32_t,PvOctets* =0);
inline	PvOctets* right(uint32_t,PvOctets* =0);
static	void defaultNotUsed();
virtual	bool isOctets() const;
protected:
static	PvIfName* defaultTN_;
static	PvIfName* defaultNUT_;
static	PvIfName* defaultTN();
static	PvIfName* defaultNUT();
static const CSTR linkLocalPrefixPresentation_;
};
inline uint32_t PvOctets::length() const {return length_;}
inline COCTSTR PvOctets::string(uint32_t n) const {return buffer_+n;}
inline int32_t PvOctets::remainLength(uint32_t n) const {return length()-n;}
inline PvOctets* PvOctets::left(uint32_t l,PvOctets* p) {
	return substr(0,l,p);}
inline PvOctets* PvOctets::right(uint32_t o,PvOctets* p) {
	return substr(o,remainLength(o),p);}
inline uint32_t PvOctets::hash() const {
	return basicHash((CSTR)string(),(int)length());}
inline uint16_t PvOctets::bitWidth() const {return length_*8;}

//======================================================================
class PvV4Addr:public PvOctets {
private:
public:
	PvV4Addr(OCTSTR=0,bool=false);
	PvV4Addr(CSTR,bool&,OCTSTR=0);		// PRESENTATION
virtual	PvObject* shallowCopy() const;
virtual	~PvV4Addr();
	bool pton(CSTR);
virtual	void print() const;
virtual	void log(uint32_t=0) const;
virtual	int32_t addressFamily() const;
};

//======================================================================
class PvV6Addr:public PvOctets {
private:
static	PvV6Addr* linkLocal_;
public:
	PvV6Addr(OCTSTR=0,bool=false);
	PvV6Addr(CSTR,bool&,OCTSTR=0);		// RFC2373 PRESENTATION
virtual	PvObject* shallowCopy() const;
virtual	~PvV6Addr();
static	const PvV6Addr* TN();
static	const PvV6Addr* NUT();
static	const PvV6Addr& linkLocal();
	bool pton(CSTR);
	PvV6Addr* merge(uint16_t,const PvOctets&,PvV6Addr* =0) const;
	bool netMerge(CSTR,int,const PvV6Addr&);
virtual	void print() const;
virtual	void log(uint32_t=0) const;
virtual	bool isV6Addr() const;
virtual	int32_t addressFamily() const;
};

//======================================================================
class PvEther:public PvOctets {
private:
public:
	PvEther(OCTSTR=0,bool=false);
	PvEther(CSTR,bool&,OCTSTR=0);			// PRESENTATION
	PvEther(const PvV6Addr&,OCTSTR=0);	// V6 -> ETHER MULTICAST
virtual	PvObject* shallowCopy() const;
virtual	~PvEther();
static	const PvEther* TN();
static	const PvEther* NUT();
	bool pton(CSTR);
	void multicast(const PvV6Addr&);	// V6 -> ETHER MULTICAST
virtual	void print() const;
virtual	void log(uint32_t=0) const;
};

//======================================================================
class PvEUI64:public PvOctets {
private:
public:
	PvEUI64(OCTSTR=0,bool=false);
	PvEUI64(const PvEther&,OCTSTR=0);	// IEEE802 -> EUI-64
virtual	~PvEUI64();
	void create(const PvEther&);		// IEEE802 -> EUI-64
};

#include "CmCltn.h"
interfaceCmList(PvOctetsList,PvOctets);

//======================================================================
class PvCookie64: public PvOctets {
	public:
		PvCookie64(OCTSTR = 0, bool = false);
		virtual	~PvCookie64();
		virtual	void log(uint32_t=0) const;
		virtual	void print() const;
		static	const PvCookie64 *zerocookie();
		virtual	PvObject *shallowCopy() const;
};

//======================================================================
class PvBSA96: public PvOctets {
	public:
		PvBSA96(OCTSTR = 0, bool = false);
		virtual	~PvBSA96();
		virtual	void log(uint32_t=0) const;
		virtual	void print() const;
		static	const PvBSA96 *zerobsa();
		virtual	PvObject *shallowCopy() const;
};
#endif


syntax highlighted by Code2HTML, v. 0.9.1