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); }
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); }