Esempio n. 1
0
        /// <summary>
        /// 接続する
        /// </summary>
        /// <returns></returns>
        private bool Connect(AbstractState state)
        {
            if (!IsOperatable)
            {
                return(false);
            }

            State = state;

            CRLFSocket socket = new CRLFSocket();

            socket.ReadLine += new EventHandler <ReadLineEventArgs>(ProcessData);
            // FIXME: Closedに対する処理は未実装

            ServerPoint server = serverPointList[random.Next(serverPointList.Count)];

            return(socket.Connect(server.Host, server.Port));
        }
Esempio n. 2
0
        /// <summary>
        /// データを処理します。
        /// </summary>
        /// <param name="socket"></param>
        /// <param name="packet"></param>
        private void ProcessData(Object sender, ReadLineEventArgs e)
        {
            Logger.GetLog().Debug("現在の状態: " + State.GetType().Name);

            CRLFSocket socket     = (CRLFSocket)sender;
            Packet     packet     = e.packet;
            string     methodName = ClientConst.GetCodeName(packet.Code);

            Logger.GetLog().Debug("実行するメソッド: " + methodName);

            // HACK: こんなところでリフレクションを無駄に使うのはいかんでしょう。
            Type       type       = State.GetType();
            MethodInfo methodInfo = type.GetMethod(methodName);

            object[] args = { this, socket, packet };

            methodInfo.Invoke(State, args);

            Logger.GetLog().Debug("実行後の状態: " + State.GetType().Name);

            State.Process(this, socket);
        }
Esempio n. 3
0
        // 634 Client->Server
        public virtual void ReplyProtocolVersion(Manager.Peer peer, CRLFSocket socket, Packet packet)
        {
            if (packet.Data == null || packet.Data.Length != 3)
            {
                return;
            }

            double version = 0.0;

            if (!double.TryParse(packet.Data[0], out version))
            {
                return;
            }

            if (version < Const.ALLOW_PROTOCOL_VERSION)
            {
                socket.WriteLine("694 1 Protocol_version_incompatible");
                socket.Close();
                return;
            }

            socket.WriteLine("612 1");
        }
        public override void NoticeAllowVersion(IClientContextForState context, CRLFSocket socket, Packet packet)
        {
            string serverVersion = packet.Data[0];

            // TODO: サーバのプロトコルバージョンチェックしてない

            if (processType == ClientConst.ProcessType.Join)
            {
                context.State = new RequireTemporaryPeerIdState();
            }
            else if (processType == ClientConst.ProcessType.Maintain)
            {
                context.State = new PeerEchoState();
            }
            else if (processType == ClientConst.ProcessType.Part)
            {
                context.State = new RequirePartState();
            }
            else
            {
                throw new NotSupportedException();
            }
        }
Esempio n. 5
0
        // 614 Server->Client
        public virtual void RequireProtocolVersion(Manager.Peer peer, CRLFSocket socket, Packet packet)
        {
            if (packet.Data == null || packet.Data.Length != 3)
            {
                return;
            }

            double version = 0.0;

            if (!double.TryParse(packet.Data[0], out version))
            {
                return;
            }

            if (version < Const.ALLOW_PROTOCOL_VERSION)
            {
                socket.WriteLine("694 1 Protocol_version_incompatible");
                socket.Close();
                return;
            }

            string[] datas = { Const.PROTOCOL_VERSION, Const.SOFTWARE_NAME, Const.SOFTWARE_VERSION };
            socket.WriteLine("634 1 " + string.Join(":", datas));
        }
Esempio n. 6
0
 public override void IncorrectRequestError(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     context.State = new EndConnectionState(ClientConst.OperationResult.Restartable, ClientConst.ErrorCode.RETURNED_INVALID_REQUEST);
 }
Esempio n. 7
0
 public override void Process(IClientContextForState context, CRLFSocket socket)
 {
     socket.WriteLine("113 1");
 }
Esempio n. 8
0
 /// <summary>
 /// 293 不正リクエストエラー
 /// </summary>
 /// <param name="context"></param>
 /// <param name="socket"></param>
 /// <param name="packet"></param>
 public virtual void IncorrectRequestError(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     throw new NotSupportedException();
 }
Esempio n. 9
0
 public override void AddressChangedError(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     context.State = new EndConnectionState(ClientConst.OperationResult.Restartable, ClientConst.ErrorCode.RETURNED_ADDRESS_CHANGED);
 }
Esempio n. 10
0
 public virtual void ReplyPeerEcho(Manager.Peer peer, CRLFSocket socket, Packet packet)
 {
     // 何もしない。
 }
Esempio n. 11
0
 public virtual void InvalidOperation(Manager.Peer peer, CRLFSocket socket, Packet packet)
 {
     socket.Close();
 }
Esempio n. 12
0
 public override void Process(IClientContextForState context, CRLFSocket socket)
 {
     Logger.GetLog().Debug("...再接続中かな?");
     // throw new NotSupportedException();
 }
Esempio n. 13
0
 public override void NoticeAreaPeers(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     context.PeerState.AreaPeerDictionary = packet.Data[0].Split(';').ToDictionary(v => v.Split(',')[0], v => int.Parse(v.Split(',')[1]));
     context.State = new RequireProtocolTimeState();
 }
Esempio n. 14
0
 /// <summary>
 /// 237 鍵の割り当て
 /// </summary>
 /// <param name="context"></param>
 /// <param name="socket"></param>
 /// <param name="packet"></param>
 public virtual void AllocateKey(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     throw new InvalidOperationException($"Cannot be operated in {GetType().Name}");
 }
Esempio n. 15
0
 /// <summary>
 /// 238 プロトコル時刻
 /// </summary>
 /// <param name="context"></param>
 /// <param name="socket"></param>
 /// <param name="packet"></param>
 public virtual void ReceiveProtocolTime(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     throw new InvalidOperationException($"Cannot be operated in {GetType().Name}");
 }
Esempio n. 16
0
 /// <summary>
 /// 298 プロトコル仕様非準拠エラー
 /// </summary>
 /// <param name="context"></param>
 /// <param name="socket"></param>
 /// <param name="packet"></param>
 public virtual void DifferentSpecificationError(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     throw new InvalidOperationException($"Cannot be operated in {GetType().Name}");
 }
Esempio n. 17
0
 /// <summary>
 /// 295 鍵割り当て不可エラー
 /// </summary>
 /// <param name="context"></param>
 /// <param name="socket"></param>
 /// <param name="packet"></param>
 public virtual void KeyCantAllocateError(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     throw new NotSupportedException();
 }
Esempio n. 18
0
 /// <summary>
 /// 294 サーバ過負荷エラー
 /// </summary>
 /// <param name="context"></param>
 /// <param name="socket"></param>
 /// <param name="packet"></param>
 public virtual void ServerUnavailableError(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     throw new NotSupportedException();
 }
Esempio n. 19
0
 public override void KeyCantAllocateError(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     ChangeState(context);
 }
Esempio n. 20
0
 public override void RequireAllowVersion(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     context.State = new NotifyProtocolVersionState(ProcessType);
 }
Esempio n. 21
0
 // 612 Server->Client
 public virtual void RequirePeerId(Manager.Peer peer, CRLFSocket socket, Packet packet)
 {
     socket.WriteLine("632 1 " + peer.GetParentPeerId());
 }
 public override void Process(IClientContextForState context, CRLFSocket socket)
 {
     string[] datas = { context.PeerState.PeerId.ToString(), context.PeerConfig.Port.ToString() };
     socket.WriteLine("114 1 " + string.Join(":", datas));
 }
Esempio n. 23
0
 public virtual void RequirePeerEcho(Manager.Peer peer, CRLFSocket socket, Packet packet)
 {
     socket.WriteLine("631 1");
 }
Esempio n. 24
0
 public override void AllocatePeerId(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     // TODO: 鍵の取得は任意だが、必ず実施してしまっている
     context.State = new RequireAllocateKeyState();
 }
Esempio n. 25
0
 public virtual void InvalidProtocolVersion(Manager.Peer peer, CRLFSocket socket, Packet packet)
 {
     socket.Close();
 }
Esempio n. 26
0
 public override void AcceptedPart(IClientContextForState context, CRLFSocket socket, Packet packet)
 {
     context.State = new EndConnectionState(ClientConst.OperationResult.Successful, ClientConst.ErrorCode.SUCCESSFUL);
 }
Esempio n. 27
0
 public void SetUp()
 {
     crlfSocket = new CRLFSocket();
 }
Esempio n. 28
0
 public abstract void Process(IClientContextForState context, CRLFSocket socket);
        public override void ReceivePortCheckResult(IClientContextForState context, CRLFSocket socket, Packet packet)
        {
            context.PeerState.IsPortOpened = (packet.Data[0] == "1");

            context.State = new RequirePeerDataState(General.ClientConst.ProcessType.Join);
        }
Esempio n. 30
0
 public void TearDown()
 {
     crlfSocket = null;
 }