using Google.Protobuf; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.Bson; using Tango.Core.ExtensionMethods; using Tango.Logging; using Tango.PMR; using Tango.PMR.Common; using Tango.PMR.DataStore; namespace Tango.DataStore { public class DataStoreProtoObject { [JsonConverter(typeof(StringEnumConverter))] public DataStoreMessageType MessageType { get; set; } public Type Type { get; set; } public byte[] Data { get; set; } private IMessage _message; [JsonIgnore] public IMessage Message { get { if (_message == null) { _message = MessageFactory.ParseProtoMessage(Data, Type); } return _message; } private set { _message = value; } } public byte[] ToBytes() { return BsonConvert.Serialize(this); } public static DataStoreProtoObject FromBytes(byte[] data) { try { var instance = BsonConvert.Deserialize(data); instance.Message = MessageFactory.ParseProtoMessage(instance.Data, instance.Type); return instance; } catch (Exception ex) { LogManager.Default.Log(ex, "Error creating data store proto object."); return null; } } public static DataStoreProtoObject FromMessage(IMessage message) { DataStoreProtoObject proto = new DataStoreProtoObject(); proto.Type = message.GetType(); proto.MessageType = MessageFactory.ParseDataStoreMessageType(proto.Type.Name); proto.Data = message.ToByteArray(); proto.Message = message; return proto; } public static DataStoreProtoObject FromJObject(JObject obj) { return (obj.ToObject()); } public static DataStoreProtoObject FromPMRDataStoreItem(DataStoreItem item) { DataStoreProtoObject proto = new DataStoreProtoObject(); proto.MessageType = item.ProtoType; proto.Type = MessageFactory.GetDataStorePMRTypeFromDataStoreMessageType(item.ProtoType); proto.Data = item.BytesValue.ToByteArray(); return proto; } public override string ToString() { return Message?.ToJsonString(); } } }