File Coverage

File:lib/Net/MQTT/Message/Connect.pm
Coverage:98.5%

linestmtbrancondsubpodtimecode
1
3
3
3
3320
21
233
use strict;
2
3
3
3
36
61
423
use warnings;
3package Net::MQTT::Message::Connect;
4
5# ABSTRACT: Perl module to represent an MQTT Connect message
6
7 - 17
=head1 SYNOPSIS

  # instantiated by Net::MQTT::Message

=head1 DESCRIPTION

This module encapsulates a single MQTT Connection Request message.  It
is a specific subclass used by L<Net::MQTT::Message> and should
not need to be instantiated directly.

=cut
18
19
3
3
3
39
14
596
use base 'Net::MQTT::Message';
20
3
3
3
56
16
88
use Net::MQTT::Constants qw/:all/;
21
22sub message_type {
23
15
429
  1
24}
25
26sub attributes {
27
0
0
  (shift->SUPER::attributes, qw/protocol_name protocol_version
28                                user_name_flag user_name
29                                password_flag password
30                                will_flag will_retain will_qos
31                                will_topic will_message
32                                clean_session connect_reserved_flag
33                                keep_alive_timer client_id/)
34}
35
36=method C<protocol_name()>
37
38Returns the protocol name field of the MQTT Connect message. The
39default is 'C<MQIsdp>'.
40
41=cut
42
43
12
411
sub protocol_name { shift->{protocol_name} || 'MQIsdp' }
44
45=method C<protocol_version()>
46
47Returns the protocol version field of the MQTT Connect message. The
48default is 3.
49
50=cut
51
52
12
377
sub protocol_version { shift->{protocol_version} || 3 }
53
54=method C<user_name_flag()>
55
56Returns the user name flag field of the MQTT Connect message. The
57default is true if and only if a user name is defined.
58
59=cut
60
61sub user_name_flag {
62
21
125
  my $self = shift;
63
21
507
  $self->{user_name_flag} || defined $self->{user_name};
64}
65
66=method C<password_flag()>
67
68Returns the password flag field of the MQTT Connect message. The
69default is true if and only if a password is defined.
70
71=cut
72
73sub password_flag {
74
21
121
  my $self = shift;
75
21
467
  $self->{password_flag} || defined $self->{password};
76}
77
78=method C<will_retain()>
79
80Returns the will retain field of the MQTT Connect message. The
81default is 0.
82
83=cut
84
85
8
189
sub will_retain { shift->{will_retain} || 0 }
86
87=method C<will_qos()>
88
89Returns the will QoS field of the MQTT Connect message. The default
90is 0.
91
92=cut
93
94
8
203
sub will_qos { shift->{will_qos} || 0 }
95
96=method C<will_flag()>
97
98Returns the will flag field of the MQTT Connect message. The default
99is 0.
100
101=cut
102
103
27
791
sub will_flag { shift->{will_flag} || 0 }
104
105=method C<clean_session()>
106
107Returns the clean session flag field of the MQTT Connect message. The
108default is 1.
109
110=cut
111
112sub clean_session {
113
6
40
  my $self = shift;
114
6
98
  defined $self->{clean_session} ? $self->{clean_session} : 1
115}
116
117=method C<connect_reserved_flag()>
118
119Returns the reserved flag field of the MQTT Connect message. The
120default is 0.
121
122=cut
123
124
6
279
sub connect_reserved_flag { shift->{connect_reserved_flag} || 0 }
125
126=method C<keep_alive_timer()>
127
128Returns the keep alive timer field of the MQTT Connect message. The
129units are seconds. The default is 60.
130
131=cut
132
133
6
232
sub keep_alive_timer { shift->{keep_alive_timer} || 60 }
134
135=method C<client_id()>
136
137Returns the client identifier field of the MQTT Connect message. The
138default is 'C<Net::MQTT::Message[$$]>' where 'C<$$>' is the
139current process id.
140
141=cut
142
143
13
1626
sub client_id { shift->{client_id} || 'Net::MQTT::Message['.$$.']' }
144
145=method C<will_topic()>
146
147Returns the will topic field of the MQTT Connect message. The default
148is undefined.
149
150=cut
151
152
4
94
sub will_topic { shift->{will_topic} }
153
154=method C<will_message()>
155
156Returns the will message field of the MQTT Connect message. The
157default is undefined.
158
159=cut
160
161
4
74
sub will_message { shift->{will_message} }
162
163=method C<user_name()>
164
165Returns the user name field of the MQTT Connect message. The default
166is undefined.
167
168=cut
169
170
4
76
sub user_name { shift->{user_name} }
171
172=method C<password()>
173
174Returns the password field of the MQTT Connect message. The default
175is undefined.
176
177=cut
178
179
4
74
sub password { shift->{password} }
180
181sub _remaining_string {
182
6
47
  my ($self, $prefix) = @_;
183
6
53
  $self->protocol_name.'/'.$self->protocol_version.'/'.$self->client_id.
184    ($self->user_name_flag ? ' user='.$self->user_name : '').
185    ($self->password_flag ? ' pass='.$self->password : '').
186    ($self->will_flag
187     ? ' will='.$self->will_topic.',"'.$self->will_message.'",'.
188       $self->will_retain.','.qos_string($self->will_qos) : '').
189    ' '.$self->SUPER::_remaining_string($prefix)
190}
191
192sub _parse_remaining {
193
3
23
  my $self = shift;
194
3
19
  my $offset = 0;
195
3
95
  $self->{protocol_name} = decode_string($self->{remaining}, \$offset);
196
3
89
  $self->{protocol_version} = decode_byte($self->{remaining}, \$offset);
197
3
87
  my $b = decode_byte($self->{remaining}, \$offset);
198
3
41
  $self->{user_name_flag} = ($b&0x80) >> 7;
199
3
25
  $self->{password_flag} = ($b&0x40) >> 6;
200
3
27
  $self->{will_retain} = ($b&0x20) >> 5;
201
3
22
  $self->{will_qos} = ($b&0x18) >> 3;
202
3
19
  $self->{will_flag} = ($b&0x4) >> 2;
203
3
24
  $self->{clean_session} = ($b&0x2) >> 1;
204
3
20
  $self->{connect_reserved_flag} = $b&0x1;
205
3
80
  $self->{keep_alive_timer} = decode_short($self->{remaining}, \$offset);
206
3
69
  $self->{client_id} = decode_string($self->{remaining}, \$offset);
207
3
28
  if ($self->will_flag) {
208
1
26
    $self->{will_topic} = decode_string($self->{remaining}, \$offset);
209
1
25
    $self->{will_message} = decode_string($self->{remaining}, \$offset);
210  }
211
3
28
  if ($self->user_name_flag) {
212
1
24
    $self->{user_name} = decode_string($self->{remaining}, \$offset);
213  }
214
3
28
  if ($self->password_flag) {
215
1
23
    $self->{password} = decode_string($self->{remaining}, \$offset);
216  }
217
3
385
  substr $self->{remaining}, 0, $offset, '';
218}
219
220sub _remaining_bytes {
221
6
50
  my $self = shift;
222
6
371
  my $o = encode_string($self->protocol_name);
223
6
70
  $o .= encode_byte($self->protocol_version);
224
6
76
  $o .= encode_byte(
225                    ($self->user_name_flag << 7) |
226                    ($self->password_flag << 6) |
227                    ($self->will_retain << 5) | ($self->will_qos << 3) |
228                    ($self->will_flag << 2) |
229                    ($self->clean_session << 1) |
230                    $self->connect_reserved_flag);
231
6
70
  $o .= encode_short($self->keep_alive_timer);
232
6
61
  $o .= encode_string($self->client_id);
233
6
60
  $o .= encode_string($self->will_topic) if ($self->will_flag);
234
6
47
  $o .= encode_string($self->will_message) if ($self->will_flag);
235
6
51
  $o .= encode_string($self->user_name) if ($self->user_name_flag);
236
6
54
  $o .= encode_string($self->password) if ($self->password_flag);
237
6
255
  $o;
238}
239
2401;