Documentation | SupportKit | PositionIO
SYNOPSIS
Perl
use HaikuR1::PositionIO; # define MyPositionIO subclass here my $reader = MyPositionIO->new(); my $chunk = $reader->ReadAt($position, $length); my $writer = MyPositionIO->new(); my $length_written = $writer->WriteAt($position, $chunk);
Python
from HaikuR1.SupportKit import PositionIO # define MyPositionIO subclass here reader = MyPositionIO() chunk = reader.ReadAt(position, length) writer = MyPositionIO() length_written = writer.WriteAt(position, chunk)
DESCRIPTION
Exposes the BPositionIO object.
For more information on PositionIO, see the Be Book class description, the Be Book overview, and the Haiku Book class description.
NATIVE OBJECTS
As a convenience, you can substitute a native IO object or a
native string in place of a PositionIO;
internally it will be wrapped in a C++ object. The C++ wrapper implements
ReadAt using Seek and Read, and implements WriteAt is using Seek
and Write. See below for language-specific counterparts of the other
methods.
If you are using a custom object instead of a standard native object, the
methods in your object should have the same parameters and returns as standard
native IO objects. A custom object only needs to provide the methods that the
function calling the hook actually uses; if you are calling a function that
only calls the C++ Read hook, for example, you only need to provide the
counterpart of the Read method in your custom object.
Perl
If you use an IO object, any IO::Handle subclass will work, including any
  handle returned by open. Custom objects should implement the following
  methods:
- Read=>- read
- Write=>- print
- Seek=>- seek
- Position=>- tell
- Flush=>- flush
If you use a string, you must pass a reference to the string as the
  parameter, not the string itself. The wrapper will call the standard
  IO::Handle functions on it, as if you had called open on the string
  reference and passed the resulting handle.
Python
If you use an IO object, io.FileIO or io.BytesIO will work. Custom
  objects should implement the following methods:
- Read=>- read
- Write=>- write
- Seek=>- seek
- Position=>- tell
- Flush=>- flush
If you use a string, keep in mind that since Python strings are immutable,
  this does not work if the function is going to write to the DataIO. The glue
  code converts the string to an io.BufferedRandom object, which means the
  internal wrapper will happily write to that object (and not raise an
  exception), but you will not have any way to access the new value.
METHODS
Constructor
Creates a PositionIO object.
Perl
HaikuR1::PositionIO->new();
Python
PositionIO()
Position
Gets the read/write position. PositionIO does not provide a default version.
Perl
$positionio->Position();
Python
positionio.Position()
ReadAt
ReadAtExactly
Reads the given number of bytes from the given position in the source. Returns
the string of bytes or signals an error. PositionIO does not provide a default
version. ReadAtExactly signals an error if it is unable to read the given
length, whereas ReadAt may read fewer bytes.
The returned string may contain null bytes.
ReadAt may also be called as a hook in some cicumstances. Additionally,
since ReadAtExactly is internally implemented using ReadAt, calling
ReadAtExactly will result in ReadAt being called as a hook.
Perl
$positionio->ReadAt($position, $size); $positionio->ReadAtExactly($position, $size);
Python
positionio.ReadAt(position, size) positionio.ReadAtExactly(position, size)
- position- An integer, the position to read from. 
- size- An integer, the number of bytes to read. 
Seek
Sets the read/write position to the given value. Returns the new position. PositionIO does not provide a default version.
Perl
$positionio->Seek($position, $seekMode);
Python
positionio.Seek(position, seekMode)
- position- An integer, the new position. 
- seekMode- An integer, the mode. 
Perl
The mode constants SEEK_SET, SEEK_CUR, and SEEK_END are available
  via the Fcntl module.
use Fcntl qw(:seek);
Python
The mode constants are available via the os module.
from os import SEEK_SET, SEEK_CUR, SEEK_END
Size
GetSize
SetSize
Gets or sets the size of the IO source/destination or signals an error. The
default version of GetSize uses Seek and Position to determine the
size. The default version of SetSize signals B_ERROR.
Perl
$positionio->GetSize(); $positionio->SetSize($size);
Python
positionio.GetSize() positionio.SetSize(size)
- size- An integer, the new size. 
WriteAt
WriteAtExactly
Writes the given string of raw bytes from the destination. Returns the number
of bytes written or signals an error. PositionIO does not provide a default
version. WriteAtExactly signals an error if it is unable to write the
entire string, whereas WriteAt may write fewer bytes.
WriteAt may also be called as a hook in some cicumstances. Additionally,
since WriteAtExactly is internally implemented using WriteAt, calling
WriteAtExactly will result in WriteAt being called as a hook.
Perl
$positionio->WriteAt($position, $buffer); $positionio->WriteAtExactly($position, $buffer);
Python
positionio.WriteAt(position, buffer) positionio.WriteAtExactly(position, buffer)
- position- An integer, the position to write to. 
- buffer- A string of bytes to write; may contain null bytes. 
DATAIO INTERFACE
PositionIO inherits the methods and hooks of DataIO.
The following differ from the DataIO versions:
Read
The default PositionIO version implements it by calling ReadAt with the
current position.
Write
The default PositionIO version implements it by calling WriteAt with the
current position.