Пример #1
0
        ActionBase IActionVisitor <ushort, ActionBase> .Visit(ActionDefineFunction2 action, ushort length)
        {
            action.Name = _reader.ReadString();
            var args = _reader.ReadUInt16();

            action.RegisterCount = _reader.ReadByte();

            action.PreloadParent     = _reader.ReadBit();
            action.PreloadRoot       = _reader.ReadBit();
            action.SuppressSuper     = _reader.ReadBit();
            action.PreloadSuper      = _reader.ReadBit();
            action.SuppressArguments = _reader.ReadBit();
            action.PreloadArguments  = _reader.ReadBit();
            action.SuppressThis      = _reader.ReadBit();
            action.PreloadThis       = _reader.ReadBit();
            action.Reserved          = (byte)_reader.ReadUnsignedBits(7);
            action.PreloadGlobal     = _reader.ReadBit();

            for (var i = 0; i < args; i++)
            {
                action.Parameters.Add(new RegisterParam {
                    Register = _reader.ReadByte(),
                    Name     = _reader.ReadString()
                });
            }
            var codeSize = _reader.ReadUInt16();
            var pos      = _reader.Position;

            while ((_reader.Position - pos) < codeSize)
            {
                var subaction = ReadAction();
                action.Actions.Add(subaction);
            }
            return(action);
        }
Пример #2
0
        object IActionVisitor <ISwfStreamWriter, object> .Visit(ActionDefineFunction2 action, ISwfStreamWriter writer)
        {
            writer.WriteString(action.Name ?? "");
            writer.WriteUInt16((ushort)action.Parameters.Count);
            writer.WriteByte(action.RegisterCount);

            writer.WriteBit(action.PreloadParent);
            writer.WriteBit(action.PreloadRoot);
            writer.WriteBit(action.SuppressSuper);
            writer.WriteBit(action.PreloadSuper);
            writer.WriteBit(action.SuppressArguments);
            writer.WriteBit(action.PreloadArguments);
            writer.WriteBit(action.SuppressThis);
            writer.WriteBit(action.PreloadThis);
            writer.WriteUnsignedBits(action.Reserved, 7);
            writer.WriteBit(action.PreloadGlobal);

            foreach (var arg in action.Parameters)
            {
                writer.WriteByte(arg.Register);
                writer.WriteString(arg.Name);
            }

            var mem       = new MemoryStream();
            var subWriter = new ActionWriter(new SwfStreamWriter(mem));

            foreach (var subAction in action.Actions)
            {
                subWriter.WriteAction(subAction);
            }

            writer.WriteUInt16((ushort)mem.Length);

            return(mem.ToArray());
        }