Пример #1
0
        internal override void Completed(MediatorContext mediatorContext, IClientContext clientContext, IPeerContext peerContext, OperationCompletedEventArgs oce)
        {
            ClientConst.OperationResult operationResult = oce.Result;

            if (operationResult == ClientConst.OperationResult.Successful)
            {
                Logger.GetLog().Info("接続が完了しました(接続数: " + peerContext.Connections + ")。");

                mediatorContext.State = new ConnectedState();
            }
            else if (operationResult == ClientConst.OperationResult.Restartable)
            {
                Logger.GetLog().Info("IPアドレスが変化しているため、再接続します。");

                peerContext.DisconnectAll();

                Logger.GetLog().Info("ピア接続をすべて切断しました(接続数: " + peerContext.Connections + ")");

                mediatorContext.State = new DisconnectedState();
                mediatorContext.Connect();
            }
            else if (operationResult == ClientConst.OperationResult.Retryable)
            {
                // FIXME: 再試行すること。いまは放置プレイ
                Logger.GetLog().Info("接続に失敗しましたが、再試行可能なエラーです。");

                mediatorContext.State = new DisconnectedState();
            }
            else
            {
                throw new NotSupportedException();
            }
        }
Пример #2
0
        public void LongTimeConnectingTest()
        {
            var mediatorContext = new MediatorContext();

            var maintainTimerField = mediatorContext.GetType().GetField("maintainTimer", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
            var timer         = (MaintainTimer)maintainTimerField.GetValue(mediatorContext);
            var intervalField = timer.GetType().GetField("maintainInterval", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance);

            intervalField.SetValue(timer, 1000);

            var field             = mediatorContext.GetType().GetField("clientContext", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance);
            var clientContextMock = new Mock <IClientContext>();

            field.SetValue(mediatorContext, clientContextMock.Object);

            bool isCalled = false;

            mediatorContext.StateChanged += (s, e) =>
            {
                Console.WriteLine("State: " + mediatorContext.State);
                if (mediatorContext.State is DisconnectedState)
                {
                    isCalled = true;
                }
            };
            mediatorContext.Completed          += (s, e) => { };
            mediatorContext.ConnectionsChanged += (s, e) => { };

            mediatorContext.Connect();

            int waitSeconds = 120;

            while (waitSeconds-- > 0 && !isCalled)
            {
                Thread.Sleep(1000);
            }

            Assert.IsTrue(isCalled);
        }
Пример #3
0
        private static void BootP2PQuake(bool localMode)
        {
            // ViewModel を取得したりイベントハンドラをくっつけたりする
            while (viewModel == null)
            {
                try
                {
                    App.Current.Dispatcher.Invoke(() =>
                    {
                        if (App.Current?.MainWindow?.DataContext != null)
                        {
                            var window = (MainWindow)App.Current?.MainWindow;
                            viewModel  = (RootViewModel)window?.DataContext;
                            viewModel.SettingViewModel.LoadFromConfiguration(ConfigurationManager.Configuration);
                            window.OnExit      += Window_OnExit;
                            window.OnUserquake += Window_OnUserquake;
                        }
                    });
                }
                catch
                {
                    // nothing to do
                }

                Thread.Sleep(1000);
            }
            ;

            client = new MediatorContext();
            client.ConnectionsChanged          += Client_ConnectionsChanged;
            client.StateChanged                += Client_StateChanged;
            client.OnAreapeers                 += Client_OnAreapeers;
            client.OnEarthquake                += Client_OnEarthquake;
            client.OnTsunami                   += Client_OnTsunami;
            client.OnEEWTest                   += Client_OnEEWTest;
            client.OnNewUserquakeEvaluation    += Client_OnNewUserquakeEvaluation;
            client.OnUpdateUserquakeEvaluation += Client_OnUpdateUserquakeEvaluation;

            configuration.OnChangeEPSPConfiguration += (s, e) =>
            {
                ReflectEPSPConfiguration();
            };
            ReflectEPSPConfiguration();

            notifier  = new Notifier(configuration, client);
            activator = new Notifications.Activator(configuration, client);
            player    = new Player(configuration, client);

            if (localMode)
            {
                // 検証鍵をテスト用のものに差し替える
                var verifierType   = Type.GetType("PKCSPeerCrypto.Verifier, PKCSPeerCrypto");
                var serverProofKey = verifierType.GetField("ServerProofKey", BindingFlags.NonPublic | BindingFlags.Static);
                serverProofKey.SetValue(null, "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDB+t0YTWlu3FFiwTb05u2bHWJRpCQJeAzhia6pWJ5BqsVIXgG7zeiHu4cFWrKME7fHQsjlihjnhtaksEtkmnbODUHnNi26FStSSpyo8ex0FZDfXtoQ9VB0m6UxdrGznpzfO9PWbpC0iSoCAyeqILLcDDbuBv5xY6+0D35kQx74kQIDAQAB");

                client.Verification = false;

                // P2P 地震情報ネットワークに接続せず、 localhost:6910 に接続する
                var field       = client.GetType().GetField("peerContext", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                var peerContext = field.GetValue(client);

                var peerDataType = Type.GetType("Client.Common.General.PeerData, Client");
                var peerData     = System.Activator.CreateInstance(peerDataType, new object[] { "localhost", 6910, 10 });
                var peerDatas    = Array.CreateInstance(peerDataType, 1);
                peerDatas.SetValue(peerData, 0);

                var connectMethod = Type.GetType("Client.Peer.Context, Client").GetMethod("Connect");
                connectMethod.Invoke(peerContext, new object[] { peerDatas });

                return;
            }

            client.Connect();
            ReadHistories();
        }
Пример #4
0
 public override Task <BoolResponse> Connect(Empty request, ServerCallContext context)
 {
     return(Task.FromResult(new BoolResponse {
         Result = _m.Connect()
     }));
 }