File Coverage

blib/lib/Protocol/DBus/Message/Header.pm
Criterion Covered Total %
statement 29 31 93.5
branch 7 14 50.0
condition n/a
subroutine 7 7 100.0
pod 0 1 0.0
total 43 53 81.1


line stmt bran cond sub pod time code
1             package Protocol::DBus::Message::Header;
2              
3 1     1   6 use strict;
  1         2  
  1         26  
4 1     1   4 use warnings;
  1         2  
  1         19  
5              
6 1     1   380 use Call::Context ();
  1         220  
  1         16  
7              
8 1     1   5 use Protocol::DBus::Marshal ();
  1         2  
  1         11  
9 1     1   5 use Protocol::DBus::Pack ();
  1         1  
  1         48  
10              
11             # This just gets us to the length of the headers array.
12             use constant {
13 1         337 _MIN_HEADER_LENGTH => 16,
14              
15             # The spec says to parse as array of pairs, but a dict makes
16             # more sense and is compatible. (The spec doesn’t proscribe
17             # duplicate headers, but the reference implementation does.)
18             SIGNATURE => 'yyyyuua{yv}',
19              
20             MESSAGE_TYPE => {
21             METHOD_CALL => 1,
22             METHOD_RETURN => 2,
23             ERROR => 3,
24             SIGNAL => 4,
25             },
26              
27             FLAG => {
28             NO_REPLY_EXPECTED => 1,
29             NO_AUTO_START => 2,
30             ALLOW_INTERACTIVE_AUTHORIZATION => 4,
31             },
32              
33             FIELD => {
34             PATH => 1,
35             INTERFACE => 2,
36             MEMBER => 3,
37             ERROR_NAME => 4,
38             REPLY_SERIAL => 5,
39             DESTINATION => 6,
40             SENDER => 7,
41             SIGNATURE => 8,
42             UNIX_FDS => 9,
43             },
44              
45             FIELD_SIGNATURE => {
46             PATH => 'o',
47             INTERFACE => 's',
48             MEMBER => 's',
49             ERROR_NAME => 's',
50             REPLY_SERIAL => 'u',
51             DESTINATION => 's',
52             SENDER => 's',
53             SIGNATURE => 'g',
54             UNIX_FDS => 'u',
55             },
56 1     1   5 };
  1         1  
57              
58             my ($_is_big_endian, $prot_version);
59              
60             sub parse_simple {
61 6     6 0 10 my ($buf_sr) = @_;
62              
63 6         23 Call::Context::must_be_list();
64              
65 6 50       57 if (length($$buf_sr) >= _MIN_HEADER_LENGTH()) {
66 6         30 ($_is_big_endian, $prot_version) = unpack 'axxC', $$buf_sr;
67              
68 6 50       16 if (1 != $prot_version) {
69 0         0 die "Protocol version must be 1, not “$prot_version”!";
70             }
71              
72 6 50       19 $_is_big_endian = ($_is_big_endian eq 'B') ? 1 : ($_is_big_endian eq 'l') ? 0 : die "Invalid endian byte: “$_is_big_endian”!";
    50          
73              
74 6 50       18 my $array_length = unpack(
75             '@12 ' . ($_is_big_endian ? 'N' : 'V'),
76             $$buf_sr,
77             );
78              
79 6 50       19 if (length($$buf_sr) >= (_MIN_HEADER_LENGTH + $array_length)) {
80 6 50       39 my ($content, $length) = Protocol::DBus::Marshal->can(
81             $_is_big_endian ? 'unmarshal_be' : 'unmarshal_le'
82             )->($buf_sr, 0, SIGNATURE());
83              
84 6         15 Protocol::DBus::Pack::align( $length, 8 );
85              
86 6         21 return( $content, $length, $_is_big_endian );
87             }
88             }
89              
90 0           return;
91             }
92              
93             1;