swfmill 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. data/.swfmill +0 -134
  2. data/README.rdoc +28 -8
  3. data/Rakefile +6 -5
  4. data/VERSION +1 -1
  5. data/ext/.gitignore +1 -0
  6. data/ext/buffer.h +95 -0
  7. data/ext/deflate.h +125 -0
  8. data/ext/extconf.rb +77 -43
  9. data/ext/inflate.h +82 -0
  10. data/ext/swfmill/.gitignore +3 -16
  11. data/ext/swfmill/AUTHORS +2 -1
  12. data/ext/swfmill/Makefile.in +2 -1
  13. data/ext/swfmill/NEWS +5 -0
  14. data/ext/swfmill/autogen.sh +7 -1
  15. data/ext/swfmill/configure +361 -275
  16. data/ext/swfmill/configure.ac +28 -20
  17. data/ext/swfmill/src/Makefile.am +93 -20
  18. data/ext/swfmill/src/Makefile.in +454 -170
  19. data/ext/swfmill/src/SWF.h +3 -0
  20. data/ext/swfmill/src/SWFFile.cpp +1 -1
  21. data/ext/swfmill/src/SWFShapeMaker.cpp +4 -3
  22. data/ext/swfmill/src/codegen/basics.xsl +2 -1
  23. data/ext/swfmill/src/codegen/header.xsl +3 -0
  24. data/ext/swfmill/src/codegen/parsexml.xsl +53 -2
  25. data/ext/swfmill/src/codegen/writexml.xsl +54 -1
  26. data/ext/swfmill/src/swfmill.cpp +52 -35
  27. data/ext/swfmill/src/swft/swft_import_jpeg.cpp +62 -16
  28. data/ext/swfmill/src/xslt/simple-elements.xslt +1 -0
  29. data/ext/swfmill/test/Makefile.in +2 -1
  30. data/ext/swfmill/test/xml/Makefile.in +2 -1
  31. data/ext/swfmill_ext.cc +12 -366
  32. data/ext/swfmill_ext_to_swf.cc +260 -0
  33. data/ext/swfmill_ext_to_swf.h +6 -0
  34. data/ext/swfmill_ext_to_xml.cc +262 -0
  35. data/ext/swfmill_ext_to_xml.h +6 -0
  36. data/ext/test/Makefile +16 -0
  37. data/ext/test/buffer_test.cc +84 -0
  38. data/ext/test/deflate_test.cc +61 -0
  39. data/ext/test/inflate_test.cc +84 -0
  40. data/ext/test/test.dat +0 -0
  41. data/lib/swfmill.rb +14 -23
  42. data/spec/swfmill_spec.rb +0 -123
  43. metadata +28 -17
  44. data/ext/swfmill/src/codegen/Makefile.am +0 -15
  45. data/ext/swfmill/src/codegen/Makefile.in +0 -346
  46. data/ext/swfmill/src/swft/Makefile.am +0 -55
  47. data/ext/swfmill/src/swft/Makefile.in +0 -717
  48. data/ext/swfmill/src/xslt/Makefile.am +0 -51
  49. data/ext/swfmill/src/xslt/Makefile.in +0 -536
  50. data/ext/swfmill/src/xslt/README +0 -19
  51. data/ext/swfmill/src/xslt/simple.cpp +0 -1686
@@ -0,0 +1,6 @@
1
+ #ifndef _SWFMILL_EXT_TO_SWF_H_
2
+ #define _SWFMILL_EXT_TO_SWF_H_
3
+
4
+ VALUE swfmill_ext_to_swf(VALUE, VALUE, VALUE);
5
+
6
+ #endif /* _SWFMILL_EXT_TO_SWF_H_ */
@@ -0,0 +1,262 @@
1
+ #include "ruby.h"
2
+ #include "SWF.h"
3
+ #include "SWFReader.h"
4
+ #include "inflate.h"
5
+
6
+ extern VALUE rb_eSwfmill_Error;
7
+ extern VALUE rb_eSwfmill_EOFError;
8
+
9
+ #define SIGNATURE_SIZE 8
10
+ typedef struct {
11
+ VALUE string;
12
+ VALUE encoding;
13
+ bool compressed;
14
+ SWF::Header *header;
15
+ SWF::Context *context;
16
+ size_t datasize;
17
+ } swfmill_to_xml;
18
+
19
+ static void
20
+ stx_mark(swfmill_to_xml * const stx)
21
+ {
22
+ if(stx != NULL)
23
+ {
24
+ rb_gc_mark(stx->string);
25
+ rb_gc_mark(stx->encoding);
26
+ }
27
+ }
28
+
29
+ static void
30
+ stx_free(swfmill_to_xml * const stx)
31
+ {
32
+ if(stx != NULL)
33
+ {
34
+ delete stx->header;
35
+ stx->header = NULL;
36
+ delete stx->context;
37
+ stx->context = NULL;
38
+ }
39
+ }
40
+
41
+ static bool
42
+ stx_validate(const swfmill_to_xml * const stx)
43
+ {
44
+ if((RSTRING_LEN(stx->string) < SIGNATURE_SIZE) ||
45
+ (strncmp(RSTRING_PTR(stx->string), "CWS", 2) != 0 &&
46
+ strncmp(RSTRING_PTR(stx->string), "FWS", 2) != 0))
47
+ {
48
+ rb_raise(rb_eSwfmill_Error, "input is no SWF");
49
+ return false;
50
+ }
51
+ return true;
52
+ }
53
+
54
+ static void
55
+ stx_check_version(swfmill_to_xml * const stx)
56
+ {
57
+ stx->context = new SWF::Context;
58
+ stx->context->debugTrace = false;
59
+ stx->context->quiet = true;
60
+
61
+ stx->context->swfVersion = (int)RSTRING_PTR(stx->string)[3];
62
+ // fprintf(stderr, "swfVersion: %d\n", stx->context->swfVersion);
63
+ }
64
+
65
+ static void
66
+ stx_check_compressed(swfmill_to_xml * const stx)
67
+ {
68
+ stx->compressed = RSTRING_PTR(stx->string)[0] == 'C';
69
+ // fprintf(stderr, "compressed: %d\n", stx->compressed);
70
+ }
71
+
72
+ static void
73
+ stx_check_datasize(swfmill_to_xml * const stx)
74
+ {
75
+ stx->datasize = (size_t)RSTRING_PTR(stx->string)[4];
76
+ stx->datasize += (size_t)RSTRING_PTR(stx->string)[5] << 8;
77
+ stx->datasize += (size_t)RSTRING_PTR(stx->string)[6] << 16;
78
+ stx->datasize += (size_t)RSTRING_PTR(stx->string)[7] << 24;
79
+ // fprintf(stderr, "datasize: %d\n", stx->datasize);
80
+
81
+ if(stx->datasize != RSTRING_LEN(stx->string) - SIGNATURE_SIZE)
82
+ {
83
+ if((!stx->compressed) &&
84
+ (stx->datasize > RSTRING_LEN(stx->string) - SIGNATURE_SIZE))
85
+ {
86
+ stx->datasize = RSTRING_LEN(stx->string) - SIGNATURE_SIZE;
87
+ }
88
+ }
89
+ // fprintf(stderr, "fixed datasize: %d\n", stx->datasize);
90
+ }
91
+
92
+ static bool
93
+ stx_copy(swfmill_to_xml * const stx)
94
+ {
95
+ stx->string = rb_str_new(RSTRING_PTR(stx->string) + SIGNATURE_SIZE,
96
+ RSTRING_LEN(stx->string) - SIGNATURE_SIZE);
97
+ return true;
98
+ }
99
+
100
+ static bool
101
+ stx_decompress(swfmill_to_xml * const stx)
102
+ {
103
+ if(!stx->compressed)
104
+ {
105
+ return stx_copy(stx);
106
+ }
107
+
108
+ const unsigned char* buff = (const unsigned char*)RSTRING_PTR(stx->string) + SIGNATURE_SIZE;
109
+ const size_t size = RSTRING_LEN(stx->string) - SIGNATURE_SIZE;
110
+ Inflate inflate(buff, size, stx->datasize);
111
+
112
+ if(!inflate.decompress())
113
+ {
114
+ rb_raise(rb_eSwfmill_Error, "decompressing SWF");
115
+ return false;
116
+ }
117
+
118
+ stx->string = rb_str_new((const char*)inflate.data(), stx->datasize);
119
+
120
+ return true;
121
+ }
122
+
123
+ static bool
124
+ stx_read(swfmill_to_xml* const stx)
125
+ {
126
+ SWF::Reader reader((const unsigned char*)RSTRING_PTR(stx->string), RSTRING_LEN(stx->string));
127
+
128
+ stx->header = new SWF::Header;
129
+ stx->header->parse(&reader, RSTRING_LEN(stx->string), stx->context);
130
+
131
+ switch(reader.getError())
132
+ {
133
+ case SWFR_ERROR:
134
+ rb_raise(rb_eSwfmill_Error, "unknown error while reading SWF");
135
+ return false;
136
+ case SWFR_EOF:
137
+ rb_raise(rb_eSwfmill_EOFError, "reached EOF while reading SWF");
138
+ return false;
139
+ }
140
+
141
+ return true;
142
+ }
143
+
144
+ static bool
145
+ stx_parse(swfmill_to_xml* const stx)
146
+ {
147
+ if(!stx_validate(stx))
148
+ {
149
+ return false;
150
+ }
151
+ stx_check_version(stx);
152
+ stx_check_compressed(stx);
153
+ stx_check_datasize(stx);
154
+ if(!stx_decompress(stx))
155
+ {
156
+ return false;
157
+ }
158
+ if(!stx_read(stx))
159
+ {
160
+ return false;
161
+ }
162
+ return true;
163
+ }
164
+
165
+ static void
166
+ stx_init_xml_memory()
167
+ {
168
+ xmlMemSetup((xmlFreeFunc)ruby_xfree,
169
+ (xmlMallocFunc)ruby_xmalloc,
170
+ (xmlReallocFunc)ruby_xrealloc,
171
+ strdup);
172
+ }
173
+
174
+ static void
175
+ stx_set_version_proparty(const swfmill_to_xml* const stx, xmlNodePtr root)
176
+ {
177
+ char temp[4];
178
+ snprintf(temp, sizeof(temp), "%i", stx->context->swfVersion);
179
+ xmlSetProp(root, (const xmlChar*)"version", (const xmlChar*)temp);
180
+ }
181
+
182
+ static void
183
+ stx_set_compressed_proparty(const swfmill_to_xml* const stx, xmlNodePtr root)
184
+ {
185
+ char temp[4];
186
+ snprintf(temp, sizeof(temp), "%i", stx->compressed ? 1 : 0);
187
+ xmlSetProp(root, (const xmlChar*)"compressed", (const xmlChar*)temp);
188
+ }
189
+
190
+ static void
191
+ stx_set_encoding(swfmill_to_xml* const stx)
192
+ {
193
+ stx->context->convertEncoding = true;
194
+ stx->context->swf_encoding = StringValueCStr(stx->encoding);
195
+ // fprintf(stderr, "%s\n", stx->context->swf_encoding);
196
+ }
197
+
198
+ static VALUE
199
+ stx_dump(const swfmill_to_xml* const stx, xmlDocPtr doc)
200
+ {
201
+ VALUE xml = Qnil;
202
+ char* xml_data = NULL;
203
+ int xml_size = 0;
204
+
205
+ xmlDocDumpMemoryEnc(doc, (xmlChar**)&xml_data, &xml_size, "UTF-8");
206
+ if(xml_size > 0)
207
+ {
208
+ xml = rb_str_new(xml_data, xml_size);
209
+ }
210
+ if(xml_data != NULL)
211
+ {
212
+ xmlFree(xml_data);
213
+ }
214
+ return xml;
215
+ }
216
+
217
+ static VALUE
218
+ stx_to_string(swfmill_to_xml* const stx)
219
+ {
220
+ VALUE xml = Qnil;
221
+ xmlDocPtr doc;
222
+ xmlNodePtr root;
223
+ stx_init_xml_memory();
224
+
225
+ doc = xmlNewDoc((const xmlChar*)"1.0");
226
+ root = doc->xmlRootNode = xmlNewDocNode(doc, NULL, (const xmlChar*)"swf", NULL);
227
+
228
+ stx_set_version_proparty(stx, root);
229
+ stx_set_compressed_proparty(stx, root);
230
+ stx_set_encoding(stx);
231
+
232
+ stx->header->writeXML(root, stx->context);
233
+ xml = stx_dump(stx, doc);
234
+
235
+ xmlFreeDoc(doc);
236
+ return xml;
237
+ }
238
+
239
+ /*
240
+ call-seq:
241
+ Swfmill.to_xml(string, encoding) -> String
242
+ */
243
+ VALUE
244
+ swfmill_ext_to_xml(VALUE self, VALUE string, VALUE encoding)
245
+ {
246
+ swfmill_to_xml *stx;
247
+
248
+ Check_Type(string, T_STRING);
249
+ Check_Type(encoding, T_STRING);
250
+
251
+ Data_Make_Struct(rb_cData, swfmill_to_xml, stx_mark, stx_free, stx);
252
+
253
+ stx->string = string;
254
+ stx->encoding = encoding;
255
+
256
+ if(stx_parse(stx))
257
+ {
258
+ return stx_to_string(stx);
259
+ }
260
+
261
+ return Qnil;
262
+ }
@@ -0,0 +1,6 @@
1
+ #ifndef _SWFMILL_EXT_TO_XML_H_
2
+ #define _SWFMILL_EXT_TO_XML_H_
3
+
4
+ VALUE swfmill_ext_to_xml(VALUE, VALUE, VALUE);
5
+
6
+ #endif /* _SWFMILL_EXT_TO_XML_H_ */
@@ -0,0 +1,16 @@
1
+ OBJS = buffer_test.o inflate_test.o deflate_test.o
2
+
3
+ CXX = g++
4
+ CFLAGS = -g -O0 -I../ -I$(HOME)/include
5
+ LDFLAGS = -L$(HOME)/lib -lgtest_main -lz -lpthread
6
+
7
+ all: $(OBJS)
8
+ $(CXX) $(CFLAGS) $(LDFLAGS) -o test_all $(OBJS)
9
+ ./test_all || rm ./test_all
10
+
11
+ .cc.o:
12
+ $(CXX) $(CFLAGS) -c $<
13
+
14
+ PHONY: check-syntax
15
+ check-syntax:
16
+ $(CXX) $(CFLAGS) -Wall -Wextra -pedantic -fsyntax-only $(CHK_SOURCES)
@@ -0,0 +1,84 @@
1
+ #include <gtest/gtest.h>
2
+ #include "buffer.h"
3
+
4
+ class BufferTest : public testing::Test
5
+ {
6
+ };
7
+
8
+ TEST_F(BufferTest, Constructor)
9
+ {
10
+ buffer<char> temp(1);
11
+ }
12
+
13
+ TEST_F(BufferTest, CopyConstructor)
14
+ {
15
+ buffer<char> tmp1(5);
16
+ tmp1.append("54321", 5);
17
+
18
+ buffer<char> tmp2 = tmp1;
19
+ ASSERT_EQ(0, memcmp("54321", tmp2.ptr(), tmp2.size()));
20
+ }
21
+
22
+ TEST_F(BufferTest, Ptr)
23
+ {
24
+ buffer<char> temp(1);
25
+ ASSERT_TRUE(temp.ptr() != NULL);
26
+ }
27
+
28
+ TEST_F(BufferTest, Size)
29
+ {
30
+ buffer<char> temp(1);
31
+ ASSERT_EQ(0, temp.size());
32
+ }
33
+
34
+ TEST_F(BufferTest, Capacity)
35
+ {
36
+ buffer<char> temp(1);
37
+ ASSERT_EQ(1, temp.capacity());
38
+ }
39
+
40
+ TEST_F(BufferTest, Raise_Capacity)
41
+ {
42
+ buffer<char> tmp1(4);
43
+
44
+ tmp1.append("12345", 5);
45
+ EXPECT_EQ(5, tmp1.size());
46
+ EXPECT_EQ(11, tmp1.capacity());
47
+
48
+ buffer<char> tmp2(2);
49
+
50
+ tmp2.append("12345", 5);
51
+ EXPECT_EQ(5, tmp2.size());
52
+ EXPECT_EQ(9, tmp2.capacity());
53
+ }
54
+
55
+ TEST_F(BufferTest, Append)
56
+ {
57
+ const char* data = "abc";
58
+ buffer<char> temp;
59
+
60
+ ASSERT_EQ(3, temp.append(data, strlen(data)));
61
+ ASSERT_EQ(0, memcmp(data, temp.ptr(), temp.size()));
62
+ }
63
+
64
+ TEST_F(BufferTest, Reserve)
65
+ {
66
+ buffer<char> temp(3);
67
+ temp.append("1234", 4);
68
+ ASSERT_EQ(3, temp.reserve(3));
69
+ ASSERT_EQ(3, temp.size());
70
+ ASSERT_EQ(3, temp.capacity());
71
+ ASSERT_EQ(0, memcmp("123", temp.ptr(), temp.size()));
72
+ }
73
+
74
+ TEST_F(BufferTest, Resize)
75
+ {
76
+ buffer<char> temp(5);
77
+
78
+ temp.append("12345", 5);
79
+ temp.resize(3);
80
+ ASSERT_EQ(0, memcmp("123", temp.ptr(), temp.size()));
81
+
82
+ temp.resize(10);
83
+ ASSERT_EQ(12, temp.capacity());
84
+ }
@@ -0,0 +1,61 @@
1
+ #include <iostream>
2
+ #include <fstream>
3
+ #include <gtest/gtest.h>
4
+ #include "deflate.h"
5
+
6
+ class DeflateTest : public testing::Test
7
+ {
8
+ protected:
9
+
10
+ void SetUp()
11
+ {
12
+ read_file("test.dat", testdata, testdata_size);
13
+ testdata_length = 256;
14
+
15
+ testbuff = new unsigned char[testdata_length];
16
+ for(size_t i=0; i<testdata_length; i++)
17
+ {
18
+ testbuff[i] = i;
19
+ }
20
+ }
21
+
22
+ void TearDown()
23
+ {
24
+ delete[] testdata;
25
+ delete[] testbuff;
26
+ }
27
+
28
+ void read_file(const char* const filename, char*& data, size_t& length)
29
+ {
30
+ std::ifstream is;
31
+
32
+ is.open(filename, std::ios::binary);
33
+
34
+ is.seekg(0, std::ios::end);
35
+ length = is.tellg();
36
+ is.seekg(0, std::ios::beg);
37
+
38
+ data = new char[length];
39
+ is.read(data, length);
40
+ is.close();
41
+ }
42
+
43
+ char* testdata;
44
+ size_t testdata_size;
45
+ size_t testdata_length;
46
+ unsigned char* testbuff;
47
+
48
+ };
49
+
50
+ TEST_F(DeflateTest, Constructor)
51
+ {
52
+ Deflate d((unsigned char*)testdata, testdata_size);
53
+ }
54
+
55
+ TEST_F(DeflateTest, compress)
56
+ {
57
+ Deflate d(testbuff, testdata_length);
58
+ EXPECT_TRUE(d.compress());
59
+ ASSERT_TRUE(memcmp(d.data(), testdata, testdata_length) == 0);
60
+ ASSERT_EQ(testdata_size, d.size());
61
+ }
@@ -0,0 +1,84 @@
1
+ #include <iostream>
2
+ #include <fstream>
3
+ #include <gtest/gtest.h>
4
+ #include "inflate.h"
5
+
6
+ class InflateTest : public testing::Test
7
+ {
8
+ protected:
9
+
10
+ void SetUp()
11
+ {
12
+ read_file("test.dat", testdata, testdata_size);
13
+ testdata_length = 256;
14
+ }
15
+
16
+ void TearDown()
17
+ {
18
+ delete[] testdata;
19
+ }
20
+
21
+ void read_file(const char* const filename, char*& data, size_t& length)
22
+ {
23
+ std::ifstream is;
24
+
25
+ is.open(filename, std::ios::binary);
26
+
27
+ is.seekg(0, std::ios::end);
28
+ length = is.tellg();
29
+ is.seekg(0, std::ios::beg);
30
+
31
+ data = new char[length];
32
+ is.read(data, length);
33
+ is.close();
34
+ }
35
+
36
+ char* testdata;
37
+ size_t testdata_size;
38
+ size_t testdata_length;
39
+
40
+ };
41
+
42
+ TEST_F(InflateTest, Constructor)
43
+ {
44
+ Inflate i((unsigned char*)testdata, testdata_size, testdata_length);
45
+ }
46
+
47
+ TEST_F(InflateTest, data)
48
+ {
49
+ Inflate i((unsigned char*)testdata, testdata_size, testdata_length);
50
+ ASSERT_TRUE(i.data() != NULL);
51
+ }
52
+
53
+ TEST_F(InflateTest, decompress)
54
+ {
55
+ Inflate i((unsigned char*)testdata, testdata_size, testdata_length);
56
+ ASSERT_TRUE(i.decompress());
57
+ }
58
+
59
+ TEST_F(InflateTest, decompress_1)
60
+ {
61
+ Inflate i((unsigned char*)testdata, testdata_size, testdata_length);
62
+ EXPECT_TRUE(i.decompress());
63
+
64
+ const unsigned char f[] = {0,1,2,3,4,5,6,7,8,9};
65
+ ASSERT_TRUE(memcmp(i.data(), f, 10) == 0);
66
+ }
67
+
68
+ TEST_F(InflateTest, decompress_2)
69
+ {
70
+ Inflate i(NULL, testdata_size, testdata_length);
71
+ ASSERT_FALSE(i.decompress());
72
+ }
73
+
74
+ TEST_F(InflateTest, decompress_3)
75
+ {
76
+ Inflate i((unsigned char*)testdata, testdata_size - 1, testdata_length);
77
+ ASSERT_FALSE(i.decompress());
78
+ }
79
+
80
+ TEST_F(InflateTest, decompress_4)
81
+ {
82
+ Inflate i((unsigned char*)testdata, testdata_size, testdata_length - 1);
83
+ ASSERT_FALSE(i.decompress());
84
+ }