source: trunk/eraser/Eraser.DefaultPlugins/ErasureMethods/Custom.cs @ 2515

Revision 2515, 4.3 KB checked in by lowjoel, 2 years ago (diff)

Set svn:keywords and svn:eol-style on all the source files.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Rev URL
Line 
1/*
2 * $Id$
3 * Copyright 2008-2010 The Eraser Project
4 * Original Author: Joel Low <lowjoel@users.sourceforge.net>
5 * Modified By:
6 *
7 * This file is part of Eraser.
8 *
9 * Eraser is free software: you can redistribute it and/or modify it under the
10 * terms of the GNU General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option) any later
12 * version.
13 *
14 * Eraser is distributed in the hope that it will be useful, but WITHOUT ANY
15 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 *
18 * A copy of the GNU General Public License can be found at
19 * <http://www.gnu.org/licenses/>.
20 */
21
22using System;
23using System.Collections.Generic;
24using System.Text;
25using System.Runtime.Serialization;
26using System.Security.Permissions;
27
28using Eraser.Util;
29using Eraser.Plugins;
30using Eraser.Plugins.ExtensionPoints;
31
32namespace Eraser.DefaultPlugins
33{
34    [Serializable]
35    class EraseCustom : PassBasedErasureMethod
36    {
37        /// <summary>
38        /// Constructor.
39        /// </summary>
40        /// <param name="method">The erasure method definition for the custom method.</param>
41        public EraseCustom(CustomErasureMethod method)
42        {
43            this.method = method;
44        }
45
46        /// <summary>
47        /// Registers all defined custom methods with the method manager.
48        /// </summary>
49        internal static void RegisterAll()
50        {
51            if (DefaultPlugin.Settings.EraseCustom == null)
52                return;
53
54            Dictionary<Guid, CustomErasureMethod> methods =
55                DefaultPlugin.Settings.EraseCustom;
56            foreach (Guid guid in methods.Keys)
57            {
58                CustomErasureMethod method = methods[guid];
59                Host.Instance.ErasureMethods.Add(new EraseCustom(method));
60            }
61        }
62
63        public override string Name
64        {
65            get { return method.Name; }
66        }
67
68        public override Guid Guid
69        {
70            get { return method.Guid; }
71        }
72
73        protected override bool RandomizePasses
74        {
75            get { return method.RandomizePasses; }
76        }
77
78        protected override ErasureMethodPass[] PassesSet
79        {
80            get { return method.Passes; }
81        }
82
83        CustomErasureMethod method;
84    }
85
86    /// <summary>
87    /// Contains information necessary to create user-defined erasure methods.
88    /// </summary>
89    [Serializable]
90    internal class CustomErasureMethod : ISerializable
91    {
92        public CustomErasureMethod()
93        {
94            Name = string.Empty;
95            Guid = Guid.Empty;
96            RandomizePasses = true;
97        }
98
99        protected CustomErasureMethod(SerializationInfo info, StreamingContext context)
100        {
101            Name = info.GetString("Name");
102            Guid = (Guid)info.GetValue("GUID", Guid.GetType());
103            RandomizePasses = info.GetBoolean("RandomizePasses");
104            List<PassData> passes = (List<PassData>)
105                info.GetValue("Passes", typeof(List<PassData>));
106
107            Passes = new ErasureMethodPass[passes.Count];
108            for (int i = 0; i != passes.Count; ++i)
109                Passes[i] = passes[i];
110        }
111
112        public string Name { get; set; }
113        public Guid Guid { get; set; }
114        public bool RandomizePasses { get; set; }
115        public ErasureMethodPass[] Passes { get; set; }
116
117        #region ISerializable Members
118        [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
119        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
120        {
121            info.AddValue("Name", Name);
122            info.AddValue("GUID", Guid);
123            info.AddValue("RandomizePasses", RandomizePasses);
124
125            List<PassData> passes = new List<PassData>(Passes.Length);
126            foreach (ErasureMethodPass pass in Passes)
127                passes.Add(new PassData(pass));
128            info.AddValue("Passes", passes);
129        }
130
131        [Serializable]
132        private class PassData
133        {
134            public PassData(ErasureMethodPass pass)
135            {
136                if (pass.Function == PassBasedErasureMethod.WriteConstant)
137                {
138                    Random = false;
139                    OpaqueValue = pass.OpaqueValue;
140                }
141                else if (pass.Function == PassBasedErasureMethod.WriteRandom)
142                {
143                    Random = true;
144                }
145                else
146                    throw new ArgumentException(S._("The custom erasure method can only comprise " +
147                        "passes containing constant or random passes"));
148            }
149
150            public static implicit operator ErasureMethodPass(PassData pass)
151            {
152                return new ErasureMethodPass(pass.Random ?
153                    new ErasureMethodPass.ErasureMethodPassFunction(PassBasedErasureMethod.WriteRandom) :
154                        new ErasureMethodPass.ErasureMethodPassFunction(PassBasedErasureMethod.WriteConstant),
155                    pass.OpaqueValue);
156            }
157
158            object OpaqueValue;
159            bool Random;
160        }
161        #endregion
162    }
163}
Note: See TracBrowser for help on using the repository browser.