diff options
Diffstat (limited to 'Src/Plugins/Input/in_swf/SWFParameters.cpp')
-rw-r--r-- | Src/Plugins/Input/in_swf/SWFParameters.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_swf/SWFParameters.cpp b/Src/Plugins/Input/in_swf/SWFParameters.cpp new file mode 100644 index 00000000..9f272e6b --- /dev/null +++ b/Src/Plugins/Input/in_swf/SWFParameters.cpp @@ -0,0 +1,104 @@ +#include "SWFParameters.h" +#include "../xml/obj_xml.h" +#include <locale.h> + +/* +example: +<invoke name="Benski" returntype="xml"> +<arguments> +</arguments> +</invoke> +*/ + +SWFParameters::SWFParameters(obj_xml *_parser) +{ + parser = _parser; + parser->xmlreader_setCaseSensitive(); + parser->xmlreader_registerCallback(L"invoke", this); + parser->xmlreader_registerCallback(L"invoke\farguments\f*", this); + parser->xmlreader_registerCallback(L"invoke\farguments\f*", ¤tParameter); + functionName=0; + C_locale = _create_locale(LC_NUMERIC, "C"); +} + +SWFParameters::~SWFParameters() +{ + for (ArgumentList::iterator itr=arguments.begin();itr!=arguments.end();itr++) + { + SWFArgument *argument = *itr; + free(argument->type); + free(argument->value); + free(argument); + } + arguments.clear(); + parser->xmlreader_unregisterCallback(this); + parser->xmlreader_unregisterCallback(¤tParameter); +} + +void SWFParameters::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params) +{ + if (!wcscmp(xmlpath, L"invoke")) + { + const wchar_t *name = params->getItemValue(L"name"); + if (name) + functionName = _wcsdup(name); + } +} + +void SWFParameters::EndTag(const wchar_t *xmlpath, const wchar_t *xmltag) +{ + if (!wcsncmp(xmlpath, L"invoke\farguments\f", 6 /*invoke*/+ 1/*\f*/ + 9/*arguments*/ + 1/*\f*/)) + { + SWFArgument *argument = new SWFArgument; + argument->type = _wcsdup(xmltag); + const wchar_t *value = currentParameter.GetString(); + if (value) + argument->value = _wcsdup(value); + else + argument->value = 0; + arguments.push_back(argument); + } +} + +bool SWFParameters::GetUnsigned(size_t index, unsigned int *value) +{ + if (index < arguments.size()) + { + SWFArgument *argument = arguments[index]; + if (argument && argument->type && !wcscmp(argument->type, L"number")) + { + const wchar_t *val = argument->value; + if (val) + { + *value = wcstoul(val, 0, 10); + return true; + } + } + } + return false; +} + +bool SWFParameters::GetDouble(size_t index, double *value) +{ + if (index < arguments.size()) + { + SWFArgument *argument = arguments[index]; + if (argument && argument->type && !wcscmp(argument->type, L"number")) + { + const wchar_t *val = argument->value; + if (val) + { + *value = _wtof_l(val, C_locale); + return true; + } + } + } + return false; +} + +#define CBCLASS SWFParameters +START_DISPATCH; +VCB(ONSTARTELEMENT, StartTag) +VCB(ONENDELEMENT, EndTag) +END_DISPATCH; +#undef CBCLASS
\ No newline at end of file |