Example #1
0
            /// <summary>
            /// Minimal stream for empty DataPack
            /// </summary>
            /// <returns></returns>
            public static Stream Stream1()
            {
                var obj = new MemoryStream();

                using (var wraper = new NonClosingStreamWrapper(obj))
                    using (var bw = new BinaryWriter(wraper))
                    {
                        bw.Write((byte)0);   // Prefix size
                        bw.Write((byte)0);   // No sign
                        bw.Write((byte)1);   // Start of Info section
                        bw.Write((uint)2);   // Size of Info section
                        bw.Write((ushort)0); // Count of inner properties
                        bw.Write((byte)1);   // Start of Info section 2
                        bw.Write((uint)2);   // Size of Info section 2
                        bw.Write((ushort)0); // Count of headers
                        bw.Write((byte)1);   // Start of Info section 3
                        bw.Write((uint)2);   // Size of Info section 3
                        bw.Write((ushort)0); // Count of public properties
                        bw.Write((byte)1);   // Start of Info section 4
                        bw.Write((uint)2);   // Size of Info section 4
                        bw.Write((ushort)0); // Count of DataPart's
                        bw.Write((byte)2);   // Start of Data section
                        bw.Write((uint)0);   // Size of Data section
                    }

                return(obj);
            }
Example #2
0
        public TrackDetail GetTrackDetail(string songKey, string arrangmentName)
        {
            var sngEntry  = _psarc.Entries.FirstOrDefault(x => x.Name == @"songs/bin/generic/" + songKey + "_" + arrangmentName + ".sng");
            var jsonEntry = _psarc.Entries.FirstOrDefault(x => x.Name.StartsWith(@"manifests/songs") && x.Name.EndsWith("/" + songKey + "_" + arrangmentName + ".json"));

            if (sngEntry == null || jsonEntry == null)
            {
                return(null);
            }

            Attributes2014 att;

            using (var wrappedStream = new NonClosingStreamWrapper(jsonEntry.Data))
            {
                using (var reader = new StreamReader(wrappedStream))
                {
                    var manifest = JsonConvert.DeserializeObject <Manifest2014 <Attributes2014> >(reader.ReadToEnd());
                    att = manifest.Entries.ToArray()[0].Value.ToArray()[0].Value;
                }
            }

            Sng2014File sngFile;

            using (var wrappedStream = new NonClosingStreamWrapper(sngEntry.Data))
            {
                var platform = _archiveFile.GetPlatform();
                sngFile = Sng2014File.ReadSng(wrappedStream, platform);
            }
            var sngObject = new Song2014(sngFile, att);

            return(new TrackDetail()
            {
                RockSmithSong = sngObject
            });
        }
Example #3
0
        //RockSmithTrack har flere levels, vi lager alphatab track utifra et bestemt level
        public IList <RSSongInfo> GetAllSongInfos()
        {
            var src = _psarc.Entries.Where(x => x.Name.StartsWith(@"manifests/songs") && x.Name.EndsWith(".json"))
                      .OrderBy(x => x.Name);

            var        retValue        = new List <RSSongInfo>();
            RSSongInfo currentSongInfo = null;

            foreach (var entry in src)
            {
                var entryName           = System.IO.Path.GetFileNameWithoutExtension(entry.Name);
                var splitPoint          = entryName.LastIndexOf('_');
                var entrySongKey        = entryName.Substring(0, splitPoint);
                var entryArrangmentName = entryName.Substring(splitPoint + 1);

                if (currentSongInfo == null || entrySongKey != currentSongInfo.Key)
                {
                    string song_name, album_name, artist_name, song_year;
                    using (var wrappedStream = new NonClosingStreamWrapper(entry.Data))
                    {
                        using (var reader = new StreamReader(wrappedStream))
                        {
                            string  json       = reader.ReadToEnd();
                            JObject o          = JObject.Parse(json);
                            var     attributes = o["Entries"].First.Last["Attributes"];

                            song_name   = attributes["SongName"].ToString();
                            album_name  = attributes["AlbumName"].ToString();
                            artist_name = attributes["ArtistName"].ToString();
                            song_year   = attributes["SongYear"].ToString();
                        }
                    }

                    currentSongInfo = new RSSongInfo()
                    {
                        Key = entrySongKey, TrackInfos = new List <RSTrackInfo>(), SongName = song_name, AlbumName = album_name, ArtistName = artist_name, SongYear = song_year
                    };
                    retValue.Add(currentSongInfo);
                }
                var arrangmentInfo = new RSTrackInfo()
                {
                    Name = entryArrangmentName, FileSize = entry.Length
                };
                currentSongInfo.TrackInfos.Add(arrangmentInfo);
            }

            return(retValue);
        }
Example #4
0
        public void Send(string queryString)
        {
            _client = new TcpClient(_host, _port)
            {
                ReceiveTimeout = 5000,
                NoDelay        = true
            };


            URL = $"http://{_host}{queryString}";

            var headerString = new StringBuilder();

            headerString.AppendFormat("GET {0} HTTP/1.1\nHost: {1}\n", queryString, _host);

            RequestHeaders["Connection"] = "close";
            foreach (var headerName in RequestHeaders.AllKeys)
            {
                headerString.AppendFormat("{0}: {1}\n", headerName, RequestHeaders.Get(headerName));
            }

            Stream = new NonClosingStreamWrapper(_client.GetStream());

            var queryHeaders = Encoding.ASCII.GetBytes(headerString.ToString() + '\n');

            Stream.Write(queryHeaders, 0, queryHeaders.Length);

            var textReader = new UnbufferedStreamReader(Stream);

            foreach (var line in textReader.ReadUntil("\r\n\r\n").Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)
                     .Where(line => !string.IsNullOrEmpty(line)))
            {
                if (line.Contains(':'))
                {
                    ResponseHeaders.Add(line);
                }
                else if (line.IndexOf("HTTP/", StringComparison.Ordinal) == 0)
                {
                    StatusCode = int.Parse(line.Substring(9, 3));
                }
            }
        }
Example #5
0
        private static void GenerateStreamParameters(System.IO.Stream OutputStream, SimulationParameters Parameters, IEnumerable <Stream> Streams)
        {
            using (var sw = new NonClosingStreamWrapper(OutputStream))
            {
                using (var write = new StreamWriter(sw))
                {
                    foreach (var stream in Streams)
                    {
                        var sb = new StringBuilder();

                        sb.Append($"void SetPars_{stream.Name}()\n{{\n");

                        if (stream.Type == Stream.StreamType.BulkFTP)
                        {
                            sb.Append($"    Ptr<Object> streamob;\n\n");

                            sb.Append($"    UintegerValue {stream.Name}_SndBufSize_in_bytes = {stream.StartSendBufferSize};\n");
                            sb.Append($"    streamob = getInnerObject(net.N{stream.StartNode.Name}, \"TcpNewReno\");\n");
                            sb.Append(GenerateAttribute("streamob", "TcpNewReno", stream.Name, "SndBufSize_in_bytes", stream.StartSendBufferSize.ToString()));
                            sb.Append($"    UintegerValue {stream.Name}_MaxWindowSize_in_bytes = {stream.StartMaxWindowSize};\n");
                            sb.Append($"    streamob = getInnerObject(net.N{stream.StartNode.Name}, \"TcpNewReno\");\n");
                            sb.Append(GenerateAttribute("streamob", "TcpNewReno", stream.Name, "MaxWindowSize_in_bytes", stream.StartMaxWindowSize.ToString()));

                            sb.Append($"    {stream.Name}_SndBufSize_in_bytes = {stream.EndSendBufferSize};\n");
                            sb.Append($"    streamob = getInnerObject(net.N{stream.EndNode.Name}, \"TcpNewReno\");\n");
                            sb.Append(GenerateAttribute("streamob", "TcpNewReno", stream.Name, "SndBufSize_in_bytes", stream.StartSendBufferSize.ToString()));
                            sb.Append($"    {stream.Name}_MaxWindowSize_in_bytes = {stream.EndMaxWindowSize};\n");
                            sb.Append($"    streamob = getInnerObject(net.N{stream.EndNode.Name}, \"TcpNewReno\");\n");
                            sb.Append(GenerateAttribute("streamob", "TcpNewReno", stream.Name, "MaxWindowSize_in_bytes", stream.StartMaxWindowSize.ToString()));
                            sb.Append($"    \n");
                        }

                        sb.Append($"}}\n\n");

                        write.Write(sb.ToString());
                    }
                }
            }
        }
Example #6
0
        protected virtual TransportSendStats WriteMessageToBody(string formDataBoundary, Stream requestStream, IList <ITransportPacketInfo> packetInfos, IList <ConfigurationRequestDataItem> configurationsToDownloadInfos, SendIterationContext context)
        {
            var packetsSendStats = new Dictionary <ITransportPacketInfo, SendStats>();

            using (var nonClosingStream = new NonClosingStreamWrapper(requestStream))
                using (var sr = new StreamWriter(nonClosingStream, this.encoding ?? DefaultEncoding))
                    using (var formDataWriter = new FormDataWriter(nonClosingStream, formDataBoundary, this.encoding ?? DefaultEncoding))
                    {
                        var maxMessageSizeReached = false;

                        if (context.RequestConfigurations)
                        {
                            // записываем данные по конфигурациям
                            for (int i = 0; i < configurationsToDownloadInfos.Count; i++)
                            {
                                var configurationsToDownloadInfo = configurationsToDownloadInfos[i];

                                // == confs[0].
                                var itemPrefix = string.Concat(TransportConstants.FormDataConfigurationProp, "[", i, "].");

                                // == confs[0].ProviderKey
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.ProviderKey)), configurationsToDownloadInfo.ProviderKey);
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.Token)), configurationsToDownloadInfo.Token);
                                if (configurationsToDownloadInfo.StartPosition != null)
                                {
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.StartPosition)), configurationsToDownloadInfo.StartPosition);
                                }
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.IsCompleted)), configurationsToDownloadInfo.IsCompleted);
                            }
                        }

                        if (context.SendPackets)
                        {
                            formDataWriter.ResetSize();

                            // записываем данные по пакетам
                            for (int i = 0; i < packetInfos.Count; i++)
                            {
                                var packetInfo = packetInfos[i];

                                var sendStats = this.packetManager.ReadSendStats(packetInfo.ProviderKey, packetInfo.Id);
                                if (sendStats?.TransferCompleted == true)
                                {
                                    continue;
                                }

                                int    packetBytesSended       = sendStats?.TransferedBytes ?? 0;
                                int    bufferSize              = 4096;
                                bool   packetTransferCompleted = false;
                                string packetBlockHashStr;
                                // == packets[0].
                                var itemPrefix = string.Concat(TransportConstants.FormDataPacketsProp, "[", i, "].");
                                // записываем данные пакета
                                using (var packetStream = packetInfo.GetReadOnlyStreamOrDefault())
                                {
                                    // пакет был удалён
                                    if (packetStream == null)
                                    {
                                        continue;
                                    }

                                    // записываем метаданные о пакете
                                    // == packets[0].ProviderKey
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.ProviderKey)), packetInfo.ProviderKey);
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.PacketId)), packetInfo.Id);
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.StartPosition)), packetBytesSended);

                                    packetStream.Seek(packetBytesSended, SeekOrigin.Begin);

                                    using (var hashAlgorithm = this.hashAlgorithmFunc())
                                    {
                                        var packetIdStr = packetInfo.Id.ToString();
                                        formDataWriter.WriteFileHeader(string.Concat(itemPrefix, nameof(PacketFormDataItem.FileKey)), packetIdStr);

                                        byte[] buffer = new byte[bufferSize];
                                        int    read   = 0;
                                        while (!maxMessageSizeReached && (read = packetStream.Read(buffer, 0, buffer.Length)) > 0)
                                        {
                                            if (formDataWriter.GetWrittenSize() + read > this.settings.PacketSizeLimits.Max)
                                            {
                                                // записываем только до максимального размера
                                                read = this.settings.PacketSizeLimits.Max - formDataWriter.GetWrittenSize();
                                                maxMessageSizeReached = true;
                                            }

                                            formDataWriter.Write(buffer, 0, read);

                                            if (hashAlgorithm != null)
                                            {
                                                // hash contents
                                                hashAlgorithm.TransformBlock(buffer, 0, read, null, 0);
                                            }

                                            packetBytesSended = packetBytesSended + read;
                                        }

                                        if (read <= 0)
                                        {
                                            packetTransferCompleted = true;
                                        }

                                        if (hashAlgorithm != null)
                                        {
                                            hashAlgorithm.TransformFinalBlock(new byte[0], 0, 0);
                                            packetBlockHashStr = hashAlgorithm.GetHashString();
                                        }
                                    }
                                }

                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.EndPosition)), packetBytesSended);

                                //// записываем хеш данные блока пакета
                                //formDataWriter.WriteValue(nameof(PacketFormDataItem.Hash) + suffix, packetBlockHashStr);
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.IsFinal)), packetTransferCompleted);

                                packetsSendStats.Add(packetInfo, new SendStats
                                {
                                    TransferedBytes   = packetBytesSended,
                                    TransferCompleted = packetTransferCompleted,
                                });

                                if (maxMessageSizeReached)
                                {
                                    break;
                                }
                            }
                        }
                    }

            return(new TransportSendStats
            {
                SendedPacketsStats = packetsSendStats,
                ConfigurationsInfos = configurationsToDownloadInfos,
            });
        }
Example #7
0
            /// <summary>
            /// Stream of DataPack2()
            /// </summary>
            /// <returns></returns>
            public static Stream Stream2()
            {
                var obj = new MemoryStream();

                using (var wraper = new NonClosingStreamWrapper(obj))
                    using (var bw = new BinaryWriter(wraper))
                    {
                        bw.Write((byte)3); // Prefix size
                        bw.Write((byte)65);
                        bw.Write((byte)66);
                        bw.Write((byte)67);

                        bw.Write((byte)0);    // No sign

                        bw.Write((byte)1);    // Start of Info section
                        bw.Write((uint)0x68); // Size of Info section
                        bw.Write((ushort)3);  // Count of inner properties
                        bw.Write((byte)0x21);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x44);
                        bw.Write((byte)0x61);
                        bw.Write((byte)0x74);
                        bw.Write((byte)0x65);
                        bw.Write((byte)0x43);
                        bw.Write((byte)0x72);
                        bw.Write((byte)0x65);
                        bw.Write((byte)0x61);
                        bw.Write((byte)0x74);
                        bw.Write((byte)0x65);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x13);
                        bw.Write((byte)0x32);
                        bw.Write((byte)0x30);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x37);
                        bw.Write((byte)0x30);
                        bw.Write((byte)0x32);
                        bw.Write((byte)0x32);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x54);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x33);
                        bw.Write((byte)0x35);
                        bw.Write((byte)0x34);
                        bw.Write((byte)0x35);
                        bw.Write((byte)0x2E);
                        bw.Write((byte)0x39);
                        bw.Write((byte)0x39);
                        bw.Write((byte)0x39);

                        bw.Write((byte)0x2E);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x06);
                        bw.Write((byte)0x46);
                        bw.Write((byte)0x69);
                        bw.Write((byte)0x6C);
                        bw.Write((byte)0x65);
                        bw.Write((byte)0x49);
                        bw.Write((byte)0x64);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x24);
                        bw.Write((byte)0x61);
                        bw.Write((byte)0x38);
                        bw.Write((byte)0x38);
                        bw.Write((byte)0x36);
                        bw.Write((byte)0x64);
                        bw.Write((byte)0x65);
                        bw.Write((byte)0x61);
                        bw.Write((byte)0x36);
                        bw.Write((byte)0x2D);
                        bw.Write((byte)0x33);
                        bw.Write((byte)0x39);
                        bw.Write((byte)0x36);
                        bw.Write((byte)0x34);
                        bw.Write((byte)0x2D);
                        bw.Write((byte)0x34);
                        bw.Write((byte)0x36);
                        bw.Write((byte)0x30);
                        bw.Write((byte)0x64);
                        bw.Write((byte)0x2D);
                        bw.Write((byte)0x38);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x32);
                        bw.Write((byte)0x2D);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x38);
                        bw.Write((byte)0x37);
                        bw.Write((byte)0x34);
                        bw.Write((byte)0x34);
                        bw.Write((byte)0x36);
                        bw.Write((byte)0x66);
                        bw.Write((byte)0x66);
                        bw.Write((byte)0x64);
                        bw.Write((byte)0x35);
                        bw.Write((byte)0x63);
                        bw.Write((byte)0x66);

                        bw.Write((byte)0x14);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x0B);
                        bw.Write((byte)0x44);
                        bw.Write((byte)0x65);
                        bw.Write((byte)0x73);
                        bw.Write((byte)0x63);
                        bw.Write((byte)0x72);
                        bw.Write((byte)0x69);
                        bw.Write((byte)0x70);
                        bw.Write((byte)0x74);
                        bw.Write((byte)0x69);
                        bw.Write((byte)0x6F);
                        bw.Write((byte)0x6E);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x05);
                        bw.Write((byte)0x44);
                        bw.Write((byte)0x65);
                        bw.Write((byte)0x73);
                        bw.Write((byte)0x63);
                        bw.Write((byte)0x72);

                        bw.Write((byte)1);   // Start of Info section 2
                        bw.Write((uint)9);   // Size of Info section 2
                        bw.Write((ushort)1); // Count of headers
                        bw.Write((byte)0x06);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x01);
                        bw.Write((byte)0x48);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x01);
                        bw.Write((byte)0x56);

                        bw.Write((byte)1);   // Start of Info section 3
                        bw.Write((uint)10);  // Size of Info section 3
                        bw.Write((ushort)1); // Count of public properties
                        bw.Write((byte)0x07);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x01);
                        bw.Write((byte)0x50);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x56);
                        bw.Write((byte)0x32);

                        bw.Write((byte)1);   // Start of Info section 4
                        bw.Write((uint)30);  // Size of Info section 4
                        bw.Write((ushort)1); // Count of DataPart's

                        bw.Write((uint)183); // Headers address
                        bw.Write((ushort)2); // Headers count
                        bw.Write((uint)18);  // Headers size
                        bw.Write((uint)201); // Properties address
                        bw.Write((ushort)2); // Properties count
                        bw.Write((uint)18);  // Properties size
                        bw.Write((uint)219); // Data address
                        bw.Write((uint)5);   // Data size

                        bw.Write((byte)2);   // Start of Data section
                        bw.Write((uint)41);  // Size of Data section

                        bw.Write((byte)0x08);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x48);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x56);
                        bw.Write((byte)0x31);

                        bw.Write((byte)0x08);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x48);
                        bw.Write((byte)0x32);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x56);
                        bw.Write((byte)0x32);

                        bw.Write((byte)0x08);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x50);
                        bw.Write((byte)0x31);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x56);
                        bw.Write((byte)0x31);

                        bw.Write((byte)0x08);
                        bw.Write((byte)0x0A);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x50);
                        bw.Write((byte)0x32);
                        bw.Write((byte)0x12);
                        bw.Write((byte)0x02);
                        bw.Write((byte)0x56);
                        bw.Write((byte)0x32);

                        bw.Write((byte)170);
                        bw.Write((byte)255);
                        bw.Write((byte)255);
                        bw.Write((byte)255);
                        bw.Write((byte)171);
                    }

                return(obj);
            }
Example #8
0
        // <%%printAtts%%> - Whether to print network attributes.
        // <%%asciiTrace%%> - Whether to output ascii tracing.
        // <%%networkName%%> - The name of the network.
        // <%%openTracing%%> - Initial set up for tracing filestreams and buffers.
        // <%%componentLog%%> - Enabling logging for components.
        // <%%nodes%%> - Set up of the nodes.
        // <%%links%%> - Set up of the links.
        // <%%streams%%> - Set up of the streams.
        // <%%domains%%> - Set up of the domains.
        // <%%stopTime%%> - Time in seconds after starting to end the simulation.
        // <%%observationTime%%> - Time after the simulation starts to begin observation.
        // <%%closeTracing%%> - Close the trace streams.
        private static void GenerateMain(System.IO.Stream OutputStream, SimulationParameters Parameters, IEnumerable <Node> Nodes, IEnumerable <Link> Links, IEnumerable <Stream> Streams, IEnumerable <Domain> Domains)
        {
            using (var sw = new NonClosingStreamWrapper(OutputStream))
            {
                using (var write = new StreamWriter(sw))
                {
                    var template = File.ReadAllText(@"Source Fragments/main.txt");

                    var sb = new StringBuilder();
                    foreach (var trace in Parameters.Traces)
                    {
                        sb.Append($"    T{trace.Name} = 0; // Avoid warnings\n");
                        sb.Append($"    SeqFirst{trace.Name} = -1; // Initialise\n");
                        sb.Append($"    AckFirst{trace.Name} = -1; // Initialise\n");
                        sb.Append($"    T{trace.Name}_FStream.open(\"{Parameters.Name}_T{trace.Name}_trace.txt\");\n");
                        sb.Append($"    // Stop gnuplot complaining.\n    T{trace.Name}_FStream << \"0 0\" << std::endl;\n");
                        if (!trace.CommonStartTime)
                        {
                            foreach (var attribute in trace.Attributes)
                            {
                                sb.Append($"    Simulator::Schedule(Seconds({trace.StartTime}), &setupT{trace.EscapedName}_{attribute.TraceSource});\n");
                            }
                        }
                    }
                    var openTracing = sb.ToString();

                    sb.Clear();
                    foreach (var componentLog in Parameters.ComponentLogs)
                    {
                        sb.Append($"    LogComponentEnable(\"{componentLog.LoggingModule.ToString()}\", (LogLevel)({componentLog.LoggingLevel.ToString()} | LOG_PREFIX_FUNC | LOG_PREFIX_TIME));\n");
                    }
                    var componentLogs = sb.ToString();

                    sb.Clear();
                    foreach (var node in Nodes)
                    {
                        sb.Append($"    nodeptr = CreateObject<Node>();\n");
                        sb.Append($"    net.N{node.Name} = nodeptr;\n");
                        // TODO: Handle non terrestrial networks.
                        sb.Append($"    nodes->Add(nodeptr);\n");
                        sb.Append($"    Names::Add(\"N{node.Name}\", net.N{node.Name});\n");
                    }
                    var nodes = sb.ToString();

                    var links = GenerateLinks(Parameters, Links);

                    var streams = GenerateStreams(Parameters, Streams);

                    var domains = GenerateDomains(Parameters, Domains);

                    sb.Clear();
                    foreach (var trace in Parameters.Traces)
                    {
                        sb.Append($"    T{trace.Name}_FStream.close();\n");
                    }
                    var closeTracing = sb.ToString();

                    template = template.Replace("<%%printAtts%%>", Parameters.PrintAttributes ? "true" : "false");
                    template = template.Replace("<%%asciiTrace%%>", Parameters.AsciiTrace ? "true" : "false");
                    template = template.Replace("<%%networkName%%>", Parameters.Name);
                    template = template.Replace("<%%openTracing%%>", openTracing);
                    template = template.Replace("<%%componentLog%%>", componentLogs);
                    template = template.Replace("<%%nodes%%>", nodes);
                    template = template.Replace("<%%links%%>", links);
                    template = template.Replace("<%%streams%%>", streams);
                    template = template.Replace("<%%domains%%>", domains);
                    template = template.Replace("<%%stopTime%%>", Parameters.ObservationStopTime.ToString());
                    template = template.Replace("<%%observationTime%%>", Parameters.ObservationStartTime.ToString());
                    template = template.Replace("<%%closeTracing%%>", closeTracing);

                    write.Write(template);
                }
            }
        }
Example #9
0
        // <%%nodes%%> - The network nodes.
        // <%%links%%> - The network links.
        // <%%streams%%> - The network streams.
        // <%%domains%%> - The network domains.
        // <%%nodeAtts%%> - Attribute display of the network nodes.
        // <%%linkAtts%%> - Attribute display of the network links.
        // <%%streamAtts%%> - Attribute display of the network streams.
        // <%%domainAtts%%> - Attribute display of the network domains.
        private static void GenerateNet(System.IO.Stream OutputStream, SimulationParameters Parameters, IEnumerable <Node> Nodes, IEnumerable <Link> Links, IEnumerable <Stream> Streams, IEnumerable <Domain> Domains)
        {
            using (var sw = new NonClosingStreamWrapper(OutputStream))
            {
                using (var write = new StreamWriter(sw))
                {
                    var template = File.ReadAllText(@"Source Fragments/net.txt");

                    var sb = new StringBuilder();
                    foreach (var node in Nodes)
                    {
                        sb.Append($"    Ptr<Node> N{node.Name};\n");
                    }
                    var nodes = sb.ToString();

                    sb.Clear();
                    foreach (var link in Links)
                    {
                        sb.Append($"    Ptr<NetDevice> L{link.Name}");
                        if (link.Duplex)
                        {
                            sb.Append($", L{link.Name}_rev;\n");
                        }
                        else
                        {
                            sb.Append(";\n");
                        }
                    }
                    var links = sb.ToString();

                    sb.Clear();
                    foreach (var stream in Streams)
                    {
                        sb.Append($"    Ptr<Object> S{stream.Name};\n");
                        sb.Append($"    Ptr<Object> C{stream.Name};\n");
                    }
                    var streams = sb.ToString();

                    sb.Clear();
                    foreach (var domain in Domains)
                    {
                        foreach (var node in domain.Nodes)
                        {
                            sb.Append($"    Ptr<NetDevice> D{domain.Name}_{node.Name};\n");
                        }
                    }
                    var domains = sb.ToString();

                    sb.Clear();
                    foreach (var node in Nodes)
                    {
                        sb.Append($"    try {{ printMyAttributes(\"{node.Text}\", \"\", attsfile, net.N{node.Name}); }}\n");
                        sb.Append($"    catch (...) {{ attsfile << \"Unable to print the attributes of net.N{node.Name}\"; }}\n");
                    }
                    var nodeAtts = sb.ToString();

                    sb.Clear();
                    foreach (var link in Links)
                    {
                        sb.Append($"    printMyAttributes(\"{link.Text}\", \"\", attsfile, net.L{link.Name});\n");
                        if (link.Duplex)
                        {
                            sb.Append($"    printMyAttributes(\"{link.Text}_rev\", \"\", attsfile, net.L{link.Name}_rev);\n");
                        }
                    }
                    var linkAtts = sb.ToString();

                    sb.Clear();
                    foreach (var stream in Streams)
                    {
                        sb.Append($"    printMyAttributes(\"{stream.Text}_server\", \"\", attsfile, net.S{stream.Name});\n");
                        sb.Append($"    printMyAttributes(\"{stream.Text}_client\", \"\", attsfile, net.C{stream.Name});\n");
                    }
                    var streamAtts = sb.ToString();

                    sb.Clear();
                    foreach (var domain in Domains)
                    {
                        foreach (var node in domain.Nodes)
                        {
                            sb.Append($"    printMyAttributes(\"{domain.Name}_{node.Name}\", \"\", attsfile, net.D{domain.Name}_{node.Name});\n");
                        }
                    }
                    var domainAtts = sb.ToString();

                    template = template.Replace("<%%nodes%%>", nodes);
                    template = template.Replace("<%%links%%>", links);
                    template = template.Replace("<%%streams%%>", streams);
                    template = template.Replace("<%%domains%%>", domains);
                    template = template.Replace("<%%nodeAtts%%>", nodeAtts);
                    template = template.Replace("<%%linkAtts%%>", linkAtts);
                    template = template.Replace("<%%streamAtts%%>", streamAtts);
                    template = template.Replace("<%%domainAtts%%>", domainAtts);

                    write.Write(template);
                }
            }
        }
Example #10
0
        // <%%variables%%> - The variables to hold the trace data.
        // <%%functions%%> - The functions for incrementing the trace data.
        // <%%commonTraces%%> - Register trace functions with common start time.
        // <%%uncommonTraces%%> - Register trace functions with uncommon start time.
        private static void GenerateTraces(System.IO.Stream OutputStream, SimulationParameters Parameters)
        {
            using (var sw = new NonClosingStreamWrapper(OutputStream))
            {
                using (var write = new StreamWriter(sw))
                {
                    var template = File.ReadAllText(@"Source Fragments/traces.txt");

                    var sb = new StringBuilder();
                    foreach (var trace in Parameters.Traces)
                    {
                        sb.Append($"// Process trace {trace.Name}\n");
                        sb.Append($"static int T{trace.Name};\n");
                        sb.Append($"static std::ofstream T{trace.Name}_FStream;\n");
                        sb.Append($"static int SeqFirst{trace.Name};\n");
                        sb.Append($"static int AckFirst{trace.Name};\n\n");
                    }
                    var variables = sb.ToString();

                    sb.Clear();
                    var tracers = new Dictionary <string, int>();
                    foreach (var trace in Parameters.Traces)
                    {
                        sb.Append($"// Process trace {trace.Name}\n");
                        foreach (var traceAttribute in trace.Attributes)
                        {
                            if (traceAttribute.Element is Domain)
                            {
                                var domain = traceAttribute.Element as Domain;
                                foreach (var node in domain.Nodes)
                                {
                                    var tracerName = $"T{trace.Name}_{node.Name}_{traceAttribute.TraceSource}Tracer";
                                    if (tracers.ContainsKey(tracerName))
                                    {
                                        tracers[tracerName]++;
                                    }
                                    else
                                    {
                                        tracers.Add(tracerName, 1);
                                    }
                                    sb.Append($"void {tracerName}{tracers[tracerName]}({traceAttribute.AttributeType})\n");
                                    sb.Append($"{{\n");
                                    sb.Append($"    T{trace.Name}_FStream << Simulator::Now().GetSeconds() << \" \" << {traceAttribute.Code} << std::endl;\n");
                                    sb.Append($"}}\n\n");
                                }
                            }
                            else
                            {
                                var tracerName = $"T{trace.Name}_{traceAttribute.TraceSource}Tracer";
                                if (tracers.ContainsKey(tracerName))
                                {
                                    tracers[tracerName]++;
                                }
                                else
                                {
                                    tracers.Add(tracerName, 1);
                                }
                                sb.Append($"void {tracerName}{tracers[tracerName]}({traceAttribute.AttributeType})\n");
                                sb.Append($"{{\n");
                                sb.Append($"    T{trace.Name}_FStream << Simulator::Now().GetSeconds() << \" \" << {traceAttribute.Code} << std::endl;\n");
                                sb.Append($"}}\n\n");
                            }
                        }
                    }
                    var functions = sb.ToString();

                    sb.Clear();
                    var sbUncommon = new StringBuilder();
                    tracers = new Dictionary <string, int>();
                    foreach (var trace in Parameters.Traces)
                    {
                        // Change the output string builder so that common and uncommon traces are split.
                        var outputBuilder = trace.CommonStartTime ? sb : sbUncommon;

                        foreach (var attribute in trace.Attributes)
                        {
                            if (attribute.Element is Domain)
                            {
                                var domain = attribute.Element as Domain;
                                foreach (var node in domain.Nodes)
                                {
                                    var networkItem = $"N{node.Name}";

                                    var tracerName = $"T{trace.Name}_{node.Name}_{attribute.TraceSource}Tracer";
                                    if (tracers.ContainsKey(tracerName))
                                    {
                                        tracers[tracerName]++;
                                    }
                                    else
                                    {
                                        tracers.Add(tracerName, 1);
                                    }

                                    if (!trace.CommonStartTime)
                                    {
                                        outputBuilder.Append($"void setupT{trace.EscapedName}_{attribute.TraceSource}()\n{{\n");
                                    }

                                    outputBuilder.Append($"    // Set up tracing for T{trace.Name} of type {attribute.AttributeType}\n");
                                    outputBuilder.Append($"    if (TraceConnectNoContext(net.{networkItem}, \"{attribute.TraceSource}\", MakeCallback(&{tracerName}{tracers[tracerName]})))\n");
                                    outputBuilder.Append($"    {{\n");
                                    outputBuilder.Append($"        NS_LOG_INFO(\"Tracing for {attribute.TraceSource} at node {networkItem} was successfully set up\");\n");
                                    outputBuilder.Append($"    }}\n");
                                    outputBuilder.Append($"    else\n");
                                    outputBuilder.Append($"    {{\n");
                                    outputBuilder.Append($"        NS_LOG_ERROR(\"Tracing for {attribute.TraceSource} at node {networkItem} was not successfully set up\");\n");
                                    outputBuilder.Append($"    }}\n\n");

                                    if (!trace.CommonStartTime)
                                    {
                                        outputBuilder.Append($"}}\n");
                                    }
                                }
                            }
                            else
                            {
                                var networkItem = "";
                                if (attribute.Element is Link)
                                {
                                    networkItem = $"L{(attribute.Element as Link).Name}{(attribute.LinkReverse ? "_rev" : "")}";
                                }
                                else if (attribute.Element is Stream)
                                {
                                    switch (attribute.TraceSource)
                                    {
                                    case "Tx":
                                    {
                                        networkItem = $"C{(attribute.Element as Stream).Name}";
                                        break;
                                    }

                                    case "Rx":
                                    {
                                        networkItem = $"S{(attribute.Element as Stream).Name}";
                                        break;
                                    }

                                    case "CongestionWindow":
                                    {
                                        networkItem = $"N{(attribute.Element as Stream).StartNode.Name}";
                                        break;
                                    }
                                    }
                                }
                                else if (attribute.Element is Node)
                                {
                                    networkItem = $"N{(attribute.Element as Node).Name}";
                                }

                                var tracerName = $"T{trace.Name}_{attribute.TraceSource}Tracer";
                                if (tracers.ContainsKey(tracerName))
                                {
                                    tracers[tracerName]++;
                                }
                                else
                                {
                                    tracers.Add(tracerName, 1);
                                }

                                if (!trace.CommonStartTime)
                                {
                                    outputBuilder.Append($"void setupT{trace.EscapedName}_{attribute.TraceSource}()\n{{\n");
                                }

                                outputBuilder.Append($"    // Set up tracing for T{trace.Name} of type {attribute.AttributeType}\n");
                                outputBuilder.Append($"    if (TraceConnectNoContext(net.{networkItem}, \"{attribute.TraceSource}\", MakeCallback(&{tracerName}{tracers[tracerName]})))\n");
                                outputBuilder.Append($"    {{\n");
                                outputBuilder.Append($"        NS_LOG_INFO(\"Tracing for {attribute.TraceSource} at node {networkItem} was successfully set up\");\n");
                                outputBuilder.Append($"    }}\n");
                                outputBuilder.Append($"    else\n");
                                outputBuilder.Append($"    {{\n");
                                outputBuilder.Append($"        NS_LOG_ERROR(\"Tracing for {attribute.TraceSource} at node {networkItem} was not successfully set up\");\n");
                                outputBuilder.Append($"    }}\n\n");

                                if (!trace.CommonStartTime)
                                {
                                    outputBuilder.Append($"}}\n");
                                }
                            }
                        }
                    }
                    var commonTrace   = sb.ToString();
                    var uncommonTrace = sbUncommon.ToString();

                    template = template.Replace("<%%variables%%>", variables);
                    template = template.Replace("<%%functions%%>", functions);
                    template = template.Replace("<%%commonTrace%%>", commonTrace);
                    template = template.Replace("<%%uncommonTrace%%>", uncommonTrace);

                    write.Write(template);
                }
            }
        }
Example #11
0
        protected virtual TransportSendStats WriteMessageToBody(string formDataBoundary, Stream requestStream, IList <ITransportPacketInfo> packetInfos, IList <ConfigurationRequestDataItem> configurationsToDownloadInfos, SendIterationContext context, Func <bool> cancelSendFunc)
        {
            var packetsSendStats = new Dictionary <ITransportPacketInfo, SendStats>();
            var completedPackets = new List <ITransportPacketInfo>();

            using (var nonClosingStream = new NonClosingStreamWrapper(requestStream))
                using (var sr = new StreamWriter(nonClosingStream, this.encoding ?? DefaultEncoding))
                    using (var formDataWriter = new FormDataWriter(nonClosingStream, formDataBoundary, this.encoding ?? DefaultEncoding))
                    {
                        var messageCapacityReached = false;

                        if (context.RequestConfigurations)
                        {
                            // записываем данные по конфигурациям
                            for (int i = 0; i < configurationsToDownloadInfos.Count; i++)
                            {
                                if (cancelSendFunc())
                                {
                                    break;
                                }

                                var configurationsToDownloadInfo = configurationsToDownloadInfos[i];

                                // == confs[0].
                                var itemPrefix = string.Concat(TransportConstants.FormDataConfigurationProp, "[", i, "].");

                                // == confs[0].ProviderKey
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.ProviderKey)), configurationsToDownloadInfo.ProviderKey);
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.Token)), configurationsToDownloadInfo.Token);
                                if (configurationsToDownloadInfo.StartPosition != null)
                                {
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.StartPosition)), configurationsToDownloadInfo.StartPosition);
                                }
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(ConfigurationRequestDataItem.IsCompleted)), configurationsToDownloadInfo.IsCompleted);
                            }
                        }

                        if (context.SendPackets)
                        {
                            //formDataWriter.ResetSize();

                            bool hasWrittenPackagePartToRequest = false;
                            // записываем данные по пакетам
                            for (int i = 0; i < packetInfos.Count; i++)
                            {
                                if (cancelSendFunc())
                                {
                                    break;
                                }

                                var packetInfo = packetInfos[i];

                                var sendStats = this.packetManager.ReadSendStats(packetInfo.ProviderKey, packetInfo.Identity);
                                if (sendStats?.TransferCompleted == true)
                                {
                                    completedPackets.Add(packetInfo);
                                    continue;
                                }

                                int packetBytesSended = sendStats?.TransferedBytes ?? 0;
                                // буфер ~16 kb (довольно много можно уместить)
                                int    bufferSize = 4 * 4096;
                                bool   packetTransferCompleted = false;
                                string packetBlockHashStr;
                                // == packets[0].
                                var itemPrefix = string.Concat(TransportConstants.FormDataPacketsProp, "[", i, "].");
                                // записываем данные пакета
                                using (var packetStream = packetInfo.GetReadOnlyStreamOrDefault())
                                {
                                    // пакет был удалён
                                    if (packetStream == null)
                                    {
                                        completedPackets.Add(packetInfo);
                                        continue;
                                    }

                                    // записываем метаданные о пакете
                                    // == packets[0].ProviderKey
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.ProviderKey)), packetInfo.ProviderKey);
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.PacketId)), packetInfo.Identity.PacketId);
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.StartPosition)), packetBytesSended);

                                    packetStream.Seek(packetBytesSended, SeekOrigin.Begin);

                                    using (var hashAlgorithm = this.hashAlgorithmFunc())
                                    {
                                        var packetIdStr = packetInfo.Identity.PacketId.ToString();
                                        formDataWriter.WriteFileHeader(string.Concat(itemPrefix, nameof(PacketFormDataItem.FileKey)), packetIdStr);

                                        byte[] buffer       = new byte[bufferSize];
                                        int    read         = 0;
                                        bool   writtenToEnd = false;
                                        while (!messageCapacityReached && (read = packetStream.Read(buffer, 0, buffer.Length)) > 0)
                                        {
                                            // подумать над реализацией которая будет делать меньшую фрагментацию пакетови не будет записывать "лишние"
                                            if (formDataWriter.GetWrittenSize() + read > context.TransportSettings.PacketSizeLimits.Max)
                                            {
                                                // записываем только до максимального размера
                                                var toWrite = context.TransportSettings.PacketSizeLimits.Max - formDataWriter.GetWrittenSize();

                                                if (toWrite < 0)
                                                {
                                                    var originalReadFromPacket = read;
                                                    if (hasWrittenPackagePartToRequest)
                                                    {
                                                        read = Math.Min(context.TransportSettings.PacketSizeLimits.Min, Math.Min(read, 4096));
                                                    }
                                                    else
                                                    {
                                                        read = read < context.TransportSettings.PacketSizeLimits.Max ? read : context.TransportSettings.PacketSizeLimits.Max;
                                                    }

                                                    writtenToEnd = originalReadFromPacket <= read && packetStream.ReadByte() == -1;
                                                }
                                                else
                                                {
                                                    read = toWrite;
                                                }

                                                messageCapacityReached = true;
                                            }

                                            formDataWriter.Write(buffer, 0, read);
                                            hasWrittenPackagePartToRequest = true;

                                            if (hashAlgorithm != null)
                                            {
                                                // hash contents
                                                hashAlgorithm.TransformBlock(buffer, 0, read, null, 0);
                                            }

                                            packetBytesSended = packetBytesSended + read;
                                        }

                                        if (read <= 0 || writtenToEnd)
                                        {
                                            packetTransferCompleted = true;
                                        }

                                        if (hashAlgorithm != null)
                                        {
                                            hashAlgorithm.TransformFinalBlock(new byte[0], 0, 0);
                                            packetBlockHashStr = hashAlgorithm.GetHashString();
                                        }
                                    }
                                }

                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.EndPosition)), packetBytesSended);

                                //// записываем хеш данные блока пакета
                                //formDataWriter.WriteValue(nameof(PacketFormDataItem.Hash) + suffix, packetBlockHashStr);
                                formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.IsFinal)), packetTransferCompleted);

                                // данные о предыдущей части
                                if (sendStats?.PreviousPartIdentity != null)
                                {
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.PreviousPartId)), sendStats.PreviousPartIdentity.Id);
                                    formDataWriter.WriteValue(string.Concat(itemPrefix, nameof(PacketFormDataItem.PreviousPartStorageToken)), sendStats.PreviousPartIdentity.StorageToken);
                                }

                                packetsSendStats.Add(packetInfo, new SendStats
                                {
                                    TransferedBytes   = packetBytesSended,
                                    TransferCompleted = packetTransferCompleted,
                                });

                                if (messageCapacityReached)
                                {
                                    break;
                                }
                            }
                        }
                    }

            return(new TransportSendStats
            {
                IgnoredPackets = completedPackets,
                SendedPacketsStats = packetsSendStats,
                ConfigurationsInfos = configurationsToDownloadInfos,
            });
        }