File Coverage

blib/lib/BACnet/DataTypes/CharString.pm
Criterion Covered Total %
statement 41 45 91.1
branch 2 4 50.0
condition n/a
subroutine 10 10 100.0
pod 0 3 0.0
total 53 62 85.4


line stmt bran cond sub pod time code
1             #!/usr/bin/perl
2              
3             package BACnet::DataTypes::CharString;
4              
5 27     27   178 use warnings;
  27         48  
  27         1512  
6 27     27   134 use strict;
  27         72  
  27         1283  
7              
8 27     27   121 use bytes;
  27         45  
  27         154  
9 27     27   15305 use Encode;
  27         471849  
  27         3100  
10              
11 27     27   228 use BACnet::DataTypes::Utils;
  27         54  
  27         833  
12              
13 27     27   120 use parent 'BACnet::DataTypes::DataType';
  27         54  
  27         198  
14              
15 27     27   1949 use constant { CODE_SEGMENT_LENGTH => 1, };
  27         58  
  27         15172  
16              
17             our $codes = {
18             'ascii' => 0x00,
19             'shiftjis' => 0x01,
20             'jis0208-raw' => 0x02,
21             'UTF-32' => 0x03,
22             'UCS-2BE' => 0x04,
23             'iso-8859-1' => 0x05,
24             };
25              
26             our $codes_rev = { reverse %$codes };
27              
28             sub construct {
29 65     65 0 556532 my ( $class, $input_char_string, $coding_type, $modified_tag ) = @_;
30              
31 65         377 my $self = {
32             data => '',
33             val => $input_char_string,
34             };
35              
36 65         568 my $encoded_val = encode( $coding_type, $input_char_string );
37              
38 65         24231 $self->{data} .= BACnet::DataTypes::Utils::_construct_head(
39             BACnet::DataTypes::Utils::CHARACTER_STRING_TAG,
40             $modified_tag, length($encoded_val) + CODE_SEGMENT_LENGTH );
41              
42 65         340 $self->{data} .= pack( 'C', $codes->{$coding_type} );
43              
44 65         300 $self->{data} .= $encoded_val;
45              
46 65         146 my $helper = $self->{val};
47              
48 65         319 return bless $self, $class;
49             }
50              
51             sub parse {
52 69     69 0 186 my ( $class, $data_in ) = @_;
53              
54 69         234 my $self = bless { data => $data_in, }, $class;
55              
56 69         249 my $headache = BACnet::DataTypes::Utils::_correct_head(
57             data_in => $data_in,
58             expected_tag => BACnet::DataTypes::Utils::CHARACTER_STRING_TAG
59             );
60              
61 69 50       200 if ( $headache ne "" ) {
62 0         0 $self->{error} = "Char string: $headache";
63 0         0 return $self;
64             }
65              
66 69         228 my $helper = BACnet::DataTypes::Utils::_get_head_length($data_in);
67              
68 69         202 my $coding_type_num = unpack(
69             'C',
70             substr(
71             $data_in, BACnet::DataTypes::Utils::_get_head_length($data_in), 1
72             )
73             );
74              
75 69         237 my $coding_type = $codes_rev->{$coding_type_num};
76              
77 69 50       2076 if ( !defined $coding_type ) {
78 0         0 $self->{error} = "Char string: undefined coding type";
79 0         0 return $self;
80             }
81              
82 69         187 $self->{val} = decode(
83             $coding_type,
84             substr(
85             $data_in,
86             BACnet::DataTypes::Utils::_get_head_length($data_in) +
87             CODE_SEGMENT_LENGTH
88             )
89             );
90              
91 69         2483 return $self;
92             }
93              
94             sub coding_type {
95 62     62 0 35442 my ($self) = @_;
96              
97             return
98             $codes_rev->{ BACnet::DataTypes::Utils::_get_char_string_coding_type(
99 62         288 $self->{data} ) };
100             }
101              
102             1;