source: trunk/CrypPlugins/ADFGVX/ADFGVXSettings.cs @ 2496

Last change on this file since 2496 was 2334, checked in by Matthäus Wander, 11 years ago

removed 1006 occurences of DisplayLevel in 218 files (see #122)

File size: 10.7 KB
Line 
1/*
2   Copyright 2008 Sebastian Przybylski, University of Siegen
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17using System;
18using System.Collections.Generic;
19using System.Linq;
20using System.Text;
21using Cryptool.PluginBase;
22using Cryptool.PluginBase.Validation;
23using System.IO;
24using System.Collections;
25using System.ComponentModel;
26
27namespace Cryptool.ADFGVX
28{
29    public class ADFGVXSettings : ISettings
30    {
31        #region Public ADFGVX specific interface
32
33        /// <summary>
34        /// We us this delegate to send messages from the settings class to the ADFGVX plugin
35        /// </summary>
36        /// <param name="msg"></param>
37        /// <param name="logLevel"></param>
38        public delegate void AdfgvxLogMessage(string msg, NotificationLevel logLevel);
39
40        /// <summary>
41        /// An enumaration for the different modes of dealing with unknown characters
42        /// </summary>
43        public enum UnknownSymbolHandlingMode { Remove = 0, Replace = 1 };
44
45        /// <summary>
46        /// Fire if a new message has to be shown in the status bar
47        /// </summary>
48        public event AdfgvxLogMessage LogMessage;
49
50        public bool CaseSensitiveAlphabet
51        {
52            get
53            {
54                if (caseSensitiveAlphabet == 0)
55                    return false;
56                else
57                    return true;
58            }
59            set { }
60        }
61
62        public string DefaultAlphabet
63        {
64            get { return this.lowerAlphabet; }
65            set { }
66               
67        }
68
69        public bool HasChanges
70        {
71            get { return hasChanges; }
72            set { hasChanges = value; }
73        }
74
75        #endregion
76
77        #region Private variables
78
79        private bool hasChanges;
80        private int selectedAction = 0;
81        private string upperAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
82        private string lowerAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
83        private string substitutionMatrix = "abcdefghijklmnopqrstuvwxyz0123456789";
84        private string transPass = string.Empty;
85        private string cleanTransPass = string.Empty;
86        private string substitutionPass = string.Empty;
87        private UnknownSymbolHandlingMode unknownSymbolHandling = UnknownSymbolHandlingMode.Replace;
88        private int caseSensitiveAlphabet = 1; //0=upper, 1=lower
89       
90        #endregion
91
92        #region private methods
93
94        private string removeEqualChars(string value)
95        {
96            int length = value.Length;
97
98            for (int i = 0; i < length; i++)
99            {
100                for (int j = i + 1; j < length; j++)
101                {
102                    if ((value[i] == value[j]) || (!CaseSensitiveAlphabet & (char.ToUpper(value[i]) == char.ToUpper(value[j]))))
103                    {
104                        value = value.Remove(j, 1);
105                        j--;
106                        length--;
107                    }
108                }
109            }
110
111            return value;
112        }
113
114        private string removeNonAlphabetChar(string value)
115        {
116            int length = value.Length;
117            for (int i = 0; i < length; i++)
118            {
119                if (!SubstitutionMatrix.Contains(value[i]))
120                {
121                    value = value.Remove(i, 1);
122                    i--;
123                    length--;
124                }
125            }
126            return value;
127        }
128
129        #endregion
130
131        #region Algorithm settings properties (visible in the Settings pane)
132
133        [ContextMenu("Action", "Select the Algorithm action", 1, ContextMenuControlType.ComboBox, new int[] { 1, 2 }, "Encrypt", "Decrypt")]
134        [TaskPane("Action","Select the Algorithm action",null,1,false,ControlType.ComboBox, new string[] {"Encrypt","Decrypt"})]
135        public int Action
136        {
137            get
138            {
139                return this.selectedAction;
140            }
141            set
142            {
143                if (value != selectedAction) HasChanges = true;
144                this.selectedAction = value;
145                OnPropertyChanged("Action");
146            }
147        }
148
149        [TaskPane("Substitution matrix","The matrixed used for encryption/decryption",null,2,false,ControlType.TextBox,"")]
150        public string SubstitutionMatrix
151        {
152            get{return this.substitutionMatrix;}
153            set
154            {
155                if (value != substitutionMatrix) HasChanges = true;
156                substitutionMatrix = value;
157                LogMessage("Changing alphabet to: \"" + SubstitutionMatrix + "\" (" + SubstitutionMatrix.Length.ToString() + " Symbols)", NotificationLevel.Info);
158                OnPropertyChanged("SubstitutionMatrix");
159            }
160        }
161
162        [TaskPane("Standard Matrix","Create default matrix",null,3,false,ControlType.Button,"")]
163        public void StandardMatrix()
164        {
165            if (SubstitutionMatrix != lowerAlphabet)
166            {
167                SubstitutionMatrix = lowerAlphabet;
168                TranspositionPass = string.Empty;
169                substitutionPass = string.Empty;
170                OnPropertyChanged("SubstitutionPass");
171            }
172        }
173
174        [TaskPane("Random Matrix","Create random matrix",null,4,false,ControlType.Button,"")]
175        public void RandomMatrix()
176        {
177            Random rand = new Random();
178            StringBuilder sb = new StringBuilder(string.Empty);
179            string defaultAlph;
180
181            if (!CaseSensitiveAlphabet)
182                defaultAlph = upperAlphabet;
183            else
184                defaultAlph = lowerAlphabet;   
185
186            while (defaultAlph.Length != 0)
187            {
188                int pos = rand.Next(defaultAlph.Length);
189                sb.Append(defaultAlph[pos].ToString());
190                defaultAlph = defaultAlph.Remove(pos, 1);
191            }
192            SubstitutionMatrix = sb.ToString();
193            TranspositionPass = string.Empty;
194            substitutionPass = string.Empty;
195        }
196
197        [TaskPane("Substitution password","Enter the string of the substitution matrix",null,5,false,ControlType.TextBox,"")]
198        public string SubstitutionPass
199        {
200            get { return this.substitutionPass; }
201            set
202            {
203                if (value != substitutionPass) HasChanges = true;
204                substitutionPass = removeNonAlphabetChar(removeEqualChars(value));
205                SubstitutionMatrix = removeEqualChars(substitutionPass + SubstitutionMatrix);
206                OnPropertyChanged("SubstitutionPass");
207            }
208        }
209
210        [TaskPane("Transpositon password","Transposition password can contain any string of characters. Redundant or invalid characters will be removed before de- or encryption.",
211            null,6,false,ControlType.TextBox,"")]
212        public string TranspositionPass
213        {
214            get { return this.transPass; }
215            set
216            {
217                if (value != transPass) HasChanges = true;
218                transPass = value;
219                CleanTranspositionPass = removeNonAlphabetChar(removeEqualChars(value));
220                OnPropertyChanged("TranspositionPass");
221            }
222        }
223
224        [TaskPane("Clean transposition password","Transposition password, with removed non alphabet character und duplicates",null,7,false,ControlType.TextBoxReadOnly,"")]
225        public string CleanTranspositionPass
226        {
227            get { return this.cleanTransPass; }
228            set
229            {
230                this.cleanTransPass = value;
231                OnPropertyChanged("CleanTranspositionPass");
232            }
233        }
234
235        [ContextMenu("Unknown symbol handling", "What should be done with encountered characters at the input which are not in the alphabet?", 8, ContextMenuControlType.ComboBox, null, new string[] { "Remove (remove non alphabet characters)", "Replace (e.g. Ü=UE)" })]
236        [TaskPane("Unknown symbol handling", "What should be done with encountered characters at the input which are not in the alphabet?", null, 8, false, ControlType.ComboBox, new string[] { "Remove (remove non alphabet characters)", "Replace (e.g. Ü=UE)" })]
237        public int UnknownSymbolHandling
238        {
239            get { return (int)this.unknownSymbolHandling; }
240            set
241            {
242                if ((UnknownSymbolHandlingMode)value != unknownSymbolHandling) HasChanges = true;
243                this.unknownSymbolHandling = (UnknownSymbolHandlingMode)value;
244                OnPropertyChanged("UnknownSymbolHandling");
245            }
246        }
247
248        [ContextMenu("Alphabet case", "Transform the alphabet and input data to upper or lower case", 9, ContextMenuControlType.ComboBox, null, new string[] { "Upper case", "Lower case" })]
249        [TaskPane("Alphabet case", "Transfer the alphabet and input data to upper or lower case", null, 9, false, ControlType.ComboBox, new string[] { "Upper case", "Lower case" })]
250        public int AlphabetCase
251        {
252            get { return this.caseSensitiveAlphabet; }
253            set
254            {
255                if (value != caseSensitiveAlphabet) HasChanges = true;
256                if (value == 0)
257                {
258                    string subPass = SubstitutionPass.ToUpper();
259                    SubstitutionMatrix = upperAlphabet;
260                    SubstitutionPass = subPass;
261                }
262                else
263                {
264                    string subPass = SubstitutionPass.ToLower();
265                    SubstitutionMatrix = lowerAlphabet;
266                    SubstitutionPass = subPass;
267                }
268                this.caseSensitiveAlphabet = value;
269                OnPropertyChanged("AlphabetCase");
270            }
271        }
272
273        #endregion
274
275        #region INotifyPropertyChanged Members
276
277        public event PropertyChangedEventHandler PropertyChanged;
278
279        protected void OnPropertyChanged(string name)
280        {
281            if (PropertyChanged != null)
282            {
283                PropertyChanged(this, new PropertyChangedEventArgs(name));
284            }
285        }
286
287        #endregion
288    }
289}
Note: See TracBrowser for help on using the repository browser.