Пример #1
0
        public ImageInfoViewModel(string imagePath, IFilter filter, IMediaImage imageFormat, Window view)

        {
            _imagePath   = imagePath;
            _filter      = filter;
            _imageFormat = imageFormat;
            _view        = view;
            IAssetLoader assets = AvaloniaLocator.Current.GetService <IAssetLoader>();

            MediaTagsList         = new ObservableCollection <string>();
            SectorTagsList        = new ObservableCollection <string>();
            Sessions              = new ObservableCollection <Session>();
            Tracks                = new ObservableCollection <Track>();
            DumpHardwareList      = new ObservableCollection <DumpHardwareModel>();
            EntropyCommand        = ReactiveCommand.Create(ExecuteEntropyCommand);
            VerifyCommand         = ReactiveCommand.Create(ExecuteVerifyCommand);
            ChecksumCommand       = ReactiveCommand.Create(ExecuteChecksumCommand);
            ConvertCommand        = ReactiveCommand.Create(ExecuteConvertCommand);
            CreateSidecarCommand  = ReactiveCommand.Create(ExecuteCreateSidecarCommand);
            ViewSectorsCommand    = ReactiveCommand.Create(ExecuteViewSectorsCommand);
            DecodeMediaTagCommand = ReactiveCommand.Create(ExecuteDecodeMediaTagCommand);

            var genericHddIcon =
                new Bitmap(assets.Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/drive-harddisk.png")));

            var genericOpticalIcon =
                new Bitmap(assets.Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/drive-optical.png")));

            var genericFolderIcon =
                new Bitmap(assets.Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/inode-directory.png")));

            var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{imageFormat.Info.MediaType}.png");

            MediaLogo = assets.Exists(mediaResource)
                            ? new Bitmap(assets.Open(mediaResource))
                            : imageFormat.Info.XmlMediaType == XmlMediaType.BlockMedia
                                ? genericHddIcon
                                : imageFormat.Info.XmlMediaType == XmlMediaType.OpticalDisc
                                    ? genericOpticalIcon
                                    : genericFolderIcon;

            ImagePathText       = $"Path: {imagePath}";
            FilterText          = $"Filter: {filter.Name}";
            ImageIdentifiedText = $"Image format identified by {imageFormat.Name} ({imageFormat.Id}).";

            ImageFormatText = !string.IsNullOrWhiteSpace(imageFormat.Info.Version)
                                  ? $"Format: {imageFormat.Format} version {imageFormat.Info.Version}"
                                  : $"Format: {imageFormat.Format}";

            ImageSizeText = $"Image without headers is {imageFormat.Info.ImageSize} bytes long";

            SectorsText =
                $"Contains a media of {imageFormat.Info.Sectors} sectors with a maximum sector size of {imageFormat.Info.SectorSize} bytes (if all sectors are of the same size this would be {imageFormat.Info.Sectors * imageFormat.Info.SectorSize} bytes)";

            MediaTypeText =
                $"Contains a media of type {imageFormat.Info.MediaType} and XML type {imageFormat.Info.XmlMediaType}";

            HasPartitionsText = $"{(imageFormat.Info.HasPartitions ? "Has" : "Doesn't have")} partitions";
            HasSessionsText   = $"{(imageFormat.Info.HasSessions ? "Has" : "Doesn't have")} sessions";

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.Application))
            {
                ApplicationText = !string.IsNullOrWhiteSpace(imageFormat.Info.ApplicationVersion)
                                      ? $"Was created with {imageFormat.Info.Application} version {imageFormat.Info.ApplicationVersion}"
                                      : $"Was created with {imageFormat.Info.Application}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.Creator))
            {
                CreatorText = $"Created by: {imageFormat.Info.Creator}";
            }

            if (imageFormat.Info.CreationTime != DateTime.MinValue)
            {
                CreationTimeText = $"Created on {imageFormat.Info.CreationTime}";
            }

            if (imageFormat.Info.LastModificationTime != DateTime.MinValue)
            {
                LastModificationTimeText = $"Last modified on {imageFormat.Info.LastModificationTime}";
            }

            if (imageFormat.Info.MediaSequence != 0 &&
                imageFormat.Info.LastMediaSequence != 0)
            {
                MediaSequenceText =
                    $"Media is number {imageFormat.Info.MediaSequence} on a set of {imageFormat.Info.LastMediaSequence} medias";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.MediaTitle))
            {
                MediaTitleText = $"Media title: {imageFormat.Info.MediaTitle}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.MediaManufacturer))
            {
                MediaManufacturerText = $"Media manufacturer: {imageFormat.Info.MediaManufacturer}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.MediaModel))
            {
                MediaModelText = $"Media model: {imageFormat.Info.MediaModel}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.MediaSerialNumber))
            {
                MediaSerialNumberText = $"Media serial number: {imageFormat.Info.MediaSerialNumber}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.MediaBarcode))
            {
                MediaBarcodeText = $"Media barcode: {imageFormat.Info.MediaBarcode}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.MediaPartNumber))
            {
                MediaPartNumberText = $"Media part number: {imageFormat.Info.MediaPartNumber}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.DriveManufacturer))
            {
                DriveManufacturerText = $"Drive manufacturer: {imageFormat.Info.DriveManufacturer}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.DriveModel))
            {
                DriveModelText = $"Drive model: {imageFormat.Info.DriveModel}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.DriveSerialNumber))
            {
                DriveSerialNumberText = $"Drive serial number: {imageFormat.Info.DriveSerialNumber}";
            }

            if (!string.IsNullOrWhiteSpace(imageFormat.Info.DriveFirmwareRevision))
            {
                DriveFirmwareRevisionText = $"Drive firmware info: {imageFormat.Info.DriveFirmwareRevision}";
            }

            if (imageFormat.Info.Cylinders > 0 &&
                imageFormat.Info.Heads > 0 &&
                imageFormat.Info.SectorsPerTrack > 0 &&
                imageFormat.Info.XmlMediaType != XmlMediaType.OpticalDisc &&
                (!(imageFormat is ITapeImage tapeImage) || !tapeImage.IsTape))
            {
                MediaGeometryText =
                    $"Media geometry: {imageFormat.Info.Cylinders} cylinders, {imageFormat.Info.Heads} heads, {imageFormat.Info.SectorsPerTrack} sectors per track";
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Count > 0)
            {
                foreach (MediaTagType tag in imageFormat.Info.ReadableMediaTags.OrderBy(t => t))
                {
                    MediaTagsList.Add(tag.ToString());
                }
            }

            if (imageFormat.Info.ReadableSectorTags != null &&
                imageFormat.Info.ReadableSectorTags.Count > 0)
            {
                foreach (SectorTagType tag in imageFormat.Info.ReadableSectorTags.OrderBy(t => t))
                {
                    SectorTagsList.Add(tag.ToString());
                }
            }

            PeripheralDeviceTypes scsiDeviceType = PeripheralDeviceTypes.DirectAccess;

            byte[]  scsiInquiryData = null;
            Inquiry?scsiInquiry     = null;

            Modes.DecodedMode?scsiMode        = null;
            byte[]            scsiModeSense6  = null;
            byte[]            scsiModeSense10 = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SCSI_INQUIRY))
            {
                scsiInquiryData = imageFormat.ReadDiskTag(MediaTagType.SCSI_INQUIRY);

                scsiDeviceType = (PeripheralDeviceTypes)(scsiInquiryData[0] & 0x1F);

                scsiInquiry = Inquiry.Decode(scsiInquiryData);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SCSI_MODESENSE_6))
            {
                scsiModeSense6 = imageFormat.ReadDiskTag(MediaTagType.SCSI_MODESENSE_6);
                scsiMode       = Modes.DecodeMode6(scsiModeSense6, scsiDeviceType);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SCSI_MODESENSE_10))
            {
                scsiModeSense10 = imageFormat.ReadDiskTag(MediaTagType.SCSI_MODESENSE_10);
                scsiMode        = Modes.DecodeMode10(scsiModeSense10, scsiDeviceType);
            }

            ScsiInfo = new ScsiInfo
            {
                DataContext = new ScsiInfoViewModel(scsiInquiryData, scsiInquiry, null, scsiMode, scsiDeviceType,
                                                    scsiModeSense6, scsiModeSense10, null, _view)
            };

            byte[] ataIdentify   = null;
            byte[] atapiIdentify = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.ATA_IDENTIFY))
            {
                ataIdentify = imageFormat.ReadDiskTag(MediaTagType.ATA_IDENTIFY);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.ATAPI_IDENTIFY))
            {
                atapiIdentify = imageFormat.ReadDiskTag(MediaTagType.ATAPI_IDENTIFY);
            }

            AtaInfo = new AtaInfo
            {
                DataContext = new AtaInfoViewModel(ataIdentify, atapiIdentify, null, _view)
            };

            byte[]                toc                  = null;
            TOC.CDTOC?            decodedToc           = null;
            byte[]                fullToc              = null;
            FullTOC.CDFullTOC?    decodedFullToc       = null;
            byte[]                pma                  = null;
            byte[]                atip                 = null;
            ATIP.CDATIP?          decodedAtip          = null;
            byte[]                cdtext               = null;
            CDTextOnLeadIn.CDText?decodedCdText        = null;
            string                mediaCatalogueNumber = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_TOC))
            {
                toc = imageFormat.ReadDiskTag(MediaTagType.CD_TOC);

                if (toc.Length > 0)
                {
                    ushort dataLen = Swapping.Swap(BitConverter.ToUInt16(toc, 0));

                    if (dataLen + 2 != toc.Length)
                    {
                        byte[] tmp = new byte[toc.Length + 2];
                        Array.Copy(toc, 0, tmp, 2, toc.Length);
                        tmp[0] = (byte)((toc.Length & 0xFF00) >> 8);
                        tmp[1] = (byte)(toc.Length & 0xFF);
                        toc    = tmp;
                    }

                    decodedToc = TOC.Decode(toc);
                }
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_FullTOC))
            {
                fullToc = imageFormat.ReadDiskTag(MediaTagType.CD_FullTOC);

                if (fullToc.Length > 0)
                {
                    ushort dataLen = Swapping.Swap(BitConverter.ToUInt16(fullToc, 0));

                    if (dataLen + 2 != fullToc.Length)
                    {
                        byte[] tmp = new byte[fullToc.Length + 2];
                        Array.Copy(fullToc, 0, tmp, 2, fullToc.Length);
                        tmp[0]  = (byte)((fullToc.Length & 0xFF00) >> 8);
                        tmp[1]  = (byte)(fullToc.Length & 0xFF);
                        fullToc = tmp;
                    }

                    decodedFullToc = FullTOC.Decode(fullToc);
                }
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_PMA))
            {
                pma = imageFormat.ReadDiskTag(MediaTagType.CD_PMA);

                if (pma.Length > 0)
                {
                    ushort dataLen = Swapping.Swap(BitConverter.ToUInt16(pma, 0));

                    if (dataLen + 2 != pma.Length)
                    {
                        byte[] tmp = new byte[pma.Length + 2];
                        Array.Copy(pma, 0, tmp, 2, pma.Length);
                        tmp[0] = (byte)((pma.Length & 0xFF00) >> 8);
                        tmp[1] = (byte)(pma.Length & 0xFF);
                        pma    = tmp;
                    }
                }
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_ATIP))
            {
                atip = imageFormat.ReadDiskTag(MediaTagType.CD_ATIP);

                uint dataLen = Swapping.Swap(BitConverter.ToUInt32(atip, 0));

                if (dataLen + 4 != atip.Length)
                {
                    byte[] tmp = new byte[atip.Length + 4];
                    Array.Copy(atip, 0, tmp, 4, atip.Length);
                    tmp[0] = (byte)((atip.Length & 0xFF000000) >> 24);
                    tmp[1] = (byte)((atip.Length & 0xFF0000) >> 16);
                    tmp[2] = (byte)((atip.Length & 0xFF00) >> 8);
                    tmp[3] = (byte)(atip.Length & 0xFF);
                    atip   = tmp;
                }

                decodedAtip = ATIP.Decode(atip);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_TEXT))
            {
                cdtext = imageFormat.ReadDiskTag(MediaTagType.CD_TEXT);

                uint dataLen = Swapping.Swap(BitConverter.ToUInt32(cdtext, 0));

                if (dataLen + 4 != cdtext.Length)
                {
                    byte[] tmp = new byte[cdtext.Length + 4];
                    Array.Copy(cdtext, 0, tmp, 4, cdtext.Length);
                    tmp[0] = (byte)((cdtext.Length & 0xFF000000) >> 24);
                    tmp[1] = (byte)((cdtext.Length & 0xFF0000) >> 16);
                    tmp[2] = (byte)((cdtext.Length & 0xFF00) >> 8);
                    tmp[3] = (byte)(cdtext.Length & 0xFF);
                    cdtext = tmp;
                }

                decodedCdText = CDTextOnLeadIn.Decode(cdtext);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.CD_MCN))
            {
                byte[] mcn = imageFormat.ReadDiskTag(MediaTagType.CD_MCN);

                mediaCatalogueNumber = Encoding.UTF8.GetString(mcn);
            }

            CompactDiscInfo = new CompactDiscInfo
            {
                DataContext = new CompactDiscInfoViewModel(toc, atip, null, null, fullToc, pma, cdtext, decodedToc,
                                                           decodedAtip, null, decodedFullToc, decodedCdText, null,
                                                           mediaCatalogueNumber, null, _view)
            };

            byte[] dvdPfi = null;
            byte[] dvdDmi = null;
            byte[] dvdCmi = null;
            byte[] hddvdCopyrightInformation = null;
            byte[] dvdBca = null;
            PFI.PhysicalFormatInformation?decodedPfi = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVD_PFI))
            {
                dvdPfi     = imageFormat.ReadDiskTag(MediaTagType.DVD_PFI);
                decodedPfi = PFI.Decode(dvdPfi);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVD_DMI))
            {
                dvdDmi = imageFormat.ReadDiskTag(MediaTagType.DVD_DMI);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVD_CMI))
            {
                dvdCmi = imageFormat.ReadDiskTag(MediaTagType.DVD_CMI);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.HDDVD_CPI))
            {
                hddvdCopyrightInformation = imageFormat.ReadDiskTag(MediaTagType.HDDVD_CPI);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVD_BCA))
            {
                dvdBca = imageFormat.ReadDiskTag(MediaTagType.DVD_BCA);
            }

            DvdInfo = new DvdInfo
            {
                DataContext = new DvdInfoViewModel(imageFormat.Info.MediaType, dvdPfi, dvdDmi, dvdCmi,
                                                   hddvdCopyrightInformation, dvdBca, null, decodedPfi, _view)
            };

            byte[] dvdRamDds                     = null;
            byte[] dvdRamCartridgeStatus         = null;
            byte[] dvdRamSpareArea               = null;
            byte[] lastBorderOutRmd              = null;
            byte[] dvdPreRecordedInfo            = null;
            byte[] dvdrMediaIdentifier           = null;
            byte[] dvdrPhysicalInformation       = null;
            byte[] hddvdrMediumStatus            = null;
            byte[] dvdrLayerCapacity             = null;
            byte[] dvdrDlMiddleZoneStart         = null;
            byte[] dvdrDlJumpIntervalSize        = null;
            byte[] dvdrDlManualLayerJumpStartLba = null;
            byte[] dvdPlusAdip                   = null;
            byte[] dvdPlusDcb                    = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDRAM_DDS))
            {
                dvdRamDds = imageFormat.ReadDiskTag(MediaTagType.DVDRAM_DDS);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDRAM_MediumStatus))
            {
                dvdRamCartridgeStatus = imageFormat.ReadDiskTag(MediaTagType.DVDRAM_MediumStatus);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDRAM_SpareArea))
            {
                dvdRamSpareArea = imageFormat.ReadDiskTag(MediaTagType.DVDRAM_SpareArea);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDR_RMD))
            {
                lastBorderOutRmd = imageFormat.ReadDiskTag(MediaTagType.DVDR_RMD);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDR_PreRecordedInfo))
            {
                dvdPreRecordedInfo = imageFormat.ReadDiskTag(MediaTagType.DVDR_PreRecordedInfo);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDR_MediaIdentifier))
            {
                dvdrMediaIdentifier = imageFormat.ReadDiskTag(MediaTagType.DVDR_MediaIdentifier);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDR_PFI))
            {
                dvdrPhysicalInformation = imageFormat.ReadDiskTag(MediaTagType.DVDR_PFI);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.HDDVD_MediumStatus))
            {
                hddvdrMediumStatus = imageFormat.ReadDiskTag(MediaTagType.HDDVD_MediumStatus);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDDL_LayerCapacity))
            {
                dvdrLayerCapacity = imageFormat.ReadDiskTag(MediaTagType.DVDDL_LayerCapacity);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDDL_MiddleZoneAddress))
            {
                dvdrDlMiddleZoneStart = imageFormat.ReadDiskTag(MediaTagType.DVDDL_MiddleZoneAddress);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDDL_JumpIntervalSize))
            {
                dvdrDlJumpIntervalSize = imageFormat.ReadDiskTag(MediaTagType.DVDDL_JumpIntervalSize);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVDDL_ManualLayerJumpLBA))
            {
                dvdrDlManualLayerJumpStartLba = imageFormat.ReadDiskTag(MediaTagType.DVDDL_ManualLayerJumpLBA);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DVD_ADIP))
            {
                dvdPlusAdip = imageFormat.ReadDiskTag(MediaTagType.DVD_ADIP);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.DCB))
            {
                dvdPlusDcb = imageFormat.ReadDiskTag(MediaTagType.DCB);
            }

            DvdWritableInfo = new DvdWritableInfo
            {
                DataContext = new DvdWritableInfoViewModel(imageFormat.Info.MediaType, dvdRamDds, dvdRamCartridgeStatus,
                                                           dvdRamSpareArea, lastBorderOutRmd, dvdPreRecordedInfo,
                                                           dvdrMediaIdentifier, dvdrPhysicalInformation,
                                                           hddvdrMediumStatus, null, dvdrLayerCapacity,
                                                           dvdrDlMiddleZoneStart, dvdrDlJumpIntervalSize,
                                                           dvdrDlManualLayerJumpStartLba, null, dvdPlusAdip, dvdPlusDcb,
                                                           _view)
            };

            byte[] blurayBurstCuttingArea = null;
            byte[] blurayCartridgeStatus  = null;
            byte[] blurayDds                  = null;
            byte[] blurayDiscInformation      = null;
            byte[] blurayPowResources         = null;
            byte[] bluraySpareAreaInformation = null;
            byte[] blurayTrackResources       = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.BD_BCA))
            {
                blurayBurstCuttingArea = imageFormat.ReadDiskTag(MediaTagType.BD_BCA);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.BD_CartridgeStatus))
            {
                blurayCartridgeStatus = imageFormat.ReadDiskTag(MediaTagType.BD_CartridgeStatus);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.BD_DDS))
            {
                blurayDds = imageFormat.ReadDiskTag(MediaTagType.BD_DDS);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.BD_DI))
            {
                blurayDiscInformation = imageFormat.ReadDiskTag(MediaTagType.BD_DI);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_POWResourcesInformation))
            {
                blurayPowResources = imageFormat.ReadDiskTag(MediaTagType.MMC_POWResourcesInformation);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.BD_SpareArea))
            {
                bluraySpareAreaInformation = imageFormat.ReadDiskTag(MediaTagType.BD_SpareArea);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_TrackResourcesInformation))
            {
                bluraySpareAreaInformation = imageFormat.ReadDiskTag(MediaTagType.MMC_TrackResourcesInformation);
            }

            BlurayInfo = new BlurayInfo
            {
                DataContext = new BlurayInfoViewModel(blurayDiscInformation, blurayBurstCuttingArea, blurayDds,
                                                      blurayCartridgeStatus, bluraySpareAreaInformation,
                                                      blurayPowResources, blurayTrackResources, null, null, _view)
            };

            byte[]            xboxDmi                   = null;
            byte[]            xboxSecuritySector        = null;
            SS.SecuritySector?decodedXboxSecuritySector = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.Xbox_DMI))
            {
                xboxDmi = imageFormat.ReadDiskTag(MediaTagType.Xbox_DMI);
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.Xbox_SecuritySector))
            {
                xboxSecuritySector        = imageFormat.ReadDiskTag(MediaTagType.Xbox_SecuritySector);
                decodedXboxSecuritySector = SS.Decode(xboxSecuritySector);
            }

            XboxInfo = new XboxInfo
            {
                DataContext = new XboxInfoViewModel(null, xboxDmi, xboxSecuritySector, decodedXboxSecuritySector, _view)
            };

            byte[] pcmciaCis = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.PCMCIA_CIS))
            {
                pcmciaCis = imageFormat.ReadDiskTag(MediaTagType.PCMCIA_CIS);
            }

            PcmciaInfo = new PcmciaInfo
            {
                DataContext = new PcmciaInfoViewModel(pcmciaCis, _view)
            };

            DeviceType deviceType = DeviceType.Unknown;

            byte[] cid         = null;
            byte[] csd         = null;
            byte[] ocr         = null;
            byte[] extendedCsd = null;
            byte[] scr         = null;

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_CID))
            {
                cid        = imageFormat.ReadDiskTag(MediaTagType.SD_CID);
                deviceType = DeviceType.SecureDigital;
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_CSD))
            {
                csd        = imageFormat.ReadDiskTag(MediaTagType.SD_CSD);
                deviceType = DeviceType.SecureDigital;
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_OCR))
            {
                ocr        = imageFormat.ReadDiskTag(MediaTagType.SD_OCR);
                deviceType = DeviceType.SecureDigital;
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.SD_SCR))
            {
                scr        = imageFormat.ReadDiskTag(MediaTagType.SD_SCR);
                deviceType = DeviceType.SecureDigital;
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_CID))
            {
                cid        = imageFormat.ReadDiskTag(MediaTagType.MMC_CID);
                deviceType = DeviceType.MMC;
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_CSD))
            {
                csd        = imageFormat.ReadDiskTag(MediaTagType.MMC_CSD);
                deviceType = DeviceType.MMC;
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_OCR))
            {
                ocr        = imageFormat.ReadDiskTag(MediaTagType.MMC_OCR);
                deviceType = DeviceType.MMC;
            }

            if (imageFormat.Info.ReadableMediaTags != null &&
                imageFormat.Info.ReadableMediaTags.Contains(MediaTagType.MMC_ExtendedCSD))
            {
                extendedCsd = imageFormat.ReadDiskTag(MediaTagType.MMC_ExtendedCSD);
                deviceType  = DeviceType.MMC;
            }

            SdMmcInfo = new SdMmcInfo
            {
                DataContext = new SdMmcInfoViewModel(deviceType, cid, csd, ocr, extendedCsd, scr)
            };

            if (imageFormat is IOpticalMediaImage opticalMediaImage)
            {
                try
                {
                    if (opticalMediaImage.Sessions != null &&
                        opticalMediaImage.Sessions.Count > 0)
                    {
                        foreach (Session session in opticalMediaImage.Sessions)
                        {
                            Sessions.Add(session);
                        }
                    }
                }
                catch
                {
                    // ignored
                }

                try
                {
                    if (opticalMediaImage.Tracks != null &&
                        opticalMediaImage.Tracks.Count > 0)
                    {
                        foreach (Track track in opticalMediaImage.Tracks)
                        {
                            Tracks.Add(track);
                        }
                    }
                }
                catch
                {
                    // ignored
                }
            }

            if (imageFormat.DumpHardware is null)
            {
                return;
            }

            foreach (DumpHardwareType dump in imageFormat.DumpHardware)
            {
                foreach (ExtentType extent in dump.Extents)
                {
                    DumpHardwareList.Add(new DumpHardwareModel
                    {
                        Manufacturer    = dump.Manufacturer, Model = dump.Model, Serial = dump.Serial,
                        SoftwareName    = dump.Software.Name, SoftwareVersion = dump.Software.Version,
                        OperatingSystem = dump.Software.OperatingSystem, Start = extent.Start, End = extent.End
                    });
                }
            }
        }
Пример #2
0
        public MediaInfoViewModel(ScsiInfo scsiInfo, string devicePath, Window view)
        {
            _view = view;
            SaveReadMediaSerialCommand        = ReactiveCommand.Create(ExecuteSaveReadMediaSerialCommand);
            SaveReadCapacityCommand           = ReactiveCommand.Create(ExecuteSaveReadCapacityCommand);
            SaveReadCapacity16Command         = ReactiveCommand.Create(ExecuteSaveReadCapacity16Command);
            SaveGetConfigurationCommand       = ReactiveCommand.Create(ExecuteSaveGetConfigurationCommand);
            SaveRecognizedFormatLayersCommand = ReactiveCommand.Create(ExecuteSaveRecognizedFormatLayersCommand);
            SaveWriteProtectionStatusCommand  = ReactiveCommand.Create(ExecuteSaveWriteProtectionStatusCommand);
            SaveDensitySupportCommand         = ReactiveCommand.Create(ExecuteSaveDensitySupportCommand);
            SaveMediumSupportCommand          = ReactiveCommand.Create(ExecuteSaveMediumSupportCommand);
            DumpCommand = ReactiveCommand.Create(ExecuteDumpCommand);
            ScanCommand = ReactiveCommand.Create(ExecuteScanCommand);
            IAssetLoader assets = AvaloniaLocator.Current.GetService <IAssetLoader>();

            _devicePath = devicePath;
            _scsiInfo   = scsiInfo;

            var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{scsiInfo.MediaType}.png");

            MediaLogo = assets.Exists(mediaResource) ? new Bitmap(assets.Open(mediaResource)) : null;

            MediaType = scsiInfo.MediaType.ToString();

            if (scsiInfo.Blocks != 0 &&
                scsiInfo.BlockSize != 0)
            {
                MediaSize =
                    $"Media has {scsiInfo.Blocks} blocks of {scsiInfo.BlockSize} bytes/each. (for a total of {scsiInfo.Blocks * scsiInfo.BlockSize} bytes)";
            }

            if (scsiInfo.MediaSerialNumber != null)
            {
                var sbSerial = new StringBuilder();

                for (int i = 4; i < scsiInfo.MediaSerialNumber.Length; i++)
                {
                    sbSerial.AppendFormat("{0:X2}", scsiInfo.MediaSerialNumber[i]);
                }

                MediaSerial = sbSerial.ToString();
            }

            SaveReadMediaSerialVisible = scsiInfo.MediaSerialNumber != null;
            SaveReadCapacityVisible    = scsiInfo.ReadCapacity != null;
            SaveReadCapacity16Visible  = scsiInfo.ReadCapacity16 != null;

            SaveGetConfigurationVisible       = scsiInfo.MmcConfiguration != null;
            SaveRecognizedFormatLayersVisible = scsiInfo.RecognizedFormatLayers != null;
            SaveWriteProtectionStatusVisible  = scsiInfo.WriteProtectionStatus != null;

            MmcVisible = SaveGetConfigurationVisible || SaveRecognizedFormatLayersVisible ||
                         SaveWriteProtectionStatusVisible;

            if (scsiInfo.DensitySupportHeader.HasValue)
            {
                DensitySupport = Decoders.SCSI.SSC.DensitySupport.PrettifyDensity(scsiInfo.DensitySupportHeader);
            }

            if (scsiInfo.MediaTypeSupportHeader.HasValue)
            {
                MediumSupport = Decoders.SCSI.SSC.DensitySupport.PrettifyMediumType(scsiInfo.MediaTypeSupportHeader);
            }

            SaveDensitySupportVisible = scsiInfo.DensitySupport != null;
            SaveMediumSupportVisible  = scsiInfo.MediaTypeSupport != null;

            SscVisible = SaveDensitySupportVisible || SaveMediumSupportVisible;

            CompactDiscInfo = new CompactDiscInfo
            {
                DataContext = new CompactDiscInfoViewModel(scsiInfo.Toc, scsiInfo.Atip, scsiInfo.DiscInformation,
                                                           scsiInfo.Session, scsiInfo.RawToc, scsiInfo.Pma,
                                                           scsiInfo.CdTextLeadIn, scsiInfo.DecodedToc,
                                                           scsiInfo.DecodedAtip, scsiInfo.DecodedSession,
                                                           scsiInfo.FullToc, scsiInfo.DecodedCdTextLeadIn,
                                                           scsiInfo.DecodedDiscInformation, scsiInfo.Mcn,
                                                           scsiInfo.Isrcs, _view)
            };

            DvdInfo = new DvdInfo
            {
                DataContext = new DvdInfoViewModel(scsiInfo.MediaType, scsiInfo.DvdPfi, scsiInfo.DvdDmi,
                                                   scsiInfo.DvdCmi, scsiInfo.HddvdCopyrightInformation, scsiInfo.DvdBca,
                                                   scsiInfo.DvdAacs, scsiInfo.DecodedPfi, _view)
            };

            XboxInfo = new XboxInfo
            {
                DataContext = new XboxInfoViewModel(scsiInfo.XgdInfo, scsiInfo.DvdDmi, scsiInfo.XboxSecuritySector,
                                                    scsiInfo.DecodedXboxSecuritySector, _view)
            };

            DvdWritableInfo = new DvdWritableInfo
            {
                DataContext = new DvdWritableInfoViewModel(scsiInfo.MediaType, scsiInfo.DvdRamDds,
                                                           scsiInfo.DvdRamCartridgeStatus, scsiInfo.DvdRamSpareArea,
                                                           scsiInfo.LastBorderOutRmd, scsiInfo.DvdPreRecordedInfo,
                                                           scsiInfo.DvdrMediaIdentifier,
                                                           scsiInfo.DvdrPhysicalInformation,
                                                           scsiInfo.HddvdrMediumStatus, scsiInfo.HddvdrLastRmd,
                                                           scsiInfo.DvdrLayerCapacity, scsiInfo.DvdrDlMiddleZoneStart,
                                                           scsiInfo.DvdrDlJumpIntervalSize,
                                                           scsiInfo.DvdrDlManualLayerJumpStartLba,
                                                           scsiInfo.DvdrDlRemapAnchorPoint, scsiInfo.DvdPlusAdip,
                                                           scsiInfo.DvdPlusDcb, _view)
            };

            BlurayInfo = new BlurayInfo
            {
                DataContext = new BlurayInfoViewModel(scsiInfo.BlurayDiscInformation, scsiInfo.BlurayBurstCuttingArea,
                                                      scsiInfo.BlurayDds, scsiInfo.BlurayCartridgeStatus,
                                                      scsiInfo.BluraySpareAreaInformation, scsiInfo.BlurayPowResources,
                                                      scsiInfo.BlurayTrackResources, scsiInfo.BlurayRawDfl,
                                                      scsiInfo.BlurayPac, _view)
            };
        }
Пример #3
0
        private void retrieveXboxInfo()
        {
            //WebRequest wRequest = HttpWebRequest.Create("http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag=saintfx82");
            //WebResponse wResponse = wRequest.GetResponse();

            //StreamReader sr = new StreamReader(wResponse.GetResponseStream());
            //string streamContents = sr.ReadToEnd();

            #region xml response
            string result = @"<XboxInfo>
                                      <AccountStatus>Gold</AccountStatus>
                                      <PresenceInfo>
	                                    <Valid>true</Valid>
	                                    <Info>Last seen 2 hours ago playing Darksiders</Info>
	                                    <Info2/>
	                                    <LastSeen>2010-01-10T20:42:12+00:00</LastSeen>
	                                    <Online>false</Online>
	                                    <StatusText>Offline</StatusText>
	                                    <Title>Darksiders</Title>
                                      </PresenceInfo>
                                      <State>Valid</State>
                                      <Gamertag>SaintFX82</Gamertag>
                                      <ProfileUrl>http://live.xbox.com/member/SaintFX82</ProfileUrl>
                                      <TileUrl>
	                                    http://image.xboxlive.com/global/t.fffe07d1/tile/0/20003
                                      </TileUrl>
                                      <Country>United States</Country>
                                      <Reputation>87.00885</Reputation>
                                      <Bio/>
                                      <Location>Indiana</Location>
                                      <ReputationImageUrl>
	                                    http://live.xbox.com/xweb/lib/images/gc_repstars_external_18.gif
                                      </ReputationImageUrl>
                                      <GamerScore>14354</GamerScore>
                                      <Zone>Underground</Zone>
                                      <RecentGames>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Darksiders</Name>
		                                    <TotalAchievements>43</TotalAchievements>
		                                    <TotalGamerScore>1000</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/bW/EM/0Wdsb2JgbA9ECgUMGgEfWSpVL2ljb24vMC84MDAwIAABAAAAAP4jYXI=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/As/84/1mdsb2JhbC9ECgUMGgEfWSpVL2ljb24vMC84MDAwAAAAAAAAAPkXzx0=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2010-01-10T17:32:50+00:00</LastPlayed>
	                                      <Achievements>7</Achievements>
	                                      <GamerScore>90</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3bdh(j0%02%05&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Dragon Age: Origins</Name>
		                                    <TotalAchievements>55</TotalAchievements>
		                                    <TotalGamerScore>1125</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/fu/yG/1Wdsb2JgbA9ECgQNGwEfVixTL2ljb24vMC84MDAwIAABAAAAAPqp7GE=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/EU/Ky/0mdsb2JhbC9ECgQNGwEfVixTL2ljb24vMC84MDAwAAAAAAAAAP2dQg4=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2010-01-09T17:20:49+00:00</LastPlayed>
	                                      <Achievements>10</Achievements>
	                                      <GamerScore>145</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3adh)k%3f%0b%04&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Assassin's Creed II</Name>
		                                    <TotalAchievements>50</TotalAchievements>
		                                    <TotalGamerScore>1000</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/ox/Jb/0Wdsb2JgbA9ECgUNGgMfVlwhL2ljb24vMC84MDAwIAABAAAAAP50Erw=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/zL/xv/1mdsb2JhbC9ECgUNGgMfVlwhL2ljb24vMC84MDAwAAAAAAAAAPlAvNM=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2010-01-02T21:19:06+00:00</LastPlayed>
	                                      <Achievements>50</Achievements>
	                                      <GamerScore>1000</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3bei*h%3ez%05&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Civilization Revolut'n</Name>
		                                    <TotalAchievements>50</TotalAchievements>
		                                    <TotalGamerScore>1000</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/Hf/Dq/1Wdsb2JgbA9ECgUMGgQfWSpWL2ljb24vMC84MDAwIAABAAAAAPrF8AI=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/cl/7e/0mdsb2JhbC9ECgUMGgQfWSpWL2ljb24vMC84MDAwAAAAAAAAAP3xXm0=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-29T21:06:51+00:00</LastPlayed>
	                                      <Achievements>46</Achievements>
	                                      <GamerScore>875</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3bdh-o0%02%03&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Mass Effect</Name>
		                                    <TotalAchievements>49</TotalAchievements>
		                                    <TotalGamerScore>1200</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/-T/0q/12dsb2JgbA9ECgR8GgMfWSpbL2ljb24vMC84MDAwIAABAAAAAPgFPeI=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/kp/Me/0Gdsb2JhbC9ECgR8GgMfWSpbL2ljb24vMC84MDAwAAAAAAAAAP8xk40=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-29T16:57:34+00:00</LastPlayed>
	                                      <Achievements>2</Achievements>
	                                      <GamerScore>40</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3a%15%18*iAr%09&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Shadow Complex</Name>
		                                    <TotalAchievements>12</TotalAchievements>
		                                    <TotalGamerScore>200</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/SY/pD/1mdsb2JgbA9ECgUAGwEfVilVL2ljb24vMC84MDAwIAABAAAAAPlsilY=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/Ji/R3/0Wdsb2JhbC9ECgUAGwEfVilVL2ljb24vMC84MDAwAAAAAAAAAP5YJDk=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-29T02:15:11+00:00</LastPlayed>
	                                      <Achievements>10</Achievements>
	                                      <GamerScore>180</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3bhe)j3%03%07&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Rock Band 2</Name>
		                                    <TotalAchievements>50</TotalAchievements>
		                                    <TotalGamerScore>1000</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/0l/Nu/0Gdsb2JgbA9ECgQNGwEfVllaL2ljb24vMC84MDAwIAABAAAAAP9BU80=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/vf/1a/12dsb2JhbC9ECgQNGwEfVllaL2ljb24vMC84MDAwAAAAAAAAAPh1-aI=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-21T21:21:11+00:00</LastPlayed>
	                                      <Achievements>13</Achievements>
	                                      <GamerScore>190</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3adh)k%3f%7ex&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Modern Warfare 2</Name>
		                                    <TotalAchievements>50</TotalAchievements>
		                                    <TotalGamerScore>1000</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/Z+/tF/12dsb2JgbA9ECgQJGgYfVl5UL2ljb24vMC84MDAwIAABAAAAAPhq63g=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/CE/Vx/0Gdsb2JhbC9ECgQJGgYfVl5UL2ljb24vMC84MDAwAAAAAAAAAP9eRRc=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-21T21:11:21+00:00</LastPlayed>
	                                      <Achievements>22</Achievements>
	                                      <GamerScore>315</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3a%60m%2fl%3b%7cw&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>The Godfather II</Name>
		                                    <TotalAchievements>41</TotalAchievements>
		                                    <TotalGamerScore>1000</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/Za/3e/1Gdsb2JgbA9ECgQNGwEfVllVL2ljb24vMC84MDAwIAABAAAAAPvxrXo=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/Cg/Pq/02dsb2JhbC9ECgQNGwEfVllVL2ljb24vMC84MDAwAAAAAAAAAPzFAxU=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-20T17:19:25+00:00</LastPlayed>
	                                      <Achievements>41</Achievements>
	                                      <GamerScore>1000</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3adh)k%3f%7ew&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Turtles In Time RS</Name>
		                                    <TotalAchievements>12</TotalAchievements>
		                                    <TotalGamerScore>200</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/7l/V0/0Wdsb2JgbA9ECgUAGwEfVytRL2ljb24vMC84MDAwIAABAAAAAP5bVfE=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/gf/tA/1mdsb2JhbC9ECgUAGwEfVytRL2ljb24vMC84MDAwAAAAAAAAAPlv+54=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-20T16:35:49+00:00</LastPlayed>
	                                      <Achievements>10</Achievements>
	                                      <GamerScore>140</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3bhe)j2e4X6z-17%01&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>GTA IV</Name>
		                                    <TotalAchievements>65</TotalAchievements>
		                                    <TotalGamerScore>1500</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/8x/Us/1Wdsb2JgbA9ECgUMGgQfWSlRL2ljb24vMC84MDAwIAABAAAAAPoDFew=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/nL/sY/0mdsb2JhbC9ECgUMGgQfWSlRL2ljb24vMC84MDAwAAAAAAAAAP03u4M=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-09T19:54:27+00:00</LastPlayed>
	                                      <Achievements>56</Achievements>
	                                      <GamerScore>1260</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3bdh-o0%01%07&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Borderlands</Name>
		                                    <TotalAchievements>60</TotalAchievements>
		                                    <TotalGamerScore>1250</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/zX/Es/12dsb2JgbA9ECgUMGgQfWSpUL2ljb24vMC84MDAwIAABAAAAAPgDcdI=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/ot/8Y/0Gdsb2JhbC9ECgUMGgQfWSpUL2ljb24vMC84MDAwAAAAAAAAAP83370=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-12-04T17:35:05+00:00</LastPlayed>
	                                      <Achievements>39</Achievements>
	                                      <GamerScore>705</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3bdh-o0%02%01&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>GRID</Name>
		                                    <TotalAchievements>54</TotalAchievements>
		                                    <TotalGamerScore>1100</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/Fu/SS/0Gdsb2JgbA9ECgQLG3QfWSklL2ljb24vMC84MDAwIAABAAAAAP+95Ak=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/eU/qm/12dsb2JhbC9ECgQLG3QfWSklL2ljb24vMC84MDAwAAAAAAAAAPiJSmY=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-10-13T19:38:59+00:00</LastPlayed>
	                                      <Achievements>18</Achievements>
	                                      <GamerScore>245</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3abn%5c%1e6%07%02&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>The Beatles: Rock Band</Name>
		                                    <TotalAchievements>50</TotalAchievements>
		                                    <TotalGamerScore>1000</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/Ya/fB/0Wdsb2JgbA9ECgQNGwEfVi1SL2ljb24vMC84MDAwIAABAAAAAP7up34=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/Dg/n1/1mdsb2JhbC9ECgQNGwEfVi1SL2ljb24vMC84MDAwAAAAAAAAAPnaCRE=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2009-09-30T00:42:45+00:00</LastPlayed>
	                                      <Achievements>22</Achievements>
	                                      <GamerScore>320</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3adh)k%3f%0a%04&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Scene It? BOS!</Name>
		                                    <TotalAchievements>58</TotalAchievements>
		                                    <TotalGamerScore>1250</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/99/uo/02dsb2JgbA9ECgR8GgMfVllTL2ljb24vMC84MDAwIAABAAAAAPyH2+g=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/mH/Wc/1Gdsb2JhbC9ECgR8GgMfVllTL2ljb24vMC84MDAwAAAAAAAAAPuzdYc=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>1753-01-01T00:00:00+00:00</LastPlayed>
	                                      <Achievements>6</Achievements>
	                                      <GamerScore>120</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3a%15%18*iN%0er&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
	                                    <XboxUserGameInfo>
	                                      <Game>
		                                    <Name>Gears of War</Name>
		                                    <TotalAchievements>57</TotalAchievements>
		                                    <TotalGamerScore>1250</TotalGamerScore>
		                                    <Image32Url>
		                                      http://tiles.xbox.com/tiles/bU/l4/1Gdsb2JgbA9ECgR8GgMfWStWL2ljb24vMC84MDAwIAABAAAAAPtXSXI=.jpg
		                                    </Image32Url>
		                                    <Image64Url>
		                                      http://tiles.xbox.com/tiles/Au/dM/02dsb2JhbC9ECgR8GgMfWStWL2ljb24vMC84MDAwAAAAAAAAAPxj5x0=.jpg
		                                    </Image64Url>
	                                      </Game>
	                                      <LastPlayed>2008-11-15T21:38:09+00:00</LastPlayed>
	                                      <Achievements>5</Achievements>
	                                      <GamerScore>60</GamerScore>
	                                      <DetailsURL>
		                                    <![CDATA[http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3a%15%18*iAs%05&compareTo=SaintFX82]]>
	                                      </DetailsURL>
	                                    </XboxUserGameInfo>
                                      </RecentGames>
                                    </XboxInfo>";
            #endregion

            XDocument xmlDoc   = XDocument.Parse(result);
            var       xboxInfo = from xi in xmlDoc.Descendants("XboxInfo")
                                 select new XboxInfo
            {
                AccountStatus      = xi.Element("AccountStatus").Value,
                State              = xi.Element("State").Value,
                Gamertag           = xi.Element("Gamertag").Value,
                ProfileUrl         = new Uri(xi.Element("ProfileUrl").Value),
                TileUrl            = new Uri(xi.Element("TileUrl").Value),
                Country            = xi.Element("Country").Value,
                Reputation         = decimal.Parse(xi.Element("Reputation").Value),
                Bio                = xi.Element("Bio").Value,
                Location           = xi.Element("Location").Value,
                ReputationImageUrl = new Uri(xi.Element("ReputationImageUrl").Value),
                GamerScore         = int.Parse(xi.Element("GamerScore").Value),
                Zone               = xi.Element("Zone").Value,
            };

            var presence = from p in xmlDoc.Descendants("PresenceInfo")
                           select new PresenceInfo
            {
                Valid      = bool.Parse(p.Element("Valid").Value),
                Info       = p.Element("Info").Value,
                Info2      = p.Element("Info2").Value,
                LastSeen   = p.Element("LastSeen").Value,
                Online     = bool.Parse(p.Element("Online").Value),
                StatusText = p.Element("StatusText").Value,
                Title      = p.Element("Title").Value
            };

            xboxInfo.First <XboxInfo>().PresenceInfo = presence.First <PresenceInfo>();

            var recentGames = from xugi in xmlDoc.Descendants("XboxUserGameInfo")
                              select new XboxUserGameInfo
            {
                Game = new Game
                {
                    Name = xugi.Element("Game").Element("Name").Value,
                    TotalAchievements = int.Parse(xugi.Element("Game").Element("TotalAchievements").Value),
                    TotalGamerScore   = int.Parse(xugi.Element("Game").Element("TotalGamerScore").Value),
                    Image32Url        = new Uri(xugi.Element("Game").Element("Image32Url").Value),
                    Image64Url        = new Uri(xugi.Element("Game").Element("Image64Url").Value)
                },
                LastPlayed   = xugi.Element("LastPlayed").Value,
                Achievements = int.Parse(xugi.Element("Achievements").Value),
                GamerScore   = int.Parse(xugi.Element("GamerScore").Value),
                DetailsUrl   = new Uri(xugi.Element("DetailsURL").Value)
            };

            XboxInfo                xInfo  = xboxInfo.First <XboxInfo>();
            PresenceInfo            pInfo  = presence.First <PresenceInfo>();
            List <XboxUserGameInfo> rGames = recentGames.ToList <XboxUserGameInfo>();

            xInfo.PresenceInfo = pInfo;
            xInfo.RecentGames  = rGames;

            propertyGrid1.SelectedObject = xInfo.PresenceInfo;

            this.xInfo = xInfo;
        }