/// <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); }
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 }); }
//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); }
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)); } } }
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()); } } } }
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, }); }
/// <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); }
// <%%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); } } }
// <%%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); } } }
// <%%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); } } }
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, }); }