예제 #1
0
        public byte[] SerializeObjectToBytes(IMarshallable obj)
        {
            ObjectTokens Token = GetTypeTokenFromObject(obj);

            switch (Token)
            {
            case ObjectTokens.NoObject:
                throw new InvalidOperationException("SerializeObject called with NoObject.");

            case ObjectTokens.Enq:
                return(new CommsSerializationHelper <EnqObject>().SerializeToBytes((EnqObject)obj));

            case ObjectTokens.Ack:
                return(new CommsSerializationHelper <AckObject>().SerializeToBytes((AckObject)obj));

            case ObjectTokens.MessageString:
                return(new CommsSerializationHelper <MessageString>().SerializeToBytes((MessageString)obj));

            case ObjectTokens.PositionInfo:
                return(new CommsSerializationHelper <PositionInfo>().SerializeToBytes((PositionInfo)obj));

            case ObjectTokens.BaseUnitInfo:
                return(new CommsSerializationHelper <BaseUnitInfo>().SerializeToBytes((BaseUnitInfo)obj));

            case ObjectTokens.GroupInfo:
                return(new CommsSerializationHelper <GroupInfo>().SerializeToBytes((GroupInfo)obj));

            case ObjectTokens.DetectedGroupInfo:
                return(new CommsSerializationHelper <DetectedGroupInfo>().SerializeToBytes((DetectedGroupInfo)obj));

            case ObjectTokens.DetectedUnitInfo:
                return(new CommsSerializationHelper <DetectedUnitInfo>().SerializeToBytes((DetectedUnitInfo)obj));

            case ObjectTokens.DetecedUnitSensorInfo:
                return(new CommsSerializationHelper <DetecedUnitSensorInfo>().SerializeToBytes((DetecedUnitSensorInfo)obj));

            case ObjectTokens.GameInfo:
                return(new CommsSerializationHelper <GameInfo>().SerializeToBytes((GameInfo)obj));

            case ObjectTokens.GameStateInfo:
                return(new CommsSerializationHelper <GameStateInfo>().SerializeToBytes((GameStateInfo)obj));

            case ObjectTokens.BattleDamageReport:
                return(new CommsSerializationHelper <BattleDamageReport>().SerializeToBytes((BattleDamageReport)obj));

            case ObjectTokens.Formation:
                return(new CommsSerializationHelper <Formation>().SerializeToBytes((Formation)obj));

            case ObjectTokens.FormationPosition:
                return(new CommsSerializationHelper <FormationPosition>().SerializeToBytes((FormationPosition)obj));

            case ObjectTokens.MessageInfo:
                return(new CommsSerializationHelper <MessageInfo>().SerializeToBytes((MessageInfo)obj));

            //case ObjectTokens.OrderInfo:
            //    break;
            case ObjectTokens.UnitOrder:
                return(new CommsSerializationHelper <UnitOrder>().SerializeToBytes((UnitOrder)obj));

            case ObjectTokens.UnitEngagementOrder:
                return(new CommsSerializationHelper <UnitEngagementOrder>().SerializeToBytes((UnitEngagementOrder)obj));

            case ObjectTokens.UnitMovementOrder:
                return(new CommsSerializationHelper <UnitMovementOrder>().SerializeToBytes((UnitMovementOrder)obj));

            case ObjectTokens.PlayerInfo:
                return(new CommsSerializationHelper <PlayerInfo>().SerializeToBytes((PlayerInfo)obj));

            case ObjectTokens.SensorClass:
                return(new CommsSerializationHelper <SensorClass>().SerializeToBytes((SensorClass)obj));

            case ObjectTokens.UnitClass:
                return(new CommsSerializationHelper <UnitClass>().SerializeToBytes((UnitClass)obj));

            case ObjectTokens.WeaponClass:
                return(new CommsSerializationHelper <WeaponClass>().SerializeToBytes((WeaponClass)obj));

            case ObjectTokens.ClientInfoRequest:
                return(new CommsSerializationHelper <ClientInfoRequest>().SerializeToBytes((ClientInfoRequest)obj));

            case ObjectTokens.GameControlRequest:
                return(new CommsSerializationHelper <GameControlRequest>().SerializeToBytes((GameControlRequest)obj));

            case ObjectTokens.GameScenario:
                return(new CommsSerializationHelper <GameScenario>().SerializeToBytes((GameScenario)obj));

            case ObjectTokens.GameScenarioCarriedUnit:
                return(new CommsSerializationHelper <GameScenarioCarriedUnit>().SerializeToBytes((GameScenarioCarriedUnit)obj));

            case ObjectTokens.WeatherSystemInfo:
                return(new CommsSerializationHelper <WeatherSystemInfo>().SerializeToBytes((WeatherSystemInfo)obj));

            case ObjectTokens.NWDateTime:
                return(new CommsSerializationHelper <NWDateTime>().SerializeToBytes((NWDateTime)obj));

            case ObjectTokens.WaypointInfo:
                return(new CommsSerializationHelper <WaypointInfo>().SerializeToBytes((WaypointInfo)obj));

            case ObjectTokens.HighLevelOrder:
                return(new CommsSerializationHelper <HighLevelOrder>().SerializeToBytes((HighLevelOrder)obj));

            case ObjectTokens.GameUiControl:
                return(new CommsSerializationHelper <GameUiControl>().SerializeToBytes((GameUiControl)obj));

            case ObjectTokens.EventTrigger:
                return(new CommsSerializationHelper <EventTrigger>().SerializeToBytes((EventTrigger)obj));

            case ObjectTokens.RegionInfo:
                return(new CommsSerializationHelper <RegionInfo>().SerializeToBytes((RegionInfo)obj));

            case ObjectTokens.Campaign:
                return(new CommsSerializationHelper <Campaign>().SerializeToBytes((Campaign)obj));

            case ObjectTokens.User:
                return(new CommsSerializationHelper <User>().SerializeToBytes((User)obj));

            case ObjectTokens.AiHintInfo:
                return(new CommsSerializationHelper <AIHintInfo>().SerializeToBytes((AIHintInfo)obj));

            case ObjectTokens.PlayerObjective:
                return(new CommsSerializationHelper <PlayerObjective>().SerializeToBytes((PlayerObjective)obj));

            case ObjectTokens.SteamClientInitiateConnection:
                return(new CommsSerializationHelper <SteamClientInitiateConnection>().SerializeToBytes(( SteamClientInitiateConnection )obj));

            case ObjectTokens.SteamGameServerInfo:
                return(new CommsSerializationHelper <SteamGameServerInfo>().SerializeToBytes(( SteamGameServerInfo )obj));

            case ObjectTokens.SteamClientBeginAuthentication:
                return(new CommsSerializationHelper <SteamClientBeginAuthentication>().SerializeToBytes(( SteamClientBeginAuthentication )obj));

            case ObjectTokens.SteamServerPassAuthentication:
                return(new CommsSerializationHelper <SteamServerPassAuthentication>().SerializeToBytes(( SteamServerPassAuthentication )obj));

            case ObjectTokens.ClientLeavingServer:
                return(new CommsSerializationHelper <ClientLeavingServer>().SerializeToBytes(( ClientLeavingServer )obj));

            case ObjectTokens.ServerExiting:
                return(new CommsSerializationHelper <ServerExiting>().SerializeToBytes(( ServerExiting )obj));

            default:
                throw new InvalidOperationException("SerializeObject called with unknown object. " + obj.ObjectTypeToken);
            }
        }
예제 #2
0
        /**
         * @brief Take an object file created by ScriptObjWriter() and convert it to a series of dynamic methods.
         * @param sdTypes   = script-defined types
         * @param objReader = where to read object file from (as written by ScriptObjWriter above).
         * @param scriptObjCode.EndMethod = called for each method defined at the end of the methods definition
         * @param objectTokens = write disassemble/decompile data (or null if not wanted)
         */
        public static void CreateObjCode(Dictionary <string, TokenDeclSDType> sdTypes, BinaryReader objReader,
                                         ScriptObjCode scriptObjCode, ObjectTokens objectTokens)
        {
            Dictionary <string, DynamicMethod> methods = new Dictionary <string, DynamicMethod>();
            DynamicMethod                  method      = null;
            ILGenerator                    ilGen       = null;
            Dictionary <int, Label>        labels      = new Dictionary <int, Label>();
            Dictionary <int, LocalBuilder> locals      = new Dictionary <int, LocalBuilder>();
            Dictionary <int, string>       labelNames  = new Dictionary <int, string>();
            Dictionary <int, string>       localNames  = new Dictionary <int, string>();

            object[] ilGenArg = new object[1];
            int      offset   = 0;
            Dictionary <int, ScriptSrcLoc> srcLocs = null;
            string srcFile = "";
            int    srcLine = 0;
            int    srcPosn = 0;

            while (true)
            {
                // Get IL instruction offset at beginning of instruction.
                offset = 0;
                if ((ilGen != null) && (monoGetCurrentOffset != null))
                {
                    offset = (int)monoGetCurrentOffset.Invoke(null, ilGenArg);
                }

                // Read and decode next internal format code from input file (.xmrobj file).
                ScriptObjWriterCode code = (ScriptObjWriterCode)objReader.ReadByte();
                switch (code)
                {
                // Reached end-of-file so we are all done.
                case ScriptObjWriterCode.TheEnd:
                    return;

                // Beginning of method's contents.
                // Method must have already been declared via DclMethod
                // so all we need is its name to retrieve from methods[].
                case ScriptObjWriterCode.BegMethod:
                {
                    string methName = objReader.ReadString();

                    method      = methods[methName];
                    ilGen       = method.GetILGenerator();
                    ilGenArg[0] = ilGen;

                    labels.Clear();
                    locals.Clear();
                    labelNames.Clear();
                    localNames.Clear();

                    srcLocs = new Dictionary <int, ScriptSrcLoc>();
                    if (objectTokens != null)
                    {
                        objectTokens.BegMethod(method);
                    }
                    break;
                }

                // End of method's contents (ie, an OpCodes.Ret was probably just output).
                // Call the callback to tell it the method is complete, and it can do whatever
                // it wants with the method.
                case ScriptObjWriterCode.EndMethod:
                {
                    ilGen       = null;
                    ilGenArg[0] = null;
                    scriptObjCode.EndMethod(method, srcLocs);
                    srcLocs = null;
                    if (objectTokens != null)
                    {
                        objectTokens.EndMethod();
                    }
                    break;
                }

                // Declare a label for branching to.
                case ScriptObjWriterCode.DclLabel:
                {
                    int    number = objReader.ReadInt32();
                    string name   = objReader.ReadString();

                    labels.Add(number, ilGen.DefineLabel());
                    labelNames.Add(number, name + "_" + number.ToString());
                    if (objectTokens != null)
                    {
                        objectTokens.DefineLabel(number, name);
                    }
                    break;
                }

                // Declare a local variable to store into.
                case ScriptObjWriterCode.DclLocal:
                {
                    int    number = objReader.ReadInt32();
                    string name   = objReader.ReadString();
                    string type   = objReader.ReadString();
                    Type   syType = GetTypeFromStr(sdTypes, type);

                    locals.Add(number, ilGen.DeclareLocal(syType));
                    localNames.Add(number, name + "_" + number.ToString());
                    if (objectTokens != null)
                    {
                        objectTokens.DefineLocal(number, name, type, syType);
                    }
                    break;
                }

                // Declare a method that will subsequently be defined.
                // We create the DynamicMethod object at this point in case there
                // are forward references from other method bodies.
                case ScriptObjWriterCode.DclMethod:
                {
                    string methName = objReader.ReadString();
                    Type   retType  = GetTypeFromStr(sdTypes, objReader.ReadString());
                    int    nArgs    = objReader.ReadInt32();

                    Type[]   argTypes = new Type[nArgs];
                    string[] argNames = new string[nArgs];
                    for (int i = 0; i < nArgs; i++)
                    {
                        argTypes[i] = GetTypeFromStr(sdTypes, objReader.ReadString());
                        argNames[i] = objReader.ReadString();
                    }
                    methods.Add(methName, new DynamicMethod(methName, retType, argTypes));
                    if (objectTokens != null)
                    {
                        objectTokens.DefineMethod(methName, retType, argTypes, argNames);
                    }
                    break;
                }

                // Mark a previously declared label at this spot.
                case ScriptObjWriterCode.MarkLabel:
                {
                    int number = objReader.ReadInt32();

                    ilGen.MarkLabel(labels[number]);

                    if (objectTokens != null)
                    {
                        objectTokens.MarkLabel(offset, number);
                    }
                    break;
                }

                // Try/Catch blocks.
                case ScriptObjWriterCode.BegExcBlk:
                {
                    ilGen.BeginExceptionBlock();
                    if (objectTokens != null)
                    {
                        objectTokens.BegExcBlk(offset);
                    }
                    break;
                }

                case ScriptObjWriterCode.BegCatBlk:
                {
                    Type excType = GetTypeFromStr(sdTypes, objReader.ReadString());
                    ilGen.BeginCatchBlock(excType);
                    if (objectTokens != null)
                    {
                        objectTokens.BegCatBlk(offset, excType);
                    }
                    break;
                }

                case ScriptObjWriterCode.BegFinBlk:
                {
                    ilGen.BeginFinallyBlock();
                    if (objectTokens != null)
                    {
                        objectTokens.BegFinBlk(offset);
                    }
                    break;
                }

                case ScriptObjWriterCode.EndExcBlk:
                {
                    ilGen.EndExceptionBlock();
                    if (objectTokens != null)
                    {
                        objectTokens.EndExcBlk(offset);
                    }
                    break;
                }

                // Emit an opcode with no operand.
                case ScriptObjWriterCode.EmitNull:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);

                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitNull(offset, opCode);
                    }
                    break;
                }

                // Emit an opcode with a FieldInfo operand.
                case ScriptObjWriterCode.EmitField:
                {
                    OpCode opCode        = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    Type   reflectedType = GetTypeFromStr(sdTypes, objReader.ReadString());
                    string fieldName     = objReader.ReadString();

                    FieldInfo field = reflectedType.GetField(fieldName);
                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, field);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitField(offset, opCode, field);
                    }
                    break;
                }

                // Emit an opcode with a LocalBuilder operand.
                case ScriptObjWriterCode.EmitLocal:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    int    number = objReader.ReadInt32();
                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, locals[number]);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitLocal(offset, opCode, number);
                    }
                    break;
                }

                // Emit an opcode with a Type operand.
                case ScriptObjWriterCode.EmitType:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    string name   = objReader.ReadString();
                    Type   type   = GetTypeFromStr(sdTypes, name);

                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, type);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitType(offset, opCode, type);
                    }
                    break;
                }

                // Emit an opcode with a Label operand.
                case ScriptObjWriterCode.EmitLabel:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    int    number = objReader.ReadInt32();

                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, labels[number]);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitLabel(offset, opCode, number);
                    }
                    break;
                }

                // Emit an opcode with a Label array operand.
                case ScriptObjWriterCode.EmitLabels:
                {
                    OpCode  opCode  = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    int     nLabels = objReader.ReadInt32();
                    Label[] lbls    = new Label[nLabels];
                    int[]   nums    = new int[nLabels];
                    for (int i = 0; i < nLabels; i++)
                    {
                        nums[i] = objReader.ReadInt32();
                        lbls[i] = labels[nums[i]];
                    }

                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, lbls);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitLabels(offset, opCode, nums);
                    }
                    break;
                }

                // Emit an opcode with a MethodInfo operand (such as a call) of an external function.
                case ScriptObjWriterCode.EmitMethodExt:
                {
                    OpCode opCode   = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    string methName = objReader.ReadString();
                    Type   methType = GetTypeFromStr(sdTypes, objReader.ReadString());
                    int    nArgs    = objReader.ReadInt32();

                    Type[] argTypes = new Type[nArgs];
                    for (int i = 0; i < nArgs; i++)
                    {
                        argTypes[i] = GetTypeFromStr(sdTypes, objReader.ReadString());
                    }
                    MethodInfo methInfo = methType.GetMethod(methName, argTypes);
                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, methInfo);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitMethod(offset, opCode, methInfo);
                    }
                    break;
                }

                // Emit an opcode with a MethodInfo operand of an internal function
                // (previously declared via DclMethod).
                case ScriptObjWriterCode.EmitMethodInt:
                {
                    OpCode opCode   = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    string methName = objReader.ReadString();

                    MethodInfo methInfo = methods[methName];
                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, methInfo);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitMethod(offset, opCode, methInfo);
                    }
                    break;
                }

                // Emit an opcode with a ConstructorInfo operand.
                case ScriptObjWriterCode.EmitCtor:
                {
                    OpCode opCode   = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    Type   ctorType = GetTypeFromStr(sdTypes, objReader.ReadString());
                    int    nArgs    = objReader.ReadInt32();
                    Type[] argTypes = new Type[nArgs];
                    for (int i = 0; i < nArgs; i++)
                    {
                        argTypes[i] = GetTypeFromStr(sdTypes, objReader.ReadString());
                    }

                    ConstructorInfo ctorInfo = ctorType.GetConstructor(argTypes);
                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, ctorInfo);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitCtor(offset, opCode, ctorInfo);
                    }
                    break;
                }

                // Emit an opcode with a constant operand of various types.
                case ScriptObjWriterCode.EmitDouble:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    double value  = objReader.ReadDouble();

                    if (opCode != OpCodes.Ldc_R8)
                    {
                        throw new Exception("bad opcode " + opCode.ToString());
                    }
                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, value);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitDouble(offset, opCode, value);
                    }
                    break;
                }

                case ScriptObjWriterCode.EmitFloat:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    float  value  = objReader.ReadSingle();

                    if (opCode != OpCodes.Ldc_R4)
                    {
                        throw new Exception("bad opcode " + opCode.ToString());
                    }
                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, value);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitFloat(offset, opCode, value);
                    }
                    break;
                }

                case ScriptObjWriterCode.EmitInteger:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    int    value  = objReader.ReadInt32();

                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);

                    if (opCode == OpCodes.Ldc_I4)
                    {
                        if ((value >= -1) && (value <= 8))
                        {
                            opCode = opCodesLdcI4M1P8[value + 1];
                            ilGen.Emit(opCode);
                            if (objectTokens != null)
                            {
                                objectTokens.EmitNull(offset, opCode);
                            }
                            break;
                        }
                        if ((value >= 0) && (value <= 127))
                        {
                            opCode = OpCodes.Ldc_I4_S;
                            ilGen.Emit(OpCodes.Ldc_I4_S, (sbyte)value);
                            goto pemitint;
                        }
                    }

                    ilGen.Emit(opCode, value);
pemitint:
                    if (objectTokens != null)
                    {
                        objectTokens.EmitInteger(offset, opCode, value);
                    }
                    break;
                }

                case ScriptObjWriterCode.EmitString:
                {
                    OpCode opCode = ReadOpCode(objReader, ref srcFile, ref srcLine, ref srcPosn);
                    string value  = objReader.ReadString();

                    SaveSrcLoc(srcLocs, offset, srcFile, srcLine, srcPosn);
                    ilGen.Emit(opCode, value);

                    if (objectTokens != null)
                    {
                        objectTokens.EmitString(offset, opCode, value);
                    }
                    break;
                }

                // Who knows what?
                default:
                    throw new Exception("bad ScriptObjWriterCode " + ((byte)code).ToString());
                }
            }
        }
예제 #3
0
        public IMarshallable DeSerializeNextObjectInReceiveBuffer()
        {
            if (!IsObjectInReceiveBuffer())
            {
                return(null);
            }
            ObjectTokens token  = GetTokenFromReceiveBuffer();
            int          Length = GetLengthFromReceiveBuffer();

            byte[] bytes = PopObjectBytesFromReceiveBuffer(Length);
            switch (token) //TODO: IMPLEMENT ALL!
            {
            case ObjectTokens.NoObject:
                break;

            case ObjectTokens.Enq:
                return(new CommsSerializationHelper <EnqObject>().DeserializeFromBytes(bytes));

            case ObjectTokens.Ack:
                return(new CommsSerializationHelper <AckObject>().DeserializeFromBytes(bytes));

            case ObjectTokens.MessageString:
                return(new CommsSerializationHelper <MessageString>().DeserializeFromBytes(bytes));

            case ObjectTokens.PositionInfo:
                return(new CommsSerializationHelper <PositionInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.BaseUnitInfo:
                return(new CommsSerializationHelper <BaseUnitInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.GroupInfo:
                return(new CommsSerializationHelper <GroupInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.DetectedGroupInfo:
                return(new CommsSerializationHelper <DetectedGroupInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.DetectedUnitInfo:
                return(new CommsSerializationHelper <DetectedUnitInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.DetecedUnitSensorInfo:
                return(new CommsSerializationHelper <DetecedUnitSensorInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.MessageInfo:
                return(new CommsSerializationHelper <MessageInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameInfo:
                return(new CommsSerializationHelper <GameInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameStateInfo:
                return(new CommsSerializationHelper <GameStateInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.BattleDamageReport:
                return(new CommsSerializationHelper <BattleDamageReport>().DeserializeFromBytes(bytes));

            case ObjectTokens.FormationPosition:
                return(new CommsSerializationHelper <FormationPosition>().DeserializeFromBytes(bytes));

            case ObjectTokens.Formation:
                return(new CommsSerializationHelper <Formation>().DeserializeFromBytes(bytes));

            case ObjectTokens.ClientInfoRequest:
                return(new CommsSerializationHelper <ClientInfoRequest>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameControlRequest:
                return(new CommsSerializationHelper <GameControlRequest>().DeserializeFromBytes(bytes));

            case ObjectTokens.UnitOrder:
                return(new CommsSerializationHelper <UnitOrder>().DeserializeFromBytes(bytes));

            case ObjectTokens.UnitMovementOrder:
                return(new CommsSerializationHelper <UnitMovementOrder>().DeserializeFromBytes(bytes));

            case ObjectTokens.UnitEngagementOrder:
                return(new CommsSerializationHelper <UnitEngagementOrder>().DeserializeFromBytes(bytes));

            case ObjectTokens.OrderInfo:
                //TODO: Add an orderinfo class to begin with
                return(null);

            case ObjectTokens.PlayerInfo:
                return(new CommsSerializationHelper <PlayerInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.SensorClass:
                return(new CommsSerializationHelper <SensorClass>().DeserializeFromBytes(bytes));

            case ObjectTokens.UnitClass:
                return(new CommsSerializationHelper <UnitClass>().DeserializeFromBytes(bytes));

            case ObjectTokens.WeaponClass:
                return(new CommsSerializationHelper <WeaponClass>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameScenario:
                return(new CommsSerializationHelper <GameScenario>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameScenarioAlliance:
                return(new CommsSerializationHelper <GameScenarioAlliance>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameScenarioPlayer:
                return(new CommsSerializationHelper <GameScenarioPlayer>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameScenarioGroup:
                return(new CommsSerializationHelper <GameScenarioGroup>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameScenarioUnit:
                return(new CommsSerializationHelper <GameScenarioUnit>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameScenarioCarriedUnit:
                return(new CommsSerializationHelper <GameScenarioCarriedUnit>().DeserializeFromBytes(bytes));

            case ObjectTokens.WeatherSystemInfo:
                return(new CommsSerializationHelper <WeatherSystemInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.NWDateTime:
                return(new CommsSerializationHelper <NWDateTime>().DeserializeFromBytes(bytes));

            case ObjectTokens.WaypointInfo:
                return(new CommsSerializationHelper <WaypointInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.HighLevelOrder:
                return(new CommsSerializationHelper <HighLevelOrder>().DeserializeFromBytes(bytes));

            case ObjectTokens.GameUiControl:
                return(new CommsSerializationHelper <GameUiControl>().DeserializeFromBytes(bytes));

            case ObjectTokens.EventTrigger:
                return(new CommsSerializationHelper <EventTrigger>().DeserializeFromBytes(bytes));

            case ObjectTokens.RegionInfo:
                return(new CommsSerializationHelper <RegionInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.User:
                return(new CommsSerializationHelper <User>().DeserializeFromBytes(bytes));

            case ObjectTokens.Campaign:
                return(new CommsSerializationHelper <Campaign>().DeserializeFromBytes(bytes));

            case ObjectTokens.AiHintInfo:
                return(new CommsSerializationHelper <AIHintInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.PlayerObjective:
                return(new CommsSerializationHelper <PlayerObjective>().DeserializeFromBytes(bytes));

            case ObjectTokens.SteamClientInitiateConnection:
                return(new CommsSerializationHelper <SteamClientInitiateConnection>().DeserializeFromBytes(bytes));

            case ObjectTokens.SteamGameServerInfo:
                return(new CommsSerializationHelper <SteamGameServerInfo>().DeserializeFromBytes(bytes));

            case ObjectTokens.SteamClientBeginAuthentication:
                return(new CommsSerializationHelper <SteamClientBeginAuthentication>().DeserializeFromBytes(bytes));

            case ObjectTokens.SteamServerPassAuthentication:
                return(new CommsSerializationHelper <SteamServerPassAuthentication>().DeserializeFromBytes(bytes));

            case ObjectTokens.ClientLeavingServer:
                return(new CommsSerializationHelper <ClientLeavingServer>().DeserializeFromBytes(bytes));

            case ObjectTokens.ServerExiting:
                return(new CommsSerializationHelper <ServerExiting>().DeserializeFromBytes(bytes));

            default:
                throw new InvalidOperationException("DeSerializeNextObjectInBuffer called with unknown object. "
                                                    + token.ToString());
            }
            return(null);
        }
예제 #4
0
        /**
         * @brief Fill in ScriptObjCode from an YEngine object file.
         *   'objFileReader' is a serialized form of the CIL code we generated
         *   'asmFileWriter' is where we write the disassembly to (or null if not wanted)
         *   'srcFileWriter' is where we write the decompilation to (or null if not wanted)
         * Throws an exception if there is any error (theoretically).
         */
        public ScriptObjCode(BinaryReader objFileReader, TextWriter asmFileWriter, TextWriter srcFileWriter)
        {
            // Check version number to make sure we know how to process file contents.
            char[] ocm = objFileReader.ReadChars(ScriptCodeGen.OBJECT_CODE_MAGIC.Length);
            if (new String(ocm) != ScriptCodeGen.OBJECT_CODE_MAGIC)
            {
                throw new CVVMismatchException("Not an Yengine object file (bad magic)");
            }

            int cvv = objFileReader.ReadInt32();

            if (cvv != ScriptCodeGen.COMPILED_VERSION_VALUE)
            {
                throw new CVVMismatchException(
                          "Object version is " + cvv.ToString() + " but accept only " + ScriptCodeGen.COMPILED_VERSION_VALUE.ToString());
            }
            // Fill in simple parts of scriptObjCode object.
            sourceHash = objFileReader.ReadString();
            glblSizes.ReadFromFile(objFileReader);
            int nStates = objFileReader.ReadInt32();

            stateNames = new string[nStates];
            for (int i = 0; i < nStates; i++)
            {
                stateNames[i] = objFileReader.ReadString();
                if (asmFileWriter != null)
                {
                    asmFileWriter.WriteLine("  state[{0}] = {1}", i, stateNames[i]);
                }
            }

            if (asmFileWriter != null)
            {
                glblSizes.WriteAsmFile(asmFileWriter, "numGbl");
            }

            string gblName;

            while ((gblName = objFileReader.ReadString()) != "")
            {
                string gblType  = objFileReader.ReadString();
                int    gblIndex = objFileReader.ReadInt32();
                Dictionary <int, string> names;
                if (!globalVarNames.TryGetValue(gblType, out names))
                {
                    names = new Dictionary <int, string>();
                    globalVarNames.Add(gblType, names);
                }
                names.Add(gblIndex, gblName);
                if (asmFileWriter != null)
                {
                    asmFileWriter.WriteLine("  {0} = {1}[{2}]", gblName, gblType, gblIndex);
                }
            }

            // Read in script-defined types.
            sdObjTypesName = new Dictionary <string, TokenDeclSDType>();
            sdDelTypes     = new Dictionary <Type, string>();
            int maxIndex = -1;

            while ((gblName = objFileReader.ReadString()) != "")
            {
                TokenDeclSDType sdt = TokenDeclSDType.ReadFromFile(sdObjTypesName,
                                                                   gblName, objFileReader, asmFileWriter);
                sdObjTypesName.Add(gblName, sdt);
                if (maxIndex < sdt.sdTypeIndex)
                {
                    maxIndex = sdt.sdTypeIndex;
                }
                if (sdt is TokenDeclSDTypeDelegate)
                {
                    sdDelTypes.Add(sdt.GetSysType(), gblName);
                }
            }
            sdObjTypesIndx = new TokenDeclSDType[maxIndex + 1];
            foreach (TokenDeclSDType sdt in sdObjTypesName.Values)
            {
                sdObjTypesIndx[sdt.sdTypeIndex] = sdt;
            }

            // Now fill in the methods (the hard part).
            scriptEventHandlerTable = new ScriptEventHandler[nStates, (int)ScriptEventCode.Size];
            dynamicMethods          = new Dictionary <string, DynamicMethod>();
            scriptSrcLocss          = new Dictionary <string, KeyValuePair <int, ScriptSrcLoc>[]>();

            ObjectTokens objectTokens = null;

            if (asmFileWriter != null)
            {
                objectTokens = new OTDisassemble(this, asmFileWriter);
            }
            else if (srcFileWriter != null)
            {
                objectTokens = new OTDecompile(this, srcFileWriter);
            }

            try
            {
                ScriptObjWriter.CreateObjCode(sdObjTypesName, objFileReader, this, objectTokens);
            }
            finally
            {
                if (objectTokens != null)
                {
                    objectTokens.Close();
                }
            }

            // We enter all script event handler methods in the ScriptEventHandler table.
            // They are named:  <statename> <eventname>
            foreach (KeyValuePair <string, DynamicMethod> kvp in dynamicMethods)
            {
                string methName = kvp.Key;
                int    i        = methName.IndexOf(' ');
                if (i < 0)
                {
                    continue;
                }
                string stateName = methName.Substring(0, i);
                string eventName = methName.Substring(++i);
                int    stateCode;
                for (stateCode = stateNames.Length; --stateCode >= 0;)
                {
                    if (stateNames[stateCode] == stateName)
                    {
                        break;
                    }
                }

                int eventCode = (int)Enum.Parse(typeof(ScriptEventCode), eventName);
                scriptEventHandlerTable[stateCode, eventCode] =
                    (ScriptEventHandler)kvp.Value.CreateDelegate(typeof(ScriptEventHandler));
            }

            // Fill in all script-defined class vtables.
            foreach (TokenDeclSDType sdt in sdObjTypesIndx)
            {
                if ((sdt != null) && (sdt is TokenDeclSDTypeClass))
                {
                    TokenDeclSDTypeClass sdtc = (TokenDeclSDTypeClass)sdt;
                    sdtc.FillVTables(this);
                }
            }
        }