Пример #1
0
        public void ReferenceTemplateImage_Template(string[] splitWimNames, RefFlags refFlags = RefFlags.DEFAULT, bool failure = false)
        {
            string[] splitWims = splitWimNames.Select(x => Path.Combine(TestSetup.SampleDir, x)).ToArray();
            string   destDir   = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            try
            {
                Directory.CreateDirectory(destDir);

                bool[] _checked = new bool[5];
                for (int i = 0; i < _checked.Length; i++)
                {
                    _checked[i] = false;
                }
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.EXTRACT_IMAGE_BEGIN:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[0] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_IMAGE_END:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[1] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_FILE_STRUCTURE:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[2] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_STREAMS:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[3] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_METADATA:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[4] = true;
                    }
                    break;
                    }
                    return(CallbackStatus.CONTINUE);
                }

                try
                {
                    using (Wim wim = Wim.OpenWim(splitWims[0], OpenFlags.DEFAULT, ProgressCallback))
                    {
                        var leftSplitWims = splitWims.Skip(1);
                        wim.ReferenceResourceFiles(leftSplitWims, refFlags, OpenFlags.DEFAULT);

                        wim.ExtractImage(1, destDir, ExtractFlags.NO_ACLS);
                    }
                }
                catch (WimLibException)
                {
                    if (failure)
                    {
                        return;
                    }
                    else
                    {
                        Assert.Fail();
                    }
                }

                Assert.IsTrue(_checked.All(x => x));

                TestHelper.CheckFileSystem(SampleSet.Src03, destDir);
            }
            finally
            {
                if (Directory.Exists(destDir))
                {
                    Directory.Delete(destDir, true);
                }
            }
        }
Пример #2
0
        public void ExtractImage_Template(string wimFileName)
        {
            string wimFile = Path.Combine(TestSetup.SampleDir, wimFileName);
            string destDir = TestHelper.GetTempDir();

            try
            {
                Directory.CreateDirectory(destDir);

                bool[] _checked = new bool[5];
                for (int i = 0; i < _checked.Length; i++)
                {
                    _checked[i] = false;
                }
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.EXTRACT_IMAGE_BEGIN:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        Assert.IsTrue(m.ImageName.Equals("Sample", StringComparison.Ordinal));
                        _checked[0] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_IMAGE_END:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        Assert.IsTrue(m.ImageName.Equals("Sample", StringComparison.Ordinal));
                        _checked[1] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_FILE_STRUCTURE:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        Assert.IsTrue(m.ImageName.Equals("Sample", StringComparison.Ordinal));
                        _checked[2] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_STREAMS:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        Assert.IsTrue(m.ImageName.Equals("Sample", StringComparison.Ordinal));
                        _checked[3] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_METADATA:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        Assert.IsTrue(m.ImageName.Equals("Sample", StringComparison.Ordinal));
                        _checked[4] = true;
                    }
                    break;
                    }
                    return(CallbackStatus.CONTINUE);
                }

                using (Wim wim = Wim.OpenWim(wimFile, OpenFlags.DEFAULT))
                {
                    wim.RegisterCallback(ProgressCallback);

                    WimInfo wi = wim.GetWimInfo();
                    Assert.IsTrue(wi.ImageCount == 1);

                    wim.ExtractImage(1, destDir, ExtractFlags.DEFAULT);
                }

                Assert.IsTrue(_checked.All(x => x));

                TestHelper.CheckFileSystem(SampleSet.Src01, destDir);
            }
            finally
            {
                if (Directory.Exists(destDir))
                {
                    Directory.Delete(destDir, true);
                }
            }
        }
Пример #3
0
        public bool ApplyImage(string wimFile, int imageIndex, string Output, IEnumerable <string> referenceWIMs = null, ExtractFlags extractFlags = ExtractFlags.DEFAULT, RefFlags refFlags = RefFlags.DEFAULT, ProgressCallback progressCallback = null)
        {
            string title = $"Applying {wimFile.Split('\\').Last()}...";

            try
            {
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.EXTRACT_IMAGE_BEGIN:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                    }
                    break;

                    case ProgressMsg.EXTRACT_IMAGE_END:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                    }
                    break;

                    case ProgressMsg.EXTRACT_FILE_STRUCTURE:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        progressCallback?.Invoke($"Applying file structure ({(int)Math.Round((double)m.CurrentFileCount / m.EndFileCount * 100)}%)", 0, true);
                    }
                    break;

                    case ProgressMsg.EXTRACT_STREAMS:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        progressCallback?.Invoke(title, (int)Math.Round((double)m.CompletedBytes / m.TotalBytes * 100), false);
                    }
                    break;

                    case ProgressMsg.EXTRACT_METADATA:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        progressCallback?.Invoke($"Applying metadata ({(int)Math.Round((double)m.CompletedBytes / m.TotalBytes * 100)}%)", 0, true);
                    }
                    break;
                    }
                    return(CallbackStatus.CONTINUE);
                }

                using (Wim wim = Wim.OpenWim(wimFile, OpenFlags.DEFAULT))
                {
                    wim.RegisterCallback(ProgressCallback);
                    if (referenceWIMs != null && referenceWIMs.Count() > 0)
                    {
                        wim.ReferenceResourceFiles(referenceWIMs, (ManagedWimLib.RefFlags)refFlags, OpenFlags.DEFAULT);
                    }
                    wim.ExtractImage(imageIndex, Output, (ManagedWimLib.ExtractFlags)extractFlags);
                }
            }
            catch
            {
                return(false);
            }
            return(true);
        }
Пример #4
0
        public void ExtractList_Template(string fileName, string[] paths)
        {
            string destDir = TestHelper.GetTempDir();

            try
            {
                Directory.CreateDirectory(destDir);

                bool[] _checked = new bool[5];
                for (int i = 0; i < _checked.Length; i++)
                {
                    _checked[i] = false;
                }
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.EXTRACT_TREE_BEGIN:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[0] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_TREE_END:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[1] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_FILE_STRUCTURE:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[2] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_STREAMS:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[3] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_METADATA:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[4] = true;
                    }
                    break;
                    }
                    return(CallbackStatus.CONTINUE);
                }

                string listFile = Path.Combine(destDir, "ListFile.txt");
                using (StreamWriter w = new StreamWriter(listFile, false, Encoding.Unicode))
                {
                    foreach (string path in paths)
                    {
                        w.WriteLine(path);
                    }
                }

                string wimFile = Path.Combine(TestSetup.SampleDir, fileName);
                using (Wim wim = Wim.OpenWim(wimFile, OpenFlags.DEFAULT))
                {
                    wim.RegisterCallback(ProgressCallback);

                    wim.ExtractPathList(1, destDir, listFile, ExtractFlags.GLOB_PATHS);
                }

                Assert.IsTrue(_checked.All(x => x));

                foreach (string path in paths.Select(x => TestHelper.NormalizePath(x.TrimStart('\\'))))
                {
                    if (path.IndexOfAny(new char[] { '*', '?' }) == -1)
                    { // No wlidcard
                        Assert.IsTrue(File.Exists(Path.Combine(destDir, path)));
                    }
                    else
                    { // With wildcard
                        string   destFullPath = Path.Combine(destDir, path);
                        string[] files        = Directory.GetFiles(Path.GetDirectoryName(destFullPath), Path.GetFileName(destFullPath), SearchOption.AllDirectories);
                        Assert.IsTrue(0 < files.Length);
                    }
                }
            }
            finally
            {
                if (Directory.Exists(destDir))
                {
                    Directory.Delete(destDir, true);
                }
            }
        }