source: trunk/CrypPlugins/BigNumber/BigNumberOperation.cs @ 753

Last change on this file since 753 was 753, checked in by nolte, 12 years ago

Rearranged order and created regions for this plug-in so it can be read more comfortable...(idea Nils K)
spread comments over the code as well

File size: 8.7 KB
Line 
1/*                             
2   Copyright 2009 Team CrypTool (Sven Rech,Dennis Nolte,Raoul Falk,Nils Kopal), Uni Duisburg-Essen
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 Cryptool.PluginBase.IO;
19using Cryptool.PluginBase;
20using Cryptool.PluginBase.Miscellaneous;
21using System.ComponentModel;
22
23namespace Cryptool.Plugins.BigNumber
24{
25    [Author("Sven Rech", "sven.rech@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
26    [PluginInfo(false, "BigNumberOperation", "Big Number Operation", null, "BigNumber/icons/plusIcon.png", "BigNumber/icons/minusIcon.png", "BigNumber/icons/timesIcon.png", "BigNumber/icons/divIcon.png", "BigNumber/icons/powIcon.png", "BigNumber/icons/gcdicon.png")]
27    class BigNumberOperation : IThroughput
28    {
29
30        #region private variable
31
32        private BigInteger input1 = null; 
33        private BigInteger input2 = null;
34        private BigInteger mod = null;
35        private BigInteger output = null;
36        private BigNumberOperationSettings settings = new BigNumberOperationSettings();
37
38        #endregion
39
40        #region event
41
42        public event Cryptool.PluginBase.StatusChangedEventHandler OnPluginStatusChanged;
43
44        public event Cryptool.PluginBase.GuiLogNotificationEventHandler OnGuiLogNotificationOccured;     
45
46        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
47
48        public event Cryptool.PluginBase.PluginProgressChangedEventHandler OnPluginProgressChanged;
49
50        #endregion
51
52        #region public
53
54        public BigNumberOperation()
55        {
56            this.settings.OnPluginStatusChanged += settings_OnPluginStatusChanged;
57        }
58
59        /// <summary>
60        /// The inputs are defined.
61        /// Only BigInteger are accepted.
62        /// </summary>
63        [PropertyInfo(Direction.InputData, "x Input", "Number input 1", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
64        public BigInteger Input1
65        {
66            get
67            {
68                return input1;
69            }
70            set
71            {
72                input1 = value;
73                OnPropertyChanged("Input1");
74            }
75        }
76
77       
78        [PropertyInfo(Direction.InputData, "y Input", "Number input 2", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
79        public BigInteger Input2
80        {
81            get
82            {
83                return input2;
84            }
85            set
86            {
87                input2 = value;
88                OnPropertyChanged("Input2");
89            }
90        }
91
92       
93        [PropertyInfo(Direction.InputData, "Modulo", "Modulo input", "", DisplayLevel.Beginner)]
94        public BigInteger Mod
95        {
96            get
97            {
98                return mod;
99            }
100            set
101            {
102                mod = value;
103                OnPropertyChanged("Mod");
104            }
105        }
106
107        /// <summary>
108        /// The output is defined.
109        /// </summary>
110        [PropertyInfo(Direction.OutputData, "Output", "Number output", "", DisplayLevel.Beginner)]
111        public BigInteger Output
112        {
113            get
114            {
115                return output;
116            }
117            set
118            {
119                output = value;
120                OnPropertyChanged("Output");
121             }
122        }
123
124       
125        /// <summary>
126        /// Showing the progress change while plug-in is working
127        /// </summary>
128        /// <param name="value">Value of current process progress</param>
129        /// <param name="max">Max value for the current progress</param>
130        private void ProgressChanged(double value, double max)
131        {
132            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
133        }
134
135       
136        public ISettings Settings
137        {
138            get { return settings; }
139            set { settings = (BigNumberOperationSettings)value; }
140        }
141
142
143        public System.Windows.Controls.UserControl Presentation
144        {
145            get { return null; }
146        }
147
148        public System.Windows.Controls.UserControl QuickWatchPresentation
149        {
150            get { return null; }
151        }
152
153        public void PreExecution()
154        {
155            input1 = null;
156            input2 = null;
157            mod = null;
158        }
159
160        /// <summary>
161        /// Main method
162        /// </summary>
163        public void Execute()
164        {
165            //First checks if both inputs are set
166            if (input1 != null && input2 != null)
167            {
168                ProgressChanged(0.5, 1.0);
169                try
170                {
171                    //As the user changes the operation different outputs are calculated.
172                    switch (settings.Operat)
173                    {
174                        // x + y
175                        case 0:
176                            if (Mod is object)
177                                Output = (Input1 + Input2) % Mod;
178                            else
179                                Output = Input1 + Input2;
180                            break;
181                        // x - y
182                        case 1:
183                            if (Mod is object)
184                                Output = (Input1 - Input2) % Mod;
185                            else
186                                Output = Input1 - Input2;
187                            break;
188                        //x * y
189                        case 2:
190                            if (Mod is object)
191                                Output = (Input1 * Input2) % Mod;
192                            else
193                                Output = Input1 * Input2;
194                            break;
195                        // x / y
196                        case 3:
197                            if (Mod is object)
198                                Output = (Input1 / Input2) % Mod;
199                            else
200                                Output = Input1 / Input2;
201                            break;
202                        // x ^ y
203                        case 4:
204                            if (Mod is object)
205                            {
206                                if (Input2 >= 0)
207                                    Output = Input1.modPow(Input2, Mod);
208                                else
209                                {
210                                    Output = Input1.modInverse(Mod).modPow(-Input2, Mod);
211                                }
212                            }
213                            else
214                            {
215                                Output = Input1.pow(Input2);
216                            }
217                            break;
218                        // gcd(x,y)
219                        case 5:
220                                Output = Input1.gcd(Input2);
221                            break;
222                    }
223                }
224                catch (Exception e)
225                {
226                    GuiLogMessage("Big Number fail: " + e.Message, NotificationLevel.Error);
227                    return;
228                }
229                ProgressChanged(1.0, 1.0);
230            }
231        }
232
233        public void PostExecution()
234        {
235        }
236
237        public void Pause()
238        {
239        }
240
241        public void Stop()
242        {
243        }
244
245        public void Initialize()
246        {
247        }
248
249        public void Dispose()
250        {
251        }
252
253        #endregion
254
255        #region private       
256
257        private void OnPropertyChanged(string p)
258        {
259            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(p));
260        }
261
262        private void GuiLogMessage(string p, NotificationLevel notificationLevel)
263        {
264            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(p, this, notificationLevel));
265        }
266
267        private void settings_OnPluginStatusChanged(IPlugin sender, StatusEventArgs args)
268        {
269            if (OnPluginStatusChanged != null) OnPluginStatusChanged(this, args);
270        }
271
272        #endregion
273    }
274}
Note: See TracBrowser for help on using the repository browser.