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

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

P2P Publish/Subscriber (buggy, aber für Präsentationszwecke geeignet)

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