示例#1
0
        internal void ProcessPacket(IMessage message)
        {
            /*if(message.GetType() == typeof(MsgRequest))
             * {
             *  MsgRequest req = message as MsgRequest;
             *  object ret = null;
             *
             *  switch (packetId)
             *  {
             *      case PacketId.Shared_GetClass:
             *          ret = new R_GetSharedClass().onRequest(this, pr);
             *          break;
             *      case PacketId.Shared_ExecuteMethod:
             *          ret = new R_SharedMethodInvoke().onRequest(this, pr);
             *          break;
             *  }
             *
             *  if (SendResultBack)
             *  {
             *      Connection.SendMessage(new MsgRequestResult(RequestId, ret));
             *  }
             * }*/
            if (message.GetType() == typeof(MsgGetSharedClass))
            {
                MsgGetSharedClass req = message as MsgGetSharedClass;
                object            ret = new R_GetSharedClass().onRequest(this, req);
                Connection.SendMessage(new MsgGetSharedClassResponse(req.RequestId, ret as ReturnResult));
            }
            else if (message.GetType() == typeof(MsgGetSharedClassResponse))
            {
                MsgGetSharedClassResponse response = message as MsgGetSharedClassResponse;
                lock (GetSharedClassRequests)
                {
                    if (GetSharedClassRequests.ContainsKey(response.RequestId))
                    {
                        GetSharedClassRequests[response.RequestId].Value = response.Result;
                        GetSharedClassRequests[response.RequestId].Pulse();
                    }
                }
            }
            else if (message.GetType() == typeof(MsgExecuteMethod))
            {
                MsgExecuteMethod req = message as MsgExecuteMethod;
                object           ret = new R_SharedMethodInvoke().onRequest(this, new PayloadReader(req.Data));

                if (req.RequireResultBack)
                {
                    Connection.SendMessage(new MsgExecuteMethodResponse(req.RequestId, ret as ReturnResult));
                    //Connection.SendMessage(new MsgRequestResult(RequestId, ret));
                }
            }
            else if (message.GetType() == typeof(MsgExecuteMethodResponse))
            {
                lock (MethodRequests)
                {
                    MsgExecuteMethodResponse response = message as MsgExecuteMethodResponse;
                    if (MethodRequests.ContainsKey(response.RequestId))
                    {
                        MethodRequests[response.RequestId].Value = response.result;
                        MethodRequests[response.RequestId].Pulse();
                        MethodRequests.Remove(response.RequestId);
                    }
                }
            }

            /*else if (message.GetType() == typeof(MsgRequestResult))
             * {
             *  lock (BeginRequestLock)
             *  {
             *      MsgRequestResult result = message as MsgRequestResult;
             *      if (Requests.ContainsKey(result.RequestId))
             *      {
             *          Request req = Requests[result.RequestId];
             *          req.syncObject.Value = result.ReturnObject;
             *          req.syncObject.Pulse();
             *
             *          if (req.Async)
             *              req.Callback(req.syncObject.Value);
             *          Requests.Remove(result.RequestId);
             *      }
             *  }
             * }*/
            else if (message.GetType() == typeof(MsgReleaseLock))
            {
                lock (NetworkLocks)
                {
                    MsgReleaseLock releaseLock = message as MsgReleaseLock;
                    uint           LockId      = releaseLock.LockId;
                    if (NetworkLocks.ContainsKey(LockId))
                    {
                        NetworkLocks[LockId].Pulse();
                        NetworkLocks.Remove(LockId);
                    }
                    else
                    {
                        NetworkLocks.Add(LockId, new SyncObject(this.Connection.Connection));
                        NetworkLocks[LockId].Pulse();
                    }
                }
            }
        }
示例#2
0
        public object onRequest(AClient connection, MsgGetSharedClass request)
        {
            ReturnResult result = new ReturnResult(null, false);

            lock (connection.SharingClasses)
            {
                try
                {
                    if (connection.SharingClasses.ContainsKey(request.ClassName))
                    {
                        SharedClass localSharedClass = connection.SharingClasses[request.ClassName];

                        if (localSharedClass.RemoteInitialize)
                        {
                            bool FoundConstructor = false;

                            if (request.ArgObjects.Length > 0)
                            {
                                //lets check if there is a constructor with these arguments
                                for (int i = 0; i < localSharedClass.ConstructorTypes.Count; i++)
                                {
                                    if (localSharedClass.ConstructorTypes[i].Length == request.ArgObjects.Length)
                                    {
                                        bool CorrectArgs = true;
                                        for (int j = 0; j < request.ArgObjects.Length; j++)
                                        {
                                            if (localSharedClass.ConstructorTypes[i][j] != request.ArgObjects[j].GetType() &&
                                                localSharedClass.ConstructorTypes[i][j] != request.ArgObjects[j].GetType().BaseType)
                                            {
                                                CorrectArgs = false;
                                                break;
                                            }
                                        }

                                        if (CorrectArgs)
                                        {
                                            FoundConstructor = true;
                                            break;
                                        }
                                    }
                                }
                                if (!FoundConstructor)
                                {
                                    return(null);
                                }
                            }
                        }

                        SharedClass sClass = new SharedClass(localSharedClass.BaseClassType, connection, localSharedClass.RemoteInitialize, localSharedClass.BaseClassTypeArgs);
                        sClass.InitializedClass = Activator.CreateInstance(sClass.BaseClassType, localSharedClass.RemoteInitialize ? request.ArgObjects : sClass.BaseClassTypeArgs);
                        Random rnd      = new Random(DateTime.Now.Millisecond);
                        int    RandomId = rnd.Next();
                        while (connection.RemoteSharedClasses.ContainsKey(RandomId))
                        {
                            RandomId = rnd.Next();
                        }

                        sClass.SharedId = RandomId;
                        connection.RemoteSharedClasses.Add(RandomId, sClass);
                        result.ReturnValue = sClass;
                        return(result);
                    }
                } catch (Exception ex)
                {
                    result.ExceptionOccured = true;
                    result.exceptionMessage = ex.InnerException != null ? ex.InnerException.Message : ex.Message;
                }
            }
            return(result);
        }