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); } }
/** * @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()); } } }
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); }
/** * @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); } } }