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