private void ReadCb(LibuvStreamHandle streamHandle, int status, ref LibuvNative.uv_buf_t buf)
        {
            if (status > 0)
            {
                // TODO:
                Console.WriteLine("ReadCallback. {0} bytes to read.", status);

                IUnmanagedByteBuf byteBuf = _byteBufAllocator.WrapDefault(buf.Memory, buf.Len);
                byteBuf.SetWrite(status);

                _readCallback(this, (ByteBuf)byteBuf);
            }
            else if (status == 0)
            {
                // TODO:
                Console.WriteLine("ReadCallback. No data to read.");
            }
            else
            {
                string error = string.Format(
                    "Error #{0}. {1} {2}",
                    status,
                    Marshal.PtrToStringAnsi(LibuvNative.uv_err_name(status)),
                    Marshal.PtrToStringAnsi(LibuvNative.uv_strerror(status))
                    );
                // TODO:
                Console.WriteLine("ReadCallback. {0}.", error);
            }
        }
        private void AllocCb(
            LibuvStreamHandle streamHandle,
            int suggestedsize,
            out LibuvNative.uv_buf_t buf)
        {
            // Тут мы можем просто взять поинтер, без буфера. Все равно поинтер не потеряется и будет передан
            // в ReadCallback, где будет завернут в буфер.
            int    size;
            IntPtr dataPtr = _byteBufAllocator.GetDefaultDataIntPtr(out size);

            buf = new LibuvNative.uv_buf_t(dataPtr, size, PlatformApis.IsWindows);
        }
Esempio n. 3
0
        private void ConnectionCallback(LibuvStreamHandle streamHandle, int status)
        {
            var libuvTcpServerChannel = new LibuvTcpServerChannel(_channelByteBufAllocator);

            libuvTcpServerChannel.Init(this);

            streamHandle.Accept(libuvTcpServerChannel);
            _clientTcpHandles.Add(libuvTcpServerChannel);

            // TODO: тут все принципы проектирования нарушены. по возможности порефакторить.
            IChannelPipeline pipeline = _channelPipelineInitializer.GetPipeline(libuvTcpServerChannel);

            libuvTcpServerChannel.StartRead(pipeline.ChannelReadCallback);
        }