source: trunk/CrypPlugins/PeerToPeerBase/P2PPeerSettings.cs @ 813

Last change on this file since 813 was 813, checked in by arnold, 12 years ago

P2P Classes updated (Remove, Base) and removed old P2P Classes (P2PStore, P2PLoad)

File size: 9.9 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase;
6using System.ComponentModel;
7using Cryptool.PluginBase.Control;
8using System.Windows;
9
10/*
11 * TODO:
12 * - Standardwerte in P2P-Settings setzen
13 * - Start- und Stop-Button fürs Beenden und Starten des Peers auch außerhalb des Starts des PlugIns
14 *
15 * FRAGE:
16 * - Wie kann ich statt StringArrays die Enum-Werte als Parameter wählen?
17 */
18
19namespace Cryptool.Plugins.PeerToPeer
20{
21    class P2PPeerSettings : ISettings
22    {
23        public event TaskPaneAttributeChangedHandler TaskPaneAttributeChanged;
24        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
25
26        private bool hasChanges = false;
27        private P2PBase p2pBase;
28
29        #region ISettings Members
30
31        public bool HasChanges
32        {
33            get
34            {
35                return hasChanges;
36            }
37            set
38            {
39                hasChanges = value;
40            }
41        }
42
43        #endregion
44
45        #region taskPane
46
47        // Parse String-Value to a valid Enum-Value
48        private static T StringToEnum<T>(string sName)
49        {
50            return (T)Enum.Parse(typeof(T), sName);
51        }
52
53        public P2PPeerSettings (P2PBase p2pBase)
54            {
55            if(TaskPaneAttributeChanged != null)
56                TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("BtnStop", Visibility.Hidden)));
57            this.p2pBase = p2pBase;
58            }
59
60        #endregion
61
62        #region Start- and Stop-Buttons incl. functionality
63
64        [TaskPane("Start", "Initializes and starts Peer", null, 3, false, DisplayLevel.Beginner, ControlType.Button)]
65        public void BtnStart()
66        {
67            PeerStarted = !this.peerStarted;
68        }
69
70        //private int iTest = 2;
71        //[PropertySaveOrder(4)]
72        //[ContextMenu("CaptionText","ContextToolTip",4,DisplayLevel.Beginner,ContextMenuControlType.ComboBox,new int[]{1,2},"Welt","Hallo")]
73        //[TaskPane("Testfunktion","",null,4,false,DisplayLevel.Beginner,ControlType.ComboBox,new string[]{"Welt","Hallo"})]
74        //public int Test
75        //{
76        //    get {return this.iTest;}
77        //    set
78        //    {
79        //        if (value != this.iTest)
80        //            this.iTest = value;
81        //    }
82        //}
83
84        private bool peerStarted = false;
85        /// <summary>
86        /// If peer isn't started by clicking the Button, it will be started by setting to true
87        /// </summary>
88        public bool PeerStarted
89        {
90            get { return this.peerStarted; }
91            set
92            {
93                if (!this.peerStarted)
94                {
95                    if (P2PPeerName != null && P2PWorldName != null)
96                    {
97                        this.p2pBase.InitializeAll(P2PPeerName, P2PWorldName, P2PLinkMngrType, P2PBSType, P2POverlType, P2PDhtType);
98                        this.p2pBase.SynchStart();
99                        TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("BtnStart", Visibility.Collapsed)));
100                        TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("BtnStop", Visibility.Visible)));
101                    }
102                    else
103                    {
104                        // can not initialize Peer, because P2PUserName and/or P2PWorldName are missing
105                        throw (new Exception("You must set P2PPeerName and/or P2PWorldName, otherwise starting the peer isn't possible"));
106                    }
107                }
108                if (value != this.peerStarted)
109                {
110                    this.peerStarted = value;
111                    //don't use the PeerStopped-Property, because you will run into a recursive loop!!!
112                    this.peerStopped = !value; 
113                    OnPropertyChanged("PeerStarted");
114                    HasChanges = true;
115                }
116            }
117        }
118
119        [TaskPane("Stop", "Stops the Peer", null, 4, false, DisplayLevel.Beginner, ControlType.Button)]
120        public void BtnStop()
121        {
122            PeerStopped = !this.peerStopped;
123        }
124
125        private bool peerStopped = true;
126        /// <summary>
127        /// if peer is already started, it will be stopped by setting to true
128        /// </summary>
129        public bool PeerStopped
130        {
131            get { return this.peerStopped; }
132            set
133            {
134                if (this.peerStarted)
135                {
136                    this.p2pBase.SynchStop();
137                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("BtnStart", Visibility.Visible)));
138                    TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("BtnStop", Visibility.Collapsed)));
139                }
140                if (value != this.peerStopped)
141                {
142                    //don't use the PeerStarted-Property, because you will run into a recursive loop!!!
143                    this.peerStarted = !value;
144                    this.peerStopped = value;
145                    OnPropertyChanged("PeerStopped");
146                    HasChanges = true;
147                }
148            }
149        }
150
151        #endregion
152
153        #region Setting-Fields
154
155        private string p2pPeerName;
156        [TaskPane("P2P Peer Name", "P2P Name of the Peer.", null, 0, false, DisplayLevel.Beginner, ControlType.TextBox)]
157        public string P2PPeerName
158        {
159            get { return this.p2pPeerName; }
160            set
161            {
162                if (value != this.p2pPeerName)
163                {
164                    this.p2pPeerName = value;
165                    OnPropertyChanged("P2PPeerName");
166                    HasChanges = true;
167                }
168            }
169        }
170
171        private string p2pWorldName;
172        [TaskPane("P2P World", "P2P Name of the world.", null, 1, false, DisplayLevel.Beginner, ControlType.TextBox)]
173        public string P2PWorldName
174        {
175            get { return this.p2pWorldName; }
176            set
177            {
178                if (value != this.p2pWorldName)
179                {
180                    this.p2pWorldName = value;
181                    OnPropertyChanged("P2PWorldName");
182                    HasChanges = true;
183                }
184            }
185        }
186
187        [TaskPane("Log internal state of peer", "Log internal state of peer", null, 2, false, DisplayLevel.Beginner, ControlType.Button)]
188        public void btnTest()
189        {
190            this.p2pBase.LogInternalState();
191        }
192
193        private P2PLinkManagerType p2pLinkManagerType = P2PLinkManagerType.Snal;
194        [TaskPane("LinkManager-Type", "Select the LinkManager-Type", "P2P Settings", 2, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Snal" })]
195        public P2PLinkManagerType P2PLinkMngrType
196        {
197            get { return this.p2pLinkManagerType; }
198            set
199            {
200                if (value != this.p2pLinkManagerType)
201                {
202                    this.p2pLinkManagerType = StringToEnum<P2PLinkManagerType>(value.ToString());
203                    OnPropertyChanged("P2PLinkManagerType");
204                    HasChanges = true;
205                }
206            }
207        }
208
209        //private P2PBootstrapperType p2pBSType = P2PBootstrapperType.LocalMachineBootstrapper;
210        private P2PBootstrapperType p2pBSType;
211        [TaskPane("Bootstrapper-Type", "Select the Bootstrapper-Type", "P2P Settings", 3, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "LocalMachineBootstrapper", "IrcBootstrapper" })]
212        public P2PBootstrapperType P2PBSType
213        {
214            get { return this.p2pBSType; }
215            set
216            {
217                if (value != this.p2pBSType)
218                {
219                    this.p2pBSType = StringToEnum<P2PBootstrapperType>(value.ToString());
220                    OnPropertyChanged("P2PBSType");
221                    HasChanges = true;
222                }
223            }
224        }
225
226        private P2POverlayType p2pOverlayType = P2POverlayType.FullMeshOverlay;
227        [TaskPane("Overlay-Type", "Select the Overlay-Type", "P2P Settings", 4, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "FullMeshOverlay" })]
228        public P2POverlayType P2POverlType
229        {
230            get { return this.p2pOverlayType; }
231            set
232            {
233                if (value != this.p2pOverlayType)
234                {
235                    this.p2pOverlayType = StringToEnum<P2POverlayType>(value.ToString());
236                    OnPropertyChanged("P2POverlType");
237                    HasChanges = true;
238                }
239            }
240        }
241
242        private P2PDHTType p2pDhtType = P2PDHTType.FullMeshDHT;
243        [TaskPane("DHT-Type", "Select the DHT-Type", "P2P Settings", 5, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "FullMeshDHT" })]
244        public P2PDHTType P2PDhtType
245        {
246            get { return this.p2pDhtType;  }
247            set
248            {
249                if (value != this.p2pDhtType)
250                {
251                    this.p2pDhtType = StringToEnum<P2PDHTType>(value.ToString());
252                    OnPropertyChanged("P2PDhtType");
253                    HasChanges = true;
254                }
255            }
256        }
257
258        #endregion
259
260        #region INotifyPropertyChanged Members
261
262        private void OnPropertyChanged(string p)
263        {
264            if (PropertyChanged != null)
265            {
266                PropertyChanged(this, new PropertyChangedEventArgs(p));
267            }
268        }
269
270        #endregion
271    }
272}
Note: See TracBrowser for help on using the repository browser.