/// <summary> /// Copy message to other message queue. /// </summary> /// <param name="messageQueue">Soutce queue.</param> /// <param name="position">Position at source queue. Should be valid postion returned by messageQueue.ReadMessage()</param> /// <param name="destinationQueue">Destination queue.</param> public static void CopyTo(this IMessageQueue messageQueue, int position, IMessageQueue destinationQueue) { var len = messageQueue.GetSize(position); var targetPosition = destinationQueue.Allocate(len); for (int i = 0; i < len; ++i) { destinationQueue.WriteInt32(targetPosition + i, messageQueue.ReadInt32(i + position)); } destinationQueue.Commit(len); }
public void Send(IMessageQueue queue, LuaObject luaObject) { var id = (int)luaObject[LuaObject.FromString("MessageId")].AsNumber(); var message = this.registry.GetDefinition(id); var table = luaObject.AsTable(); int dynamicSize = 0; int foundProperties = 0; foreach (var property in message.Properties) { var serializer = this.luaTypeRegistry.GetSerializer(property.PropertyType); LuaObject propertyValue; if (table.TryGetValue(LuaObject.FromString(property.Name), out propertyValue)) { ++foundProperties; } dynamicSize += serializer.GetDynamicSize(queue, propertyValue); } var position = queue.Allocate(message.MinSize + dynamicSize); foreach (var keyValue in table) { var keyObject = keyValue.Key; int propertyKey = 0; if (keyObject.IsNumber) { propertyKey = (int)keyObject.AsNumber(); } else { propertyKey = Hash.Eval(keyObject.AsString()); } var property = message.GetPropertyById(propertyKey); switch (property.PropertyType) { case PropertyTypes.Int32: queue.WriteInt32(position + property.Offset, (int)keyValue.Value.AsNumber()); break; case PropertyTypes.Single: queue.WriteFloat(position + property.Offset, (float)keyValue.Value.AsNumber()); break; case PropertyTypes.String: queue.WriteInt32(position + property.Offset, message.MinSize); queue.WriteStringContent(position + message.MinSize, keyValue.Value.AsString()); break; default: throw new NotImplementedException(); } } queue.Commit(position); }