From 24b22fabfa9db7b85ffdba780bea26d8741c9d19 Mon Sep 17 00:00:00 2001 From: yoya Date: Tue, 30 Nov 2010 18:31:02 +0000 Subject: [PATCH] =?utf8?q?-=20setActionVariables=20=E3=81=AE=E5=AE=9F?= =?utf8?q?=E8=A3=85=E3=82=92=E4=B8=80=E9=80=9A=E3=82=8A=20-=20shape=20?= =?utf8?q?=E8=A1=A8=E7=A4=BA=20-=20getEditString=20=E3=81=A7=E7=84=A1?= =?utf8?q?=E9=A7=84=E3=81=AA=201=20byte=20=E3=81=AE=E3=82=B3=E3=83=94?= =?utf8?q?=E3=83=BC=E3=82=92=E6=B8=9B=E3=82=89=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/swfed/trunk@343 7c90b180-03d5-4157-b861-58a559ae9d1e --- src/php_swfed.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++---- src/php_swfed.h | 2 +- src/swf_object.c | 33 +++++++++++++++++++++++++--- src/swf_object.h | 4 ++-- src/swf_tag.c | 16 ++++++++++++++ src/swf_tag.h | 4 ++++ src/swf_tag_action.c | 33 ++++++++++++++++++++++++++++ src/swf_tag_action.h | 2 ++ 8 files changed, 145 insertions(+), 10 deletions(-) diff --git a/src/php_swfed.c b/src/php_swfed.c index 99f5c55..e3ffbcb 100644 --- a/src/php_swfed.c +++ b/src/php_swfed.c @@ -28,6 +28,8 @@ #include "php_swfed.h" #include "swf_define.h" +#include "y_keyvalue.h" + #include "swf_tag_jpeg.h" #include "swf_tag_lossless.h" #include "swf_tag_edit.h" @@ -76,7 +78,7 @@ zend_function_entry swfed_functions[] = { PHP_ME(swfed, replaceEditString, NULL, 0) PHP_ME(swfed, getActionData, NULL, 0) PHP_ME(swfed, disasmActionData, NULL, 0) -// PHP_ME(swfed, insertActionSetVariables, NULL, 0) + PHP_ME(swfed, setActionVariables, NULL, 0) PHP_ME(swfed, swfInfo, NULL, 0) {NULL, NULL, NULL} /* Must be the last line in swfed_functions[] */ }; @@ -407,6 +409,7 @@ PHP_METHOD(swfed, getTagDetail) { swf_tag_sound_detail_t *tag_sound; swf_tag_action_detail_t *tag_action; swf_tag_sprite_detail_t *tag_sprite; + swf_tag_shape_detail_t *tag_shape; case 6: // DefineBitsJPEG case 21: // DefineBitsJPEG2 case 35: // DefineBitsJPEG3 @@ -474,6 +477,17 @@ PHP_METHOD(swfed, getTagDetail) { add_assoc_long(return_value, "sprite_id", tag_sprite->sprite_id); add_assoc_long(return_value, "frame_count", tag_sprite->frame_count); break; + case 2: // DefineShape; + case 22: // DefineShape2; + case 32: // DefineShape3; + case 46: // DefineMorphShape; + tag_shape = tag->detail; + array_init(return_value); + add_assoc_long(return_value, "shape_id", tag_shape->shape_id); + add_assoc_long(return_value, "fill_styles.count", tag_shape->shape_with_style.styles.fill_styles.count); + add_assoc_long(return_value, "line_styles.count", tag_shape->shape_with_style.styles.line_styles.count); +// tag_shape->shape_with_style.shape_records + break; default: RETURN_FALSE; } @@ -883,13 +897,13 @@ PHP_METHOD(swfed, getEditString) { RETURN_FALSE; } str_len = strlen(data); - new_buff = emalloc(str_len + 1); + new_buff = emalloc(str_len); if (new_buff == NULL) { fprintf(stderr, "getEditString: Can't emalloc new_buff\n"); free(data); RETURN_FALSE; } - memcpy(new_buff, data, str_len + 1); + memcpy(new_buff, data, str_len); free(data); RETURN_STRINGL(new_buff, str_len, 0); } @@ -964,7 +978,46 @@ PHP_METHOD(swfed, disasmActionData) { RETURN_TRUE; } -PHP_METHOD(swfed, insertActionSetVariables) { +PHP_METHOD(swfed, setActionVariables) { + zval *zid, *arr, **entry; + HashTable *arr_hash; + HashPosition pos; + char *str_key, *str_value; + uint str_key_len, str_value_len; + ulong tmp; + char tmp_str[17]; + int ret; + y_keyvalue_t *kv; + swf_object_t *swf = get_swf_object(getThis() TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &arr) == FAILURE) { + RETURN_FALSE; + } + kv = y_keyvalue_open(); + + arr_hash = Z_ARRVAL_P(arr); + zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(arr), &pos); + while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **)&entry, & + pos) == SUCCESS) { + str_value = Z_STRVAL_PP(entry); + str_value_len = Z_STRLEN_PP(entry); + ret = zend_hash_get_current_key_ex(Z_ARRVAL_P(arr), &str_key, & + str_key_len, &tmp, 0, &pos); + switch (ret) { + case HASH_KEY_IS_STRING: + y_keyvalue_set(kv, str_key, str_key_len - 1, str_value, str_value_len); + break; + case HASH_KEY_IS_LONG: + snprintf(tmp_str, 17, "%ld\0", tmp); + y_keyvalue_set(kv, tmp_str, strlen(tmp_str), str_value, str_value_len); + break; + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array keys invalid type(%d).", ret); + } + zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos); + } + swf_object_insert_action_setvariables(swf, kv); + y_keyvalue_close(kv); RETURN_TRUE; } diff --git a/src/php_swfed.h b/src/php_swfed.h index ec3fcc5..100d62d 100644 --- a/src/php_swfed.h +++ b/src/php_swfed.h @@ -74,7 +74,7 @@ PHP_METHOD(swfed, getEditString); PHP_METHOD(swfed, replaceEditString); PHP_METHOD(swfed, getActionData); PHP_METHOD(swfed, disasmActionData); -PHP_METHOD(swfed, insertActionSetVariables); +PHP_METHOD(swfed, setActionVariables); PHP_METHOD(swfed, swfInfo); /* diff --git a/src/swf_object.c b/src/swf_object.c index 0d32e9f..d00b9c6 100644 --- a/src/swf_object.c +++ b/src/swf_object.c @@ -640,9 +640,36 @@ swf_object_get_actiondata(swf_object_t *swf, unsigned long *length, int tag_seqn int swf_object_insert_action_setvariables(swf_object_t *swf, - char **keys, char **values, int size) { - // - return 0; + y_keyvalue_t *kv) { + swf_tag_t *tag, *prev_tag = NULL, *next_tag = NULL; + if (swf == NULL) { + fprintf(stderr, "swf_object_insert_action_setvariables: swf == NULL\n"); + return 1; // NG + } + for (tag=swf->tag ; tag ; tag=tag->next) { + if ((tag->tag != 69) && (tag->tag != 9)) { // FileAttributs or SetBackgroundColor + next_tag = tag; + break; + } + prev_tag = tag; + } + if (next_tag == NULL) { + fprintf(stderr, "swf_object_insert_action_setvariables: next_tag == NULL\n"); + return 1; + } + tag = swf_tag_create_action_setvariables(kv); + if (tag == NULL) { + fprintf(stderr, "swf_object_insert_action_setvariables: swf_tag_create_action_setvariables failed\n"); + return 1;// NG + } + if (prev_tag == NULL) { + swf->tag = tag; + tag->next = next_tag; + } else { + prev_tag->next = tag; + tag->next = next_tag; + } + return 0; // SUCCESS } diff --git a/src/swf_object.h b/src/swf_object.h index bc266bb..b8b0080 100644 --- a/src/swf_object.h +++ b/src/swf_object.h @@ -7,6 +7,7 @@ #ifndef __SWF_OBJECT_H__ #define __SWF_OBJECT_H__ +#include "y_keyvalue.h" #include "swf_header.h" #include "swf_header.h" #include "swf_tag.h" @@ -82,8 +83,7 @@ extern int swf_object_replace_editstring(swf_object_t *swf, int initial_text_len); extern unsigned char *swf_object_get_actiondata(swf_object_t *swf, unsigned long *length, int tag_seqno); extern int swf_object_insert_action_setvariables(swf_object_t *swf, - char **keys, char **values, - int size); + y_keyvalue_t *kv); extern int swf_object_apply_shapematrix_factor(swf_object_t *swf,int shape_id, diff --git a/src/swf_tag.c b/src/swf_tag.c index 5e33aac..d5afa61 100644 --- a/src/swf_tag.c +++ b/src/swf_tag.c @@ -799,3 +799,19 @@ swf_tag_apply_shape_type_tilled(swf_tag_t *tag, int shape_id, return result; } + +swf_tag_t * +swf_tag_create_action_setvariables(y_keyvalue_t *kv) { + int ret; + swf_tag_t *tag = calloc(sizeof(*tag), 1); + tag->tag = 12; // DoAction + swf_tag_info_t *tag_info = get_swf_tag_info(tag->tag); + swf_tag_detail_handler_t *detail_handler = tag_info->detail_handler(); + tag->detail = detail_handler->create(); + ret = swf_tag_action_create_setvaribles(tag, kv); + if (ret) { + swf_tag_destroy(tag); + return 0; + } + return tag; +} diff --git a/src/swf_tag.h b/src/swf_tag.h index 1059f69..38c0af3 100644 --- a/src/swf_tag.h +++ b/src/swf_tag.h @@ -8,6 +8,8 @@ #define __SWF_TAG_H__ #include "bitstream.h" +#include "y_keyvalue.h" + struct swf_object_; // swf_object.h typedef struct swf_tag_ { @@ -103,4 +105,6 @@ extern int swf_tag_apply_shape_rect_factor(swf_tag_t *tag, int shape_id, extern int swf_tag_apply_shape_type_tilled(swf_tag_t *tag, int shape_id, struct swf_object_ *swf); +extern swf_tag_t *swf_tag_create_action_setvariables(y_keyvalue_t *kv); + #endif /* __SWF_TAG_H__ */ diff --git a/src/swf_tag_action.c b/src/swf_tag_action.c index 311e355..d3f9d46 100644 --- a/src/swf_tag_action.c +++ b/src/swf_tag_action.c @@ -127,3 +127,36 @@ swf_tag_action_destroy_detail(swf_tag_t *tag) { } return ; } + +int +swf_tag_action_create_setvaribles(swf_tag_t *tag, y_keyvalue_t *kv) { + bitstream_t *bs; + char *key, *value; + int key_len, value_len; + unsigned long data_len; + swf_tag_action_detail_t *swf_tag_action = (swf_tag_action_detail_t *) tag->detail; + swf_tag_action->action_sprite = 0; + bs = bitstream_open(); + + y_keyvalue_rewind(kv); + while (y_keyvalue_next(kv)) { + key = y_keyvalue_get_currentkey(kv, &key_len); + value = y_keyvalue_get_currentvalue(kv, &value_len); + bitstream_putbyte(bs, 0x96); // Push Data + bitstream_putbytesLE(bs, key_len + 2 , 2); + bitstream_putbyte(bs, 0); + bitstream_putstring(bs, key, key_len); + bitstream_putbyte(bs, 0); + bitstream_putbyte(bs, 0x96); // Push Data + bitstream_putbytesLE(bs, value_len + 2 , 2); + bitstream_putbyte(bs, 0); + bitstream_putstring(bs, value, value_len); + bitstream_putbyte(bs, 0); + bitstream_putbyte(bs, 0x1d); // Set Variable + } + bitstream_putbyte(bs, 0); // End + swf_tag_action->action_record = bitstream_steal(bs, &data_len); + swf_tag_action->action_record_len = data_len; + bitstream_close(bs); + return 0; +} diff --git a/src/swf_tag_action.h b/src/swf_tag_action.h index 881ebc6..32be3fd 100644 --- a/src/swf_tag_action.h +++ b/src/swf_tag_action.h @@ -30,4 +30,6 @@ extern void swf_tag_action_print_detail(swf_tag_t *tag, int indent_depth); extern void swf_tag_action_destroy_detail(swf_tag_t *tag); +extern int swf_tag_action_create_setvaribles(swf_tag_t *tag, y_keyvalue_t *kv); + #endif /* __SWF_TAG_ACTION__H__ */ -- 2.11.0