1 #
2 # Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
3 #
4
5 #
6 # Object.pm contains perl code for exacct object manipulation.
7 #
8
9 require 5.8.4;
10 use strict;
11 use warnings;
12
13 package Sun::Solaris::Exacct::Object;
14
15 our $VERSION = '1.3';
16 use XSLoader;
17 XSLoader::load(__PACKAGE__, $VERSION);
18
19 our (@EXPORT_OK, %EXPORT_TAGS, @_Constants);
20 @EXPORT_OK = @_Constants;
21 %EXPORT_TAGS = (CONSTANTS => \@_Constants, ALL => \@EXPORT_OK);
22
23 use base qw(Exporter);
24 use Sun::Solaris::Exacct::Catalog qw(:CONSTANTS);
25
26 #
27 # Class methods
28 #
29
30 #
31 # Dump an exacct object to the specified filehandle, or STDOUT by default.
32 #
33 sub dump
34 {
35 # Fettle parameters.
36 my ($class, $obj, $fh, $indent) = @_;
37 $fh ||= \*STDOUT;
38 $indent ||= 0;
39 my $istr = ' ' x $indent;
40
41 # Check for undef values.
42 if (! defined($obj)) {
43 print $fh ($istr, "UNDEFINED_VALUE\n");
44 return;
45 }
46
47 # Deal with items.
48 my @cat = $obj->catalog()->value();
49 if ($obj->type() == &EO_ITEM) {
50 printf $fh ("%sITEM\n%s Catalog = %s|%s|%s\n",
51 $istr, $istr, @cat);
52 $indent++;
53 my $val = $obj->value();
54
55 # Recursively dump nested objects.
56 if (ref($val)) {
57 $class->dump($val, $fh, $indent);
58
59 # Just print out items.
60 } else {
61 $val = unpack('H*', $val) if ($cat[0] == &EXT_RAW);
62 printf $fh ("%s Value = %s\n", $istr, $val);
63 }
64
65 # Deal with groups.
66 } else {
67 printf $fh ("%sGROUP\n%s Catalog = %s|%s|%s\n",
68 $istr, $istr, @cat);
69 $indent++;
70 foreach my $val ($obj->value()) {
71 $class->dump($val, $fh, $indent);
72 }
73 printf $fh ("%sENDGROUP\n", $istr);
74 }
75 }
76
77 #
78 # Item subclass - establish inheritance.
79 #
80 package Sun::Solaris::Exacct::Object::Item;
81 use base qw(Sun::Solaris::Exacct::Object);
82
83 #
84 # Group subclass - establish inheritance.
85 #
86 package Sun::Solaris::Exacct::Object::Group;
87 use base qw(Sun::Solaris::Exacct::Object);
88
89 #
90 # Tied array used for holding a group's items.
91 #
92 package Sun::Solaris::Exacct::Object::_Array;
93 use Carp;
94
95 #
96 # Check the passed list of arguments are derived from ::Object
97 #
98 sub check_args
99 {
100 my @duff;
101 foreach my $i (@_) {
102 push(@duff, $i)
103 if (! UNIVERSAL::isa($i, 'Sun::Solaris::Exacct::Object'));
104 }
105 if (@duff) {
106 local $Carp::CarpLevel = 2;
107 croak('"', join('", "', @duff), @duff == 1 ? '" is' : '" are',
108 ' not of type Sun::Solaris::Exacct::Object');
109 }
110 }
111
112 #
113 # Tied hash access methods
114 #
115 sub TIEARRAY
116 {
117 return(bless([], $_[0]));
118 }
119
120 sub FETCHSIZE
121 {
122 return(scalar(@{$_[0]}));
123 }
124
125 sub STORESIZE
126 {
127 $#{$_[0]} = $_[1] - 1;
128 }
129
130 sub STORE
131 {
132 check_args($_[2]);
133 return($_[0]->[$_[1]] = copy_xs_ea_objects($_[2]));
134 }
135
136 sub FETCH
137 {
138 return($_[0]->[$_[1]]);
139 }
140
141 sub CLEAR
142 {
143 @{$_[0]} = ();
144 }
145
146 sub POP
147 {
148 return(pop(@{$_[0]}));
149 }
150
151 sub PUSH
152 {
153 my $a = shift(@_);
154 check_args(@_);
155 push(@$a, copy_xs_ea_objects(@_));
156 }
157
158 sub SHIFT
159 {
160 return(shift(@{$_[0]}));
161 }
162
163 sub UNSHIFT
164 {
165 my $a = shift(@_);
166 check_args($_[2]);
167 return(unshift(@$a, copy_xs_ea_objects(@_)));
168 }
169
170 sub EXISTS
171 {
172 return(exists($_[0]->[$_[1]]));
173 }
174
175 sub DELETE
176 {
177 return(delete($_[0]->[$_[1]]));
178 }
179
180 sub EXTEND
181 {
182 }
183
184 sub SPLICE
185 {
186 my $a = shift(@_);
187 my $sz = scalar(@$a);
188 my $off = @_ ? shift(@_) : 0;
189 $off += $sz if $off < 0;
190 my $len = @_ ? shift : $sz - $off;
191 check_args(@_);
192 return(splice(@$a, $off, $len, copy_xs_ea_objects(@_)));
193 }
194
195 1;