Example #1
0
        public void Encode(object data, IClient client, Stream stream)
        {
            PipeStream pstream = stream.ToPipeStream();
            RPCPacket  request = data as RPCPacket;

            request.Write(Options, pstream);
        }
Example #2
0
        public async void Ping()
        {
            if (System.Threading.Interlocked.CompareExchange(ref mPingStatus, 1, 0) == 0)
            {
                if (TcpClient.IsConnected)
                {
                    try
                    {
                        RPCPacket request = new RPCPacket();
                        request.Url = "/__System/Ping";
                        var response = await XRPCClient.SendWait(request, TcpClient, null);

                        PingTime = TimeWatch.GetElapsedMilliseconds();
                    }
                    catch (Exception e_)
                    {
                    }
                    finally
                    {
                        if (TimeOut(XRPCClient.PingTimeout * 1000))
                        {
                            TcpClient.DisConnect();
                            bool isnew;
                            TcpClient.Connect(out isnew);
                        }
                    }
                }
                else
                {
                    PingTime = TimeWatch.GetElapsedMilliseconds();
                }
                System.Threading.Interlocked.Exchange(ref mPingStatus, 0);
            }
        }
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            if (!Handlers.TryGetValue(targetMethod.Name, out ClientActionHandler handler))
            {
                var error = new XRPCException($"{targetMethod.Name} action not found!");
                error.ErrorCode = (short)StatusCode.ACTION_NOT_FOUND;
                throw error;
            }
            else
            {
                if (!handler.IsTaskResult)
                {
                    var error = new XRPCException("Definition is not supported, please define task with return value!");
                    error.ErrorCode = (short)StatusCode.NOT_SUPPORT;
                    throw error;
                }

                var request = new RPCPacket();
                request.Url  = handler.Url;
                request.Data = args;
                var task = Server.SendWait(request, Session, handler.ResponseType);
                IAnyCompletionSource source = handler.GetCompletionSource();
                source.WaitResponse(task);
                return(source.GetTask());
            }
        }
Example #4
0
        private async void InvokeController(ControllerCenter.HandlerItem handler, RPCPacket packet)
        {
            RPCPacket response = new RPCPacket();

            try
            {
                packet.LoadParameters(handler.Parameters);
                var result = handler.Handler.Execute(handler.Controller, packet.Data);
                if (result is Task task)
                {
                    await task;
                }
                var data = handler.GetValue(result);
                if (data != null)
                {
                    response.Data = new object[] { data }
                }
                ;
            }
            catch (Exception e_)
            {
                response.Status = (short)StatusCode.INNER_ERROR;
                response.Data   = new string[] { e_.Message };
            }
            packet.ReplyPacket(response);
        }
Example #5
0
        private void OnEncode(ISession session, object data, System.IO.Stream stream)
        {
            PipeStream pstream  = stream.ToPipeStream();
            RPCPacket  response = data as RPCPacket;

            response.Write(Options, pstream);
        }
Example #6
0
        public void Decode(IClient client, Stream stream)
        {
            PipeStream pstream = stream.ToPipeStream();

            while (true)
            {
                if (mPacket == null)
                {
                    mPacket        = new RPCPacket();
                    mPacket.Client = (AsyncTcpClient)client;
                }
                if (mPacket.Read(Options, pstream))
                {
                    try
                    {
                        Completed?.Invoke(client, mPacket);
                    }
                    finally
                    {
                        mPacket = null;
                    }
                }
                else
                {
                    return;
                }
            }
        }
Example #7
0
        public void Decode(ISession session, Stream stream)
        {
            PipeStream pstream = stream.ToPipeStream();

            while (true)
            {
                if (mRequest == null)
                {
                    mRequest        = new RPCPacket();
                    mRequest.Sesion = session;
                }
                if (mRequest.Read(Options, pstream))
                {
                    mCompletedArgs.SetInfo(session, mRequest);
                    try
                    {
                        Completed?.Invoke(this, mCompletedArgs);
                    }
                    finally
                    {
                        mRequest = null;
                    }
                }
                else
                {
                    return;
                }
            }
        }
Example #8
0
        private void OnPacketCompleted(IClient client, object message)
        {
            RPCPacket response = (RPCPacket)message;

            System.Threading.Interlocked.Increment(ref mResponses);
            mReceiveDispatchCenter.Enqueue(response);
        }
Example #9
0
        protected virtual void OnProcess(RPCPacket response)
        {
            var awaitItem = mAwaiterFactory.GetItem(response.ID);

            if (awaitItem != null)
            {
                response.ResultType = awaitItem.ResultType;
                try
                {
                    response.LoadParameters(response.ResultType);
                }
                catch (Exception e_)
                {
                    response.Status = (short)StatusCode.INNER_ERROR;
                    response.Data   = new object[] { $"{e_.Message}@{e_.StackTrace}" };
                }
                mAwaiterFactory.Completed(awaitItem, response);
            }
            else
            {
                try
                {
                    if (response.Url.IndexOf(DELEGATE_TAG, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        InvokeDelegate(response);
                        return;
                    }
                    //notfound;
                    var item = Controllers.GetHandler(response.Url);
                    if (item != null)
                    {
                        InvokeController(item, response);
                    }
                    else
                    {
                        if (Receive != null)
                        {
                            Receive(this, response);
                        }
                        else
                        {
                            if (response.NeedReply)
                            {
                                var result = new RPCPacket();
                                result.Status = (short)StatusCode.NOT_SUPPORT;
                                result.Data   = new object[] { $"{response.Url} not found!" };
                                response.ReplyPacket(result);
                            }
                        }
                    }
                }
                catch (Exception e_)
                {
                    OnError(response.Client, new ClientErrorArgs {
                        Error = e_, Message = $"Packet process event error {e_.Message}"
                    });
                }
            }
        }
Example #10
0
        private void OnTimeProcess(AwaiterItem item)
        {
            RPCPacket response = new RPCPacket();

            response.Status = (short)StatusCode.REQUEST_TIMEOUT;
            response.Data   = new object[] { $"Request {item.Request.Url} time out!" };
            Completed(item, response);
        }
Example #11
0
        protected virtual Task OnVoidExecute(params object[] data)
        {
            RPCPacket packet = new RPCPacket();

            packet.NeedReply = false;
            packet.Url       = Clients.XRPCClient.DELEGATE_TAG + Name;
            packet.Data      = data;
            return(xRPCClient.Send(packet, null));
        }
Example #12
0
 public bool Completed(RPCPacket data)
 {
     if (System.Threading.Interlocked.CompareExchange(ref mFree, 1, 0) == 0)
     {
         data.ResultType = ResultType;
         completionSource.TrySetResult(data);
         return(true);
     }
     return(false);
 }
Example #13
0
 public bool Completed(AwaiterItem item, RPCPacket data)
 {
     if (item.Completed(data))
     {
         item.Response = null;
         item.Request  = null;
         return(true);
     }
     return(false);
 }
Example #14
0
        public void Send(RPCPacket request, AsyncTcpClient client = null)
        {
            client = client ?? GetClient();
            bool isnew;

            if (client.Connect(out isnew))
            {
                client.Send(request);
                System.Threading.Interlocked.Increment(ref mRequests);
            }
            else
            {
                throw client.LastError;
            }
        }
Example #15
0
        private async void InvokeDelegate(RPCPacket packet)
        {
            var path = packet.Url.SubRightWith('/', out string action);

            if (mDelegateHandlers.TryGetValue(action, out DelegateHandler handler))
            {
                try
                {
                    packet.LoadParameters(handler.Parameters);
                    object result = handler.Delegate.DynamicInvoke(packet.Data);
                    if (!handler.IsVoid)
                    {
                        await(Task) result;
                        if (handler.TargetReturnType != null)
                        {
                            var data = handler.GetValue(result);
                            packet.Reply(data);
                        }
                        else
                        {
                            packet.ReplySuccess();
                        }
                    }
                }
                catch (Exception e_)
                {
                    if (!handler.IsVoid)
                    {
                        packet.ReplyError((short)StatusCode.INNER_ERROR, $"{action} delegate invoke error {e_.Message}!");
                    }
                    else
                    {
                        OnError(packet.Client, new ClientErrorArgs {
                            Error = e_, Message = $"{action} delegate invoke error {e_.Message}"
                        });
                    }
                }
            }
            else
            {
                if (packet.NeedReply)
                {
                    packet.ReplyError((short)StatusCode.ACTION_NOT_FOUND, $"{action} delegate not found!");
                }
            }
        }
Example #16
0
        public Task <RPCPacket> SendWait(RPCPacket request, AsyncTcpClient client, Type[] resultType = null)
        {
            client = client ?? GetClient();
            bool isnew;

            if (client.Connect(out isnew))
            {
                var result = mAwaiterFactory.Create(request, resultType, TimeOut);
                request.ID = result.Item1;
                client.Send(request);
                System.Threading.Interlocked.Increment(ref mRequests);
                return(result.Item2.Task);
            }
            else
            {
                throw client.LastError;
            }
        }
Example #17
0
        protected virtual async Task OnLogin(AsyncTcpClient client)
        {
            if (!string.IsNullOrEmpty(UserName))
            {
                RPCPacket packet = new RPCPacket();
                packet.Url       = LOGIN_TAG;
                packet.Data      = new object[] { UserName, PassWord };
                packet.NeedReply = true;
                var response = await SendWait(packet, client);

                if (response.Status != (short)StatusCode.SUCCESS)
                {
                    client.DisConnect();
                    throw new XRPCException((string)response.Data[0]);
                }
            }
            if (Connected != null)
            {
                await Connected(client);
            }
        }
Example #18
0
        protected virtual async Task <T> OnTaskExecute <T>(params object[] data)
        {
            bool      istask = typeof(T) == typeof(RESULT_NULL);
            RPCPacket packet = new RPCPacket();

            packet.NeedReply = true;
            packet.Url       = Clients.XRPCClient.DELEGATE_TAG + Name;
            packet.Data      = data;
            var returltype = GetReturnTypes();
            var result     = await xRPCClient.SendWait(packet, null, returltype);

            if (result.Status != (short)StatusCode.SUCCESS)
            {
                throw new XRPCException((string)result.Data[0]);
            }
            if (istask)
            {
                return((T)(object)new RESULT_NULL());
            }
            return((T)result.Data[0]);
        }
Example #19
0
 public async void Ping()
 {
     if (System.Threading.Interlocked.CompareExchange(ref mPingStatus, 1, 0) == 0)
     {
         try
         {
             RPCPacket request = new RPCPacket();
             request.Url = "/__System/Ping";
             var response = await XRPCClient.SendWait(request, TcpClient, null);
         }
         catch (Exception e_)
         {
             mPingError++;
             if (mPingError > 3)
             {
                 mPingError = 0;
                 TcpClient.DisConnect();
             }
         }
         System.Threading.Interlocked.Exchange(ref mPingStatus, 0);
     }
 }
Example #20
0
        public async Task Subscribe <T>(T handler, AsyncTcpClient client = null) where T : Delegate
        {
            DelegateHandler item = new DelegateHandler(typeof(T));

            item.Delegate = handler;
            item.Init();
            if (!item.IsVoid)
            {
                throw new XRPCException($"The subscribe delegate return value must be void!");
            }
            if (item.Parameters == null || item.Parameters.Length == 0)
            {
                throw new XRPCException($"The subscribe delegate parameters can't be empty!");
            }
            RPCPacket packet = new RPCPacket();

            packet.Url       = SUBSCRIBE_TAG + item.Name;
            packet.NeedReply = true;
            await SendWait(packet, client);

            mDelegateHandlers[item.Name] = item;
        }
Example #21
0
        public (int, TaskCompletionSource <RPCPacket>) Create(RPCPacket request, Type[] resultType, int timeout = 1000 * 10)
        {
            request.NeedReply = true;
            int  id = 0;
            long expiredTime;

            lock (this)
            {
                mID++;
                if (mID >= mEndID)
                {
                    mID = mStartID;
                }
                id = mID;
            }
            expiredTime = TimeWatch.GetElapsedMilliseconds() + timeout;
            var item = new AwaiterItem();

            item.ID         = id;
            item.ResultType = resultType;
            item.Request    = request;
            mAwaiterItemGroup.Set(item.ID, item);
            return(id, item.Create(expiredTime));
        }
Example #22
0
 public EventPacketProcessingArgs(XRPCServer server, RPCPacket packet) : base(server, packet)
 {
 }
Example #23
0
 public EventActionNotFoundArgs(XRPCServer server, RPCPacket packet) : base(server
                                                                            )
 {
     Packet = packet;
 }
Example #24
0
        protected override object Invoke(MethodInfo targetMethod, object[] args)
        {
            if (!mHandlers.TryGetValue(targetMethod.Name, out ClientActionHandler handler))
            {
                var error = new XRPCException($"{targetMethod.Name} action not found!");
                error.ErrorCode = (short)StatusCode.ACTION_NOT_FOUND;
                throw error;
            }
            else
            {
                if (!handler.IsTaskResult)
                {
                    var error = new XRPCException("Definition is not supported, please define task with return value!");
                    error.ErrorCode = (short)StatusCode.NOT_SUPPORT;
                    throw error;
                }

                var request = new RPCPacket();
                request.Url  = handler.Url;
                request.Data = args;
                if (!string.IsNullOrEmpty(Actor))
                {
                    request.Header = new Dictionary <string, string>();
                    request.Header[EventCenter.ACTOR_TAG] = this.Actor;
                }
                if (mHeader.Count > 0)
                {
                    if (request.Header == null)
                    {
                        request.Header = new Dictionary <string, string>();
                    }
                    foreach (var item in mHeader)
                    {
                        request.Header.Add(item.Key, item.Value);
                    }
                }
                var task = Client.SendWait(request, TcpClient, handler.ResponseType);
                if (!handler.IsTaskResult)
                {
                    if (task.Wait(Client.TimeOut))
                    {
                        var response = task.Result;
                        if (response.Status == (short)StatusCode.SUCCESS)
                        {
                            if (response.Paramters > 0)
                            {
                                return(response.Data[0]);
                            }
                            return(null);
                        }
                        else
                        {
                            Client.AwaiterFactory.GetItem(request.ID);
                            var error = new XRPCException((string)response.Data[0]);
                            error.ErrorCode = response.Status;
                            throw error;
                        }
                    }
                    else
                    {
                        var error = new XRPCException($"{targetMethod.Name} action time out!");
                        error.ErrorCode = (short)StatusCode.REQUEST_TIMEOUT;
                        throw error;
                    }
                }
                else
                {
                    IAnyCompletionSource source = handler.GetCompletionSource();
                    source.WaitResponse(task);
                    return(source.GetTask());
                }
            }
        }
Example #25
0
 public EventPacketArgs(XRPCServer server, RPCPacket packet) : base(server
                                                                    )
 {
     Packet = packet;
 }