/// <summary>
        /// Initializes the torrent engine.
        /// </summary>
        public static void Initialize()
        {
            if (isInitialized)
            {
                return;
            }

            isInitialized = true;

            Log.LogInfo("[Engine] Starting up TorrentEngine.");

            if (engineThread != null)
            {
                engineThread.Join();
                engineThread = null;
            }

            isStopping = false;
            workQueueResetEvent.Set();

            DiskManager.Initialize();
            PeerListener.StartListening();
            LocalPeerListener.StartListening();
            LocalPeerDiscovery.Initialize();

            engineThread          = new Thread(EngineLoop);
            engineThread.Priority = ThreadPriority.Normal;
            engineThread.Name     = "TorrentEngineThread";
            engineThread.Start();
        }
        /// <summary>
        /// Uninitializes the torrent engine.
        /// </summary>
        public static void Uninitialize()
        {
            if (!isInitialized)
            {
                return;
            }

            Log.LogInfo("[Engine] Shutting down TorrentEngine.");

            isInitialized = false;
            isStopping    = true;
            workQueueResetEvent.Set();

            TorrentRegistry.StopAllActiveTorrents();
            PeerListener.StopListening();
            LocalPeerListener.StopListening();
            LocalPeerDiscovery.Uninitialize();
            DiskManager.Uninitialize();

            if (engineThread != null)
            {
                engineThread.Join();
                engineThread = null;
            }
        }
Exemple #3
0
 private void _localDiscovery_PeerDiscovered(LocalPeerDiscovery sender, IPEndPoint peerEP, BinaryID networkID)
 {
     lock (_networks)
     {
         if (_networks.ContainsKey(networkID))
         {
             _networks[networkID].MakeConnection(peerEP);
         }
     }
 }
Exemple #4
0
            int _reNegotiateAfterSeconds = 3600;      //1hr

            #endregion

            #region constructor

            public InternalBitChatService(BitChatService service, BitChatProfile profile, Certificate[] trustedRootCertificates, SecureChannelCryptoOptionFlags supportedCryptoOptions)
            {
                _service = service;
                _profile = profile;
                _trustedRootCertificates = trustedRootCertificates;
                _supportedCryptoOptions  = supportedCryptoOptions;

                _connectionManager = new ConnectionManager(_profile.LocalEP, ChannelRequest);

                LocalPeerDiscovery.StartListener(41733);
                _localDiscovery = new LocalPeerDiscovery(_connectionManager.LocalEP.Port);
                _localDiscovery.PeerDiscovered += _localDiscovery_PeerDiscovered;

                _profile.LocalEP = _connectionManager.LocalEP;
            }
 private void LocalDiscovery_PeerDiscovered(LocalPeerDiscovery sender, IPEndPoint peerEP, BinaryID networkID)
 {
     lock (_chats)
     {
         if (_chats.ContainsKey(networkID))
         {
             _chats[networkID].Network.MakeConnection(peerEP);
         }
         else
         {
             foreach (KeyValuePair <BinaryID, BitChat> chat in _chats)
             {
                 if (networkID.Equals(chat.Value.Network.MaskedPeerEmailAddress))
                 {
                     chat.Value.Network.SendInvitation(new IPEndPoint[] { peerEP });
                     break;
                 }
             }
         }
     }
 }
        public void Start()
        {
            if (_connectionManager != null)
            {
                return;
            }

            //set min threads since the default value is too small for client at startup due to multiple chats queuing too many tasks immediately
            {
                int minWorker, minIOC;
                ThreadPool.GetMinThreads(out minWorker, out minIOC);

                minWorker = Environment.ProcessorCount * 32;
                ThreadPool.SetMinThreads(minWorker, minIOC);
            }

            //verify root certs
            foreach (Certificate trustedCert in _trustedRootCertificates)
            {
                trustedCert.Verify(_trustedRootCertificates);
            }

            //verify profile cert
            _profile.LocalCertificateStore.Certificate.Verify(_trustedRootCertificates);

            //start connection manager
            _connectionManager = new ConnectionManager(_profile);
            _connectionManager.InternetConnectivityStatusChanged += ConnectionManager_InternetConnectivityStatusChanged;
            _connectionManager.BitChatNetworkChannelInvitation   += ConnectionManager_BitChatNetworkChannelInvitation;
            _connectionManager.BitChatNetworkChannelRequest      += ConnectionManager_BitChatNetworkChannelRequest;
            _connectionManager.TcpRelayPeersAvailable            += ConnectionManager_TcpRelayPeersAvailable;

            //start local peer discovery
            LocalPeerDiscovery.StartListener(41733);
            _localDiscovery = new LocalPeerDiscovery(_connectionManager.LocalPort);
            _localDiscovery.PeerDiscovered += LocalDiscovery_PeerDiscovered;

            //check inbound invitation tracking
            ManageInboundInvitationTracking();

            foreach (BitChatProfile.BitChatInfo bitChatInfo in _profile.BitChatInfoList)
            {
                try
                {
                    BitChatNetwork network;

                    if (bitChatInfo.Type == BitChatNetworkType.PrivateChat)
                    {
                        if (bitChatInfo.PeerEmailAddress == null)
                        {
                            network = new BitChatNetwork(_connectionManager, _trustedRootCertificates, _supportedCryptoOptions, bitChatInfo.HashedPeerEmailAddress, bitChatInfo.NetworkID, bitChatInfo.NetworkSecret, bitChatInfo.NetworkStatus, bitChatInfo.InvitationSender, bitChatInfo.InvitationMessage);
                        }
                        else
                        {
                            network = new BitChatNetwork(_connectionManager, _trustedRootCertificates, _supportedCryptoOptions, bitChatInfo.PeerEmailAddress, bitChatInfo.SharedSecret, bitChatInfo.NetworkID, bitChatInfo.NetworkSecret, bitChatInfo.PeerCertificateList, bitChatInfo.NetworkStatus, bitChatInfo.InvitationSender, bitChatInfo.InvitationMessage);
                        }
                    }
                    else
                    {
                        network = new BitChatNetwork(_connectionManager, _trustedRootCertificates, _supportedCryptoOptions, bitChatInfo.NetworkName, bitChatInfo.SharedSecret, bitChatInfo.NetworkID, bitChatInfo.NetworkSecret, bitChatInfo.PeerCertificateList, bitChatInfo.NetworkStatus);
                    }

                    BitChat chat = CreateBitChat(network, bitChatInfo.MessageStoreID, bitChatInfo.MessageStoreKey, bitChatInfo.GroupImageDateModified, bitChatInfo.GroupImage, bitChatInfo.SharedFileList, bitChatInfo.TrackerURIs, bitChatInfo.EnableTracking, bitChatInfo.SendInvitation, bitChatInfo.Mute);
                    _chats.Add(chat.NetworkID, chat);
                }
                catch
                { }
            }

            //check profile cert revocation
            ThreadPool.QueueUserWorkItem(CheckCertificateRevocationAsync, new Certificate[] { _profile.LocalCertificateStore.Certificate });

            //check trusted root cert revocation
            ThreadPool.QueueUserWorkItem(CheckCertificateRevocationAsync, _trustedRootCertificates);
        }