You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeutils/ksim/monitors/snmp/value.cpp

331 lines
8.3 KiB

/* This file is part of the KDE project
Copyright (C) 2003 Simon Hausmann <hausmann@kde.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "value.h"
#include "value_p.h"
#include "snmp_p.h"
#include <tqvariant.h>
#include <tdelocale.h>
#include <assert.h>
using namespace KSim::Snmp;
ValueImpl::ValueImpl( variable_list *var )
{
switch ( var->type ) {
case ASN_INTEGER: {
type = Value::Int;
data = TQVariant( static_cast<int>( *var->val.integer ) );
break;
}
case ASN_UINTEGER: {
type = Value::UInt;
data = TQVariant( static_cast<uint>( *var->val.integer ) );
break;
}
case ASN_OCTET_STR: {
type = Value::ByteArray;
TQByteArray d;
d.setRawData( reinterpret_cast<char *>( var->val.string ), var->val_len );
TQByteArray copy = d;
copy.detach();
d.resetRawData( reinterpret_cast<char *>( var->val.string ), var->val_len );
data = TQVariant( copy );
break;
}
case ASN_NULL: {
type = Value::Null;
break;
}
case ASN_OBJECT_ID: {
type = Value::Oid;
oid = Identifier( new Identifier::Data( var->val.objid, var->val_len / sizeof( oid ) ) );
break;
}
case ASN_IPADDRESS: {
type = Value::IpAddress;
addr = TQHostAddress( static_cast<uint>( *var->val.integer ) );
break;
}
case ASN_COUNTER: {
type = Value::Counter;
data = TQVariant( static_cast<uint>( *var->val.integer ) );
break;
}
case ASN_GAUGE: {
type = Value::Gauge;
data = TQVariant( static_cast<uint>( *var->val.integer ) );
break;
}
case ASN_COUNTER64: {
type = Value::Counter64;
ctr64 = ( ( ( TQ_UINT64 )var->val.counter64->high ) << 32 ) | ( var->val.counter64->low );
break;
}
case ASN_TIMETICKS: {
type = Value::TimeTicks;
data = TQVariant( static_cast<int>( *var->val.integer ) );
break;
}
case SNMP_NOSUCHOBJECT: {
type = Value::NoSuchObject;
break;
}
case SNMP_NOSUCHINSTANCE: {
type = Value::NoSuchInstance;
break;
}
case SNMP_ENDOFMIBVIEW: {
type = Value::EndOfMIBView;
break;
}
#if defined( OPAQUE_SPECIAL_TYPES )
case ASN_OPAQUE_FLOAT: {
type = Value::Double;
data = TQVariant( static_cast<float>( *var->val.floatVal ) );
break;
}
case ASN_OPAQUE_DOUBLE: {
type = Value::Double;
data = TQVariant( static_cast<float>( *var->val.doubleVal ) );
break;
}
#endif
default: {
tqDebug( "ValueImp: converting from %i to invalid", var->type );
type = Value::Invalid; break;
}
}
}
Value::Value()
{
d = new ValueImpl;
}
Value::Value( ValueImpl *impl )
: d( impl )
{
}
Value::Value( int val, Type type )
{
d = new ValueImpl;
assert( type == Int || type == TimeTicks );
d->type = type;
d->data = TQVariant( val );
}
Value::Value( uint val, Type type )
{
d = new ValueImpl;
assert( type == UInt || type == Counter || type == Gauge );
d->type = type;
d->data = TQVariant( val );
}
Value::Value( double val )
{
d = new ValueImpl;
d->type = Double;
d->data = TQVariant( val );
}
Value::Value( const TQByteArray &data )
{
d = new ValueImpl;
d->type = ByteArray;
d->data = TQVariant( data );
}
Value::Value( const KSim::Snmp::Identifier &oid )
{
d = new ValueImpl;
d->type = Value::Oid;
d->oid = oid;
}
Value::Value( const TQHostAddress &address )
{
d = new ValueImpl;
d->type = IpAddress;
d->addr = address;
}
Value::Value( TQ_UINT64 counter )
{
d = new ValueImpl;
d->type = Counter64;
d->ctr64 = counter;
}
Value::Value( const Value &rhs )
{
d = new ValueImpl( *rhs.d );
}
Value &Value::operator=( const Value &rhs )
{
if ( this == &rhs )
return *this;
delete d;
d = new ValueImpl( *rhs.d );
return *this;
}
Value::~Value()
{
delete d;
}
Value::Type Value::type() const
{
return d->type;
}
int Value::toInt() const
{
switch ( d->type ) {
case Int:
case TimeTicks: return d->data.toInt();
case Invalid: tqDebug( "cannot convert from invalid to int" );
default: assert( false );
}
assert( false );
return -1;
}
uint Value::toUInt() const
{
switch ( d->type ) {
case UInt:
case Counter:
case Gauge: return d->data.toUInt();
case Invalid: tqDebug( "cannot convert from invalid to uint" );
default: assert( false );
}
assert( false );
return 0;
}
double Value::toDouble() const
{
assert( d->type == Double );
return d->data.toDouble();
}
const TQByteArray Value::toByteArray() const
{
assert( d->type == ByteArray );
return d->data.toByteArray();
}
const Identifier Value::toOID() const
{
assert( d->type == Oid );
return d->oid;
}
const TQHostAddress Value::toIpAddress() const
{
assert( d->type == IpAddress );
return d->addr;
}
uint Value::toCounter() const
{
return toUInt();
}
uint Value::toGauge() const
{
return toUInt();
}
int Value::toTimeTicks() const
{
return toInt();
}
TQ_UINT64 Value::toCounter64() const
{
assert( d->type == Counter64 );
return d->ctr64;
}
TQString Value::toString( int conversionFlags ) const
{
switch ( type() ) {
case Value::Int: return TQString::number( toInt() );
case Value::Gauge:
case Value::Counter:
case Value::UInt: return TQString::number( toUInt() );
case Value::Double: return TQString::number( toDouble() );
case Value::Counter64: return TQString::number( toCounter64() );
case Value::ByteArray: return TQString::fromAscii( toByteArray().data(), toByteArray().size() );
case Value::IpAddress: return toIpAddress().toString();
case Value::Oid: return toOID().toString();
case Value::TimeTicks: return formatTimeTicks( toTimeTicks(), conversionFlags );
// not using i18n here, because it may be called from within a worker thread, and I'm
// not sure it makes sense to translate it anyway
case Value::NoSuchObject: return TQString::fromLatin1( "No Such Object" );
case Value::NoSuchInstance: return TQString::fromLatin1( "No Such Instance" );
case Value::EndOfMIBView: return TQString::fromLatin1( "End Of MIB View" );
case Value::Invalid:
case Value::Null: return TQString();
}
return TQString();
}
TQString Value::formatTimeTicks( int ticks, int conversionFlags )
{
ticks /= 100;
int days = ticks / ( 60 * 60 * 24 );
ticks %= 60 * 60 * 24;
int hours = ticks / ( 60 * 60 );
ticks %= 60 * 60;
int minutes = ticks / 60;
int seconds = ticks % 60;
TQString result;
if ( days > 0 )
result += TQString::number( days ) + "d:";
result += TQString(TQString::fromAscii( "%1h:%2m" )).arg( hours ).arg( minutes );
if ( conversionFlags & TimeTicksWithSeconds )
result += ":" + TQString::number( seconds ) + "s";
return result;
}