1 //========================================================================
5 // Copyright 1996-2002 Glyph & Cog, LLC
6 // Copyright 2003 Martin Kretzschmar
8 //========================================================================
11 #pragma implementation
17 #include "GnomeVFSStream.h"
18 #include "gpdf-g-switch.h"
19 # include <libgnomevfs/gnome-vfs.h>
20 #include "gpdf-g-switch.h"
26 GnomeVFSStream::GnomeVFSStream(GnomeVFSHandle *handleA, Guint startA,
27 GBool limitedA, Guint lengthA, Object *dictA):
33 bufPtr = bufEnd = buf;
39 GnomeVFSStream::~GnomeVFSStream() {
43 Stream *GnomeVFSStream::makeSubStream(Guint startA, GBool limitedA,
44 Guint lengthA, Object *dictA) {
45 return new GnomeVFSStream(handle, startA, limitedA, lengthA, dictA);
48 void GnomeVFSStream::reset() {
49 GnomeVFSFileSize offsetReturn;
50 if (gnome_vfs_tell(handle, &offsetReturn) == GNOME_VFS_OK) {
51 savePos = (Guint)offsetReturn;
54 gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, start);
55 bufPtr = bufEnd = buf;
63 void GnomeVFSStream::close() {
65 gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, savePos);
70 GBool GnomeVFSStream::fillBuf() {
72 GnomeVFSFileSize bytesRead;
77 bufPos += bufEnd - buf;
78 bufPtr = bufEnd = buf;
79 if (limited && bufPos >= start + length) {
82 if (limited && bufPos + gnomeVFSStreamBufSize > start + length) {
83 n = start + length - bufPos;
85 n = gnomeVFSStreamBufSize;
87 if (gnome_vfs_read(handle, buf, n, &bytesRead) != GNOME_VFS_OK) {
90 bufEnd = buf + bytesRead;
91 if (bufPtr >= bufEnd) {
96 for (p = buf; p < bufEnd; ++p) {
97 *p = (char)decrypt->decryptByte((Guchar)*p);
104 void GnomeVFSStream::setPos(Guint pos, int dir) {
106 if (gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, pos) == GNOME_VFS_OK) {
110 GnomeVFSFileSize offsetReturn;
111 if (gnome_vfs_seek(handle, GNOME_VFS_SEEK_END, 0) == GNOME_VFS_OK &&
112 gnome_vfs_tell(handle, &offsetReturn) == GNOME_VFS_OK) {
113 bufPos = (Guint)offsetReturn;
116 if (gnome_vfs_seek(handle, GNOME_VFS_SEEK_END, -(int)pos) == GNOME_VFS_OK &&
117 gnome_vfs_tell(handle, &offsetReturn) == GNOME_VFS_OK) {
118 bufPos = (Guint)offsetReturn;
122 bufPtr = bufEnd = buf;
125 void GnomeVFSStream::moveStart(int delta) {
127 bufPtr = bufEnd = buf;