/[cvs]/joko/Scripts/psh/lib/POE/Component/Terminal.pm
ViewVC logotype

Contents of /joko/Scripts/psh/lib/POE/Component/Terminal.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations)
Fri Jun 14 21:22:10 2002 UTC (22 years, 3 months ago) by cvsjoko
Branch: MAIN
Branch point for: nfo
Initial revision

1 #!/usr/bin/perl
2 ##
3 ## POE::Component::Terminal -- Terminal Component
4 ##
5 ## $Id: Terminal.pm,v 0.01 2002/06/13 19:10:05 joko Exp $
6 ##
7 package POE::Component::Terminal;
8
9 use strict;
10 #use strict qw ( vars refs );
11 use warnings;
12
13
14 use Carp qw( croak carp );
15
16 use POE;
17
18 use Term::ReadKey;
19 use Data::Dumper;
20
21 $POE::Component::Terminal::VERSION = 0.01;
22
23 my @args_needed = qw (
24 Alias
25 Caption
26 PromptPrefix
27 PromptPostfix
28 RequestSession
29 RequestState
30 ResponseSession
31 ResponseState
32 PromptChangeState
33 );
34
35 my $states = {
36 _start => 'start',
37 _stop => 'stop',
38 _signal => 'signal',
39 _default => 'default',
40 pollForKey => 'pollForKey',
41 recievePrompt => 'recievePrompt',
42 recieveResponse => 'recieveResponse',
43 };
44
45 sub new {
46 my $class = shift;
47 $class = ref( $class ) || $class;
48 #my( %args ) = ( %default_args, @_ );
49 my $args = shift;
50
51 # bless class into object ($self)
52 my $self = bless {}, $class;
53
54 ## Check args
55 foreach my $arg_needed (@args_needed) {
56 croak "Need $arg_needed argument."
57 unless exists $args->{ $arg_needed };
58 }
59
60 # store entries from args to object ($self)
61 map { $self->{$_} = $args->{$_}; } keys %{$args};
62
63 ## Make our session. See $states defined up above . . .
64 POE::Session->create( object_states => [ $self => $states, ], );
65
66 return $self;
67 }
68
69 ##
70 ## start -- Startup state
71 ##
72 sub start {
73 my( $self, $kernel, $heap, $session, $sender ) =
74 @_[ OBJECT, KERNEL, HEAP, SESSION, SENDER ];
75
76 ## Pipe up if we're debugging
77 print STDERR "## ", __PACKAGE__, "::start\r\n" if $self->{Debug};
78
79 ## Set the alias requested so we can be post'd to
80 $kernel->alias_set( $self->{Alias} );
81
82 ## Remember session that created us for posting DispatchEvent
83 $self->{ _target } = $sender;
84
85 $heap->{state}{InputBuffer} = '';
86 $heap->{state}{Startup} = 1;
87 $heap->{state}{Caption} = $self->{Caption};
88
89 # initially call worker-state
90 $kernel->post($session, "pollForKey");
91
92 return;
93 }
94
95 ##
96 ## stop -- Shutdown state
97 ##
98 sub stop {
99 my( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ];
100
101 ## Just pipe up if we're debugging
102 print STDERR "## ", __PACKAGE__, "::stop\r\n" if $self->{_debug};
103
104 return
105 }
106
107 ##
108 ## signal -- Handle any signals received
109 ##
110 sub signal {
111 my( $self, $heap, $signal ) = @_[ OBJECT, HEAP, ARG0 ];
112
113 ## Just pipe up if we're debugging
114 print STDERR "## ", __PACKAGE__, "::signal $signal\n" if $self->{_debug};
115
116 ## shut things down on TERM, QUIT, or INT
117 if( $signal =~ /^TERM|QUIT|INT/ ) {
118 delete $heap->{wheel}; # toss our listening wheel reference
119
120 ## Check for child wheels
121 my $live_wheels = scalar keys %{$heap->{wheels}};
122 if( $live_wheels ) {
123 print STDERR "Exiting with $live_wheels clients still active\n"
124 if $self->{_debug};
125 delete $heap->{wheels};
126 }
127 }
128
129 return
130 }
131
132 ##
133 ## default -- Catch any unhandled events for debugging
134 ##
135 sub default {
136 my( $self, $heap, $event ) = @_[ OBJECT, HEAP, ARG0 ];
137
138 ## Just pipe up if we're debugging
139 print STDERR "## ", __PACKAGE__, "::default got $event\n"
140 if $self->{_debug};
141
142 return
143 }
144
145
146
147
148
149
150
151 # ================ POE stuff
152
153 sub pollForKey {
154
155 my ($self, $kernel, $heap, $session) = @_[OBJECT, KERNEL, HEAP, SESSION ];
156
157 my $prompt_inlay = $heap->{state}{PromptInlay};
158 if ($prompt_inlay) { $prompt_inlay .= ' '; } else { $prompt_inlay = ''; }
159
160 my $prompt = "#> ";
161 $prompt = $self->{PromptPrefix} . ' ' . $prompt_inlay . $self->{PromptPostfix};
162
163 if ( ($heap->{state}{KeyPressed} && !$heap->{state}{RequestPending}) || ($heap->{state}{Startup}) ) {
164 $heap->{state}{Startup} = 0;
165 $heap->{state}{KeyPressed} = 0;
166 #ReadMode 4; # Turn off controls keys
167 #ReadMode 1;
168 #print $prompt;
169 my $outputline = $prompt . $heap->{state}{InputBuffer};
170 my $s = ' ' x (length($outputline) + 1);
171 print "\r", $s;
172 print "\r", $outputline;
173 }
174
175 my $key = ReadKey(-1);
176 if ($key) {
177
178 $heap->{state}{KeyPressed} = 1;
179
180 # normal key?
181 if ($key =~ m/[a-zA-Z? ]/) {
182 $heap->{state}{InputBuffer} .= $key;
183 #print $key;
184 }
185
186 # enter pressed?
187 if ($key eq "\r") {
188 # send command
189 my $buf = $heap->{state}{InputBuffer};
190 if ($buf) {
191 $heap->{state}{RequestPending} = 1;
192 #print "ord: ", ord($buf), "\n";
193 my $response_target = {
194 ResponseSession => $self->{ResponseSession},
195 ResponseState => $self->{ResponseState},
196 };
197 $kernel->post( $self->{RequestSession} => $self->{RequestState} => $buf, $response_target);
198 }
199 $heap->{state}{InputBuffer} = '';
200
201 # prepare new loop for fresh prompt
202 print "\n";
203 }
204
205 # backspace pressed?
206 if (ord($key) == 8) {
207 $heap->{state}{InputBuffer} = substr($heap->{state}{InputBuffer}, 0, -1);
208 }
209
210 }
211
212
213 $kernel->post($session, "pollForKey");
214 #$kernel->delay("term_work", 0.1);
215
216 }
217
218
219
220
221 sub recieveResponse {
222 my ($kernel, $heap, $session, $response) = @_[KERNEL, HEAP, SESSION, ARG0];
223 if ($response) { print $response, "\n"; }
224 $heap->{state}{RequestPending} = 0;
225 }
226 sub recievePrompt {
227 my ($kernel, $heap, $session, $prompt_inlay) = @_[KERNEL, HEAP, SESSION, ARG0];
228 $heap->{state}{PromptInlay} = $prompt_inlay;
229 }
230
231
232 1;

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed