コード例 #1
0
ファイル: TcpClientAdapter.cs プロジェクト: hydna/Hydna.NET
        void IConnectionAdapter.Send(Frame frame)
        {
            SendState state;

            if (_closing || _disposed)
                return;

            state = new SendState();
            state.data = frame.ToBytes();

            if (_sending) {
                _sendQueue.Enqueue(state);
                return;
            }

            processSendState(state);
        }
コード例 #2
0
ファイル: Connection.cs プロジェクト: hydna/Hydna.NET
        internal void Send(Frame frame)
        {
            if (_adapter == null)
                return;

            _adapter.Send(frame);
        }
コード例 #3
0
ファイル: Connection.cs プロジェクト: hydna/Hydna.NET
        void resolveHandler(Frame frame)
        {
            string path;

            try {
                path = Encoding.UTF8.GetString(frame.Payload);
            }
            catch (EncoderFallbackException) {
                // Ignore unresolved paths;
                return;
            }

            Channel channel;

            if (_channels.ContainsKey(path) == false) {
                return;
            }

            channel = _channels[path];

            if (channel.State == ChannelState.Closing) {
                deallocChannel(channel);
                return;
            }

            if (frame.ResolveFlag != ResolveFlag.Success) {
                deallocChannel(channel, frame, "Unable to resolve path");
                return;
            }

            _routes.Add(frame.Ptr, channel);
            channel.handleResolved(frame.Ptr);

            Frame open = Frame.Create(frame.Ptr,
                                      channel.Mode,
                                      channel.ctoken,
                                      channel.token);

            _adapter.Send(open);
        }
コード例 #4
0
ファイル: Connection.cs プロジェクト: hydna/Hydna.NET
        void signalHandler(Frame frame)
        {
            Channel channel;

            if (frame.SignalFlag == SignalFlag.Emit) {
                if (frame.Ptr == 0) {
                    foreach (KeyValuePair<string, Channel> kvp in _channels) {
                        channel = kvp.Value;
                        channel.handleSignal(frame.Clone());
                    }
                }
                else {
                    if (_routes.ContainsKey(frame.Ptr) == false)
                        return;

                    channel = _routes[frame.Ptr];
                    channel.handleSignal(frame);
                }
            }
            else {
                if (frame.Ptr == 0) {
                    foreach (KeyValuePair<string, Channel> kvp in _channels) {
                        channel = kvp.Value;
                        deallocChannel(channel, frame.Clone(), null);
                    }
                }
                else {
                    if (_routes.ContainsKey(frame.Ptr) == false)
                        return;

                    channel = _routes[frame.Ptr];

                    if (channel.State != ChannelState.Closing) {
                        // We havent closed our channel yet. We therefor need
                        // to send an ENDSIG in response to this packet.
                        Frame end = Frame.Create(frame.Ptr,
                                                  SignalFlag.End,
                                                  ContentType.Utf,
                                                  null);
                        _adapter.Send(end);
                    }

                    deallocChannel(channel, frame, null);
                }
            }
        }
コード例 #5
0
ファイル: Connection.cs プロジェクト: hydna/Hydna.NET
        void dataHandler(Frame frame)
        {
            if (frame.Payload == null || frame.Payload.Length == 0) {
                close("Protocol error: Zero data packet sent received");
                return;
            }

            Channel channel;

            if (frame.Ptr == 0) {
                foreach (KeyValuePair<string, Channel> kvp in _channels) {
                    channel = kvp.Value;
                    if ((channel.Mode & ChannelMode.Read) == ChannelMode.Read) {
                        channel.handleData(frame.Clone());
                    }
                }
                return;
            }

            if (_routes.ContainsKey(frame.Ptr) == false)
                return;


            channel = _routes[frame.Ptr];

            if ((channel.Mode & ChannelMode.Read) == ChannelMode.Read) {
                channel.handleData(frame);
            }
        }
コード例 #6
0
ファイル: Connection.cs プロジェクト: hydna/Hydna.NET
        void openHandler(Frame frame)
        {
            Channel channel;

            if (_routes.ContainsKey(frame.Ptr) == false) {
                close("Protocol error: Server sent invalid open packet");
                return;
            }

            channel = _routes[frame.Ptr];

            if (channel.State != ChannelState.Resolved) {
                close("Protocol error: Server sent open to an open channel");
                return;
            }

            if (frame.OpenFlag == OpenFlag.Success) {
                channel.handleOpen(frame);
                return;
            }

            deallocChannel(channel, frame, "Open was denied");
        }
コード例 #7
0
ファイル: Connection.cs プロジェクト: hydna/Hydna.NET
        void frameHandler(Frame frame)
        {
            switch (frame.OpCode)
            {
                case OpCode.Open:
                openHandler(frame);
                break;

                case OpCode.Data:
                dataHandler(frame);
                break;

                case OpCode.Signal:
                signalHandler(frame);
                break;

                case OpCode.Resolve:
                resolveHandler(frame);
                break;
            }
        }
コード例 #8
0
ファイル: Connection.cs プロジェクト: hydna/Hydna.NET
        void deallocChannel(Channel channel, Frame frame, string reason)
        {
            if (channel.AbsolutePath == null)
                return;

            if (_channels.ContainsKey(channel.AbsolutePath))
                _channels.Remove(channel.AbsolutePath);

            if (channel.Ptr != 0)
                _routes.Remove(channel.Ptr);

            _refcount--;
            if (_refcount == 0) {
                close();
            }

            channel.handleClose(frame, reason);
        }
コード例 #9
0
ファイル: Channel.cs プロジェクト: hydna/Hydna.NET
        internal void handleClose(Frame frame, string reason)
        {
            if (_state == ChannelState.Closed) {
                return;
            }

            _state = ChannelState.Closed;
            _ptr = 0;

            if (_closedInvoker == null)
                return;

            ChannelCloseEventArgs e;

            if (frame == null) {
                e = new ChannelCloseEventArgs(false, false, reason);
            }
            else {
                bool wasDenied = frame.OpCode == OpCode.Open;
                bool wasClean = wasDenied ? false
                                          : frame.SignalFlag == SignalFlag.End;

                e = new ChannelCloseEventArgs(frame.ContentType,
                                              frame.Payload,
                                              wasDenied,
                                              wasClean,
                                              reason);
            }

            _closedInvoker(this, e);
        }
コード例 #10
0
ファイル: Channel.cs プロジェクト: hydna/Hydna.NET
 internal void handleClose(Frame frame)
 {
     handleClose(frame, "Unknown reason");
 }
コード例 #11
0
ファイル: Channel.cs プロジェクト: hydna/Hydna.NET
        internal void handleSignal(Frame frame)
        {
            if (_signalInvoker == null)
                return;

            ChannelEventArgs e;
            e = new ChannelEventArgs(frame.ContentType,
                                     frame.Payload);
            _signalInvoker(this, e);
        }
コード例 #12
0
ファイル: Channel.cs プロジェクト: hydna/Hydna.NET
        internal void handleData(Frame frame)
        {
            if (_dataInvoker == null)
                return;

            ChannelDataEventArgs e;
            e = new ChannelDataEventArgs(frame.ContentType,
                                         frame.Payload,
                                         frame.PriorityFlag);
            _dataInvoker(this, e);
        }
コード例 #13
0
ファイル: Channel.cs プロジェクト: hydna/Hydna.NET
        internal void handleOpen(Frame frame)
        {

            if (_state == ChannelState.Closing) {
                // User has called close before it was open. Send
                // the pending ENDSIG.
                Frame end = Frame.Create(_ptr, SignalFlag.End, coutro, outro);
                outro = null;
                _connection.Send(end);
                return;
            }

            _state = ChannelState.Open;

            if (_openInvoker == null)
                return;

            ChannelEventArgs e;
            e = new ChannelEventArgs(frame.ContentType, frame.Payload);

            _openInvoker(this, e);
        }