Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }