public string CreateChannel(string channelName, MediaEncoding channelEncoding, MediaProtocol inputProtocol, string inputAddressAuthorized, int?inputSubnetPrefixLength, string previewAddressAuthorized, int?previewSubnetPrefixLength, int?archiveWindowMinutes, bool archiveEncryption) { ChannelEncodingType channelType = (ChannelEncodingType)channelEncoding; StreamingProtocol channelProtocol = (StreamingProtocol)inputProtocol; IChannel channel = CreateChannel(channelName, channelType, channelProtocol, inputAddressAuthorized, inputSubnetPrefixLength, previewAddressAuthorized, previewSubnetPrefixLength); CreatePrograms(channel, archiveWindowMinutes, archiveEncryption); foreach (IProgram program in channel.Programs) { CreateLocator(LocatorType.OnDemandOrigin, program.Asset); } return(channel.Id); }
public string Create(string channelName, MediaEncoding channelEncoding, MediaProtocol inputProtocol, string inputAddressAuthorized, int?inputSubnetPrefixLength, string previewAddressAuthorized, int?previewSubnetPrefixLength, int?archiveWindowMinutes, bool?archiveEncryption) { if (!archiveEncryption.HasValue) { archiveEncryption = false; } string channelId = string.Empty; string authToken = homeController.GetAuthToken(this.Request, this.Response); if (!string.IsNullOrEmpty(authToken)) { MediaClient mediaClient = new MediaClient(authToken); channelId = mediaClient.CreateChannel(channelName, channelEncoding, inputProtocol, inputAddressAuthorized, inputSubnetPrefixLength, previewAddressAuthorized, previewSubnetPrefixLength, archiveWindowMinutes, archiveEncryption.Value); } return(channelId); }
public bool Open(IFilter imageFilter) { Stream stream = imageFilter.GetDataForkStream(); stream.Seek(0, SeekOrigin.Begin); var cmt = new MemoryStream(); stream.Seek(0x1F, SeekOrigin.Begin); for (uint i = 0; i < stream.Length; i++) { byte b = (byte)stream.ReadByte(); if (b == 0x1A) { break; } cmt.WriteByte(b); } imageInfo.Comments = StringHandlers.CToString(cmt.ToArray()); sectorsData = new List <byte[]>(); byte currentCylinder = 0; imageInfo.Cylinders = 1; imageInfo.Heads = 1; ulong currentLba = 0; TransferRate mode = TransferRate.TwoHundred; while (stream.Position + 5 < stream.Length) { mode = (TransferRate)stream.ReadByte(); byte cylinder = (byte)stream.ReadByte(); byte head = (byte)stream.ReadByte(); byte spt = (byte)stream.ReadByte(); byte n = (byte)stream.ReadByte(); byte[] idmap = new byte[spt]; byte[] cylmap = new byte[spt]; byte[] headmap = new byte[spt]; ushort[] bps = new ushort[spt]; if (cylinder != currentCylinder) { currentCylinder = cylinder; imageInfo.Cylinders++; } if ((head & 1) == 1) { imageInfo.Heads = 2; } stream.Read(idmap, 0, idmap.Length); if ((head & SECTOR_CYLINDER_MAP_MASK) == SECTOR_CYLINDER_MAP_MASK) { stream.Read(cylmap, 0, cylmap.Length); } if ((head & SECTOR_HEAD_MAP_MASK) == SECTOR_HEAD_MAP_MASK) { stream.Read(headmap, 0, headmap.Length); } if (n == 0xFF) { byte[] bpsbytes = new byte[spt * 2]; stream.Read(bpsbytes, 0, bpsbytes.Length); for (int i = 0; i < spt; i++) { bps[i] = BitConverter.ToUInt16(bpsbytes, i * 2); } } else { for (int i = 0; i < spt; i++) { bps[i] = (ushort)(128 << n); } } if (spt > imageInfo.SectorsPerTrack) { imageInfo.SectorsPerTrack = spt; } SortedDictionary <byte, byte[]> track = new SortedDictionary <byte, byte[]>(); for (int i = 0; i < spt; i++) { var type = (SectorType)stream.ReadByte(); byte[] data = new byte[bps[i]]; // TODO; Handle disks with different bps in track 0 if (bps[i] > imageInfo.SectorSize) { imageInfo.SectorSize = bps[i]; } switch (type) { case SectorType.Unavailable: if (!track.ContainsKey(idmap[i])) { track.Add(idmap[i], data); } break; case SectorType.Normal: case SectorType.Deleted: case SectorType.Error: case SectorType.DeletedError: stream.Read(data, 0, data.Length); if (!track.ContainsKey(idmap[i])) { track.Add(idmap[i], data); } imageInfo.ImageSize += (ulong)data.Length; break; case SectorType.Compressed: case SectorType.CompressedDeleted: case SectorType.CompressedError: case SectorType.CompressedDeletedError: byte filling = (byte)stream.ReadByte(); ArrayHelpers.ArrayFill(data, filling); if (!track.ContainsKey(idmap[i])) { track.Add(idmap[i], data); } break; default: throw new ImageNotSupportedException($"Invalid sector type {(byte)type}"); } } foreach (KeyValuePair <byte, byte[]> kvp in track) { sectorsData.Add(kvp.Value); currentLba++; } } imageInfo.Application = "IMD"; // TODO: The header is the date of dump or the date of the application compilation? imageInfo.CreationTime = imageFilter.GetCreationTime(); imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); imageInfo.Comments = StringHandlers.CToString(cmt.ToArray()); imageInfo.Sectors = currentLba; imageInfo.MediaType = MediaType.Unknown; MediaEncoding mediaEncoding = MediaEncoding.MFM; if (mode == TransferRate.TwoHundred || mode == TransferRate.ThreeHundred || mode == TransferRate.FiveHundred) { mediaEncoding = MediaEncoding.FM; } imageInfo.MediaType = Geometry.GetMediaType(((ushort)imageInfo.Cylinders, (byte)imageInfo.Heads, (ushort)imageInfo.SectorsPerTrack, imageInfo.SectorSize, mediaEncoding, false)); switch (imageInfo.MediaType) { case MediaType.NEC_525_HD when mode == TransferRate.FiveHundredMfm: imageInfo.MediaType = MediaType.NEC_35_HD_8; break; case MediaType.DOS_525_HD when mode == TransferRate.FiveHundredMfm: imageInfo.MediaType = MediaType.NEC_35_HD_15; break; case MediaType.RX50 when mode == TransferRate.FiveHundredMfm: imageInfo.MediaType = MediaType.ATARI_35_SS_DD; break; } imageInfo.XmlMediaType = XmlMediaType.BlockMedia; AaruConsole.VerboseWriteLine("IMD image contains a disk of type {0}", imageInfo.MediaType); if (!string.IsNullOrEmpty(imageInfo.Comments)) { AaruConsole.VerboseWriteLine("IMD comments: {0}", imageInfo.Comments); } return(true); }