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 12 13 module hunt.proton.codec.messaging.HeaderType; 14 15 import hunt.collection.AbstractList; 16 import hunt.collection.List; 17 import hunt.Object; 18 import hunt.Boolean; 19 import hunt.proton.amqp.Symbol; 20 import hunt.proton.amqp.UnsignedByte; 21 import hunt.proton.amqp.UnsignedInteger; 22 import hunt.proton.amqp.UnsignedLong; 23 import hunt.proton.amqp.messaging.Header; 24 import hunt.proton.codec.AbstractDescribedType; 25 import hunt.proton.codec.Decoder; 26 import hunt.proton.codec.DescribedTypeConstructor; 27 import hunt.proton.codec.EncoderImpl; 28 import hunt.Exceptions; 29 import std.concurrency : initOnce; 30 import std.conv : to; 31 32 class HeaderWrapper : AbstractList!Object 33 { 34 private Header _impl; 35 36 this(Header impl) 37 { 38 _impl = impl; 39 } 40 41 42 override 43 public Object get(int index) 44 { 45 46 switch(index) 47 { 48 case 0: 49 return _impl.getDurable(); 50 case 1: 51 return _impl.getPriority(); 52 case 2: 53 return _impl.getTtl(); 54 case 3: 55 return _impl.getFirstAcquirer(); 56 case 4: 57 return _impl.getDeliveryCount(); 58 default: 59 return null; 60 } 61 62 // throw new IllegalStateException("Unknown index " ~ to!string(index)); 63 64 } 65 66 override 67 public int size() 68 { 69 return _impl.getDeliveryCount() !is null 70 ? 5 71 : _impl.getFirstAcquirer() !is null 72 ? 4 73 : _impl.getTtl() !is null 74 ? 3 75 : _impl.getPriority() !is null 76 ? 2 77 : _impl.getDurable() !is null 78 ? 1 79 : 0; 80 81 } 82 83 84 } 85 86 87 class HeaderType : AbstractDescribedType!(Header,List!Object) , DescribedTypeConstructor!(Header) 88 { 89 //private static Object[] DESCRIPTORS = 90 //{ 91 // UnsignedLong.valueOf(0x0000000000000070L), Symbol.valueOf("amqp:header:list"), 92 //}; 93 94 //private static UnsignedLong DESCRIPTOR = UnsignedLong.valueOf(0x0000000000000070L); 95 96 static Object[] DESCRIPTORS() { 97 __gshared Object[] inst; 98 return initOnce!inst([UnsignedLong.valueOf(0x0000000000000070L), Symbol.valueOf("amqp:header:list")]); 99 } 100 101 static UnsignedLong DESCRIPTOR() { 102 __gshared UnsignedLong inst; 103 return initOnce!inst(UnsignedLong.valueOf(0x0000000000000070L)); 104 } 105 106 107 this(EncoderImpl encoder) 108 { 109 super(encoder); 110 } 111 112 override 113 protected UnsignedLong getDescriptor() 114 { 115 return DESCRIPTOR; 116 } 117 118 override 119 protected List!Object wrap(Header val) 120 { 121 return new HeaderWrapper(val); 122 } 123 124 125 126 public Header newInstance(Object described) 127 { 128 List!Object l = cast(List!Object) described; 129 130 Header o = new Header(); 131 132 133 switch(5 - l.size()) 134 { 135 136 case 0: 137 o.setDeliveryCount( cast(UnsignedInteger) l.get( 4 ) ); 138 goto case; 139 case 1: 140 o.setFirstAcquirer( (cast(Boolean) l.get( 3 )) ); 141 goto case; 142 case 2: 143 o.setTtl( cast(UnsignedInteger) l.get( 2 ) ); 144 goto case; 145 case 3: 146 o.setPriority( cast(UnsignedByte) l.get( 1 ) ); 147 goto case; 148 case 4: 149 o.setDurable( (cast(Boolean) l.get( 0 )) ); 150 break; 151 default: 152 break; 153 } 154 155 156 return o; 157 } 158 159 public TypeInfo getTypeClass() 160 { 161 return typeid(Header); 162 } 163 164 public static void register(Decoder decoder, EncoderImpl encoder) 165 { 166 HeaderType type = new HeaderType(encoder); 167 // implementationMissing(false); 168 foreach(Object descriptor ; DESCRIPTORS) 169 { 170 decoder.registerDynamic(descriptor, type); 171 } 172 encoder.register(type); 173 } 174 }