]> www.fi.muni.cz Git - evince.git/blob - pdf/xpdf/GnomeVFSStream.cc
4ff30a5f9616de4b0d967e170184923a7f52c475
[evince.git] / pdf / xpdf / GnomeVFSStream.cc
1 //========================================================================
2 //
3 // GnomeVFSStream.cc
4 //
5 // Copyright 1996-2002 Glyph & Cog, LLC
6 // Copyright 2003 Martin Kretzschmar
7 //
8 //========================================================================
9
10 #ifdef __GNUC__
11 #pragma implementation
12 #endif
13
14 #include <aconf.h>
15 #include "config.h"
16
17 #include "GnomeVFSStream.h"
18 #include "gpdf-g-switch.h"
19 #  include <libgnomevfs/gnome-vfs.h>
20 #include "gpdf-g-switch.h"
21
22 #ifndef NO_DECRYPTION
23 #include "Decrypt.h"
24 #endif
25
26 GnomeVFSStream::GnomeVFSStream(GnomeVFSHandle *handleA, Guint startA,
27                                GBool limitedA, Guint lengthA, Object *dictA):
28   BaseStream(dictA) {
29   handle = handleA;
30   start = startA;
31   limited = limitedA;
32   length = lengthA;
33   bufPtr = bufEnd = buf;
34   bufPos = start;
35   savePos = 0;
36   saved = gFalse;
37 }
38
39 GnomeVFSStream::~GnomeVFSStream() {
40   close();
41 }
42
43 Stream *GnomeVFSStream::makeSubStream(Guint startA, GBool limitedA,
44                                       Guint lengthA, Object *dictA) {
45   return new GnomeVFSStream(handle, startA, limitedA, lengthA, dictA);
46 }
47
48 void GnomeVFSStream::reset() {
49   GnomeVFSFileSize offsetReturn;
50   if (gnome_vfs_tell(handle, &offsetReturn) == GNOME_VFS_OK) {
51     savePos = (Guint)offsetReturn;
52     saved = gTrue;
53   }
54   gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, start);
55   bufPtr = bufEnd = buf;
56   bufPos = start;
57 #ifndef NO_DECRYPTION
58   if (decrypt)
59     decrypt->reset();
60 #endif
61 }
62
63 void GnomeVFSStream::close() {
64   if (saved) {
65     gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, savePos);
66     saved = gFalse;
67   }
68 }
69
70 GBool GnomeVFSStream::fillBuf() {
71   int n;
72   GnomeVFSFileSize bytesRead;
73 #ifndef NO_DECRYPTION
74   char *p;
75 #endif
76
77   bufPos += bufEnd - buf;
78   bufPtr = bufEnd = buf;
79   if (limited && bufPos >= start + length) {
80     return gFalse;
81   }
82   if (limited && bufPos + gnomeVFSStreamBufSize > start + length) {
83     n = start + length - bufPos;
84   } else {
85     n = gnomeVFSStreamBufSize;
86   }
87   if (gnome_vfs_read(handle, buf, n, &bytesRead) != GNOME_VFS_OK) {
88     return gFalse;
89   }
90   bufEnd = buf + bytesRead;
91   if (bufPtr >= bufEnd) {
92     return gFalse;
93   }
94 #ifndef NO_DECRYPTION
95   if (decrypt) {
96     for (p = buf; p < bufEnd; ++p) {
97       *p = (char)decrypt->decryptByte((Guchar)*p);
98     }
99   }
100 #endif
101   return gTrue;
102 }
103
104 void GnomeVFSStream::setPos(Guint pos, int dir) {
105   if (dir >= 0) {
106     if (gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, pos) == GNOME_VFS_OK) {
107       bufPos = pos;
108     }
109   } else {
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;
114       if (pos > bufPos)
115         pos = (Guint)bufPos;
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;
119       }
120     }
121   }
122   bufPtr = bufEnd = buf;
123 }
124
125 void GnomeVFSStream::moveStart(int delta) {
126   start += delta;
127   bufPtr = bufEnd = buf;
128   bufPos = start;
129 }