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

Last change on this file since 2115 was 2115, checked in by Sven Rech, 11 years ago

some p2p keysearcher changes (all related to better disconnect handling)

File size: 6.3 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;
22
23namespace Cryptool.P2P.Internal
24{
25    public class ConnectionManager
26    {
27        #region Delegates
28
29        public delegate void P2PConnectionStateChangeEventHandler(object sender, bool newState);
30
31        #endregion
32
33        private readonly object connectLock = new object();
34        private readonly P2PBase p2PBase;
35        private DateTime lastConnectionAttempt;
36        private Dispatcher guiLogDispatcher = null;
37
38        public ConnectionManager(P2PBase p2PBase)
39        {
40            this.p2PBase = p2PBase;
41
42            bool reconnecting = false;
43            p2PBase.OnSystemLeft += new P2PBase.SystemLeft(delegate
44                                                               {
45                                                                   //Enforce a minimum of 2 seconds between each connection attempt:
46                                                                   if ((lastConnectionAttempt - DateTime.Now).TotalSeconds < 2)
47                                                                       Thread.Sleep(2000);
48
49                                                                   P2PManager.GuiLogMessage("Lost P2P Connection. Try reconnecting...",
50                                                                        NotificationLevel.Error);
51                                                                   reconnecting = true;
52                                                                   this.Connect();
53                                                                   guiLogDispatcher = Dispatcher.CurrentDispatcher;
54                                                               });
55            p2PBase.OnSystemJoined += new P2PBase.SystemJoined(delegate
56                                                                   {
57                                                                       if (p2PBase.IsConnected && reconnecting)
58                                                                       {
59                                                                           //TODO: This doesn't work. GuiLogMessage will never be shown:
60                                                                           if (guiLogDispatcher != null)
61                                                                                guiLogDispatcher.Invoke(DispatcherPriority.Send, (SendOrPostCallback)delegate
62                                                                                {
63                                                                                    P2PManager.GuiLogMessage("Successfully reconnected!",
64                                                                                        NotificationLevel.Balloon);
65                                                                                }, null);
66                                                                           reconnecting = false;
67                                                                       }
68                                                                   });
69        }
70
71        public bool IsConnecting { get; internal set; }
72        public event P2PConnectionStateChangeEventHandler OnP2PConnectionStateChangeOccurred;
73
74        public void Connect()
75        {
76            lock (connectLock)
77            {
78                lastConnectionAttempt = DateTime.Now;
79
80                if (p2PBase.IsConnected || IsConnecting)
81                {
82                    P2PManager.GuiLogMessage("Cannot connect, already connected or connecting.",
83                                             NotificationLevel.Warning);
84                    return;
85                }
86
87                if (!IsReadyToConnect())
88                {
89                    P2PManager.GuiLogMessage("Cannot connect, configuration is broken.", NotificationLevel.Warning);
90                    return;
91                }
92
93                IsConnecting = true;
94            }
95
96            P2PManager.GuiLogMessage("Dispatching connect request with ConnectionWorker.", NotificationLevel.Debug);
97            new ConnectionWorker(p2PBase, this).Start();
98        }
99
100        public void Disconnect()
101        {
102            lock (connectLock)
103            {
104                if (!p2PBase.IsConnected || IsConnecting)
105                {
106                    P2PManager.GuiLogMessage("Cannot disconnect, no connection or connection attempt active.",
107                                             NotificationLevel.Warning);
108                    return;
109                }
110
111                IsConnecting = true;
112            }
113
114            P2PManager.GuiLogMessage("Dispatching disconnect request with ConnectionWorker.", NotificationLevel.Debug);
115            new ConnectionWorker(p2PBase, this).Start();
116        }
117
118        public bool IsReadyToConnect()
119        {
120            if (String.IsNullOrEmpty(P2PSettings.Default.PeerName))
121            {
122                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: username missing.", NotificationLevel.Error);
123                return false;
124            }
125
126            if (String.IsNullOrEmpty(P2PSettings.Default.PeerName))
127            {
128                P2PManager.GuiLogMessage("Peer-to-peer not fully configured: world name missing.",
129                                         NotificationLevel.Error);
130                return false;
131            }
132
133            return true;
134        }
135
136        public void FireConnectionStatusChange()
137        {
138            if (OnP2PConnectionStateChangeOccurred != null)
139            {
140                OnP2PConnectionStateChangeOccurred(this, p2PBase.IsConnected);
141            }
142        }
143    }
144}
Note: See TracBrowser for help on using the repository browser.