996
|
1 package Language::INTERCAL::GenericIO::TCP;
|
|
2
|
|
3 # Write/read data from/to TCP socket
|
|
4
|
|
5 # This file is part of CLC-INTERCAL
|
|
6
|
|
7 # Copyright (c) 2007-2008 Claudio Calvelli, all rights reserved.
|
|
8
|
|
9 # CLC-INTERCAL is copyrighted software. However, permission to use, modify,
|
|
10 # and distribute it is granted provided that the conditions set out in the
|
|
11 # licence agreement are met. See files README and COPYING in the distribution.
|
|
12
|
|
13 use strict;
|
|
14 use vars qw($VERSION $PERVERSION);
|
|
15 ($VERSION) = ($PERVERSION = "CLC-INTERCAL/Base INTERCAL/GenericIO/TCP.pm 1.-94.-2") =~ /\s(\S+)$/;
|
|
16
|
|
17 use Carp;
|
|
18 use Language::INTERCAL::Exporter '1.-94.-2';
|
|
19 use Language::INTERCAL::Splats '1.-94.-2', qw(:SP);
|
|
20 use Language::INTERCAL::GenericIO '1.-94.-2';
|
|
21 use vars qw(@ISA);
|
|
22 @ISA = qw(Language::INTERCAL::GenericIO);
|
|
23
|
|
24 sub _new {
|
|
25 @_ == 4 or croak
|
|
26 "Usage: new Language::INTERCAL::GenericIO::TCP(MODE, ADDR, SERVER)";
|
|
27 my ($object, $mode, $data, $server) = @_;
|
|
28 $data =~ s/:(\w+)$//
|
|
29 or croak "DATA must be host:port when TYPE is $object->{type}";
|
|
30 my $port = $1;
|
|
31 my $host = $data;
|
|
32 my $id = $server->tcp_socket($data, $port);
|
|
33 $object->{filedata} = {
|
|
34 server => $server,
|
|
35 id => $id,
|
|
36 host => $host,
|
|
37 port => $port,
|
|
38 progress => 1,
|
|
39 };
|
|
40 }
|
|
41
|
|
42 sub is_terminal { 0 }
|
|
43
|
|
44 sub read_binary {
|
|
45 @_ == 2 or croak "Usage: IO->read_binary(DATA)";
|
|
46 my ($object, $string) = @_;
|
|
47 my $server = $object->{filedata}{server};
|
|
48 my $id = $object->{filedata}{id};
|
|
49 $server->read_binary($id, $string);
|
|
50 }
|
|
51
|
|
52 sub _write_code {
|
|
53 my ($object, $size) = @_;
|
|
54 my $server = $object->{filedata}{server};
|
|
55 my $id = $object->{filedata}{id};
|
|
56 my $progress = $object->{filedata}{progress};
|
|
57 $server->write_binary($id, $size, $progress);
|
|
58 }
|
|
59
|
|
60 sub _write_text_code {
|
|
61 my ($object, $newline) = @_;
|
|
62 my $index = index($object->{buffer}, $newline);
|
|
63 while ($index < 0) {
|
|
64 my $data = $object->_write_code(1);
|
|
65 if ($data ne '') {
|
|
66 $object->{buffer} .= $data;
|
|
67 $index = index($object->{buffer}, $newline);
|
|
68 } else {
|
|
69 $index = length($object->{buffer});
|
|
70 last;
|
|
71 }
|
|
72 }
|
|
73 substr($object->{buffer}, 0, $index, '');
|
|
74 }
|
|
75
|
|
76 sub DESTROY {
|
|
77 my ($object) = @_;
|
|
78 my $server = $object->{filedata}{server};
|
|
79 my $id = $object->{filedata}{id};
|
|
80 $server and eval { $server->tcp_socket_close($id); };
|
|
81 }
|
|
82
|
|
83 sub describe {
|
|
84 @_ == 1 or croak "Usage: IO->describe";
|
|
85 my ($object) = @_;
|
|
86 my $host = $object->{filedata}{host};
|
|
87 my $port = $object->{filedata}{port};
|
|
88 my $type = $object->{type};
|
|
89 return "$type($host:$port)";
|
|
90 }
|
|
91
|
|
92 1;
|