Beispiel #1
0
        protected MemoryStream Handle(MemoryStream istream, HproseMethods methods, object context)
        {
            currentContext = context;
            try {
                istream.Position = 0;
                for (int i = filters.Count - 1; i >= 0; --i)
                {
#if (dotNET10 || dotNET11 || dotNETCF10)
                    IHproseFilter filter = (IHproseFilter)filters[i];
                    istream = filter.InputFilter(istream, context);
#else
                    istream = filters[i].InputFilter(istream, context);
#endif
                    istream.Position = 0;
                }
                switch (istream.ReadByte())
                {
                case HproseTags.TagCall:
                    return(DoInvoke(istream, methods, context));

                case HproseTags.TagEnd:
                    return(DoFunctionList(methods, context));

                default:
                    return(SendError(new HproseException("Wrong Request: \r\n" + HproseHelper.ReadWrongInfo(istream)), context));
                }
            }
            catch (Exception e) {
                return(SendError(e, context));
            }
            finally {
                currentContext = null;
            }
        }
Beispiel #2
0
        private object DoInput(MemoryStream inData, object[] arguments, Type returnType, HproseResultMode resultMode, HproseClientContext context)
        {
            for (int i = filters.Count - 1; i >= 0; --i)
            {
                inData.Position = 0;
#if (dotNET10 || dotNET11 || dotNETCF10 || dotNETMF)
                IHproseFilter filter = (IHproseFilter)filters[i];
                inData = filter.InputFilter(inData, context);
#else
                inData = filters[i].InputFilter(inData, context);
#endif
            }
            inData.Position = inData.Length - 1;
            int tag = inData.ReadByte();
            if (tag != HproseTags.TagEnd)
            {
                throw new HproseException("Wrong Response: \r\n" + HproseHelper.ReadWrongInfo(inData));
            }
            inData.Position = 0;
            if (resultMode == HproseResultMode.Raw)
            {
                inData.SetLength(inData.Length - 1);
            }
            if (resultMode == HproseResultMode.RawWithEndTag ||
                resultMode == HproseResultMode.Raw)
            {
                return(MemoryStreamToType(inData, returnType));
            }
            object result = null;
#if !dotNETMF
            HproseReader reader = new HproseReader(inData, mode);
#else
            HproseReader reader = new HproseReader(inData);
#endif
            while ((tag = inData.ReadByte()) != HproseTags.TagEnd)
            {
                switch (tag)
                {
                case HproseTags.TagResult:
                    if (resultMode == HproseResultMode.Normal)
                    {
                        reader.Reset();
                        result = reader.Unserialize(returnType);
                    }
                    else
                    {
                        result = MemoryStreamToType(reader.ReadRaw(), returnType);
                    }
                    break;

                case HproseTags.TagArgument:
                    reader.Reset();
                    Object[] args   = reader.ReadObjectArray();
                    int      length = arguments.Length;
                    if (length > args.Length)
                    {
                        length = args.Length;
                    }
                    Array.Copy(args, 0, arguments, 0, length);
                    break;

                case HproseTags.TagError:
                    reader.Reset();
                    result = new HproseException(reader.ReadString());
                    break;

                default:
                    throw new HproseException("Wrong Response: \r\n" + HproseHelper.ReadWrongInfo(inData));
                }
            }
            return(result);
        }