source: trunk/CrypP2P/Internal/ConnectionManager.cs @ 2348

Last change on this file since 2348 was 2348, checked in by kopal, 11 years ago
  • removed old certificate stuff
  • p2p editor now checks if certificate exists and can be loaded BEFORE trying to connect to network
  • p2p password is now encrypted using the current windows user
  • some design changes of p2p editor
File size: 8.6 KB
Line 
1/*
2   Copyright 2010 Paul Lelgemann, University of 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 System.Threading;
19using System.Windows.Threading;
20using Cryptool.P2P.Worker;
21using Cryptool.PluginBase;
22using PeersAtPlay.CertificateLibrary.Certificates;
23using System.IO;
24
25namespace Cryptool.P2P.Internal
26{
27    public class ConnectionManager
28    {
29        #region Delegates
30
31        public delegate void P2PConnectionStateChangeEventHandler(object sender, bool newState);
32        public delegate void P2PTryConnectingStateChangeEventHandler(object sender, bool newState);
33
34        #endregion
35
36        #region Events
37
38        public event P2PConnectionStateChangeEventHandler OnP2PConnectionStateChangeOccurred;
39        public event P2PTryConnectingStateChangeEventHandler OnP2PTryConnectingStateChangeOccurred;
40
41        #endregion
42
43        private readonly object connectLock = new object();
44        private readonly P2PBase p2PBase;
45        private DateTime lastConnectionAttempt;
46        private Dispatcher guiLogDispatcher = null;
47        private bool disconnected = false;
48
49        public ConnectionManager(P2PBase p2PBase)
50        {
51            this.p2PBase = p2PBase;
52
53            bool reconnecting = false;
54            p2PBase.OnSystemLeft += new P2PBase.SystemLeft(delegate
55                                                               {
56                                                                   if (disconnected)
57                                                                       return;
58
59                                                                   //Enforce a minimum of 2 seconds between each connection attempt:
60                                                                   if ((lastConnectionAttempt - DateTime.Now).TotalSeconds < 2)
61                                                                       Thread.Sleep(2000);
62
63                                                                   P2PManager.GuiLogMessage("Lost P2P Connection. Try reconnecting...",
64                                                                        NotificationLevel.Error);
65                                                                   reconnecting = true;
66                                                                   this.Connect();
67                                                                   guiLogDispatcher = Dispatcher.CurrentDispatcher;
68                                                               });
69            p2PBase.OnSystemJoined += new P2PBase.SystemJoined(delegate
70                                                                   {
71                                                                       if (p2PBase.IsConnected && reconnecting)
72                                                                       {
73                                                                           //TODO: This doesn't work. GuiLogMessage will never be shown:
74                                                                           if (guiLogDispatcher != null)
75                                                                                guiLogDispatcher.Invoke(DispatcherPriority.Send, (SendOrPostCallback)delegate
76                                                                                {
77                                                                                    P2PManager.GuiLogMessage("Successfully reconnected!",
78                                                                                        NotificationLevel.Balloon);
79                                                                                }, null);
80                                                                           reconnecting = false;
81                                                                       }
82                                                                   });
83        }
84
85        private bool isConnecting;
86        public bool IsConnecting { 
87            get { return isConnecting; } 
88            internal set
89            {
90                isConnecting = value;
91                if (OnP2PTryConnectingStateChangeOccurred != null)
92                {
93                    OnP2PTryConnectingStateChangeOccurred(this, isConnecting);
94                }
95            }
96        }
97       
98        public void Connect()
99        {
100            lock (connectLock)
101            {
102                disconnected = false;
103                lastConnectionAttempt = DateTime.Now;
104
105                try
106                {
107                    if (CertificateServices.GetPeerCertificateByAvatar(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PeersAtPlay" + Path.DirectorySeparatorChar + "Certificates" + Path.DirectorySeparatorChar),
108                        P2PSettings.Default.PeerName, P2PSettings.Default.Password) == null)
109                    {
110                        P2PManager.GuiLogMessage("Cannot connect, account \"" + P2PSettings.Default.PeerName + "\" not found!",
111                                                 NotificationLevel.Warning);
112                        return;
113                    }
114                }
115                catch (Exception ex)
116                {
117                    P2PManager.GuiLogMessage("Cannot connect using account \"" + P2PSettings.Default.PeerName + "\": " + (ex.InnerException != null ? ex.InnerException.Message : ex.Message),
118                                                 NotificationLevel.Warning);
119                    return;
120                }
121
122                if (p2PBase.IsConnected || IsConnecting)
123                {
124                    P2PManager.GuiLogMessage("Cannot connect, already connected or connecting.",
125                                             NotificationLevel.Warning);
126                    return;
127                }
128
129                if (!IsReadyToConnect())
130                {
131                    P2PManager.GuiLogMessage("Cannot connect, configuration is broken.", NotificationLevel.Warning);
132                    return;
133                }
134
135                IsConnecting = true;
136            }
137
138            P2PManager.GuiLogMessage("Dispatching connect request with ConnectionWorker.", NotificationLevel.Debug);
139            new ConnectionWorker(p2PBase, this).Start();
140        }
141
142        public void Disconnect()
143        {
144            lock (connectLock)
145            {
146                disconnected = true;
147                if (!p2PBase.IsConnected || IsConnecting)
148                {
149                    P2PManager.GuiLogMessage("Cannot disconnect, no connection or connection attempt active.",
150                                             NotificationLevel.Warning);
151                    return;
152                }
153
154                IsConnecting = true;
155            }
156
157            P2PManager.GuiLogMessage("Dispatching disconnect request with ConnectionWorker.", NotificationLevel.Debug);
158            new ConnectionWorker(p2PBase, this).Start();
159        }
160
161        public bool IsReadyToConnect()
162        {
163            if (String.IsNullOrEmpty(P2PSettings.Default.PeerName))
164            {
165                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: username missing.", NotificationLevel.Error);
166                return false;
167            }
168
169            if (String.IsNullOrEmpty(P2PSettings.Default.Password))
170            {
171                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: password missing.",
172                                         NotificationLevel.Error);
173                return false;
174            }
175
176            if (String.IsNullOrEmpty(P2PSettings.Default.WorldName))
177            {
178                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: world name missing.",
179                                         NotificationLevel.Error);
180                return false;
181            }
182
183            return true;
184        }
185
186        public void FireConnectionStatusChange()
187        {
188            if (OnP2PConnectionStateChangeOccurred != null)
189            {
190                OnP2PConnectionStateChangeOccurred(this, p2PBase.IsConnected);
191            }
192        }
193    }
194}
Note: See TracBrowser for help on using the repository browser.