]> www.fi.muni.cz Git - evince.git/blob - pdf/xpdf/GnomeVFSStream.cc
new class, just what the name says, uses GnomeVFSStream for loading
[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   gnome_vfs_tell(handle, &offsetReturn);
51   savePos = (Guint)offsetReturn;
52   saved = gTrue;
53   gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, start);
54   bufPtr = bufEnd = buf;
55   bufPos = start;
56 #ifndef NO_DECRYPTION
57   if (decrypt)
58     decrypt->reset();
59 #endif
60 }
61
62 void GnomeVFSStream::close() {
63   if (saved) {
64     gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, savePos);
65     saved = gFalse;
66   }
67 }
68
69 GBool GnomeVFSStream::fillBuf() {
70   int n;
71   GnomeVFSFileSize bytesRead;
72 #ifndef NO_DECRYPTION
73   char *p;
74 #endif
75
76   bufPos += bufEnd - buf;
77   bufPtr = bufEnd = buf;
78   if (limited && bufPos >= start + length) {
79     return gFalse;
80   }
81   if (limited && bufPos + gnomeVFSStreamBufSize > start + length) {
82     n = start + length - bufPos;
83   } else {
84     n = gnomeVFSStreamBufSize;
85   }
86   gnome_vfs_read(handle, buf, n, &bytesRead);
87   bufEnd = buf + bytesRead;
88   if (bufPtr >= bufEnd) {
89     return gFalse;
90   }
91 #ifndef NO_DECRYPTION
92   if (decrypt) {
93     for (p = buf; p < bufEnd; ++p) {
94       *p = (char)decrypt->decryptByte((Guchar)*p);
95     }
96   }
97 #endif
98   return gTrue;
99 }
100
101 void GnomeVFSStream::setPos(Guint pos, int dir) {
102   Guint size;
103
104   if (dir >= 0) {
105     gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, pos);
106     bufPos = pos;
107   } else {
108     GnomeVFSFileSize offsetReturn;
109     gnome_vfs_seek(handle, GNOME_VFS_SEEK_END, 0);
110     gnome_vfs_tell(handle, &offsetReturn);
111     size = (Guint)offsetReturn;
112     if (pos > size)
113       pos = (Guint)size;
114     gnome_vfs_seek(handle, GNOME_VFS_SEEK_END, -(int)pos);
115     gnome_vfs_tell(handle, &offsetReturn);
116     bufPos = (Guint)offsetReturn;
117   }
118   bufPtr = bufEnd = buf;
119 }
120
121 void GnomeVFSStream::moveStart(int delta) {
122   start += delta;
123   bufPtr = bufEnd = buf;
124   bufPos = start;
125 }