File Coverage

blib/lib/Net/DSML/Control.pm
Criterion Covered Total %
statement 111 143 77.6
branch 58 74 78.3
condition 23 36 63.8
subroutine 13 14 92.8
pod 5 5 100.0
total 210 272 77.2


line stmt bran cond sub pod time code
1             package Net::DSML::Control;
2              
3 3     3   3303 use warnings;
  3         8  
  3         110  
4 3     3   18 use strict;
  3         5  
  3         103  
5             #use Carp;
6 3     3   1322 use Class::Std::Utils;
  3         4829  
  3         22  
7              
8             # Copyright (c) 2007 Clif Harden . All rights reserved.
9             # This program is free software; you can redistribute it and/or
10             # modify it under the same terms as Perl itself.
11              
12 3     3   154 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  3         7  
  3         412  
13 3     3   18 use version; $VERSION = version->new('0.002');
  3         8  
  3         18  
14              
15             {
16              
17             BEGIN
18             {
19 3     3   268 use Exporter ();
  3         7  
  3         133  
20              
21 3     3   57 @ISA = qw(Exporter);
22 3         8 @EXPORT = qw();
23 3         8 %EXPORT_TAGS = ();
24 3         5686 @EXPORT_OK = ();
25             }
26              
27             my %errMsg; # no error this will be a null string.
28             my %controls; # Actual xml data string.
29             my %default; # will contain the initial control string if there is one.
30             #
31             # Method new
32             #
33             # The method new creates a new DSML Control oject.
34             #
35             # There are four possible input options.
36             # Input option "control": Sets the oid number of the control
37             # Input option "value": Sets the control value data.
38             # Input option "valuetype": Sets the xsd type for the control value.
39             # Input option "criticality": Sets the criticality variable to the input
40             # value, either true or false.
41             #
42             #
43             # $control = Net::DSML::Control->new( { control => 1.2.840.113556.1.4.619,
44             # valuetype => base64Binary,
45             # criticality => true,
46             # value => RFNNTYyLJA== } );
47             #
48             # Method output; Returns a new DSML object.
49             #
50              
51             sub new
52             {
53 19     19 1 3203 my ($class, $opt) = @_;
54 19         55 my $self = bless anon_scalar(),$class;
55 19         105 my $id = ident($self);
56 19         26 my $result;
57             my $value;
58 0         0 my $valuetype;
59 0         0 my $criticality;
60 0         0 my $control;
61             #
62             # Initailize data to a default values.
63             #
64 19         53 $errMsg{$id} = ""; # no error
65 19         38 $controls{$id} = []; # Actual control xml data string(s).
66 19         55 $default{$id}->{default} = "";
67              
68 19 100       50 if ( $opt )
69             {
70              
71 12 50       38 if ( !defined($opt->{control}) )
72             {
73 0         0 $errMsg{$id} = "Subroutine Control required type oid value is not defined.";
74 0         0 return $self;
75             }
76              
77 12 100       34 $control = (ref($opt->{control}) ? ${$opt->{control}} : $opt->{control});
  2         4  
78 12 100       40 $valuetype = (ref($opt->{valuetype}) ? ${$opt->{valuetype}} : $opt->{valuetype}) if ( $opt->{valuetype});
  1 100       3  
79 12 100       33 $criticality = (ref($opt->{criticality}) ? ${$opt->{criticality}} : $opt->{criticality}) if ( $opt->{criticality});
  1 100       3  
80 12 100       39 $value = (ref($opt->{value}) ? ${$opt->{value}} : $opt->{value});
  1         2  
81              
82 12 50 66     60 if ( $opt->{criticality} && !($criticality =~ /^(true)||(false)$/) )
83             {
84 0         0 $errMsg{$id} = "The Control`s criticality is not defined properly.";
85 0         0 return $self;
86             }
87              
88 12 50 66     57 if ( $opt->{valuetype} && !($valuetype =~ /^(string)||(anyURI)||(base64Binary)$/) )
89             {
90 0         0 $errMsg{$id} = "The Control`s valuetype is not defined properly.";
91 0         0 return $self;
92             }
93              
94 12 50 66     132 if ( $opt->{value} && !$opt->{valuetype})
95             {
96 0         0 $errMsg{$id} = "The value data was defined but the valuetype of the value data was not not defined.";
97 0         0 return $self;
98             }
99              
100 12 50 33     35 if ( $opt->{type} && !$opt->{value})
101             {
102 0         0 $errMsg{$id} = "The valuetype was defined but the value data was not not defined.";
103 0         0 return $self;
104             }
105              
106 12 100       30 if ( $opt->{value} )
107             {
108 5 50       25 _specialChar(\$value) if ( $value =~ /(&||<||>||"||')/);
109             }
110              
111 12         28 $result = "
112 12 100       34 $result .= " critical=\"" . $criticality . "\"" if ( $opt->{criticality});
113 12         22 $result .= ">";
114 12 100       26 $result .= "{value});
115 12 100 66     49 $result .= "xsi:type=\"xsd:" . $valuetype . "\"" if ( $opt->{value} && $opt->{valuetype});
116 12 100 66     41 $result .= ">" if ( $opt->{value} && $opt->{valuetype});
117 12 100       32 $result .= $value . "" if ($opt->{value});
118 12         20 $result .= "";
119              
120 12         13 push(@{$controls{$id}}, $result);
  12         31  
121 12         25 $default{$id}->{default} = $result;
122             }
123              
124 19         61 return $self;
125             }
126              
127             #
128             # inside-out classes have to have a DESTROY subrountine.
129             #
130             sub DESTROY
131             {
132 19     19   1028 my ($dsml) = @_;
133 19         45 my $id = ident($dsml);
134              
135 19         47 delete $controls{$id}; # Copy of actual xml data string.
136 19         47 delete $default{$id}; # Copy of actual xml data string.
137 19         32 delete $errMsg{$id}; # no error this will be a null string.
138 19         229 return;
139             }
140              
141             #
142             # The method clear sets object variables to their default values.
143             #
144             # Returns true on success.
145             #
146              
147             sub clear
148             {
149 1     1 1 461 my ($dsml) = shift;
150 1         5 my $id = ident $dsml;
151              
152 1         4 $controls{$id} = []; # Actual xml data string.
153 1         4 $errMsg{$id} = ""; # error messages, no error this will be a null string.
154 1         2 push(@{$controls{$id}}, $default{$id}->{default});
  1         5  
155 1         3 return 1;
156             }
157              
158             # 1. & - &
159             # 2. < - <
160             # 3. > - >
161             # 4. " - "
162             # 5. ' - '
163             #
164             # Convert special characters to xml standards.
165             #
166             sub _specialChar
167             {
168 8     8   14 my ($char) = @_;
169              
170 8         19 $$char =~ s/&/&/g;
171 8         12 $$char =~ s/
172 8         11 $$char =~ s/>/>/g;
173 8         14 $$char =~ s/"/"/g;
174 8         329 $$char =~ s/'/'/g;
175 8         28 return;
176             }
177              
178             #
179             # Method error
180             #
181             # The method error returns the error message for the object.
182             # $message = $dsml->error();
183             #
184              
185             sub error
186             {
187 0     0 1 0 my $dsml = shift;
188 0         0 return $errMsg{ident $dsml};
189             }
190              
191             # Method add
192             #
193             # The method Add is used in conjuction with other methods like Search.
194             #
195             # If there is one required input option and 3 additional optional options.
196             #
197             # $return = $control->Add( { control => 1.2.840.113556.1.4.619, valuetype => base64Binary, criticality => true, value => RFNNTYyLJA== } );
198             #
199             # Input option "control": The control oid number.
200             # Input option "valuetype": The xsd type for the value data.
201             # Input option "criticality": The criticality of the control; true or false.
202             # Input option "value": The value of the control.
203             #
204             # Method output; Returns true on success; false on error, error message
205             # can be gotten with error method.
206             #
207              
208             sub add
209             {
210 8     8 1 2792 my ($dsml, $opt) = @_;
211 8         24 my $id = ident $dsml;
212 8         13 my $result;
213             my $value;
214 0         0 my $valuetype;
215 0         0 my $criticality;
216 0         0 my $control;
217              
218 8         20 $errMsg{$id} = "";
219 8 50       38 if ( !defined($opt->{control}) )
220             {
221 0         0 $errMsg{$id} = "Method add control required oid value is not defined.";
222 0         0 return 0;
223             }
224              
225 8 50       27 $control = (ref($opt->{control}) ? ${$opt->{control}} : $opt->{control});
  0         0  
226 8 50       29 $valuetype = (ref($opt->{valuetype}) ? ${$opt->{valuetype}} : $opt->{valuetype}) if ( $opt->{valuetype});
  0 100       0  
227 8 50       29 $criticality = (ref($opt->{criticality}) ? ${$opt->{criticality}} : $opt->{criticality}) if ( $opt->{criticality});
  0 100       0  
228 8 50       21 $value = (ref($opt->{value}) ? ${$opt->{value}} : $opt->{value});
  0         0  
229              
230              
231 8 50 66     48 if ( $opt->{criticality} && !($criticality =~ /^(true)||(false)$/) )
232             {
233 0         0 $errMsg{$id} = "Method add Control criticality is not defined properly.";
234 0         0 return 0;
235             }
236              
237 8 50 66     46 if ( $opt->{valuetype} && !($valuetype =~ /^(string)||(anyURI)||(base64Binary)$/) )
238             {
239 0         0 $errMsg{$id} = "Method add control`s valuetype is not defined properly.";
240 0         0 return 0;
241             }
242              
243 8 50 66     36 if ( $opt->{value} && ! $opt->{valuetype})
244             {
245 0         0 $errMsg{$id} = "Method control valuetype for the value data was not not defined.";
246 0         0 return 0;
247             }
248              
249 8 50 66     1083 if ( $opt->{valuetype} && !$opt->{value})
250             {
251 0         0 $errMsg{$id} = "Method add control`s valuetype was defined but the value data was not not defined.";
252 0         0 return 0;
253             }
254              
255 8 100       579 if ( $opt->{value} )
256             {
257 3 50       26 _specialChar(\$value) if ( $value =~ /(&||<||>||"||')/);
258             }
259              
260 8         21 $result = "
261 8 100       31 $result .= " critical=\"" . $criticality . "\"" if ( $opt->{criticality});
262 8         13 $result .= ">";
263 8 100       23 $result .= "{value});
264 8 100 66     38 $result .= "xsi:type=\"xsd:" . $valuetype . "\"" if ( $opt->{value} && $opt->{valuetype});
265 8 100 66     1929 $result .= ">" if ( $opt->{value} && $opt->{valuetype});
266 8 100       28 $result .= $value . "" if ($opt->{value});
267 8         10 $result .= "";
268            
269 8         10 push(@{$controls{$id}}, $result);
  8         189  
270 8         25 return 1;
271             }
272              
273             sub getControl
274             {
275 20     20 1 7035 my ($dsml) = @_;
276 20         46 my $id = ident $dsml;
277 20         20 my $result;
278 20         103 $result = "";
279              
280 20         22 foreach my $var (@{$controls{$id}})
  20         215  
281             {
282 22         143 $result .= $var;
283             }
284              
285 20         129 return $result;
286             }
287              
288             }
289              
290             1; # Magic true value required at end of module
291              
292             __END__