示例#1
0
		public LuaObject Receive(IMessageQueue queue, int position)
		{
			var messageId = queue.ReadInt32(position);
			var message = this.registry.GetDefinition(messageId);
			Dictionary<LuaObject, LuaObject> table = new Dictionary<LuaObject, LuaObject>();
			foreach (var property in message.Properties)
			{
				var key = LuaObject.FromString(property.Name);
				switch (property.PropertyType)
				{
					case PropertyTypes.Int32:
						table[key] = LuaObject.FromNumber(queue.ReadInt32(position + property.Offset));
						break;
					case PropertyTypes.Single:
						table[key] = LuaObject.FromNumber(queue.ReadFloat(position + property.Offset));
						break;
					case PropertyTypes.String:
						table[key] =
							LuaObject.FromString(
								ExtensionMethods.ReadStringContent(queue, position + queue.ReadInt32(position + property.Offset)));
						break;
					default:
						throw new NotImplementedException();
				}
			}
			return LuaObject.FromTable(table);
		}
示例#2
0
		public static string ReadStringContent(IMessageQueue queue, int contentIndex)
		{
			//TODO: avoid list allocation.
			var res = new List<byte>(32);
			for (;;)
			{
				int val = queue.ReadInt32(contentIndex);
				++contentIndex;

				byte b;
				b = (byte)(val & 255);
				if (b == 0)
				{
					break;
				}
				res.Add(b);
				b = (byte)((val >> 8) & 255);
				if (b == 0)
				{
					break;
				}
				res.Add(b);
				b = (byte)((val >> 16) & 255);
				if (b == 0)
				{
					break;
				}
				res.Add(b);
				b = (byte)((val >> 24) & 255);
				if (b == 0)
				{
					break;
				}
				res.Add(b);
			}
			var array = res.ToArray();
			return Encoding.UTF8.GetString(array, 0, array.Length);
		}