# # Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. # # # Object.pm contains perl code for exacct object manipulation. # require 5.8.4; use strict; use warnings; package Sun::Solaris::Exacct::Object; our $VERSION = '1.3'; use XSLoader; XSLoader::load(__PACKAGE__, $VERSION); our (@EXPORT_OK, %EXPORT_TAGS, @_Constants); @EXPORT_OK = @_Constants; %EXPORT_TAGS = (CONSTANTS => \@_Constants, ALL => \@EXPORT_OK); use base qw(Exporter); use Sun::Solaris::Exacct::Catalog qw(:CONSTANTS); # # Class methods # # # Dump an exacct object to the specified filehandle, or STDOUT by default. # sub dump { # Fettle parameters. my ($class, $obj, $fh, $indent) = @_; $fh ||= \*STDOUT; $indent ||= 0; my $istr = ' ' x $indent; # Check for undef values. if (! defined($obj)) { print $fh ($istr, "UNDEFINED_VALUE\n"); return; } # Deal with items. my @cat = $obj->catalog()->value(); if ($obj->type() == &EO_ITEM) { printf $fh ("%sITEM\n%s Catalog = %s|%s|%s\n", $istr, $istr, @cat); $indent++; my $val = $obj->value(); # Recursively dump nested objects. if (ref($val)) { $class->dump($val, $fh, $indent); # Just print out items. } else { $val = unpack('H*', $val) if ($cat[0] == &EXT_RAW); printf $fh ("%s Value = %s\n", $istr, $val); } # Deal with groups. } else { printf $fh ("%sGROUP\n%s Catalog = %s|%s|%s\n", $istr, $istr, @cat); $indent++; foreach my $val ($obj->value()) { $class->dump($val, $fh, $indent); } printf $fh ("%sENDGROUP\n", $istr); } } # # Item subclass - establish inheritance. # package Sun::Solaris::Exacct::Object::Item; use base qw(Sun::Solaris::Exacct::Object); # # Group subclass - establish inheritance. # package Sun::Solaris::Exacct::Object::Group; use base qw(Sun::Solaris::Exacct::Object); # # Tied array used for holding a group's items. # package Sun::Solaris::Exacct::Object::_Array; use Carp; # # Check the passed list of arguments are derived from ::Object # sub check_args { my @duff; foreach my $i (@_) { push(@duff, $i) if (! UNIVERSAL::isa($i, 'Sun::Solaris::Exacct::Object')); } if (@duff) { local $Carp::CarpLevel = 2; croak('"', join('", "', @duff), @duff == 1 ? '" is' : '" are', ' not of type Sun::Solaris::Exacct::Object'); } } # # Tied hash access methods # sub TIEARRAY { return(bless([], $_[0])); } sub FETCHSIZE { return(scalar(@{$_[0]})); } sub STORESIZE { $#{$_[0]} = $_[1] - 1; } sub STORE { check_args($_[2]); return($_[0]->[$_[1]] = copy_xs_ea_objects($_[2])); } sub FETCH { return($_[0]->[$_[1]]); } sub CLEAR { @{$_[0]} = (); } sub POP { return(pop(@{$_[0]})); } sub PUSH { my $a = shift(@_); check_args(@_); push(@$a, copy_xs_ea_objects(@_)); } sub SHIFT { return(shift(@{$_[0]})); } sub UNSHIFT { my $a = shift(@_); check_args($_[2]); return(unshift(@$a, copy_xs_ea_objects(@_))); } sub EXISTS { return(exists($_[0]->[$_[1]])); } sub DELETE { return(delete($_[0]->[$_[1]])); } sub EXTEND { } sub SPLICE { my $a = shift(@_); my $sz = scalar(@$a); my $off = @_ ? shift(@_) : 0; $off += $sz if $off < 0; my $len = @_ ? shift : $sz - $off; check_args(@_); return(splice(@$a, $off, $len, copy_xs_ea_objects(@_))); } 1;