1 /** Wrapper de SDL_RWops
2 * @file JRW.cpp
3 * @author Juan Carlos Seijo P�rez
4 * @date 23/Mar/2005
5 * @version 0.0.1 - 23/Mar/2005 - Primera versi�n.
6 */
7
8 #include <JLib/Util/JRW.h>
9
ZRead(void ** buff)10 u32 JRW::ZRead(void **buff)
11 {
12 u32 len, lenUncomp;
13
14 // Original & compressed size
15 if (!ReadLE32(&lenUncomp) ||
16 !ReadLE32(&len))
17 {
18 // perror("ZRead - Error 1");
19 return 0;
20 }
21
22 // printf("ZRead: lenUncomp %d, len %d\n", lenUncomp, len);
23
24 u8 *buffComp = new u8[len];
25
26 if (!buffComp)
27 {
28 // perror("ZRead - Error 2");
29 return 0;
30 }
31
32 u8 *buff_out = new u8[lenUncomp];
33
34 if (!buff_out)
35 {
36 // perror("ZRead - Error 3");
37 delete[] buffComp;
38 return 0;
39 }
40
41 if (0 >= SDL_RWread(rwops, buffComp, len, 1))
42 {
43 // perror("ZRead - Error 4");
44 delete[] buffComp;
45 delete[] buff_out;
46 return 0;
47 }
48
49 // For compatibility with zlib
50 unsigned long lenUL, lenUncompUL;
51 lenUncompUL = lenUncomp;
52 lenUL = len;
53
54 if (Z_OK != uncompress((Bytef*)buff_out, (uLongf*)&lenUncompUL, (Bytef*)buffComp, lenUL))
55 {
56 // perror("ZRead - Error 5");
57 delete[] buffComp;
58 delete[] buff_out;
59 return 0;
60 }
61
62 delete[] buffComp;
63 *buff = buff_out;
64
65 // perror("Todo ok");
66
67 return (u32)lenUncompUL;
68 }
69
Import(const char * filename)70 u32 JRW::Import(const char *filename)
71 {
72 JRW f;
73
74 if (!f.Create(filename, "rb"))
75 {
76 return 0;
77 }
78
79 u32 size = f.Seek(0, SEEK_END);
80 f.Seek(0, SEEK_SET);
81
82 u8 *buff = new u8[size];
83
84 if (!buff)
85 {
86 return 0;
87 }
88
89 u32 ret;
90 ret = f.Read(buff, size, 1);
91
92 if (!ret)
93 {
94 delete[] buff;
95 return 0;
96 }
97
98 Create(buff, size);
99
100 return ret;
101 }
102
ZWrite(const void * buff,u32 size,s32 level)103 u32 JRW::ZWrite(const void *buff, u32 size, s32 level)
104 {
105 u32 sizeComp;
106 sizeComp = compressBound(size);
107
108 unsigned char *buffComp = new unsigned char[sizeComp + 8];
109
110 if (!buffComp)
111 {
112 return 0;
113 }
114
115 // For compatibility with zlib
116 unsigned long sizeCompUL, sizeUL;
117 sizeCompUL = sizeComp;
118 sizeUL = size;
119
120 if (Z_OK != compress2((Bytef*)buffComp, (uLongf*)&sizeComp, (Bytef*)buff, size, level))
121 {
122 delete[] buffComp;
123 return 0;
124 }
125
126 sizeComp = (u32)sizeCompUL;
127
128 // Tama�o original + Tama�o comprimido + datos comprimidos
129 if (0 == WriteLE32(&size) || 0 == WriteLE32(&sizeComp) ||
130 SDL_RWwrite(rwops, buffComp, sizeComp, 1) <= 0)
131 {
132 delete[] buffComp;
133 return 0;
134 }
135
136 delete[] buffComp;
137
138 return sizeComp;
139 }
140
Export(const char * filename,u32 size)141 u32 JRW::Export(const char *filename, u32 size)
142 {
143 JRW f;
144
145 if (!f.Create(filename, "wb"))
146 {
147 return 0;
148 }
149
150 u8 *buff = new u8[size];
151
152 if (!buff)
153 {
154 return 0;
155 }
156
157 u32 ret;
158 ret = Read(buff, size, 1);
159
160 if (!ret)
161 {
162 delete[] buff;
163 return 0;
164 }
165
166 ret = f.Write(buff, size, 1);
167 delete[] buff;
168
169 return ret;
170 }
171