- // Data is Fixed Subscription-Id-Type (Enumerated derived from Integer32) and then Fixed Subscription-Id-Data (UTF8String):
- // No need to find Subscription-Id-Type, it's always the first:
- diameter::codec::functions::decodeAVP(_dataG.c_str(), _id, _flags, _length, _data);
- // Enumerated:
- int type = DECODE4BYTES_INDX_VALUETYPE(_data, 0, int);
- found = (type == subscriptionIdType);
+ // Data (_dataG) consists in two mandatory Avps in ANY order:
+ // - Subscription-Id-Type (Enumerated derived from Integer32)
+ // - Subscription-Id-Data (UTF8String)
+
+ // First AVP within _dataG:
+ diameter::codec::functions::decodeAVP(_dataG.c_str(), _id, _flags, _length, _data1);
+
+ if (_id == diameter::helpers::dcca::AVPID__Subscription_Id_Type) {
+ type = DECODE4BYTES_INDX_VALUETYPE(_data1, 0, int);
+ if (type == subscriptionIdType) {
+ diameter::codec::functions::decodeAVP(_dataG.c_str() + 12, _id, _flags, _length, _data2);
+ if (_id == diameter::helpers::dcca::AVPID__Subscription_Id_Data) return _data2;
+ }
+ }
+ else if (_id == diameter::helpers::dcca::AVPID__Subscription_Id_Data) {
+ diameter::codec::functions::decodeAVP(_dataG.c_str() + 20, _id, _flags, _length, _data2);
+ if (_id == diameter::helpers::dcca::AVPID__Subscription_Id_Type) {
+ type = DECODE4BYTES_INDX_VALUETYPE(_data2, 0, int);
+ if (type == subscriptionIdType) return _data1;
+ }
+ }
+