1 /* 2 * hunt-proton: AMQP Protocol library for D programming language. 3 * 4 * Copyright (C) 2018-2019 HuntLabs 5 * 6 * Website: https://www.huntlabs.net/ 7 * 8 * Licensed under the Apache-2.0 License. 9 * 10 */ 11 module hunt.proton.codec.messaging.ReceivedType; 12 13 import hunt.collection.AbstractList; 14 import hunt.collection.List; 15 import hunt.Object; 16 import hunt.Exceptions; 17 import hunt.proton.amqp.Symbol; 18 import hunt.proton.amqp.UnsignedInteger; 19 import hunt.proton.amqp.UnsignedLong; 20 import hunt.proton.amqp.messaging.Received; 21 import hunt.proton.codec.AbstractDescribedType; 22 import hunt.proton.codec.Decoder; 23 import hunt.proton.codec.DescribedTypeConstructor; 24 import hunt.proton.codec.EncoderImpl; 25 import std.concurrency : initOnce; 26 import hunt.Exceptions; 27 import std.conv : to; 28 29 class ReceivedWrapper : AbstractList!Object 30 { 31 private Received _impl; 32 33 this(Received impl) 34 { 35 _impl = impl; 36 } 37 38 override 39 public Object get(int index) 40 { 41 switch(index) 42 { 43 case 0: 44 return _impl.getSectionNumber(); 45 case 1: 46 return _impl.getSectionOffset(); 47 default: 48 return null; 49 } 50 51 // throw new IllegalStateException("Unknown index " ~ to!string(index)); 52 } 53 54 override 55 public int size() 56 { 57 return _impl.getSectionOffset() !is null 58 ? 2 59 : _impl.getSectionNumber() !is null 60 ? 1 61 : 0; 62 } 63 } 64 65 class ReceivedType : AbstractDescribedType!(Received, List!Object) , DescribedTypeConstructor!(Received) 66 { 67 //private static Object[] DESCRIPTORS = 68 //{ 69 // UnsignedLong.valueOf(0x0000000000000023L), Symbol.valueOf("amqp:received:list"), 70 //}; 71 72 //private static UnsignedLong DESCRIPTOR = UnsignedLong.valueOf(0x0000000000000023L); 73 74 75 static Object[] DESCRIPTORS() { 76 __gshared Object[] inst; 77 return initOnce!inst([UnsignedLong.valueOf(0x0000000000000023L), Symbol.valueOf("amqp:received:list")]); 78 } 79 80 static UnsignedLong DESCRIPTOR() { 81 __gshared UnsignedLong inst; 82 return initOnce!inst(UnsignedLong.valueOf(0x0000000000000023L)); 83 } 84 85 86 this(EncoderImpl encoder) 87 { 88 super(encoder); 89 } 90 91 override 92 public UnsignedLong getDescriptor() 93 { 94 return DESCRIPTOR; 95 } 96 97 override 98 protected List!Object wrap(Received val) 99 { 100 return new ReceivedWrapper(val); 101 } 102 103 104 105 override 106 public Received newInstance(Object described) 107 { 108 List!Object l = cast(List!Object) described; 109 110 Received o = new Received(); 111 112 switch(2 - l.size()) 113 { 114 case 0: 115 o.setSectionOffset(cast(UnsignedLong) l.get( 1 )); 116 goto case; 117 case 1: 118 o.setSectionNumber(cast(UnsignedInteger) l.get( 0 )); 119 break; 120 default: 121 break; 122 } 123 124 return o; 125 } 126 127 override 128 public TypeInfo getTypeClass() 129 { 130 return typeid(Received); 131 } 132 133 public static void register(Decoder decoder, EncoderImpl encoder) 134 { 135 ReceivedType type = new ReceivedType(encoder); 136 //implementationMissing(false); 137 foreach(Object descriptor ; DESCRIPTORS) 138 { 139 decoder.registerDynamic(descriptor, type); 140 } 141 encoder.register(type); 142 } 143 }