internal IMessage NotifyActivatorProperties(IMessage msg, bool bServerSide)
        {
            IMessage message = null;

            try
            {
                int    index = this._numCtxProps;
                object obj2  = null;
                while (index-- != 0)
                {
                    obj2 = this._ctxProps[index];
                    IContextPropertyActivator activator = obj2 as IContextPropertyActivator;
                    if (activator != null)
                    {
                        IConstructionCallMessage message2 = msg as IConstructionCallMessage;
                        if (message2 != null)
                        {
                            if (!bServerSide)
                            {
                                activator.CollectFromClientContext(message2);
                            }
                            else
                            {
                                activator.DeliverClientContextToServerContext(message2);
                            }
                        }
                        else if (bServerSide)
                        {
                            activator.CollectFromServerContext((IConstructionReturnMessage)msg);
                        }
                        else
                        {
                            activator.DeliverServerContextToClientContext((IConstructionReturnMessage)msg);
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                IMethodCallMessage mcm = null;
                if (msg is IConstructionCallMessage)
                {
                    mcm = (IMethodCallMessage)msg;
                }
                else
                {
                    mcm = new ErrorMessage();
                }
                message = new ReturnMessage(exception, mcm);
                if (msg != null)
                {
                    ((ReturnMessage)message).SetLogicalCallContext((LogicalCallContext)msg.Properties[Message.CallContextKey]);
                }
            }
            return(message);
        }
Пример #2
0
        internal IMessage NotifyActivatorProperties(IMessage msg, bool bServerSide)
        {
            IMessage message = (IMessage)null;

            try
            {
                int index = this._numCtxProps;
                while (index-- != 0)
                {
                    IContextPropertyActivator propertyActivator = this._ctxProps[index] as IContextPropertyActivator;
                    if (propertyActivator != null)
                    {
                        IConstructionCallMessage msg1 = msg as IConstructionCallMessage;
                        if (msg1 != null)
                        {
                            if (!bServerSide)
                            {
                                propertyActivator.CollectFromClientContext(msg1);
                            }
                            else
                            {
                                propertyActivator.DeliverClientContextToServerContext(msg1);
                            }
                        }
                        else if (bServerSide)
                        {
                            propertyActivator.CollectFromServerContext((IConstructionReturnMessage)msg);
                        }
                        else
                        {
                            propertyActivator.DeliverServerContextToClientContext((IConstructionReturnMessage)msg);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                IMethodCallMessage mcm = !(msg is IConstructionCallMessage) ? (IMethodCallMessage) new ErrorMessage() : (IMethodCallMessage)msg;
                message = (IMessage) new ReturnMessage(ex, mcm);
                if (msg != null)
                {
                    ((ReturnMessage)message).SetLogicalCallContext((LogicalCallContext)msg.Properties[(object)Message.CallContextKey]);
                }
            }
            return(message);
        }
Пример #3
0
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        //~~~~~~~~~~~~~~~~~~~ Activation Support ~~~~~~~~~~~~~~~~~~~~~~~~
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        internal IMessage NotifyActivatorProperties(
            IMessage msg, bool bServerSide)
        {
            BCLDebug.Assert((msg is IConstructionCallMessage) ||
                            (msg is IConstructionReturnMessage),
                            "Bad activation msg type");
            BCLDebug.Assert(!((msg is IConstructionCallMessage) &&
                              (msg is IConstructionReturnMessage)),
                            "Activation message cannot be both call & return type");

            BCLDebug.Assert((_ctxFlags & CTX_FROZEN) == CTX_FROZEN,
                            "ServerContext not frozen during activation!");


            // Any exception thrown by the notifications is caught and
            // folded into a return message to return to the caller.
            IMessage errMsg = null;

            try
            {
                // Since the context is frozen the properties array is in
                // effect read-only!
                int    iProp = _numCtxProps;
                Object prop  = null;

                while (iProp-- != 0)
                {
                    // see if this property is interested in Activation
                    prop = _ctxProps[iProp];
                    IContextPropertyActivator activator = prop as IContextPropertyActivator;
                    if (null != activator)
                    {
                        // yes, notify as appropriate
                        IConstructionCallMessage ccm = msg as IConstructionCallMessage;
                        if (null != ccm)
                        {
                            // IConsructionCallMessage on its way forward
                            if (!bServerSide)
                            {
                                // activation starting at client side
                                activator.CollectFromClientContext(ccm);
                            }
                            else
                            {
                                activator.DeliverClientContextToServerContext(ccm);
                            }
                        }
                        else
                        {
                            // IConstructionReturnMessage on its way back
                            if (bServerSide)
                            {
                                // activation returning from server side
                                activator.CollectFromServerContext((IConstructionReturnMessage)msg);
                            }
                            else
                            {
                                // activation back at client side
                                activator.DeliverServerContextToClientContext((IConstructionReturnMessage)msg);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                IMethodCallMessage mcm = null;
                if (msg is IConstructionCallMessage)
                {
                    mcm = (IMethodCallMessage)msg;
                }
                else
                {
                    mcm = new ErrorMessage();
                }
                errMsg = new ReturnMessage(e, mcm);
                if (msg != null)
                {
                    ((ReturnMessage)errMsg).SetLogicalCallContext(
                        (LogicalCallContext)
                        msg.Properties[Message.CallContextKey]);
                }
            }
            return(errMsg);
        }