コード例 #1
0
 private MSEncoder GetEncoder()
 {
     if (_encoder == null)
     {
         _encoder = new MSEncoder(4 * 1024);
     }
     return(_encoder);
 }
コード例 #2
0
        private void InvokeMethod(Method method, SegmentType type)
        {
            MSEncoder encoder = GetEncoder();

            encoder.Init();
            encoder.WriteUint16(method.GetEncodedType());
            if (type == SegmentType.COMMAND)
            {
                if (method.Sync)
                {
                    encoder.WriteUint16(0x0101);
                }
                else
                {
                    encoder.WriteUint16(0x0100);
                }
            }
            method.Write(_encoder);
            MemoryStream methodSeg = encoder.Segment();

            byte flags = network.Frame.FIRST_SEG;

            bool payload = method.HasPayload();

            if (!payload)
            {
                flags |= network.Frame.LAST_SEG;
            }

            MemoryStream headerSeg = null;

            if (payload)
            {
                Header   hdr     = method.Header;
                Struct[] structs = hdr.Structs;

                foreach (Struct st in structs)
                {
                    encoder.WriteStruct32(st);
                }
                headerSeg = encoder.Segment();
            }

            lock (_sendlock)
            {
                Fragment(flags, type, method, methodSeg);
                if (payload)
                {
                    Fragment(0x0, SegmentType.HEADER, method, headerSeg);
                    Fragment(network.Frame.LAST_SEG, SegmentType.BODY, method, method.Body);
                }
            }
        }
コード例 #3
0
        public void EncodeValue(IEncoder enc, short type, object val)
        {
            try {
                switch ((int)type)
                {
                case 1: enc.WriteUint8((short)val); break;                                 // U8

                case 2: enc.WriteUint16((int)val);  break;                                 // U16

                case 3: enc.WriteUint32((long)val); break;                                 // U32

                case 4: enc.WriteUint64((long)val); break;                                 // U64

                case 6: enc.WriteStr8((string)val); break;                                 // SSTR

                case 7: enc.WriteStr16((string)val); break;                                // LSTR

                case 8: enc.WriteDatetime((long)val); break;                               // ABSTIME

                case 9: enc.WriteUint32((long)val);   break;                               // DELTATIME

                case 10: ((ObjectID)val).encode(enc); break;                               // ref

                case 11:
                    if ((bool)val)
                    {
                        enc.WriteUint8(1);
                    }
                    else
                    {
                        enc.WriteUint8(0);
                    }
                    break;

                case 12: enc.WriteFloat((float)val); break;                                // FLOAT

                case 13: enc.WriteDouble((double)val);   break;                            // DOUBLE

                case 14: enc.WriteUuid((UUID)val); break;                                  // UUID

                case 15: enc.WriteMap((Dictionary <string, object>)val); break;            // Ftable

                case 16: enc.WriteInt8((short)val); break;                                 // int8

                case 17: enc.WriteInt16((int)val);  break;                                 // int16

                case 18: enc.WriteInt32(long.Parse("" + val)); break;                      // int32

                case 19: enc.WriteInt64(long.Parse("" + val)); break;                      // int64

                case 20:                                                                   // Object
                    // Check that the object has a session, if not
                    // take ownership of it
                    QMFObject qObj = (QMFObject)val;
                    if (qObj.Session == null)
                    {
                        qObj.Session = this;
                    }
                    qObj.Encode(enc);
                    break;

                case 21:                                                                     // List
                    List <object> items = (List <object>)val;
                    MSEncoder     lEnc  = new MSEncoder(1);
                    lEnc.Init();
                    lEnc.WriteUint32(items.Count);
                    foreach (object obj in items)
                    {
                        short innerType = Util.QMFType(obj);
                        lEnc.WriteUint8(innerType);
                        this.EncodeValue(lEnc, innerType, obj);
                    }
                    enc.WriteVbin32(lEnc.Segment().ToArray());
                    break;

                case 22:                                                                                                 // Array
                    List <object> aItems = (List <object>)val;
                    MSEncoder     aEnc   = new MSEncoder(1);
                    aEnc.Init();
                    long aCount = aItems.Count;
                    aEnc.WriteUint32(aCount);
                    if (aCount > 0)
                    {
                        Object anObj     = aItems[0];
                        short  innerType = Util.QMFType(anObj);
                        aEnc.WriteUint8(innerType);
                        foreach (object obj in aItems)
                        {
                            this.EncodeValue(aEnc, innerType, obj);
                        }
                    }
                    enc.WriteVbin32(aEnc.Segment().ToArray());
                    break;

                default:
                    throw new Exception(String.Format("Invalid Type Code: {0}", type));
                }
            }
            catch (System.InvalidCastException e) {
                string msg = String.Format("Class cast exception for typecode {0}, type {1} ", type, val.GetType());
                log.Error(msg);
                throw new Exception(msg + type, e);
            }
        }