示例#1
0
文件: Core.cs 项目: slicol/meshwork
        public void Start()
        {
            if (started)
            {
                throw new InvalidOperationException("You already called Start()!");
            }

            foreach (var networkInfo in settings.Networks)
            {
                AddNetwork(networkInfo);
            }

            foreach (ITransportListener listener in transportListeners)
            {
                try {
                    listener.StartListening();
                } catch (Exception ex) {
                    LoggingService.LogError($"Listener failed to start: {listener}", ex);
                    failedTransportListeners.Add(new FailedTransportListener(listener, ex));
                }
            }

            ShareHasher.Start();
            RescanSharedDirectories();

            // XXX: This is blocking ! shareWatcher.Start();

            started = true;

            Started?.Invoke(null, EventArgs.Empty);
        }
示例#2
0
文件: Core.cs 项目: slicol/meshwork
        public Core(ISettings settings, IPlatform platform)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }
            if (platform == null)
            {
                throw new ArgumentNullException(nameof(platform));
            }

            Settings = settings;
            Platform = platform;

            KeyManager keyManager = new KeyManager(settings);

            rsaProvider = new RSACryptoServiceProvider();
            rsaProvider.ImportParameters(keyManager.EncryptionParameters);
            nodeID = Common.Utils.SHA512Str(rsaProvider.ToXmlString(false));

            FileSystem = new FileSystemProvider(this);

            ShareBuilder = new ShareBuilder(this);
            ShareBuilder.FinishedIndexing += ShareBuilder_FinishedIndexing;

            shareWatcher = new ShareWatcher(this);

            ShareHasher = new ShareHasher();

            transportManager = new TransportManager(this);

            FileTransferManager = new FileTransferManager(this);

            FileSearchManager = new FileSearchManager(this);

            DestinationManager = new DestinationManager(this);

            // XXX: Use reflection to load these:
            DestinationManager.RegisterSource(new TCPIPv4DestinationSource(this));
            DestinationManager.RegisterSource(new TCPIPv6DestinationSource(this));

            TrackerFactory.Register("meshwork", typeof(MeshworkTracker));

            ITransportListener tcpListener = new TcpTransportListener(this, Settings.TcpListenPort);

            transportListeners.Add(tcpListener);

            if (FinishedLoading != null)
            {
                FinishedLoading(null, EventArgs.Empty);
            }
        }
示例#3
0
文件: Core.cs 项目: slicol/meshwork
        public void Stop()
        {
            ShareBuilder.Stop();

            ShareHasher.Stop();
            shareWatcher.Stop();

            foreach (ITransportListener listener in transportListeners)
            {
                listener.StopListening();
            }

            foreach (var transport in TransportManager.Transports)
            {
                transport.Disconnect();
            }
        }
示例#4
0
        public static bool Init(ISettings settings)
        {
            if (loaded == true) {
                throw new Exception ("Please only call this method once.");
            }

            if (settings == null) {
                throw new ArgumentNullException("settings");
            }

            Core.Settings = settings;

            string pidFilePath = Path.Combine(Core.Settings.DataPath, "meshwork.pid");
            if (File.Exists(pidFilePath)) {
                int processId = -1;
                Int32.TryParse(File.ReadAllText(pidFilePath), out processId);
                try {
                    Process.GetProcessById(processId);
                    Console.Error.WriteLine("Meshwork is already running (PID {0})!", processId);
                    return false;
                } catch (ArgumentException) {
                    File.Delete(pidFilePath);
                }
            }
            File.WriteAllText(pidFilePath, Process.GetCurrentProcess().Id.ToString());

            if (settings.KeyEncrypted) {
                PasswordPrompt(null, EventArgs.Empty);
                if (!settings.KeyUnlocked) {
                    // Quit!
                    return false;
                }
            }

            rsaProvider = new RSACryptoServiceProvider();
            rsaProvider.ImportParameters(settings.EncryptionParameters);
            nodeID = Common.SHA512Str(rsaProvider.ToXmlString(false));

            fileSystem = new FileSystemProvider();

            shareBuilder = new ShareBuilder();
            shareBuilder.FinishedIndexing += ShareBuilder_FinishedIndexing;

            shareWatcher = new ShareWatcher();

            shareHasher = new ShareHasher();

            transportManager = new TransportManager ();

            fileTransferManager = new FileTransferManager();

            fileSearchManager = new FileSearchManager();

            destinationManager = new DestinationManager();

            // XXX: Use reflection to load these:
            destinationManager.RegisterSource(new TCPIPv4DestinationSource());
            destinationManager.RegisterSource(new TCPIPv6DestinationSource());

            MonoTorrent.Client.Tracker.TrackerFactory.Register("meshwork", typeof(MeshworkTracker));

            ITransportListener tcpListener = new TcpTransportListener(Core.Settings.TcpListenPort);
            transportListeners.Add(tcpListener);

            loaded = true;

            if (FinishedLoading != null) {
                FinishedLoading(null, EventArgs.Empty);
            }

            return true;
        }