4
4
#include <junzip.h>
5
5
#include <zlib.h>
6
6
7
+ #ifdef LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP
8
+ #define USE_NEW_FOPS 1
9
+ #else
10
+ #define USE_NEW_FOPS 0
11
+ #endif
12
+
7
13
struct junzip_mem_handle {
8
14
JZFile handle ;
9
15
int fd ;
@@ -17,11 +23,16 @@ struct open_mem_file {
17
23
long length ;
18
24
long position ;
19
25
};
26
+ #if USE_NEW_FOPS
27
+ #define lws_filefd_to_mem_file (FD ) \
28
+ ((struct open_mem_file*) (FD)->filesystem_priv)
29
+ #else
20
30
#define MAX_OPEN_MEM_FILES 32
21
31
struct open_mem_file open_mem_files [MAX_OPEN_MEM_FILES ];
22
32
#define lws_filefd_to_mem_file (FD ) \
23
33
((FD) >= 1000 ? &open_mem_files[(FD)-1000] : NULL)
24
34
#define mem_file_to_lws_filefd (MEM ) (((MEM)-&open_mem_files[0])+1000)
35
+ #endif
25
36
26
37
struct lws_plat_file_ops fops_plat ;
27
38
@@ -55,17 +66,21 @@ static int zipRecordCallback(JZFile *zip, int idx, JZFileHeader *header) {
55
66
56
67
static char domterm_resource_prefix [] = "domterm:/" ;
57
68
69
+ #if USE_NEW_FOPS
70
+ static lws_fop_fd_t
71
+ domserver_fops_open (struct lws_plat_file_ops * fops ,
72
+ const char * filename ,
73
+ lws_filepos_t * filelen , lws_fop_flags_t * flags )
74
+ #else
58
75
static lws_filefd_type
59
76
domserver_fops_open (struct lws * wsi , const char * filename ,
60
- unsigned long * filelen ,
61
- #ifdef LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP
62
- int * flags
63
- #else
64
- int flags
77
+ unsigned long * filelen , int flags )
65
78
#endif
66
- )
67
79
{
68
80
lws_filefd_type n ;
81
+ #if USE_NEW_FOPS
82
+ lws_fop_fd_t fop_fd ;
83
+ #endif
69
84
if (strncmp (filename , domterm_resource_prefix ,
70
85
sizeof (domterm_resource_prefix )- 1 ) == 0 ) {
71
86
JZFile * zip = & junzip_handler .handle ;
@@ -78,8 +93,14 @@ domserver_fops_open(struct lws *wsi, const char *filename,
78
93
&& memcmp (entry_name , zip -> start + entry -> fileNameStart ,
79
94
fnlength ) == 0 ) {
80
95
uint32_t uncompressedSize = entry -> uncompressedSize ;
81
- int j = MAX_OPEN_MEM_FILES ;
82
96
struct open_mem_file * mem ;
97
+ #if USE_NEW_FOPS
98
+ fop_fd = xmalloc (sizeof (* fop_fd )+ sizeof (struct open_mem_file ));
99
+ mem = (struct open_mem_file * ) (fop_fd + 1 );
100
+ fop_fd -> filesystem_priv = mem ;
101
+ fop_fd -> fops = fops ;
102
+ #else
103
+ int j = MAX_OPEN_MEM_FILES ;
83
104
for (;;) {
84
105
if (-- j == 0 ) {
85
106
errno = EMFILE ;
@@ -89,6 +110,7 @@ domserver_fops_open(struct lws *wsi, const char *filename,
89
110
if (mem -> handle == NULL )
90
111
break ;
91
112
}
113
+ #endif
92
114
mem -> handle = & junzip_handler ;
93
115
mem -> index = i ;
94
116
mem -> position = 0 ;
@@ -113,10 +135,10 @@ domserver_fops_open(struct lws *wsi, const char *filename,
113
135
for (int k = 4 ; -- k >= 0 ; ) * ptr ++ = 0 ; // MTIME = 0
114
136
* ptr ++ = 0 ; // Extra Flags. should get from generalPurposeBitFlag
115
137
* ptr ++ = 3 ; // OS=Unix. Could use versionMadeBy
116
- memcpy (ptr , junzip_handler . start + offset , compressedSize );
138
+ memcpy (ptr , zip -> start + offset , compressedSize );
117
139
ptr += compressedSize ;
118
140
// write 8-byte footer
119
- uint32_t val = entry -> info . crc32 ;
141
+ uint32_t val = entry -> crc32 ;
120
142
for (int k = 4 ; -- k >= 0 ; ) {
121
143
* ptr ++ = val & 0xFF ; val >>= 8 ;
122
144
}
@@ -136,24 +158,44 @@ domserver_fops_open(struct lws *wsi, const char *filename,
136
158
entry , data ) != Z_OK ) {
137
159
fprintf (stderr , "Couldn't read file data!" );
138
160
free (data );
139
- return -1 ;
161
+ #if USE_NEW_FOPS
162
+ return NULL ;
163
+ #else
164
+ return LWS_INVALID_FILE ;
165
+ #endif
140
166
}
141
167
}
142
168
mem -> length = rsize ;
143
169
* filelen = rsize ;
170
+ #if USE_NEW_FOPS
171
+ return fop_fd ;
172
+ #else
144
173
return mem_file_to_lws_filefd (mem );
174
+ #endif
145
175
}
146
176
}
147
177
errno = EMFILE ;
178
+ #if USE_NEW_FOPS
179
+ return NULL ;
180
+ #else
148
181
return LWS_INVALID_FILE ;
182
+ #endif
149
183
}
150
184
151
185
/* call through to original platform implementation */
152
- return fops_plat .open (wsi , filename , filelen , flags );
186
+ #if USE_NEW_FOPS
187
+ return fops_plat .open (fops , filename , filelen , flags );
188
+ #else
189
+ return fops_plat .open (wsi , filename , filelen , flags );
190
+ #endif
153
191
}
154
192
155
193
static int
194
+ #if USE_NEW_FOPS
195
+ domserver_fops_close (lws_fop_fd_t fd )
196
+ #else
156
197
domserver_fops_close (struct lws * wsi , lws_filefd_type fd )
198
+ #endif
157
199
{
158
200
struct open_mem_file * mem = lws_filefd_to_mem_file (fd );
159
201
if (mem != NULL ) {
@@ -164,39 +206,62 @@ domserver_fops_close(struct lws *wsi, lws_filefd_type fd)
164
206
mem -> index = 0 ;
165
207
return 0 ;
166
208
}
209
+ #if USE_NEW_FOPS
210
+ return fops_plat .close (fd );
211
+ #else
167
212
return fops_plat .close (wsi , fd );
213
+ #endif
168
214
}
169
215
216
+ #if USE_NEW_FOPS
217
+ static lws_fileofs_t
218
+ domserver_fops_seek_cur (lws_fop_fd_t fd ,
219
+ lws_fileofs_t offset_from_cur_pos )
220
+ #else
170
221
static unsigned long
171
222
domserver_fops_seek_cur (struct lws * wsi , lws_filefd_type fd ,
172
223
long offset_from_cur_pos )
224
+ #endif
173
225
{
174
226
struct open_mem_file * mem = lws_filefd_to_mem_file (fd );
227
+ #if !USE_NEW_FOPS
175
228
if (mem != NULL ) {
176
- long new_position = mem -> position + offset_from_cur_pos ;
177
- if (new_position < 0 || new_position > mem -> length )
178
- return (off_t ) (-1 );
179
- mem -> position = new_position ;
180
- return new_position ;
229
+ #endif
230
+ long new_position = mem -> position + offset_from_cur_pos ;
231
+ if (new_position < 0 || new_position > mem -> length )
232
+ return (off_t ) (-1 );
233
+ mem -> position = new_position ;
234
+ return new_position ;
235
+ #if !USE_NEW_FOPS
181
236
}
182
237
return fops_plat .seek_cur (wsi , fd , offset_from_cur_pos );
238
+ #endif
183
239
}
184
240
185
241
static int
242
+ #if USE_NEW_FOPS
243
+ domserver_fops_read (lws_fop_fd_t fd , lws_filepos_t * amount ,
244
+ uint8_t * buf , lws_filepos_t len )
245
+ #else
186
246
domserver_fops_read (struct lws * wsi , lws_filefd_type fd , unsigned long * amount ,
187
247
unsigned char * buf , unsigned long len )
248
+ #endif
188
249
{
189
250
struct open_mem_file * mem = lws_filefd_to_mem_file (fd );
251
+ #if !USE_NEW_FOPS
190
252
if (mem != NULL ) {
191
- unsigned long avail = mem -> length - mem -> position ;
192
- if (len > avail )
193
- len = avail ;
194
- memcpy (buf , mem -> data + mem -> position , len );
195
- mem -> position += len ;
196
- * amount = len ;
197
- return 0 ;
253
+ #endif
254
+ unsigned long avail = mem -> length - mem -> position ;
255
+ if (len > avail )
256
+ len = avail ;
257
+ memcpy (buf , mem -> data + mem -> position , len );
258
+ mem -> position += len ;
259
+ * amount = len ;
260
+ return 0 ;
261
+ #if !USE_NEW_FOPS
198
262
}
199
263
return fops_plat .read (wsi , fd , amount , buf , len );
264
+ #endif
200
265
}
201
266
202
267
void
0 commit comments