line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package DBGp::Client::AnyEvent::Connection; |
2
|
|
|
|
|
|
|
|
3
|
2
|
|
|
2
|
|
481
|
use strict; |
|
2
|
|
|
|
|
2
|
|
|
2
|
|
|
|
|
45
|
|
4
|
2
|
|
|
2
|
|
5
|
use warnings; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
42
|
|
5
|
|
|
|
|
|
|
|
6
|
2
|
|
|
2
|
|
1251
|
use AnyEvent::Handle; |
|
2
|
|
|
|
|
23057
|
|
|
2
|
|
|
|
|
58
|
|
7
|
2
|
|
|
2
|
|
882
|
use DBGp::Client::AsyncConnection; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
use Scalar::Util qw(weaken blessed); |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
sub new { |
11
|
|
|
|
|
|
|
my ($class, %args) = @_; |
12
|
|
|
|
|
|
|
my $self = bless { |
13
|
|
|
|
|
|
|
handle => undef, |
14
|
|
|
|
|
|
|
on_stream => undef, |
15
|
|
|
|
|
|
|
on_notify => undef, |
16
|
|
|
|
|
|
|
connection => DBGp::Client::AsyncConnection->new(socket => $args{socket}), |
17
|
|
|
|
|
|
|
}, $class; |
18
|
|
|
|
|
|
|
my $weak_self = $self; |
19
|
|
|
|
|
|
|
weaken($weak_self); |
20
|
|
|
|
|
|
|
my $handle = AnyEvent::Handle->new( |
21
|
|
|
|
|
|
|
fh => $args{socket}, |
22
|
|
|
|
|
|
|
on_error => sub { |
23
|
|
|
|
|
|
|
my ($handle, $fatal, $message) = @_; |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
$weak_self->{handle} = undef; |
26
|
|
|
|
|
|
|
$handle->destroy; |
27
|
|
|
|
|
|
|
$weak_self->{connection}->closed; |
28
|
|
|
|
|
|
|
}, |
29
|
|
|
|
|
|
|
on_read => sub { |
30
|
|
|
|
|
|
|
my ($handle) = @_; |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
$weak_self->{connection}->add_data($handle->{rbuf}); |
33
|
|
|
|
|
|
|
substr $handle->{rbuf}, 0, length($handle->{rbuf}), '' |
34
|
|
|
|
|
|
|
if defined $handle->{rbuf}; |
35
|
|
|
|
|
|
|
}, |
36
|
|
|
|
|
|
|
on_eof => sub { |
37
|
|
|
|
|
|
|
my ($handle) = @_; |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
$weak_self->{handle} = undef; |
40
|
|
|
|
|
|
|
$handle->destroy; |
41
|
|
|
|
|
|
|
$weak_self->{connection}->closed; |
42
|
|
|
|
|
|
|
}, |
43
|
|
|
|
|
|
|
); |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
$self->{handle} = $handle; |
46
|
|
|
|
|
|
|
$self->{on_stream_cb} = sub { |
47
|
|
|
|
|
|
|
$weak_self->{on_stream}->(@_); |
48
|
|
|
|
|
|
|
}; |
49
|
|
|
|
|
|
|
$self->{on_notify_cb} = sub { |
50
|
|
|
|
|
|
|
$weak_self->{on_notify}->(@_); |
51
|
|
|
|
|
|
|
}; |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
return $self; |
54
|
|
|
|
|
|
|
} |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
sub DESTROY { |
57
|
|
|
|
|
|
|
my ($self) = @_; |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
$self->{handle}->destroy if $self->{handle} && !$self->{handle}->destroyed; |
60
|
|
|
|
|
|
|
} |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
sub init { $_[0]->{connection}->init } |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
sub send_command { |
65
|
|
|
|
|
|
|
my ($self, $callback_or_condvar, @rest) = @_; |
66
|
|
|
|
|
|
|
my ($condvar, $callback); |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
if (!defined $callback_or_condvar) { |
69
|
|
|
|
|
|
|
$condvar = AnyEvent->condvar; |
70
|
|
|
|
|
|
|
$callback = sub { $condvar->send($_[0]) }; |
71
|
|
|
|
|
|
|
} elsif (ref $callback_or_condvar eq 'CODE') { |
72
|
|
|
|
|
|
|
$condvar = AnyEvent->condvar; |
73
|
|
|
|
|
|
|
$callback = sub { $condvar->send($_[0]); $callback_or_condvar->($_[0]); }; |
74
|
|
|
|
|
|
|
} elsif (blessed $callback_or_condvar && $callback_or_condvar->isa('AnyEvent::CondVar')) { |
75
|
|
|
|
|
|
|
$condvar = $callback_or_condvar; |
76
|
|
|
|
|
|
|
$callback = sub { $condvar->send($_[0]) }; |
77
|
|
|
|
|
|
|
} else { |
78
|
|
|
|
|
|
|
die "callback_or_condvar can be undefined, a code reference or a condvar"; |
79
|
|
|
|
|
|
|
} |
80
|
|
|
|
|
|
|
$self->{connection}->send_command($callback, @rest); |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
return $condvar; |
83
|
|
|
|
|
|
|
} |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
sub on_stream { |
86
|
|
|
|
|
|
|
my ($self, $cb) = @_; |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
$self->{on_stream} = $cb; |
89
|
|
|
|
|
|
|
if ($cb) { |
90
|
|
|
|
|
|
|
$self->{connection}->on_stream($self->{on_stream_cb}); |
91
|
|
|
|
|
|
|
} else { |
92
|
|
|
|
|
|
|
$self->{connection}->on_stream(undef); |
93
|
|
|
|
|
|
|
} |
94
|
|
|
|
|
|
|
} |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
sub on_notify { |
97
|
|
|
|
|
|
|
my ($self, $cb) = @_; |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
$self->{on_notify} = $cb; |
100
|
|
|
|
|
|
|
if ($cb) { |
101
|
|
|
|
|
|
|
$self->{connection}->on_notify($self->{on_notify_cb}); |
102
|
|
|
|
|
|
|
} else { |
103
|
|
|
|
|
|
|
$self->{connection}->on_notify(undef); |
104
|
|
|
|
|
|
|
} |
105
|
|
|
|
|
|
|
} |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
1; |