3 require 5.002; # becase we use prototypes
\r
7 use IO::Socket::INET;
\r
11 use VNC::ServerConnection;
\r
12 use vars qw(@ISA @EXPORT_OK);
\r
14 @ISA = qw(Exporter);
\r
24 bless ($self, $class);
\r
26 # Get the port number
\r
27 my $port = $args{Port} ||= 0 ;
\r
28 # Port number less than 100 is treated as display number
\r
29 if ($port < 100 ) {$port += 5900;}
\r
30 $self->{PORT} = $port ;
\r
32 # Get the idle Interval
\r
33 $self->{IDLE_INTERVAL} = $args{Idle} || 1 ;
\r
34 $self->{IdleHandler} = $args{IdleHandler};
\r
35 $self->{KeyEventHandler} = $args{KeyEventHandler};
\r
36 $self->{PointerEventHandler} = $args{PointerEventHandler};
\r
37 $self->{CutTextHandler} = $args{CutTextHandler};
\r
38 $self->{UpdateDisplayHandler} = $args{UpdateDisplayHandler};
\r
39 $self->{PixelFormat} = $args{PixelFormat};
\r
40 $self->{Caption} = $args{Caption};
\r
41 $self->{Width} = $args{Width};
\r
42 $self->{Height} = $args{Height};
\r
43 $self->{ClientConnectHandler} = $args{ClientConnectHandler};
\r
44 $self->{ClientDisconnectHandler} = $args{ClientDisconnectHandler};
\r
45 $self->{Password} = $args{Password};
\r
50 sub update_all_displays {
\r
53 my $vncref = $self->{VNC_CONNECTIONS} ;
\r
54 my %vncs = %{$vncref} ;
\r
56 foreach (values %vncs) {
\r
57 $_->update_display ;
\r
61 sub disconnect_client {
\r
62 my ($self, $vnc, $sock_handle) = @_ ;
\r
64 my $vncref = $self->{VNC_CONNECTIONS} ;
\r
65 my %vncs = %{$vncref} ;
\r
67 my $sel = $self->{SELECTOR};
\r
69 shutdown($sock_handle,2);
\r
71 delete $vncs{$sock_handle};
\r
72 $sel->remove($sock_handle) ;
\r
74 $sock_handle = undef ;
\r
76 print "Client Disconnectd\n";
\r
79 sub vnc_server_loop {
\r
82 my $listen_sock = new IO::Socket::INET(Listen => 1, LocalPort => $self->{PORT} );
\r
83 my $sel = new IO::Select( $listen_sock );
\r
87 $self->{VNC_CONNECTIONS} = \%vncs;
\r
88 $self->{SELECTOR} = $sel ;
\r
92 if (@ready_handles = $sel->can_read( $self->{IDLE_INTERVAL} ) ) {
\r
93 foreach my $fh (@ready_handles) {
\r
94 if ($fh == $listen_sock) {
\r
95 #accept new connection from client
\r
97 my $client_sock = $listen_sock->accept;
\r
98 $client_sock->blocking(1);
\r
100 my $vnc = new VNC::ServerConnection( Server => $self,
\r
101 Caption => $self->{Caption},
\r
102 Socket => $client_sock,
\r
103 Width => $self->{Width},
\r
104 Height => $self->{Height},
\r
105 Password => $self->{Password},
\r
106 PixelFormat => $self->{PixelFormat},
\r
107 KeyEventHandler => $self->{KeyEventHandler},
\r
108 PointerEventHandler => $self->{PointerEventHandler},
\r
109 CutTextHandler => $self->{CutTextHandler},
\r
110 UpdateDisplayHandler => $self->{UpdateDisplayHandler}
\r
113 print "Accepted new connection from ",$client_sock->sockhost(),"\n" ;
\r
116 my $handler = $self->{ClientConnectHandler};
\r
117 if (defined $handler) {
\r
118 $ok = &$handler($self, $client_sock, $vnc);
\r
122 $sel->add($client_sock);
\r
123 $vnc->start_conversation();
\r
124 $vncs{$client_sock} = $vnc ;
\r
127 shutdown($client_sock,2) ;
\r
128 $client_sock = undef;
\r
131 my $vnc = $vncs{$fh} ;
\r
133 die "Error! got data from un-connected socket" unless (defined $vnc);
\r
135 if (!defined $vnc->handle_client_data()) {
\r
141 my $sub = $self->{IdleHandler};
\r
142 if (defined $sub) {
\r