implement CREDIT and COPY
[safeq] / terminal-server.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use Data::Dump qw(dump);
6
7 use IO::Socket::INET;
8
9 $| = 1;
10
11 my $socket = IO::Socket::INET->new(
12         LocalPort => 4096,
13         Proto => 'tcp',
14         Listen => 5,
15         Reuse => 1
16 ) or die "ERROR: $!";
17
18 print "$0 waiting for client connection on port 4096\n";
19
20 my $prices = {
21         A3 => 0.3, # FIXME
22         A4 => 0.2,
23         BW => 0.0, # just paper cost
24         COLOR => 3.99, # FIXME
25         DUPLEX => -0.05,
26 };
27
28 while(1) {
29         our $client_socket = $socket->accept();
30
31         sub client_send {
32                 my $text = join('', @_);
33                 warn ">> $text\n";
34                 print $client_socket "$text\r\n";
35         }
36
37         sub client_line {
38                 my $line = <$client_socket>;
39                 $line =~ s/[\r\n]+$//;
40                 warn "<< $line\n";
41                 return $line;
42         }
43
44         # get the host and port number of newly connected client.
45         my $peer_address = $client_socket->peerhost();
46         my $peer_port = $client_socket->peerport();
47
48         print "Connection from: $peer_address:$peer_port\n";
49
50         my $credit = 3.30;
51         my $total_charged = 0.00;
52         my $total_pages   = 0;
53         sub credit {
54                 my $v = shift || $credit;
55                 return sprintf "%1.2f kn", $v;
56         }
57
58         while ($client_socket->connected) {
59
60                 my $line = client_line;
61
62                 if ( $line =~ m/^\.SQ ([\d\.]+) (\S+)/ ) {
63                         my ($version,$serial) = ($1,$2);
64                         client_send  ".SQ OK";
65                         #client_send  ".SQ FAILED message";
66                 } elsif ( $line =~ m/^\.CFG/ ) {
67                         client_send  ".CFG OK %s";
68                 } elsif ( $line =~ m/\.SERVER LIST/ ) {
69                         client_send  ".ERROR NO-ENTERPRISE";
70                 } elsif ( $line =~ m/\.CARD (\S+)/ ) {
71                         my ($rfid_sid) = $1;
72                         client_send  ".CARD OK Ime Prezime (nobody\@example.com)";
73                 } elsif ( $line =~ m/\.ACTION$/ ) {
74                         client_send  ".ACTION CMENUS0"; # FIXME can be CMENUS2
75
76                 } elsif ( $line =~ m/\.ACTION COPY/ ) {
77                         client_send  ".ACTION COPY";    # safeq sends this twice
78                         client_send  ".COPY Mozete kopirati |".credit;
79                         client_send  ".NOP";
80                         client_send  ".CREDIT ".credit;
81                 } elsif ( $line =~ m/\.COPY (.+)/ ) {
82                         # FIXME
83                         my $charge = 0;
84                         foreach ( split(/,/,$1) ) {
85                                 die "can't find [$_] in prices=",dump($prices) unless exists $prices->{$_};
86                                 $charge += $prices->{$_};
87                         }
88                         warn "CHARGE: $charge\n";
89                         $credit        -= $charge;
90                         $total_charged += $charge;
91                         $total_pages++;
92                         client_send ".CREDIT ".credit;
93                         client_send ".COPY 1"; # I verified that you are allowed to copy 1 page?
94                         client_send ".NOP";
95
96                 } elsif ( $line =~ m/\.ACTION LIST/ ) {
97                         # FIXME
98
99                 } elsif ( $line =~ m/\.ACTION PRINT ALL/ ) {
100                         # FIXME
101
102                 } elsif ( $line =~ m/(\.NOP)/ ) {
103                         client_send  "$1";
104                 } elsif ( $line =~ m/^\.END/ ) {
105                         client_send  ".DONE BLK WAIT";
106                         client_send  ".NOP";
107                         my $nop = client_line;
108                         client_send "DONE $total_pages ".credit($total_charged);
109                         warn "expected NOP got: $nop" unless $nop =~ m/NOP/;
110                         my $null = client_line;
111                         $client_socket->close;
112                 } else {
113                         warn "UNKNOWN: ",dump($line);
114                         print "Response>";
115                         my $r = <STDIN>;
116                         chomp $r;
117                         client_send $r;
118                 }
119         }
120         warn "# return to accept";
121 }
122
123 $socket->close();
124
125