public async CFTask <IResponse> Call(IRequest request) { int rpcId = ++RpcId; RpcInfo rpcInfo = new RpcInfo(request); this.requestCallbacks[rpcId] = rpcInfo; request.RpcId = rpcId; this.Send(request); return(await rpcInfo.Tcs.Task); }
public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("counts", Counts); info.AddValue("rpcInfo", RpcInfo.KNetSerializeReference()); byte[][] serializedArgs = new byte[Arguments.Length][]; for (int i = 0; i < serializedArgs.Length; i++) { serializedArgs[i] = KNetUtils.Serialize(Arguments[i], RpcInfo.ArgSerializationTypes[i], out Counts[i]); } info.AddValue("args", serializedArgs); }
public async CFTask <IResponse> Call(IRequest request, CancellationToken cancellationToken) { int rpcId = ++RpcId; RpcInfo rpcInfo = new RpcInfo(request); this.requestCallbacks[rpcId] = rpcInfo; request.RpcId = rpcId; this.Send(request); void CancelAction() { if (!this.requestCallbacks.TryGetValue(rpcId, out RpcInfo action)) { return; } this.requestCallbacks.Remove(rpcId); Type responseType = OpcodeTypeComponent.Instance.GetResponseType(action.Request.GetType()); IResponse response = (IResponse)Activator.CreateInstance(responseType); response.Error = ErrorCode.ERR_Cancel; action.Tcs.SetResult(response); } IResponse ret; try { cancellationToken?.Add(CancelAction); ret = await rpcInfo.Tcs.Task; } finally { cancellationToken?.Remove(CancelAction); } return(ret); }
protected override void HandleInternal(ChannelHandlerContext ctx, RpcInfo info) { RpcCall rpcCall = (RpcCall)info.Header(); MountInterface.MNTPROC mntproc = MountInterface.MNTPROC.FromValue(rpcCall.GetProcedure ()); int xid = rpcCall.GetXid(); byte[] data = new byte[info.Data().ReadableBytes()]; info.Data().ReadBytes(data); XDR xdr = new XDR(data); XDR @out = new XDR(); IPAddress client = ((IPEndPoint)info.RemoteAddress()).Address; if (mntproc == MountInterface.MNTPROC.Null) { @out = NullOp(@out, xid, client); } else { if (mntproc == MountInterface.MNTPROC.Mnt) { // Only do port monitoring for MNT if (!DoPortMonitoring(info.RemoteAddress())) { @out = MountResponse.WriteMNTResponse(Nfs3Status.Nfs3errAcces, @out, xid, null); } else { @out = Mnt(xdr, @out, xid, client); } } else { if (mntproc == MountInterface.MNTPROC.Dump) { @out = Dump(@out, xid, client); } else { if (mntproc == MountInterface.MNTPROC.Umnt) { @out = Umnt(xdr, @out, xid, client); } else { if (mntproc == MountInterface.MNTPROC.Umntall) { Umntall(@out, xid, client); } else { if (mntproc == MountInterface.MNTPROC.Export) { // Currently only support one NFS export IList <NfsExports> hostsMatchers = new AList <NfsExports>(); if (hostsMatcher != null) { hostsMatchers.AddItem(hostsMatcher); @out = MountResponse.WriteExportList(@out, xid, exports, hostsMatchers); } else { // This means there are no valid exports provided. RpcAcceptedReply.GetInstance(xid, RpcAcceptedReply.AcceptState.ProcUnavail, new VerifierNone ()).Write(@out); } } else { // Invalid procedure RpcAcceptedReply.GetInstance(xid, RpcAcceptedReply.AcceptState.ProcUnavail, new VerifierNone ()).Write(@out); } } } } } } ChannelBuffer buf = ChannelBuffers.WrappedBuffer(@out.AsReadOnlyWrap().Buffer()); RpcResponse rsp = new RpcResponse(buf, info.RemoteAddress()); RpcUtil.SendRpcResponse(ctx, rsp); }
/// <exception cref="System.Exception"/> public override void MessageReceived(ChannelHandlerContext ctx, MessageEvent e) { RpcInfo info = (RpcInfo)e.GetMessage(); RpcCall rpcCall = (RpcCall)info.Header(); int portmapProc = rpcCall.GetProcedure(); int xid = rpcCall.GetXid(); XDR @in = new XDR(info.Data().ToByteBuffer().AsReadOnlyBuffer(), XDR.State.Reading ); XDR @out = new XDR(); if (portmapProc == PmapprocNull) { @out = NullOp(xid, @in, @out); } else { if (portmapProc == PmapprocSet) { @out = Set(xid, @in, @out); } else { if (portmapProc == PmapprocUnset) { @out = Unset(xid, @in, @out); } else { if (portmapProc == PmapprocDump) { @out = Dump(xid, @in, @out); } else { if (portmapProc == PmapprocGetport) { @out = Getport(xid, @in, @out); } else { if (portmapProc == PmapprocGetversaddr) { @out = Getport(xid, @in, @out); } else { Log.Info("PortmapHandler unknown rpc procedure=" + portmapProc); RpcAcceptedReply reply = RpcAcceptedReply.GetInstance(xid, RpcAcceptedReply.AcceptState .ProcUnavail, new VerifierNone()); reply.Write(@out); } } } } } } ChannelBuffer buf = ChannelBuffers.WrappedBuffer(@out.AsReadOnlyWrap().Buffer()); RpcResponse rsp = new RpcResponse(buf, info.RemoteAddress()); RpcUtil.SendRpcResponse(ctx, rsp); }