diff --git a/src/FixMessageUtil.h b/src/FixMessageUtil.h index 391a4cb..8871762 100644 --- a/src/FixMessageUtil.h +++ b/src/FixMessageUtil.h @@ -119,9 +119,7 @@ class FixMessageUtil { } else { - FIX::Group* group = new FIX::Group( - groupObj->Get(indexKey)->ToInteger()->Value(), - groupObj->Get(delimKey)->ToInteger()->Value()); + FIX::Group* group = getGroup(groupObj); // compat for old, non-nested format @@ -147,6 +145,33 @@ class FixMessageUtil { } } + static std::vector getTagOrder(Local tagsOrder){ + std::vector values; + int numValues = tagsOrder->Length(); + for (int i = 0; i < numValues; i++) { + values.push_back(tagsOrder->Get(i)->NumberValue()); + } + values.push_back(0); + return values; + } + + static FIX::Group* getGroup(Local groupObj){ + Local delimKey = Nan::New("delim").ToLocalChecked(); + Local orderKey = Nan::New("order").ToLocalChecked(); + Local indexKey = Nan::New("index").ToLocalChecked(); + if( ! groupObj->Has(orderKey)){ + return new FIX::Group( + groupObj->Get(indexKey)->ToInteger()->Value(), + groupObj->Get(delimKey)->ToInteger()->Value()); + } else { + Local tagsOrder = Local::Cast(groupObj->Get(orderKey)); + return new FIX::Group( + groupObj->Get(indexKey)->ToInteger()->Value(), + groupObj->Get(delimKey)->ToInteger()->Value(), + &getTagOrder(tagsOrder)[0]); //correct + } + } + static void addFixTrailer(FIX::Message* message, Local msg) { FIX::Trailer &msgTrailer = message->getTrailer();