1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import errno
23
24 from twisted.internet import defer
25
26 from flumotion.common import log
27
28 from flumotion.component.misc.httpserver import fileprovider
29 from flumotion.component.misc.httpserver import cachestats
30
31 LOG_CATEGORY = "resource-manager"
32
33
34 errnoLookup = {errno.ENOENT: fileprovider.NotFoundError,
35 errno.EISDIR: fileprovider.CannotOpenError,
36 errno.EACCES: fileprovider.AccessError}
37
38
40 """
41 Base class for all resources data source.
42 """
43
44 url = None
45 identifier = None
46 mimeType = None
47 mtime = None
48 size = None
49
50 - def read(self, offset, size):
51 raise NotImplementedError()
52
54 raise NotImplementedError()
55
56
80
81
83 """
84 Offers a file-like interface of a data source.
85 Handle errors and asynchronous readings and file offset.
86 """
87
93
96
98 return self._source.mtime
99
101 return self._source.size
102
105
106 - def seek(self, offset):
107 self._check()
108 self._offset = offset
109
110 - def read(self, size):
125
126 - def produce(self, consumer, fromOffset=None):
127 """
128 Returns a producer that produce data from the specified position
129 or from the current position if None is specified.
130 Can return None if a producer cannot be provided or is not convenient.
131 """
132 self._check()
133 return self._source.produce(consumer, fromOffset or self._offset)
134
136 self._check()
137 self._source.close()
138 self._source = None
139
142
143
144
148
149 - def _open(self, source):
152
153
154
156 self._reading = False
157 self._offset += len(data)
158 return data
159