Exemplo n.º 1
0
        private IEnumerable <SessionContainer> ExtractCombinators(TcpTransport item)
        {
            var results = new List <SessionContainer>();

            // снимем шифрование
            var em = new EncryptedMessage(_settings.AuthKey, item.Payload);

            // если контейнер - вскроем его
            int crc32 = em.GetConstructorCrc();

            // Если контейнер
            // Простой контейнер содержит несколько сообщений следующим образом:
            // msg_container#73f1f8dc messages:vector message = MessageContainer;
            // Здесь message обозначает любое сообщение вместе с длиной и с msg_id:
            // message msg_id:long seqno:int bytes:int body:Object = Message;
            if (crc32 == 0x73f1f8dc)
            {
                // Распарсим все входные ответы
                using (var data = new MemoryStream(em.Data.MessageData))
                    using (var br = new BinaryReader(data))
                    {
                        br.ReadInt32();             // конструктор
                        int count = br.ReadInt32(); // количество сообщений внутри

                        for (int i = 0; i < count; i++)
                        {
                            br.ReadInt64();
                            br.ReadInt32();
                            int    msgLength = br.ReadInt32();
                            byte[] msg       = br.ReadBytes(msgLength);

                            // Внутри конструктора ожидаются следующие системные типы
                            //rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult;
                            //rpc_error#2144ca19 error_code:int error_message:string = RpcError;
                            //gzip_packed#3072cfa1 packed_data:string = Object;
                            // msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

                            // Сформируем инстанс комбинатора и внесем его в очередь
                            var temp = new SessionContainer(em.Data.SessionId, msg);
                            results.Add(temp);
                        }
                    }
            }
            else // простое сообщение
            {
                results.Add(new SessionContainer(em.Data.SessionId, em.Data.MessageData));
            }
            return(results);
        }