/*
 * Copyright (C) IBM Corporation 2004.
 * 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.
 *
 *    Author: Kazuo Hiekata <e30948@jp.ibm.com>
 *
 */

#if !defined(NOT_USE_SNMP)

#include "McSub.h"
#include "MmHeader.h"
#include "ItPosition.h"
#include "WObject.h"
#include "RObject.h"
#include "PControl.h"
#include "PvObject.h"
#include "PvOctets.h"
#include "McSNMP.h"
#include <stdio.h>
#include <string.h>

////////////////////////////////////////////////////////////////
#define SUPER McHeader
McUdp_SNMP::McUdp_SNMP(CSTR s): McHeader(s) {}
McUdp_SNMP::~McUdp_SNMP() {}
uint32_t McUdp_SNMP::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const {
	return(buf.remainLength(at.bytes()));
}
RObject *McUdp_SNMP::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const {
	RObject *r_self = SUPER::reverse(c, r_parent, at, buf);
	return(r_self);
}
McUdp_SNMPTrap::McUdp_SNMPTrap(CSTR s): McHeader(s) {}
McUdp_SNMPTrap::~McUdp_SNMPTrap() {}
uint32_t McUdp_SNMPTrap::length_for_reverse(RControl &, ItPosition &at, OCTBUF &buf) const {
	return(buf.remainLength(at.bytes()));
}
RObject *McUdp_SNMPTrap::reverse(RControl &c, RObject *r_parent, ItPosition &at, OCTBUF &buf) const {
	RObject *r_self = SUPER::reverse(c, r_parent, at, buf);
	return(r_self);
}
#undef SUPER
////////////////////////////////////////////////////////////////
#define PDU_HDR_LEN 2
McPdu_SNMP::McPdu_SNMP(CSTR key): McOption(key), type_(0), length_(0) {}
McPdu_SNMP::~McPdu_SNMP() {}
uint32_t McPdu_SNMP::length_for_reverse(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(!length_) {
		return(McOption::length_for_reverse(c, at, buf));
	}
	uint32_t length = length_->value(at, buf) + PDU_HDR_LEN;
	return(length);
}
bool McPdu_SNMP::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		ItPosition tmpat = at;
		RObject *rcode = type_->reverse(c, 0, tmpat,buf);
		if(!rcode) {
			return(false);
		}
		const PvNumber *pv = (const PvNumber *)rcode->pvalue();
		uint32_t codevalue = pv->value();
		c.DictType().type_Set(codevalue);
		delete(rcode);
		return(true);
	}
	return(false);
}
bool McPdu_SNMP::HCGENE(Length)(WControl &cntr, WObject *wmem, OCTBUF &buf) const {
	WObject *wc = wmem->parent();
	uint32_t valulen = wc->size().bytes() - PDU_HDR_LEN;
	PvNumber def(valulen);
	return(def.generate(cntr, wmem, buf));
}
bool McPdu_SNMP::HCGENE(Type)(WControl &cntr, WObject *wmem, OCTBUF &buf) const {
	int32_t val = get_pduType(wmem);
	if(val < 0) {
		return(false);
	}
	PvNumber def(val);
	return(def.generate(cntr, wmem, buf));
}
PObject *McPdu_SNMP::HCEVAL(Type)(WObject *wmem) const {
	int32_t val = get_pduType(wmem);
	return(new PvNumber(val));
}
int32_t McPdu_SNMP::get_pduType(WObject *wmem) const {
	WObject *wc = wmem->parent();
	int32_t rtn = wc ? wc->meta()->pduType() : -1;
	if(rtn < 0) {
		wmem->mustDefine(0);
	}
	return(rtn);
}
#undef PDU_HDR_LEN
////////////////////////////////////////////////////////////////
McPdu_SNMP_ANY::McPdu_SNMP_ANY(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_ANY::~McPdu_SNMP_ANY() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Message::McPdu_SNMP_Message(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Message::~McPdu_SNMP_Message() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Version::McPdu_SNMP_Version(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Version::~McPdu_SNMP_Version() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Community::McPdu_SNMP_Community(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Community::~McPdu_SNMP_Community() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_GetRequest::McPdu_SNMP_GetRequest(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_GetRequest::~McPdu_SNMP_GetRequest() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_GetNextRequest::McPdu_SNMP_GetNextRequest(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_GetNextRequest::~McPdu_SNMP_GetNextRequest() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_SetRequest::McPdu_SNMP_SetRequest(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_SetRequest::~McPdu_SNMP_SetRequest() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_GetResponse::McPdu_SNMP_GetResponse(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_GetResponse::~McPdu_SNMP_GetResponse() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Trap::McPdu_SNMP_Trap(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Trap::~McPdu_SNMP_Trap() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_GetBulk::McPdu_SNMP_GetBulk(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_GetBulk::~McPdu_SNMP_GetBulk() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Inform::McPdu_SNMP_Inform(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Inform::~McPdu_SNMP_Inform() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Trap2::McPdu_SNMP_Trap2(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Trap2::~McPdu_SNMP_Trap2() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Report::McPdu_SNMP_Report(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Report::~McPdu_SNMP_Report() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_RequestID::McPdu_SNMP_RequestID(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_RequestID::~McPdu_SNMP_RequestID() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_ErrorStatus::McPdu_SNMP_ErrorStatus(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_ErrorStatus::~McPdu_SNMP_ErrorStatus() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_ErrorIndex::McPdu_SNMP_ErrorIndex(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_ErrorIndex::~McPdu_SNMP_ErrorIndex() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_GenericTrap::McPdu_SNMP_GenericTrap(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_GenericTrap::~McPdu_SNMP_GenericTrap() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_SpecificTrap::McPdu_SNMP_SpecificTrap(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_SpecificTrap::~McPdu_SNMP_SpecificTrap() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_VarBindList::McPdu_SNMP_VarBindList(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_VarBindList::~McPdu_SNMP_VarBindList() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_VarBind::McPdu_SNMP_VarBind(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_VarBind::~McPdu_SNMP_VarBind() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Boolean::McPdu_SNMP_Boolean(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Boolean::~McPdu_SNMP_Boolean() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Integer::McPdu_SNMP_Integer(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Integer::~McPdu_SNMP_Integer() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_BitString::McPdu_SNMP_BitString(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_BitString::~McPdu_SNMP_BitString() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_OctString::McPdu_SNMP_OctString(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_OctString::~McPdu_SNMP_OctString() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Null::McPdu_SNMP_Null(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Null::~McPdu_SNMP_Null() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_ObjectID::McPdu_SNMP_ObjectID(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_ObjectID::~McPdu_SNMP_ObjectID() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Sequence::McPdu_SNMP_Sequence(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Sequence::~McPdu_SNMP_Sequence() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Set::McPdu_SNMP_Set(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Set::~McPdu_SNMP_Set() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Opaque::McPdu_SNMP_Opaque(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Opaque::~McPdu_SNMP_Opaque() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_IPAddress::McPdu_SNMP_IPAddress(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_IPAddress::~McPdu_SNMP_IPAddress() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Counter::McPdu_SNMP_Counter(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Counter::~McPdu_SNMP_Counter() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_Gauge::McPdu_SNMP_Gauge(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_Gauge::~McPdu_SNMP_Gauge() {}

////////////////////////////////////////////////////////////////
McPdu_SNMP_TimeTicks::McPdu_SNMP_TimeTicks(CSTR key): McPdu_SNMP(key) {}
McPdu_SNMP_TimeTicks::~McPdu_SNMP_TimeTicks() {}


////////////////////////////////////////////////////////////////
MmPdu_SNMP_onSNMP::MmPdu_SNMP_onSNMP(CSTR key): MmReference_More0(key, true) {}
MmPdu_SNMP_onSNMP::~MmPdu_SNMP_onSNMP() {}
void MmPdu_SNMP_onSNMP::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmPdu_SNMP_onSNMP::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmPdu_SNMP_onSNMP::dict_;
bool MmPdu_SNMP_onSNMP::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmPdu_SNMP_onPDU::MmPdu_SNMP_onPDU(CSTR key): MmReference_More0(key, true) {}
MmPdu_SNMP_onPDU::~MmPdu_SNMP_onPDU() {}
void MmPdu_SNMP_onPDU::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmPdu_SNMP_onPDU::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmPdu_SNMP_onPDU::dict_;
bool MmPdu_SNMP_onPDU::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_Version_onSNMP_Message::MmSNMP_Version_onSNMP_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_Version_onSNMP_Message::~MmSNMP_Version_onSNMP_Message() {}
void MmSNMP_Version_onSNMP_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_Version_onSNMP_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_Version_onSNMP_Message::dict_;
bool MmSNMP_Version_onSNMP_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_Community_onSNMP_Message::MmSNMP_Community_onSNMP_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_Community_onSNMP_Message::~MmSNMP_Community_onSNMP_Message() {}
void MmSNMP_Community_onSNMP_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_Community_onSNMP_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_Community_onSNMP_Message::dict_;
bool MmSNMP_Community_onSNMP_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_RequestID_onSNMP_Message::MmSNMP_RequestID_onSNMP_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_RequestID_onSNMP_Message::~MmSNMP_RequestID_onSNMP_Message() {}
void MmSNMP_RequestID_onSNMP_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_RequestID_onSNMP_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_RequestID_onSNMP_Message::dict_;
bool MmSNMP_RequestID_onSNMP_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_ErrorStatus_onSNMP_Message::MmSNMP_ErrorStatus_onSNMP_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_ErrorStatus_onSNMP_Message::~MmSNMP_ErrorStatus_onSNMP_Message() {}
void MmSNMP_ErrorStatus_onSNMP_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_ErrorStatus_onSNMP_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_ErrorStatus_onSNMP_Message::dict_;
bool MmSNMP_ErrorStatus_onSNMP_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_ErrorIndex_onSNMP_Message::MmSNMP_ErrorIndex_onSNMP_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_ErrorIndex_onSNMP_Message::~MmSNMP_ErrorIndex_onSNMP_Message() {}
void MmSNMP_ErrorIndex_onSNMP_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_ErrorIndex_onSNMP_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_ErrorIndex_onSNMP_Message::dict_;
bool MmSNMP_ErrorIndex_onSNMP_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_ObjectID_onTrap_Message::MmSNMP_ObjectID_onTrap_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_ObjectID_onTrap_Message::~MmSNMP_ObjectID_onTrap_Message() {}
void MmSNMP_ObjectID_onTrap_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_ObjectID_onTrap_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_ObjectID_onTrap_Message::dict_;
bool MmSNMP_ObjectID_onTrap_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_IPAddress_onTrap_Message::MmSNMP_IPAddress_onTrap_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_IPAddress_onTrap_Message::~MmSNMP_IPAddress_onTrap_Message() {}
void MmSNMP_IPAddress_onTrap_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_IPAddress_onTrap_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_IPAddress_onTrap_Message::dict_;
bool MmSNMP_IPAddress_onTrap_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_GenericTrap_onTrap_Message::MmSNMP_GenericTrap_onTrap_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_GenericTrap_onTrap_Message::~MmSNMP_GenericTrap_onTrap_Message() {}
void MmSNMP_GenericTrap_onTrap_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_GenericTrap_onTrap_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_GenericTrap_onTrap_Message::dict_;
bool MmSNMP_GenericTrap_onTrap_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_SpecificTrap_onTrap_Message::MmSNMP_SpecificTrap_onTrap_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_SpecificTrap_onTrap_Message::~MmSNMP_SpecificTrap_onTrap_Message() {}
void MmSNMP_SpecificTrap_onTrap_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_SpecificTrap_onTrap_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_SpecificTrap_onTrap_Message::dict_;
bool MmSNMP_SpecificTrap_onTrap_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_TimeStamp_onTrap_Message::MmSNMP_TimeStamp_onTrap_Message(CSTR key): MmReference_Must1(key, true) {}
MmSNMP_TimeStamp_onTrap_Message::~MmSNMP_TimeStamp_onTrap_Message() {}
void MmSNMP_TimeStamp_onTrap_Message::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_TimeStamp_onTrap_Message::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_TimeStamp_onTrap_Message::dict_;
bool MmSNMP_TimeStamp_onTrap_Message::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_VarBindList_onPDU::MmSNMP_VarBindList_onPDU(CSTR key): MmReference_More0(key, true) {}
MmSNMP_VarBindList_onPDU::~MmSNMP_VarBindList_onPDU() {}
void MmSNMP_VarBindList_onPDU::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_VarBindList_onPDU::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_VarBindList_onPDU::dict_;
bool MmSNMP_VarBindList_onPDU::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
MmSNMP_VarBind_onPDU::MmSNMP_VarBind_onPDU(CSTR key): MmReference_More0(key, true) {}
MmSNMP_VarBind_onPDU::~MmSNMP_VarBind_onPDU() {}
void MmSNMP_VarBind_onPDU::add(McPdu_SNMP *mc) {
	dict_.add(mc->pduType(), mc);
}
void MmSNMP_VarBind_onPDU::add_other(McPdu_SNMP *mc) {
	dict_.add_other(mc);
}
TypevsMcDict MmSNMP_VarBind_onPDU::dict_;
bool MmSNMP_VarBind_onPDU::overwrite_DictType(RControl &c, ItPosition &at, OCTBUF &buf) const {
	if(buf.remainLength(at.bytes())) {
		McPdu_SNMP *any = (McPdu_SNMP *)dict_.find_other();
		return(any->overwrite_DictType(c, at, buf));
	}
	return(false);
}
////////////////////////////////////////////////////////////////
#define SNMPVERSION_LEN 1
MmSNMPVersion::MmSNMPVersion(CSTR s,uint16_t n,const PObject* g,const PObject* e,
	const ICVoverwriter* ow,METH_HC_ForIPinfo meth):
	MmUint(s,n,g,e,ow,meth) {}
MmSNMPVersion::~MmSNMPVersion() {}

PvObject* MmSNMPVersion::reversePv(RControl&,
		const ItPosition& at,const ItPosition&,const OCTBUF& buf)const{
	uint32_t val = decode(at,buf);
	return new PvSNMPVersion(val);}
////////////////////////////////////////////////////////////////
PvSNMPVersion::~PvSNMPVersion() {}
PvSNMPVersion::PvSNMPVersion():PvNumber() {}
PvSNMPVersion::PvSNMPVersion(int32_t x):PvNumber(x) {}
PvSNMPVersion::PvSNMPVersion(const PvNumber& x):PvNumber(x) {}
void PvSNMPVersion::print() const {
	printf("%u", (value()&0xff));
	switch(value()&0xff) {
		case 0:	printf(" (Version 1)"); break;
		case 1:	printf(" (Version 2C)"); break;
		case 2:	printf(" (Version 3)"); break;
		default: printf(" (Unknown Version)"); break;
	}
	return;
}
#undef SNMPVERSION_LEN
////////////////////////////////////////////////////////////////
MmObjectID::MmObjectID(CSTR s, const PObject *g, const PObject *e): MmVarOctets(s, g, e, 0, 0) {}
MmObjectID::~MmObjectID() {}

PvObject *MmObjectID::reversePv(RControl &, const ItPosition &at, const ItPosition &size, const OCTBUF &buf) const {
	uint32_t offset = at.bytes();
	uint32_t length = size.bytes();
	return(new PvObjectID(length, (OCTSTR)buf.string(offset)));
}

////////////////////////////////////////////////////////////////
PvObjectID::PvObjectID(): PvOctets() {}
PvObjectID::PvObjectID(uint32_t l, OCTSTR o, bool b): PvOctets(l, o, b) {}
PvObjectID::~PvObjectID() {}
PvObject *PvObjectID::shallowCopy() const {
	return(new PvObjectID(length(), (OCTSTR)string()));
}
void PvObjectID::log(uint32_t t) const {
	CmCString s("\nlog:");
	for(uint32_t i=0;i<t;i++) {s += "| ";}
		s += "  ";
	dump(s.string());
	return;
}
void PvObjectID::print() const {
	dump(length()>16?0:"");
	return;
}
void PvObjectID::dump(CSTR tag) const {
	int i, j, k, i9=length();
	char tmp[256];
	char tmp2[64];
	COCTSTR s=string();
	for(i=0;i<i9;i++)
		printf("%02x",s[i]&0xff);
	printf((tag!=0&&length()>16)?tag:"");
	int a=(int)(s[0]&0xff);
	sprintf(tmp, "%d.%d.",(int)(a/40), (int)(a%40));
	/* ASN.1 decode */	
	for(i=1;i<i9;i++){
		j=0;
		a=(int)(s[i]&0xff);
		if (a > 0x7F)
			for(j=1;j<i9-i;j++)
				if (s[i+j] < 0x80) break;
		
		if (j!=0) {
			a=0;
			for (k=i; k<=i+j; k++)
				a+=(int)((s[k]&0x7f)<<(7*(i+j-k)));
		}
		if(i+j<i9-1)
			sprintf(tmp2, "%d.",a);
		else
			sprintf(tmp2, "%d", a);
		strcat(tmp, tmp2);
		i+=j;
	}
	printf(" (%s)", tmp);
	return;
}
////////////////////////////////////////////////////////////////
MmSNMPString::MmSNMPString(CSTR s, const PObject *g, const PObject *e): MmVarOctets(s, g, e, 0, 0) {}
MmSNMPString::~MmSNMPString() {}

PvObject *MmSNMPString::reversePv(RControl &, const ItPosition &at, const ItPosition &size, const OCTBUF &buf) const {
	uint32_t offset = at.bytes();
	uint32_t length = size.bytes();
	return(new PvSNMPString(length, (OCTSTR)buf.string(offset)));
}
////////////////////////////////////////////////////////////////
PvSNMPString::PvSNMPString(): PvOctets() {}
PvSNMPString::PvSNMPString(uint32_t l, OCTSTR o, bool b): PvOctets(l, o, b) {}
PvSNMPString::~PvSNMPString() {}
PvObject *PvSNMPString::shallowCopy() const {
	return(new PvSNMPString(length(), (OCTSTR)string()));
}
void PvSNMPString::log(uint32_t t) const {
	dump("\nlog:  ");
	return;
}
void PvSNMPString::print() const {
	dump();
	return;
}
void PvSNMPString::dump(CSTR tag) const {
	int i, i9=length();
	COCTSTR s=string();
//	CSTR nl=tag!=0?tag:"\n";
	CSTR pad=(tag!=0&&length()>16)?tag:"";
	for(i=0;i<i9;i++) {
		printf("%s%02x",pad,s[i]&0xff);
		switch((i%32)+1) {
			case 4: case 12: case 20: case 28:	pad=""; break;
			case 8:	case 16: case 24:		pad=""; break;
			case 32:				pad=""; break;
			default:				pad=""; break;}}
//			case 4: case 12: case 20: case 28:	pad=" "; break;
//			case 8:	case 16: case 24:		pad="  "; break;
//			case 32:				pad=nl; break;
//			default:				pad=""; break;}}
	printf(" ascii(");
	for(i=0;i<i9;i++)
		printf("%.01s",&s[i]);
	printf(")");
	return;
}
////////////////////////////////////////////////////////////////
#define ERRORSTATUS_LEN 1
MmErrorStatus::MmErrorStatus(CSTR s,uint16_t n,const PObject* g,const PObject* e,
	const ICVoverwriter* ow,METH_HC_ForIPinfo meth):
	MmUint(s,n,g,e,ow,meth) {}
MmErrorStatus::~MmErrorStatus() {}

PvObject* MmErrorStatus::reversePv(RControl&,
		const ItPosition& at,const ItPosition&,const OCTBUF& buf)const{
	uint32_t val = decode(at,buf);
	return (new PvErrorStatus(val));
}
////////////////////////////////////////////////////////////////
PvErrorStatus::~PvErrorStatus() {}
PvErrorStatus::PvErrorStatus():PvNumber() {}
PvErrorStatus::PvErrorStatus(int32_t x):PvNumber(x) {}
void PvErrorStatus::print() const {
	printf("%u", (value()&0xff));
	switch(value()&0xff) {
		/* Errors defined in rfc1157.txt	*/
		case 0: printf(" (noError)"); break;
		case 1: printf(" (tooBig)"); break;
		case 2: printf(" (noSuchName)"); break;
		case 3: printf(" (badValue)"); break;
		case 4: printf(" (readOnly)"); break;
		case 5: printf(" (genErr)"); break;
		/* Errors defined in rfc1905.txt	*/
		case 6: printf(" (noAccess)"); break;
		case 7: printf(" (wrongType)"); break;
		case 8: printf(" (wrongLength)"); break;
		case 9: printf(" (wrongEncoding)"); break;
		case 10: printf(" (wrongValue)"); break;
		case 11: printf(" (noCreation)"); break;
		case 12: printf(" (inconsistentValue)"); break;
		case 13: printf(" (resourceUnavailable)"); break;
		case 14: printf(" (commitFailed)"); break;
		case 15: printf(" (undoFailed)"); break;
		case 16: printf(" (authorizationError)"); break;
		case 17: printf(" (notWritable)"); break;
		case 18: printf(" (inconsistentName)"); break;
		/* Unknown */
		default: printf(" (Unknown Error)"); break;
	}
	return;
}
#undef ERRORSTATUS_LEN
////////////////////////////////////////////////////////////////

#endif //NOT_USE_SNMP


syntax highlighted by Code2HTML, v. 0.9.1