private SessionMessageBase DeserializeMessage(SessionFragmentMessage fragment) { var type = SessionMessageTypeAttribute.GetTypeForMessageType(fragment.Header.SessionMessageType); if (type == null) { logger.LogTrace("Incoming decrypted has no impl: " + JsonConvert.SerializeObject(fragment, Formatting.Indented)); } var message = CreateFromMessageType(fragment.Header.SessionMessageType); if (fragment.Header.IsFragment) { message = new FragmentMessage(); } logger.LogTrace($"Received {message.GetType().Name} message"); message.Header.ChannelId = fragment.Header.ChannelId; message.Header.RequestAcknowledge = fragment.Header.RequestAcknowledge; message.Header.IsFragment = fragment.Header.IsFragment; message.Header.SessionMessageType = fragment.Header.SessionMessageType; message.Header.Version = fragment.Header.Version; message.Deserialize(new BEReader(fragment.Fragment)); return(message); }
public SessionMessageBase AssembleFragment(SessionMessageBase message, uint sequenceNumber) { FragmentMessage fragment = message as FragmentMessage; SessionMessageType messageType = fragment.Header.SessionMessageType; int sequenceBegin = (int)fragment.SequenceBegin; int sequenceEnd = (int)fragment.SequenceEnd; _fragmentQueue[(int)sequenceNumber] = fragment.Data; IEnumerable <int> neededSequences = Enumerable.Range(sequenceBegin, sequenceEnd - sequenceBegin); foreach (var seq in neededSequences) { if (!_fragmentQueue.ContainsKey(seq)) { return(null); } } EndianWriter writer = new EndianWriter(); foreach (int seq in neededSequences) { byte[] data = _fragmentQueue[seq]; writer.Write(data); _fragmentQueue.Remove(seq); } SessionMessageBase assembled = SessionMessageTransport.CreateFromMessageType(messageType); assembled.Deserialize(new EndianReader(writer.ToBytes())); return(assembled); }
void LoadFragment(int id) { Fragment fragment = null; switch (id) { case Resource.Id.menu_home: fragment = FragmentHome.NewInstance(); break; case Resource.Id.menu_add_location: fragment = FragmentAdd.NewInstance(); break; case Resource.Id.menu_message: fragment = FragmentMessage.NewInstance(); break; case Resource.Id.menu_settings: fragment = FragmentSettings.NewInstance(); break; } if (fragment == null) { return; } FragmentManager.BeginTransaction() .Replace(Resource.Id.content_frame, fragment) .Commit(); }
public SessionMessageBase AssembleFragment(SessionMessageBase message, uint sequenceNumber) { FragmentMessage fragment = message as FragmentMessage; SessionMessageType messageType = fragment.Header.SessionMessageType; int sequenceBegin = (int)fragment.SequenceBegin; int sequenceEnd = (int)fragment.SequenceEnd; _fragmentQueue[(int)sequenceNumber] = fragment.Data; IEnumerable <int> neededSequences = Enumerable.Range(sequenceBegin, sequenceEnd - sequenceBegin); BEWriter writer = new BEWriter(); foreach (int seq in neededSequences) { try { byte[] data = _fragmentQueue[seq]; writer.Write(data); } catch (KeyNotFoundException) { return(null); } } // Pop obsolete fragment data foreach (int seq in neededSequences) { _fragmentQueue.Remove(seq); } SessionMessageBase assembled = SessionMessageTransport.CreateFromMessageType(messageType); assembled.Deserialize(new BEReader(writer.ToBytes())); return(assembled); }
private void SendFragments(string message) { int total = Mathf.CeilToInt((float)message.Length / (float)maxPacketSize); for (int n = 0; n < total; n++) { int length = maxPacketSize; int i = n * maxPacketSize; if (length > message.Length - i) { length = message.Length - i; } var msgFragment = message.Substring(i, length); var fragment = new FragmentMessage { op = "fragment", data = msgFragment, id = fragmentId.ToString(), num = n, total = total }; Send(JsonUtility.ToJson(fragment)); } fragmentId++; }