BEGIN { push @INC, qw(. .. ../lib ../../lib ../../../lib) } package TestObj; use Stream::Streamable; @ISA = qw(Streamable); sub saveToDataStream { my $self = shift; my $dos = shift; $dos->write($self->{'data'}); $dos->writeByte($self->{'byte'}); $dos->writeInt16($self->{'int16'}); $dos->writeInt32($self->{'int32'}); $dos->writeFloat($self->{'float'}); $dos->writeDouble($self->{'double'}); $dos->writeTime($self->{'time'}); $dos->writeString($self->{'string'}); $dos->writeLength($self->{'len1'}); $dos->writeLength($self->{'len2'}); $dos->writeLength($self->{'len3'}); $dos->writeLength($self->{'len4'}); } sub restoreFromDataStream { my $type = shift; my $self = {}; bless $self, $type; my $dis = shift; $self->{'data'} = $dis->read(8); $self->{'byte'} = $dis->readByte(); $self->{'int16'} = $dis->readInt16(); $self->{'int32'} = $dis->readInt32(); $self->{'float'} = $dis->readFloat(); $self->{'double'} = $dis->readDouble(); $self->{'time'} = $dis->readTime(); $self->{'string'} = $dis->readString(); $self->{'len1'} = $dis->readLength(); $self->{'len2'} = $dis->readLength(); $self->{'len3'} = $dis->readLength(); $self->{'len4'} = $dis->readLength(); defined ($self->{'data'}) || return "read data failed"; defined ($self->{'byte'}) || return "read byte failed"; defined ($self->{'int16'}) || return "read int16 failed"; defined ($self->{'int32'}) || return "read int32 failed"; defined ($self->{'float'}) || return "read float failed"; defined ($self->{'double'}) || return "read double failed"; defined ($self->{'time'}) || return "read time failed"; defined ($self->{'string'}) || return "read string failed"; defined ($self->{'len1'}) || return "read len1 failed"; defined ($self->{'len2'}) || return "read len2 failed"; defined ($self->{'len3'}) || return "read len3 failed"; defined ($self->{'len4'}) || return "read len4 failed"; $self; } package main; use Stream::IO; use POSIX; use Carp; my $sos = new StringOutputStream; my $dos = new DataOutputStream $sos; $dos->write("Testing!"); $dos->writeByte(42); $dos->writeInt16(1234); $dos->writeInt32(987654); $dos->writeFloat(1.25); $dos->writeDouble(3.14159262536); $dos->writeTime(1); $dos->writeString("Hello world\n"); $dos->writeLength(0); $dos->writeLength(100); $dos->writeLength(10000); $dos->writeLength(1000000); # print unpack("H*", $sos->data()), "\n"; print "1..19\n"; print "1 ok\n" if (unpack("H*", $sos->data()) eq "54657374696e67212a04d2000f12063fa00000400921fb507a3535000000010c48656c6c6f20776f726c640a0064ce10bd8440"); my $sis = new StringInputStream $sos->data(); my $dis = new DataInputStream $sis; print "2 ok\n" if ($dis->read(8) eq "Testing!"); print "3 ok\n" if ($dis->readByte() == 42); print "4 ok\n" if ($dis->readInt16() == 1234); print "5 ok\n" if ($dis->readInt32() == 987654); print "6 ok\n" if ($dis->readFloat() == 1.25); print "7 ok\n" if ($dis->readDouble() == 3.14159262536); print "8 ok\n" if ($dis->readTime() == 1); print "9 ok\n" if ($dis->readString() eq "Hello world\n"); print "10 ok\n" if ($dis->readLength() == 0); print "11 ok\n" if ($dis->readLength() == 100); print "12 ok\n" if ($dis->readLength() == 10000); print "13 ok\n" if ($dis->readLength() == 1000000); my $obj = restore TestObj $sos->data(); if (ref($obj)) { print "14 ok\n" } else { print "14 not ok\n"; croak("Restore failed - $obj"); } print "15 ok\n" if ($obj->save() eq $sos->data()); my $tmpfile = POSIX::tmpnam(); my $fos = new FileOutputStream $tmpfile; $dos = new DataOutputStream $fos; $obj->saveToDataStream($dos); $fos->close(); # Ensure data has been saved my $fis = new FileInputStream $tmpfile; ref($fis) || croak("Failed to open $tmpfile - $fis"); if ($fis->readAll() eq $obj->save()) { print "16 ok\n"; } else { print "16 not ok\n"; } $fis->seek(0, 0); $dis = new DataInputStream $fis; ref($dis) || croak("Failed to create DataInputStream - $dis"); my $obj2 = restoreFromDataStream TestObj $dis; if (ref($obj2)) { print "17 ok\n" } else { croak("Restore failed - $obj2"); } print "18 ok\n" if ($obj->save() eq $obj2->save()); unlink($tmpfile); # Remove unwanted file $tmpfile = POSIX::tmpnam(); $obj2->saveToFile($tmpfile); my $obj3 = restoreFromFile TestObj $tmpfile; print "19 ok\n" if ($obj2->save() eq $obj3->save()); unlink($tmpfile); # Remove unwanted file