if ((tag->tag != 12) && (tag->tag != 59)) { // DoAction, DoInitAction
return NULL;
}
- swf_tag_create_detail(tag, swf);
+ swf_tag_create_input_detail(tag, swf);
swf_tag_action = (swf_tag_action_detail_t *) tag->detail;
*length = swf_tag_action->action_record_len;
return swf_tag_action->action_record;
printf("\n");
if (tag_info && tag_info->detail_handler) {
if (tag->detail == NULL) {
- swf_tag_create_detail(tag, swf);
+ swf_tag_create_input_detail(tag, swf);
}
swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
if (detail_handler->print) {
}
}
-int swf_tag_create_detail(swf_tag_t *tag, struct swf_object_ *swf) {
+int swf_tag_create_input_detail(swf_tag_t *tag, struct swf_object_ *swf) {
swf_tag_info_t *tag_info;
if (tag == NULL) {
- fprintf(stderr, "swf_tag_create_detail: tag == NULL\n");
+ fprintf(stderr, "swf_tag_create_input_detail: tag == NULL\n");
return 1;
}
tag_info = get_swf_tag_info(tag->tag);
if (tag_info && tag_info->detail_handler) {
+ int result;
swf_tag_detail_handler_t * detail_handler = tag_info->detail_handler();
if (detail_handler->create == NULL) {
fprintf(stderr, "detail_handler->create == NULL (tag=%d)\n",
tag->tag);
return 1;
}
- tag->detail = detail_handler->create(tag->data, tag->length, tag, swf);
+ tag->detail = detail_handler->create();
if (tag->detail == NULL) {
fprintf(stderr, "can't create tag detail (tag=%d)\n", tag->tag);
return 1;
}
+ result = detail_handler->input(tag->data, tag->length, tag, swf);
+ if (result) {
+ fprintf(stderr, "can't input tag detail (result=%d)\n", result);
+ return 1;
+ }
}
return 1;
}
return NULL;
}
if (! tag->detail) {
- swf_tag_create_detail(tag, NULL);
+ swf_tag_create_input_detail(tag, NULL);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_get_jpeg_data: Can't create tag\n");
}
}
if (! tag->detail) {
- swf_tag_create_detail(tag, NULL);
+ swf_tag_create_input_detail(tag, NULL);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_get_alpha_data: Can't create tag\n");
}
}
if (! tag->detail) {
- swf_tag_create_detail(tag, NULL);
+ swf_tag_create_input_detail(tag, NULL);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_replace_jpeg_data: Can't create tag\n");
return NULL;
}
if (! tag->detail) {
- swf_tag_create_detail(tag, NULL);
+ swf_tag_create_input_detail(tag, NULL);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_get_png_data: Can't create tag\n");
}
}
if (! tag->detail) {
- swf_tag_create_detail(tag, NULL);
+ swf_tag_create_input_detail(tag, NULL);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_replace_png_data: Can't create tag\n");
return NULL;
}
if (! tag->detail) {
- swf_tag_create_detail(tag, NULL);
+ swf_tag_create_input_detail(tag, NULL);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_get_sound_data: Can't create tag detail\n");
}
}
if (! tag->detail) {
- swf_tag_create_detail(tag, NULL);
+ swf_tag_create_input_detail(tag, NULL);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_replace_melog_data: Can't create tag\n");
return NULL;
}
if (! tag->detail) {
- swf_tag_create_detail(tag, swf);
+ swf_tag_create_input_detail(tag, swf);
}
if (! tag->detail) {
fprintf(stderr, "Can't create tag\n");
}
if (! tag->detail) {
- swf_tag_create_detail(tag, swf);
+ swf_tag_create_input_detail(tag, swf);
}
if (! tag->detail) {
fprintf(stderr, "swf_tag_replace_edit_string: Can't create tag\n");
} swf_tag_t;
typedef struct swf_tag_detail_handler_ {
- void * (*create) (unsigned char *data,
+ void * (*create) (void);
+ int (*input) (unsigned char *data,
unsigned long length,
swf_tag_t *tag,
struct swf_object_ *swf);
swf_tag_detail_handler_t *
swf_tag_action_detail_handler(void) {
action_detail_handler.create = swf_tag_action_create_detail;
+ action_detail_handler.input = swf_tag_action_input_detail;
action_detail_handler.identity = swf_tag_action_identity_detail;
action_detail_handler.output = swf_tag_action_output_detail;
action_detail_handler.print = swf_tag_action_print_detail;
}
void *
-swf_tag_action_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf) {
+swf_tag_action_create_detail(void) {
swf_tag_action_detail_t *swf_tag_action;
- bitstream_t *bs;
- unsigned long pos, len;
- (void) swf;
swf_tag_action = calloc(sizeof(*swf_tag_action), 1);
if (swf_tag_action == NULL) {
fprintf(stderr, "ERROR: swf_tag_action_create_detail: can't calloc\n");
return NULL;
}
+ swf_tag_action->action_sprite = 0;
+ swf_tag_action->action_record = NULL;
+ swf_tag_action->action_record_len = 0;
+ return swf_tag_action;
+}
+
+int
+swf_tag_action_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf) {
+ swf_tag_action_detail_t *swf_tag_action;
+ bitstream_t *bs;
+ unsigned long pos, len;
+ (void) swf;
+ swf_tag_action = tag->detail;
+ if (swf_tag_action == NULL) {
+ fprintf(stderr, "ERROR: swf_tag_action_create_detail: swf_tag_action == NULL\n");
+ return 1;
+ }
bs = bitstream_open();
bitstream_input(bs, data, length);
swf_tag_action->action_record = bitstream_output_sub(bs, pos, len);
swf_tag_action->action_record_len = len;
bitstream_close(bs);
- return (void *) swf_tag_action;
+ return 0;
}
int swf_tag_action_identity_detail(unsigned char *data, int id,
extern swf_tag_detail_handler_t *swf_tag_action_detail_handler(void);
-extern void *swf_tag_action_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf);
+extern void *swf_tag_action_create_detail(void);
+extern int swf_tag_action_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf);
extern int swf_tag_action_identity_detail(unsigned char *data, int id,
swf_tag_t *tag);
extern unsigned char *swf_tag_action_output_detail(void *detail,
swf_tag_detail_handler_t *
swf_tag_edit_detail_handler(void) {
edit_detail_handler.create = swf_tag_edit_create_detail;
+ edit_detail_handler.input = swf_tag_edit_input_detail;
edit_detail_handler.identity = swf_tag_edit_identity_detail;
edit_detail_handler.output = swf_tag_edit_output_detail;
edit_detail_handler.print = swf_tag_edit_print_detail;
return &edit_detail_handler;
}
+
void *
-swf_tag_edit_create_detail(unsigned char *data, unsigned long length,
+swf_tag_edit_create_detail(void) {
+ swf_tag_edit_detail_t *swf_tag_edit;
+ swf_tag_edit = calloc(sizeof(*swf_tag_edit), 1);
+ if (swf_tag_edit == NULL) {
+ fprintf(stderr, "ERROR: swf_tag_edit_create_detail: can't calloc\n");
+ return NULL;
+ }
+ return swf_tag_edit;
+}
+
+int
+swf_tag_edit_input_detail(unsigned char *data, unsigned long length,
swf_tag_t *tag,
struct swf_object_ *swf) {
swf_tag_edit_detail_t *swf_tag_edit;
bitstream_t *bs;
(void) tag;
- swf_tag_edit = calloc(sizeof(*swf_tag_edit), 1);
+ swf_tag_edit = tag->detail;
if (swf_tag_edit == NULL) {
- fprintf(stderr, "ERROR: swf_tag_edit_create_detail: can't calloc\n");
- return NULL;
+ fprintf(stderr, "ERROR: swf_tag_edit_input_detail: swf_tag_edit == NULL\n");
+ return 1;
}
bs = bitstream_open();
bitstream_input(bs, data, length);
}
bitstream_close(bs);
- return (void *) swf_tag_edit;
+ return 0;
}
int swf_tag_edit_identity_detail(unsigned char *data, int id,
extern swf_tag_detail_handler_t *swf_tag_edit_detail_handler(void);
-extern void *swf_tag_edit_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf);
+extern void *swf_tag_edit_create_detail(void);
+extern int swf_tag_edit_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf);
extern int swf_tag_edit_identity_detail(unsigned char *data, int id,
swf_tag_t *tag);
extern unsigned char *swf_tag_edit_output_detail(void *detail,
swf_tag_detail_handler_t *swf_tag_jpeg_detail_handler(void) {
jpeg_detail_handler.create = swf_tag_jpeg_create_detail;
+ jpeg_detail_handler.input = swf_tag_jpeg_input_detail;
jpeg_detail_handler.identity = swf_tag_jpeg_identity_detail;
jpeg_detail_handler.output = swf_tag_jpeg_output_detail;
jpeg_detail_handler.print = swf_tag_jpeg_print_detail;
}
swf_tag_detail_handler_t *swf_tag_jpeg3_detail_handler(void) {
- jpeg_detail_handler.create = swf_tag_jpeg3_create_detail;
+ jpeg_detail_handler.create = swf_tag_jpeg_create_detail;
+ jpeg_detail_handler.input = swf_tag_jpeg3_input_detail;
jpeg_detail_handler.identity = swf_tag_jpeg_identity_detail;
jpeg_detail_handler.output = swf_tag_jpeg3_output_detail;
jpeg_detail_handler.print = swf_tag_jpeg_print_detail;
}
void *
-swf_tag_jpeg_create_detail(unsigned char *data, unsigned long length,
+swf_tag_jpeg_create_detail(void) {
+ swf_tag_jpeg_detail_t *swf_tag_jpeg;
+ bitstream_t *bs;
+ swf_tag_jpeg = calloc(sizeof(*swf_tag_jpeg), 1);
+ if (swf_tag_jpeg == NULL) {
+ fprintf(stderr, "ERROR: swf_tag_jpeg_create_detail: can't calloc\n");
+ return NULL;
+ }
+ swf_tag_jpeg->image_id = -1;
+ swf_tag_jpeg->jpeg_data = NULL;
+ swf_tag_jpeg->jpeg_data_len = 0;
+ swf_tag_jpeg->alpha_data = NULL;
+ swf_tag_jpeg->alpha_data_len = 0;
+ return (void *) swf_tag_jpeg;
+}
+
+int
+swf_tag_jpeg_input_detail(unsigned char *data, unsigned long length,
swf_tag_t *tag,
struct swf_object_ *swf) {
swf_tag_jpeg_detail_t *swf_tag_jpeg;
bitstream_t *bs;
(void) tag;
(void) swf;
- swf_tag_jpeg = calloc(sizeof(*swf_tag_jpeg), 1);
+ swf_tag_jpeg = tag->detail;
if (swf_tag_jpeg == NULL) {
- fprintf(stderr, "ERROR: swf_tag_jpeg_create_detail: can't calloc\n");
- return NULL;
+ fprintf(stderr, "ERROR: swf_tag_jpeg_input_detail: swf_tag_jpeg == NULL\n");
+ return 1;
}
bs = bitstream_open();
bitstream_input(bs, data, length);
swf_tag_jpeg->alpha_data = NULL;
swf_tag_jpeg->alpha_data_len = 0;
bitstream_close(bs);
- return (void *) swf_tag_jpeg;
+ return 0;
}
-void *
-swf_tag_jpeg3_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf) {
+int
+swf_tag_jpeg3_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf) {
swf_tag_jpeg_detail_t *swf_tag_jpeg;
unsigned long offset_to_alpha;
bitstream_t *bs;
int result;
(void) tag;
(void) swf;
- swf_tag_jpeg = calloc(sizeof(*swf_tag_jpeg), 1);
+ swf_tag_jpeg = tag->detail;
if (swf_tag_jpeg == NULL) {
- fprintf(stderr, "swf_tag_jpeg_create_detail: can't calloc\n");
- return NULL;
+ fprintf(stderr, "ERROR: swf_tag_jpeg3_input_detail: swf_tag_jpeg == NULL\n");
+ return 1;
}
bs = bitstream_open();
bitstream_input(bs, data, length);
free(swf_tag_jpeg);
bitstream_close(bs);
fprintf(stderr, "swf_tag_jpeg3_create_detail: swf_tag_jpeg->jpeg_data\n");
- return NULL;
+ return 1;
}
swf_tag_jpeg->jpeg_data_len = offset_to_alpha;
offset = 2 + 4 + offset_to_alpha;
alpha_data_len = length - offset;
origsize = 256 * alpha_data_len;
- new_buff = malloc(origsize);
+ new_buff = malloc(origsize); // enough size
old_buff_ref = bitstream_buffer(bs, offset);
result = uncompress(new_buff, &origsize, old_buff_ref, alpha_data_len);
if (result == Z_OK) {
swf_tag_jpeg->alpha_data = realloc(new_buff, origsize);
- swf_tag_jpeg->alpha_data = new_buff;
swf_tag_jpeg->alpha_data_len = origsize;
} else {
if (result == Z_MEM_ERROR) {
free(new_buff);
}
bitstream_close(bs);
- return (void *) swf_tag_jpeg;
+ (void *) swf_tag_jpeg;
+ return 0;
}
int
unsigned long jpeg_data_len,
unsigned char *alpha_data,
unsigned long alpha_data_len,
- swf_tag_t *tag) {
+ swf_tag_t *tag) {
swf_tag_jpeg_detail_t *swf_tag_jpeg = (swf_tag_jpeg_detail_t *) detail;
if (detail == NULL) {
fprintf(stderr, "swf_tag_jpeg_replace_jpeg_data: detail == NULL\n");
extern swf_tag_detail_handler_t *swf_tag_jpeg_detail_handler(void);
extern swf_tag_detail_handler_t *swf_tag_jpeg3_detail_handler(void);
-extern void *swf_tag_jpeg_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf);
+extern void *swf_tag_jpeg_create_detail(void);
+
+extern int swf_tag_jpeg_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf);
+extern int swf_tag_jpeg3_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf);
extern int swf_tag_jpeg_identity_detail(unsigned char *data, int id,
swf_tag_t *tag);
extern void *swf_tag_jpeg3_create_detail(unsigned char *data,
swf_tag_detail_handler_t *swf_tag_lossless_detail_handler(void) {
lossless_detail_handler.create = swf_tag_lossless_create_detail;
+ lossless_detail_handler.input = swf_tag_lossless_input_detail;
lossless_detail_handler.identity = swf_tag_lossless_identity_detail;
lossless_detail_handler.output = swf_tag_lossless_output_detail;
lossless_detail_handler.print = swf_tag_lossless_print_detail;
}
void *
-swf_tag_lossless_create_detail(unsigned char *data,
+swf_tag_lossless_create_detail(void) {
+ swf_tag_lossless_detail_t *swf_tag_lossless;
+ swf_tag_lossless = calloc(sizeof(*swf_tag_lossless), 1);
+ if (swf_tag_lossless == NULL) {
+ fprintf(stderr, "swf_tag_lossless_create_detail: can't calloc swf_tag_lossless\n");
+ return NULL;
+ }
+ return swf_tag_lossless;
+}
+
+int
+swf_tag_lossless_input_detail(unsigned char *data,
unsigned long length,
swf_tag_t *tag,
struct swf_object_ *swf) {
unsigned char *tmp_buff, *old_buff_ref;
unsigned long origsize, old_size, offset;
int result;
-
- swf_tag_lossless = calloc(sizeof(*swf_tag_lossless), 1);
+ swf_tag_lossless = tag->detail;
if (swf_tag_lossless == NULL) {
- fprintf(stderr, "swf_tag_lossless_create_detail: can't calloc swf_tag_lossless\n");
- return NULL;
+ fprintf(stderr, "swf_tag_lossless_input_detail: swf_tag_lossless == NULL\n");
+ return 1;
}
+
bs = bitstream_open();
bitstream_input(bs, data, length);
swf_tag_lossless->image_id = bitstream_getbytesLE(bs, 2);
}
free(tmp_buff);
bitstream_close(bs);
- return NULL;
+ return 1;
}
if (indices_len != origsize - bytes_per_color * swf_tag_lossless->colormap_count) {
fprintf(stderr, "swf_tag_lossless_create_detail: indices_len(%lu) != origsize(%lu) - %d * swf_tag_lossless->colormap_count(%d) at line(%d)\n",
swf_tag_lossless->colormap_count, __LINE__);
free(tmp_buff);
bitstream_close(bs);
- return NULL;
+ return 1;
}
bs2 = bitstream_open();
bitstream_input(bs2, tmp_buff, origsize);
}
free(tmp_buff);
bitstream_close(bs);
- return NULL;
+ return 1;
}
bs2 = bitstream_open();
bitstream_input(bs2, tmp_buff, origsize);
free(tmp_buff);
}
bitstream_close(bs);
- return (void *) swf_tag_lossless;
+ return 0;
+
}
int
extern swf_tag_detail_handler_t *swf_tag_lossless_detail_handler(void);
-extern void *swf_tag_lossless_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf);
-extern void *swf_tag_lossless2_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf);
+extern void *swf_tag_lossless_create_detail(void);
+extern int swf_tag_lossless_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf);
extern int swf_tag_lossless_identity_detail(unsigned char *data, int id,
swf_tag_t *tag);
extern unsigned char *swf_tag_lossless_output_detail(void *detail,
unsigned long *length,
swf_tag_t *tag,
struct swf_object_ *swf);
-extern unsigned char *swf_tag_lossless2_output_detail(void *detail,
- unsigned long *length,
- swf_tag_t *tag,
- struct swf_object_ *swf);
extern void swf_tag_lossless_print_detail(void *detail,
swf_tag_t *tag,
struct swf_object_ *swf);
swf_tag_detail_handler_t *
swf_tag_sound_detail_handler(void) {
sound_detail_handler.create = swf_tag_sound_create_detail;
+ sound_detail_handler.input = swf_tag_sound_input_detail;
sound_detail_handler.identity = swf_tag_sound_identity_detail;
sound_detail_handler.output = swf_tag_sound_output_detail;
sound_detail_handler.print = swf_tag_sound_print_detail;
}
void *
-swf_tag_sound_create_detail(unsigned char *data, unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf) {
+swf_tag_sound_create_detail(void) {
+ swf_tag_sound_detail_t *swf_tag_sound;
+ swf_tag_sound = calloc(sizeof(*swf_tag_sound), 1);
+ if (swf_tag_sound == NULL) {
+ fprintf(stderr, "ERROR: swf_tag_sound_create_detail: can't calloc\n");
+ return NULL;
+ }
+}
+
+int
+swf_tag_sound_input_detail(unsigned char *data, unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf) {
swf_tag_sound_detail_t *swf_tag_sound;
bitstream_t *bs;
unsigned long sound_data_len;
unsigned char *sound_data_ref;
(void) tag;
(void) swf;
- swf_tag_sound = calloc(sizeof(*swf_tag_sound), 1);
+ swf_tag_sound = tag->detail;
if (swf_tag_sound == NULL) {
- fprintf(stderr, "ERROR: swf_tag_sound_create_detail: can't calloc\n");
- return NULL;
+ fprintf(stderr, "ERROR: swf_tag_sound_input_detail: swf_tag_sound == NULL\n");
+ return 1;
}
bs = bitstream_open();
bitstream_input(bs, data, length);
fprintf(stderr, "swf_tag_sound_create_detail: swf_tag_sound->sound_data == NULL at line(%d): sound_data_len=%lu\n",
__LINE__, sound_data_len);
bitstream_close(bs);
- return NULL;
+ return 1;
}
sound_data_ref = bitstream_buffer(bs, bitstream_getbytepos(bs));
memcpy(swf_tag_sound->sound_data, sound_data_ref, sound_data_len);
swf_tag_sound->sound_data_len = sound_data_len;
bitstream_close(bs);
- return (void *) swf_tag_sound;
+ return 0;
}
int
extern swf_tag_detail_handler_t *swf_tag_sound_detail_handler(void);
-extern void *swf_tag_sound_create_detail(unsigned char *data,
- unsigned long length,
- swf_tag_t *tag,
- struct swf_object_ *swf);
+extern void *swf_tag_sound_create_detail(void);
+extern int swf_tag_sound_input_detail(unsigned char *data,
+ unsigned long length,
+ swf_tag_t *tag,
+ struct swf_object_ *swf);
extern int swf_tag_sound_identity_detail(unsigned char *data, int id,
swf_tag_t *tag);
extern unsigned char *swf_tag_sound_output_detail(void *detail,
if ((tag_info == NULL) || (tag_info->detail_handler == NULL)) {
RETURN_FALSE;
}
- swf_tag_create_detail(tag, swf);
+ swf_tag_create_input_detail(tag, swf);
switch (tag->tag) {
swf_tag_jpeg_detail_t *tag_jpeg;
swf_tag_lossless_detail_t *tag_lossless;