2 +----------------------------------------------------------------------+
3 | Author: yoya@awm.jp |
4 +----------------------------------------------------------------------+
10 #include "swf_tag_edit.h"
11 #include "swf_object.h"
14 swf_tag_detail_handler_t edit_detail_handler;
16 swf_tag_detail_handler_t *
17 swf_tag_edit_detail_handler(void) {
18 edit_detail_handler.create = swf_tag_edit_create_detail;
19 edit_detail_handler.input = swf_tag_edit_input_detail;
20 edit_detail_handler.get_cid = swf_tag_edit_get_cid_detail;
21 edit_detail_handler.replace_cid = swf_tag_edit_replace_cid_detail;
22 edit_detail_handler.output = swf_tag_edit_output_detail;
23 edit_detail_handler.print = swf_tag_edit_print_detail;
24 edit_detail_handler.destroy = swf_tag_edit_destroy_detail;
25 return &edit_detail_handler;
29 swf_tag_edit_create_detail(void) {
30 swf_tag_edit_detail_t *swf_tag_edit;
31 swf_tag_edit = calloc(sizeof(*swf_tag_edit), 1);
32 if (swf_tag_edit == NULL) {
33 fprintf(stderr, "ERROR: swf_tag_edit_create_detail: can't calloc\n");
40 swf_tag_edit_input_detail(swf_tag_t *tag, struct swf_object_ *swf) {
41 swf_tag_edit_detail_t *swf_tag_edit = tag->detail;
42 unsigned char *data = tag->data;
43 unsigned long length = tag->length;
45 if (swf_tag_edit == NULL) {
46 fprintf(stderr, "ERROR: swf_tag_edit_input_detail: swf_tag_edit == NULL\n");
49 bs = bitstream_open();
50 bitstream_input(bs, data, length);
51 swf_tag_edit->edit_id = bitstream_getbytesLE(bs, 2);
52 swf_rect_parse(bs, &swf_tag_edit->rect);
54 swf_tag_edit->edit_has_text = bitstream_getbit(bs);
55 swf_tag_edit->edit_word_wrap = bitstream_getbit(bs);
56 swf_tag_edit->edit_multiline = bitstream_getbit(bs);
57 swf_tag_edit->edit_password = bitstream_getbit(bs);
58 swf_tag_edit->edit_readonly = bitstream_getbit(bs);
59 swf_tag_edit->edit_has_color = bitstream_getbit(bs);
60 swf_tag_edit->edit_has_max_length = bitstream_getbit(bs);
61 swf_tag_edit->edit_has_font = bitstream_getbit(bs);
62 if (swf && (swf->header.version >= 6)) {
63 (void) bitstream_getbit(bs); // reserved;
64 swf_tag_edit->edit_auto_size = bitstream_getbit(bs);
66 (void) bitstream_getbit(bs); // reserved;
67 (void) bitstream_getbit(bs); // reserved;
69 swf_tag_edit->edit_has_layout = bitstream_getbit(bs);
70 swf_tag_edit->edit_no_select = bitstream_getbit(bs);
71 swf_tag_edit->edit_border = bitstream_getbit(bs);
72 (void) bitstream_getbit(bs); // reserved;
73 swf_tag_edit->edit_html = bitstream_getbit(bs);
74 swf_tag_edit->edit_use_outlines = bitstream_getbit(bs);
75 if (swf_tag_edit->edit_has_font) {
76 swf_tag_edit->edit_font_id_ref = bitstream_getbytesLE(bs, 2);
77 swf_tag_edit->edit_font_height = bitstream_getbytesLE(bs, 2);
79 if (swf_tag_edit->edit_has_color) {
80 swf_rgba_parse(bs, &swf_tag_edit->edit_color);
82 if (swf_tag_edit->edit_has_max_length) {
83 swf_tag_edit->edit_max_length = bitstream_getbytesLE(bs, 2);
85 if (swf_tag_edit->edit_has_layout) {
86 swf_tag_edit->edit_align = bitstream_getbyte(bs);
87 swf_tag_edit->edit_left_margine = bitstream_getbytesLE(bs, 2);
88 swf_tag_edit->edit_right_margine = bitstream_getbytesLE(bs, 2);
89 swf_tag_edit->edit_indent = (signed) bitstream_getbytesLE(bs, 2);
90 swf_tag_edit->edit_leading = (signed) bitstream_getbytesLE(bs, 2);
92 swf_tag_edit->edit_variable_name = (char *) bitstream_outputstring(bs);
93 if (swf_tag_edit->edit_has_text) {
94 swf_tag_edit->edit_initial_text = (char *) bitstream_outputstring(bs);
96 swf_tag_edit->edit_initial_text = NULL;
103 int swf_tag_edit_get_cid_detail(swf_tag_t *tag) {
104 unsigned char *data = tag->data;
106 swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
107 return swf_tag_edit->edit_id;
110 fprintf(stderr, "swf_tag_edit_get_cid_detail: data == NULL\n");
113 return GetUShortLE(data); // edit_id;
116 int swf_tag_edit_replace_cid_detail(swf_tag_t *tag, int id) {
117 unsigned char *data = tag->data;
119 swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
120 swf_tag_edit->edit_id = id;
123 PutUShortLE(data, id);
125 return 0; // always 0
129 swf_tag_edit_output_detail(swf_tag_t *tag, unsigned long *length,
130 struct swf_object_ *swf) {
131 swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
136 bs = bitstream_open();
137 bitstream_putbytesLE(bs, swf_tag_edit->edit_id, 2);
138 swf_rect_build(bs, &swf_tag_edit->rect);
140 bitstream_putbit(bs, swf_tag_edit->edit_has_text);
141 bitstream_putbit(bs, swf_tag_edit->edit_word_wrap);
142 bitstream_putbit(bs, swf_tag_edit->edit_multiline);
143 bitstream_putbit(bs, swf_tag_edit->edit_password );
144 bitstream_putbit(bs, swf_tag_edit->edit_readonly);
145 bitstream_putbit(bs, swf_tag_edit->edit_has_color );
146 bitstream_putbit(bs, swf_tag_edit->edit_has_max_length);
147 bitstream_putbit(bs, swf_tag_edit->edit_has_font);
148 if (swf && (swf->header.version >= 6)) {
149 bitstream_putbit(bs, 0); // reserved;
150 bitstream_putbit(bs, swf_tag_edit->edit_auto_size);
152 bitstream_putbit(bs, 0); // reserved;
153 bitstream_putbit(bs, 0); // reserved;
155 bitstream_putbit(bs, swf_tag_edit->edit_has_layout);
156 bitstream_putbit(bs, swf_tag_edit->edit_no_select);
157 bitstream_putbit(bs, swf_tag_edit->edit_border);
158 bitstream_putbit(bs, 0); // reserved;
159 bitstream_putbit(bs, swf_tag_edit->edit_html);
160 bitstream_putbit(bs, swf_tag_edit->edit_use_outlines);
161 if (swf_tag_edit->edit_has_font) {
162 bitstream_putbytesLE(bs, swf_tag_edit->edit_font_id_ref, 2);
163 bitstream_putbytesLE(bs, swf_tag_edit->edit_font_height, 2);
165 if (swf_tag_edit->edit_has_color) {
166 swf_rgba_build(bs, &swf_tag_edit->edit_color);
168 if (swf_tag_edit->edit_has_max_length) {
169 bitstream_putbytesLE(bs, swf_tag_edit->edit_max_length, 2);
171 if (swf_tag_edit->edit_has_layout) {
172 bitstream_putbyte(bs, swf_tag_edit->edit_align);
173 bitstream_putbytesLE(bs, swf_tag_edit->edit_left_margine, 2);
174 bitstream_putbytesLE(bs, swf_tag_edit->edit_right_margine, 2);
175 bitstream_putbytesLE(bs, swf_tag_edit->edit_indent, 2);
176 bitstream_putbytesLE(bs, swf_tag_edit->edit_leading, 2);
178 bitstream_putstring(bs,
179 (unsigned char *) swf_tag_edit->edit_variable_name,
180 strlen(swf_tag_edit->edit_variable_name) + 1);
181 if (swf_tag_edit->edit_has_text) {
182 bitstream_putstring(bs,
183 (unsigned char *)swf_tag_edit->edit_initial_text,
184 strlen(swf_tag_edit->edit_initial_text) + 1);
186 data = bitstream_steal(bs, length);
192 swf_tag_edit_print_detail(swf_tag_t *tag,
193 struct swf_object_ *swf, int indent_depth) {
194 swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
196 print_indent(indent_depth);
197 printf("edit_id=%d\n", swf_tag_edit->edit_id);
198 swf_rect_print(&swf_tag_edit->rect, indent_depth + 1);
199 print_indent(indent_depth);
200 printf("text=%d wwrap=%d multi=%d pass=%d ro=%d col=%d maxlen=%d font=%d\n",
201 swf_tag_edit->edit_has_text?1:0,
202 swf_tag_edit->edit_word_wrap?1:0,
203 swf_tag_edit->edit_multiline?1:0,
204 swf_tag_edit->edit_password?1:0,
205 swf_tag_edit->edit_readonly?1:0,
206 swf_tag_edit->edit_has_color?1:0,
207 swf_tag_edit->edit_has_max_length?1:0,
208 swf_tag_edit->edit_has_font?1:0);
209 if (swf->header.version >= 6) {
210 print_indent(indent_depth);
211 printf("auto_size=%d\n", swf_tag_edit->edit_auto_size);
213 print_indent(indent_depth);
214 printf("layout=%d no_sel=%d border=%d\n",
215 swf_tag_edit->edit_has_layout?1:0,
216 swf_tag_edit->edit_no_select?1:0,
217 swf_tag_edit->edit_border?1:0);
218 if (swf_tag_edit->edit_has_font) {
219 print_indent(indent_depth);
220 printf("font_id=%d font_height=%d",
221 swf_tag_edit->edit_font_id_ref,
222 swf_tag_edit->edit_font_height / SWF_TWIPS);
224 if (swf_tag_edit->edit_has_color) {
225 printf(" color=#%02x%02x%02x(%02x)",
226 swf_tag_edit->edit_color.red,
227 swf_tag_edit->edit_color.green,
228 swf_tag_edit->edit_color.blue,
229 swf_tag_edit->edit_color.alpha);
232 if (swf_tag_edit->edit_has_max_length) {
233 print_indent(indent_depth);
234 printf("max_length=%d\n",
235 swf_tag_edit->edit_max_length);
237 if (swf_tag_edit->edit_has_layout) {
238 print_indent(indent_depth);
239 printf("align=%d (left,right)_margine=(%d,%d) indent=%d leading=%d\n",
240 swf_tag_edit->edit_align,
241 swf_tag_edit->edit_left_margine,
242 swf_tag_edit->edit_right_margine,
243 swf_tag_edit->edit_indent,
244 swf_tag_edit->edit_leading);
246 if (swf_tag_edit->edit_variable_name) {
247 print_indent(indent_depth);
248 printf("variable_name=%s\n",
249 swf_tag_edit->edit_variable_name);
251 if (swf_tag_edit->edit_initial_text) {
252 print_indent(indent_depth);
253 printf("initial_text=%s\n",
254 swf_tag_edit->edit_initial_text);
260 swf_tag_edit_destroy_detail(swf_tag_t *tag) {
261 swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) tag->detail;
263 free(swf_tag_edit->edit_variable_name);
264 free(swf_tag_edit->edit_initial_text);
265 swf_tag_edit->edit_variable_name = NULL;
266 swf_tag_edit->edit_initial_text = NULL;
274 swf_tag_edit_get_string(void *detail,
275 char *variable_name, int variable_name_len,
277 swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) detail;
278 char *data, *initial_text;
279 int initial_text_len = 0;
282 if ((strlen(swf_tag_edit->edit_variable_name) != (unsigned)variable_name_len) || strncmp(swf_tag_edit->edit_variable_name, variable_name, variable_name_len)) {
283 if (atoi(variable_name) != swf_tag_edit->edit_id) {
288 initial_text = swf_tag_edit->edit_initial_text;
289 if (initial_text == NULL) {
292 initial_text_len = strlen(initial_text);
293 data = malloc(initial_text_len + 1);
296 fprintf(stderr, "swf_tag_edit_get_string: Can't malloc\n");
299 memcpy(data, initial_text, initial_text_len + 1);
304 swf_tag_edit_replace_string(void *detail,
305 char *variable_name, int variable_name_len,
306 char *initial_text, int initial_text_len) {
308 swf_tag_edit_detail_t *swf_tag_edit = (swf_tag_edit_detail_t *) detail;
309 if (((int) strlen(swf_tag_edit->edit_variable_name) != variable_name_len)
310 || memcmp(swf_tag_edit->edit_variable_name, variable_name,
311 variable_name_len)) {
312 if (atoi(variable_name) != swf_tag_edit->edit_id) {
316 if (initial_text_len == 0) {
317 swf_tag_edit->edit_has_text = 0;
318 if (swf_tag_edit->edit_initial_text) {
319 free(swf_tag_edit->edit_initial_text);
320 swf_tag_edit->edit_initial_text = NULL;
324 swf_tag_edit->edit_has_text = 1;
325 new_str = malloc(initial_text_len + 1);
326 if (new_str == NULL) {
327 fprintf(stderr, "swf_tag_edit_replace_string: Can't malloc\n");
330 memcpy(new_str, initial_text, initial_text_len);
331 new_str[initial_text_len] = '\0';
332 if (swf_tag_edit->edit_initial_text) {
333 free(swf_tag_edit->edit_initial_text);
335 swf_tag_edit->edit_initial_text = new_str;