Example #1
0
        internal virtual void injectFullFrame(byte[] frameBuffer)
        {
            // the process of injecting a complete frame
            // is implemented in terms of existing steps that are also used
            // for reading data from the physical channel
            // 1. the frame header is parsed
            // 2. the frame payload is consumed

            // injecting full frames is allowed only when the channel
            // is prepared to process whole frames
            System.Diagnostics.Debug.Assert(
                state == InputState.READING_WHOLE_FRAMES);

            byte[] rawBuffer = frameBuffer;

            byte[] header = new byte[Frame.FRAME_HEADER_SIZE];
            Array.Copy(rawBuffer, header, header.Length);

            int payloadSize = parseFrameHeader(header);

            createCurrentIncomingFrame(payloadSize);

            currentIncomingFrame.dataBuffer.Write(
                rawBuffer, Frame.FRAME_HEADER_SIZE, payloadSize);

            if (logCallback != null)
            {
                logCallback.Log(LogEventArgs.LogLevel.HIGH,
                                "Frame received:"
                                + " from: " + target
                                + " tid: " + currentIncomingFrameTransportId
                                + " fid: " + currentIncomingFrameNumber);
            }

            // store this frame together with other frames
            // for the same message

            storeOrDispatchCurrentFrame();
        }
Example #2
0
        internal Channel(string target, Options options, 
            IncomingMessageDispatchCallback incomingMessageDispatchCallback, 
            LogCallback logCallback, LogEventArgs.LogLevel logLevel)
        {
            this.target = target;
            this.options = options;

            this.logCallback = logCallback;
            this.logLevel = logLevel;

            connect(incomingMessageDispatchCallback);

            if (logCallback != null)
            {
                logCallback.Log(LogEventArgs.LogLevel.LOW,
                    "Connected to " + target);
            }
        }
Example #3
0
        internal Channel(string target, Options options,
                         IncomingMessageDispatchCallback incomingMessageDispatchCallback,
                         IOWorker ioWorker,
                         LogCallback logCallback, LogEventArgs.LogLevel logLevel)
        {
            this.target  = target;
            this.options = options;

            this.logCallback = logCallback;
            this.logLevel    = logLevel;

            connect(incomingMessageDispatchCallback, ioWorker);

            if (logCallback != null)
            {
                logCallback.Log(LogEventArgs.LogLevel.LOW,
                                "Connected to " + target);
            }
        }
Example #4
0
        // used by listener when accepting new connections
        internal Channel(Socket acceptedChannel, string sourceTarget,
                         IncomingMessageDispatchCallback incomingMessageDispatchCallback,
                         Options options, LogCallback logCallback,
                         LogEventArgs.LogLevel logLevel)
        {
            this.target  = sourceTarget;
            this.options = options;

            this.connection =
                new NetworkUtils.TransportChannel(acceptedChannel);

            this.logCallback = logCallback;
            this.logLevel    = logLevel;

            createReaderWriter(incomingMessageDispatchCallback);

            if (logCallback != null)
            {
                logCallback.Log(LogEventArgs.LogLevel.LOW,
                                "Accepted connection from " + target);
            }
        }
Example #5
0
        // used by listener when accepting new connections
        internal Channel(Socket acceptedChannel, string sourceTarget, 
            IncomingMessageDispatchCallback incomingMessageDispatchCallback, 
            Options options, LogCallback logCallback, 
            LogEventArgs.LogLevel logLevel)
        {
            this.target = sourceTarget;
            this.options = options;

            this.connection =
                new NetworkUtils.TransportChannel(acceptedChannel);

            this.logCallback = logCallback;
            this.logLevel = logLevel;

            createReaderWriter(incomingMessageDispatchCallback);

            if (logCallback != null)
            {
                logCallback.Log(LogEventArgs.LogLevel.LOW,
                    "Accepted connection from " + target);
            }
        }
Example #6
0
        public virtual void close()
        {
            if (connection != null)
            {
                try
                {
                    connection.close();
                }
                catch (Exception)
                {
                    // ignore
                }
                connection = null;

                channelWriter.notifyCancellation();

                if (logCallback != null)
                {
                    logCallback.Log(LogEventArgs.LogLevel.LOW,
                                    "Closed connection to " + target);
                }
            }
        }
Example #7
0
        internal virtual void doSomeOutput()
        {
            OutgoingFrame frame;

            lock (outgoingFrames)
            {
                if (outgoingFrames.Count == 0)
                {
                    return;
                }
                frame = outgoingFrames[0];

                if (frame.closeFlag)
                {
                    outgoingFrames.RemoveAt(0);

                    // this artificial exception forces the worker to
                    // physically close this connection and remove it
                    // from the set of channels
                    throw new YAMIIOException("dummy");
                }
            }

            if (connection.connectedChannel != null)
            {
                // TCP connection
                int sent =
                    connection.connectedChannel.Send(frame.BuffersToSent);
                frame.AddSentBytes(sent);
            }
            else if (connection.ssl != null)
            {
                // TCP SSL connection
                int sent =
                    connection.writingQueue.PutMany(frame.BuffersToSent);
                frame.AddSentBytes(sent);
            }
            else
            {
                // UDP connection
                connection.datagramChannel.SendTo(
                    frame.SingleBuffer, connection.targetAddress);
            }

            if (frame.buffersConsumed())
            {
                // the first frame (head in the queue) was complmesetely
                // sent -> notify its progress callback and remove
                // the head from the queue
                lock (outgoingFrames)
                {
                    outgoingFrames.RemoveAt(0);
                }

                MessageProgressCallback callback =
                    frame.messageProgressCallback;
                if (callback != null)
                {
                    callback.progress(frame.byteCount, frame.totalByteCount);
                }

                if (logCallback != null)
                {
                    if (logLevel == LogEventArgs.LogLevel.HIGH)
                    {
                        logCallback.Log(LogEventArgs.LogLevel.HIGH,
                                        "Frame sent:"
                                        + " target: " + target
                                        + " tid: " + frame.transportId
                                        + " fid: " + frame.frameNumber
                                        + " size: "
                                        + frame.byteCount + "/" + frame.totalByteCount);
                    }
                }
            }
        }