source: trunk/CrypPlugins/SZ42/Lorenz.cs @ 2334

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

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

File size: 9.1 KB
Line 
1/* HOWTO: Change year, author name and organization.
2   Copyright 2010 Your Name, University of Duckburg
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*/
16using System;
17using System.Collections.Generic;
18using System.Linq;
19using System.Text;
20using Cryptool.PluginBase;
21using System.ComponentModel;
22using Cryptool.PluginBase.IO;
23using Cryptool.PluginBase.Miscellaneous;
24using System.Windows.Controls;
25using Cryptool.PluginBase.Cryptography;
26using System.IO;
27using System.Runtime.Serialization.Formatters.Binary;
28
29namespace Cryptool.Plugins.SZ42
30{
31    [Author("Wilmer Daza", "mr.wadg@gmail.com", "University of Magdalena", "http://www.unimagdalena.edu.co")]
32    [PluginInfo(false, "Lorenz SZ42", "Represents the SZ42 Lorenz machine", "SZ42/DetailedDescription/Description.xaml", "SZ42/Images/sz42.png")]
33    [EncryptionType(EncryptionType.Classic)]
34   
35    public class Lorenz : IEncryption
36    {
37        #region Private Variables
38
39        private readonly LorenzSettings settings;
40        private string inputString;
41        private string outputString;
42        private string parsedString;
43        private bool first = true;
44        private bool isPlayMode = false;
45        private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
46        private SZ42 sz42Encrypt, sz42Decrypt, reset;
47        private BinaryFormatter bf;
48        private MemoryStream ms;
49
50        #endregion
51
52        #region Public Interface
53
54        public Lorenz() 
55        {
56            settings = new LorenzSettings();
57
58            reset = new SZ42();
59
60            //ConfigMachine(reset);
61
62            settings.LogMessage += Lorenz_LogMessage;
63            settings.ReExecute += Lorenz_ReExecute;
64        }
65
66        #endregion
67
68        #region Data Properties
69
70        [PropertyInfo(Direction.InputData, "Text Input", "Input a string to be processed by the SZ42 cipher", null, false, false, QuickWatchFormat.Text, null)]
71        public string InputString
72        {
73            get { return this.inputString; }
74            set
75            {
76                if (value != inputString)
77                {
78                    this.inputString = value;
79                    OnPropertyChanged("InputString");
80                }
81            }
82        }
83
84        [PropertyInfo(Direction.OutputData, "Text output", "The string after processing with the SZ42 cipher", "", false, false, QuickWatchFormat.Text, null)]
85        public string OutputString
86        {
87            get { return this.outputString; }
88            set
89            {
90                this.outputString = value;
91                OnPropertyChanged("OutputString");
92            }
93        }
94
95        #endregion
96
97        #region IPlugin Members
98
99        public ISettings Settings
100        {
101            get { return settings; }
102        }
103
104        /// <summary>
105        /// HOWTO: You can provide a custom (tabbed) presentation to visualize your algorithm.
106        /// Return null if you don't provide one.
107        /// </summary>
108        public UserControl Presentation
109        {
110            get { return null; }
111        }
112
113        /// <summary>
114        /// HOWTO: You can provide custom (quickwatch) presentation to visualize your algorithm.
115        /// Return null if you don't provide one.
116        /// </summary>
117        public UserControl QuickWatchPresentation
118        {
119            get { return null; }
120        }
121
122        public void PreExecution()
123        {
124            Dispose();
125        }
126
127        public void Execute()
128        {
129            if (first)
130            {
131                ConfigMachine(reset);
132                first = false;
133            }
134
135            isPlayMode = true;
136
137            if (!string.IsNullOrEmpty(inputString))
138            {
139                if (settings.Action == 0)
140                {
141                    Lorenz_LogMessage("encrypting", NotificationLevel.Info);
142                    sz42Encrypt = ResetMachine();
143                    Encrypt();
144                }
145                else if (settings.Action == 1)
146                {
147                    Lorenz_LogMessage("decrypting", NotificationLevel.Info);
148                    sz42Decrypt = ResetMachine();
149                    Decrypt();
150                }
151
152                OnPropertyChanged("OutputString");
153            }
154        }
155
156        private void Encrypt() 
157        {
158            if (settings.Limitation == 1)
159                sz42Encrypt.TheresLimitation = false;
160            else
161                sz42Encrypt.TheresLimitation = true;
162
163            sz42Encrypt.Trace.Clear();
164
165            if (settings.InputParsed)
166                parsedString = inputString;
167            else
168                parsedString = sz42Encrypt.ParseInput(inputString);
169
170            outputString = sz42Encrypt.ActionMachine(parsedString);
171        }
172
173        private void Decrypt() 
174        {
175            if (settings.Limitation == 1)
176                sz42Decrypt.TheresLimitation = false;
177            else
178                sz42Decrypt.TheresLimitation = true;
179
180            sz42Decrypt.Trace.Clear();
181
182            parsedString = sz42Decrypt.ActionMachine(inputString);
183
184            if (settings.OutputParsed)
185                outputString = parsedString;
186            else
187                outputString = sz42Decrypt.ParseOutput(parsedString);
188        }
189
190        private SZ42 ResetMachine() 
191        {
192            ms = new MemoryStream();
193            bf = new BinaryFormatter();
194            bf.Serialize(ms, reset);
195            ms.Position = 0;
196            SZ42 sz42 = (SZ42)bf.Deserialize(ms);
197            ms.Close();
198            return sz42;
199        }
200
201        private void ConfigMachine(SZ42 machine)
202        {
203            string[] positions, patterns;
204            int i = 0;
205
206            positions = settings.Positions;
207            patterns = settings.Patterns;
208
209            foreach (Wheel wheel in machine.ChiWheels)
210            {
211                wheel.CurrentPosition = Convert.ToInt32(positions[i]);
212                wheel.Pattern = patterns[i].ToCharArray();
213                i++;
214            }
215
216            foreach (Wheel wheel in machine.PsiWheels)
217            {
218                wheel.CurrentPosition = Convert.ToInt32(positions[i]);
219                wheel.Pattern = patterns[i].ToCharArray();
220                i++;
221            }
222
223            foreach (Wheel wheel in machine.MuWheels)
224            {
225                wheel.CurrentPosition = Convert.ToInt32(positions[i]);
226                wheel.Pattern = patterns[i].ToCharArray();
227                i++;
228            }
229        }
230
231        /// <summary>
232        /// Handles re-execution events from settings class
233        /// </summary>
234        private void Lorenz_ReExecute()
235        {
236            if (isPlayMode)
237                Execute();
238        }
239
240        /// <summary>
241        /// Handles log messages from the settings class
242        /// </summary>
243        private void Lorenz_LogMessage(string msg, NotificationLevel loglevel)
244        {
245            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(msg, this, loglevel));
246        }
247
248        public void PostExecution()
249        {
250            isPlayMode = false;
251            Dispose();
252        }
253
254        public void Pause()
255        {
256        }
257
258        public void Stop()
259        {
260        }
261
262        public void Initialize()
263        {
264        }
265
266        public void Dispose()
267        {
268            foreach (CryptoolStream stream in listCryptoolStreamsOut)
269                stream.Close();
270           
271            listCryptoolStreamsOut.Clear();
272        }
273
274        #endregion
275
276        #region Event Handling
277
278        public event StatusChangedEventHandler OnPluginStatusChanged;
279
280        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
281
282        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
283
284        public event PropertyChangedEventHandler PropertyChanged;
285
286        private void GuiLogMessage(string message, NotificationLevel logLevel)
287        {
288            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
289        }
290
291        private void OnPropertyChanged(string name)
292        {
293            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
294        }
295
296        private void ProgressChanged(double value, double max)
297        {
298            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
299        }
300
301        #endregion
302    }
303}
Note: See TracBrowser for help on using the repository browser.