8#ifndef INCLUDED_BALBER_BERDECODER
9#define INCLUDED_BALBER_BERDECODER
122#include <balscm_version.h>
154#include <bsl_algorithm.h>
155#include <bsl_istream.h>
156#include <bsl_ostream.h>
157#include <bsl_string.h>
158#include <bsl_vector.h>
163class BerDecoder_Node;
164class BerDecoder_NodeVisitor;
165class BerDecoder_UniversalElementVisitor;
185 class MemOutStream :
public bsl::ostream {
191 MemOutStream(
const MemOutStream&);
192 MemOutStream& operator=(
const MemOutStream&);
219 const char *
data()
const;
232#ifndef BDE_OMIT_INTERNAL_DEPRECATED
246 MemOutStream *d_logStream;
253 bsl::streambuf *d_streamBuf;
256 int d_numUnknownElementsSkipped;
262 int d_arrayLengthHint;
281 void logErrorImp(
const char *msg);
288 bsl::ostream& logStream();
310 template <
typename TYPE>
311 int decode(bsl::streambuf *streamBuf, TYPE *variable);
317 template <
typename TYPE>
318 int decode(bsl::istream& stream, TYPE *variable);
327 template <
typename TYPE>
328 int decodeAny(bsl::streambuf *streamBuf, TYPE *variable);
339 template <
typename TYPE>
340 int decodeAny(bsl::istream& stream, TYPE *variable);
398 int d_expectedLength;
399 int d_consumedHeaderBytes;
400 int d_consumedBodyBytes;
401 int d_consumedTailBytes;
402 int d_formattingMode;
403 const char *d_fieldName;
424 template <
typename TYPE>
426 template <
typename TYPE>
428 template <
typename TYPE>
430 template <
typename TYPE>
432 template <
typename TYPE>
434 template <
typename TYPE>
436 template <
typename TYPE>
438 template <
typename TYPE>
443 template <
typename TYPE>
444 int decodeArray(TYPE *variable);
448 template <
typename TYPE>
449 int decodeChoice(TYPE *variable);
456 template <
class t_BYTE>
463 template <
typename TYPE>
469 template <
typename TYPE>
472 template <
typename TYPE,
typename ANY_CATEGORY>
473 int operator()(TYPE *
object, ANY_CATEGORY category);
475 template <
typename TYPE>
482 int spacePerLevel = 0,
483 const char *prefixText = 0)
const;
584 template <
typename TYPE,
typename INFO>
585 int operator()(TYPE *variable,
const INFO& info);
619 template <
typename TYPE>
640 : d_options_p(options)
662balber::BerDecoder::MemOutStream::MemOutStream(
665, d_sb(
bslma::Default::allocator(basicAllocator))
687 return (
int)d_sb.length();
697BerDecoder::logError(
const char *msg)
707bsl::ostream& BerDecoder::logStream()
709 if (0 == d_logStream) {
710 d_logStream =
new(d_logArea.buffer()) MemOutStream(d_allocator);
715template <
typename TYPE>
717int BerDecoder::decode(bsl::istream& stream, TYPE *variable)
719 if (!stream.good()) {
723 if (0 != this->decode(stream.rdbuf(), variable)) {
724 stream.setstate(bsl::ios_base::failbit);
731template <
typename TYPE>
732int BerDecoder::decode(bsl::streambuf *streamBuf, TYPE *variable)
736 d_streamBuf = streamBuf;
738 d_severity = e_BER_SUCCESS;
739 d_numUnknownElementsSkipped = 0;
741 if (d_logStream != 0) {
742 d_logStream->reset();
756 rc = visitor(variable);
760 rc = visitor(variable);
767template <
typename TYPE>
769int BerDecoder::decodeAny(bsl::istream& stream, TYPE *variable)
772 return decodeAny(stream, &any);
775template <
typename TYPE>
777int BerDecoder::decodeAny(bsl::streambuf *streamBuf, TYPE *variable)
780 return decodeAny(streamBuf, &any);
784void BerDecoder::setNumUnknownElementsSkipped(
int value)
788 d_numUnknownElementsSkipped = value;
809 d_logStream->length());
816bool BerDecoder::maxDepthExceeded()
const
818 return d_currentDepth > d_options->maxDepth();
822int BerDecoder::numUnknownElementsSkipped()
const
824 return d_numUnknownElementsSkipped;
835, d_parent (d_decoder->d_topNode)
839, d_expectedLength (0)
840, d_consumedHeaderBytes(0)
841, d_consumedBodyBytes (0)
842, d_consumedTailBytes (0)
846 ++d_decoder->d_currentDepth;
848 d_formattingMode = d_parent->d_formattingMode;
850 d_decoder->d_topNode =
this;
857 d_parent->d_consumedBodyBytes += d_consumedHeaderBytes
858 + d_consumedBodyBytes
859 + d_consumedTailBytes;
862 d_decoder->d_topNode = d_parent;
863 --d_decoder->d_currentDepth;
874 return 0 != d_decoder->d_streamBuf->sgetc();
877 return d_expectedLength > d_consumedBodyBytes;
908 return d_formattingMode;
920 return d_expectedLength;
936template <
typename TYPE>
940 BSLS_ASSERT(0 &&
"Should never execute this function");
945template <
typename TYPE,
typename ANY_CATEGORY>
949 return this->decode(
object, category);
952template <
typename TYPE>
957 return this->decode(
object, Tag());
966 template <
class t_BASE_TYPE>
969 return d_that->decode(value, BaseTag());
974template <
typename TYPE>
984 return logError(
"Expected CONSTRUCTED tag type for choice");
994 BerDecoder_Node innerNode(d_decoder);
995 rc = innerNode.readTagHeader();
1001 return innerNode.logError(
1002 "Expected CONTEXT tag class for tagged choice");
1006 return innerNode.logError(
1007 "Expected CONSTRUCTED tag type for tagged choice");
1010 if (innerNode.tagNumber() != 0) {
1011 return innerNode.logError(
1012 "Expected 0 as a tag number for tagged choice");
1015 if (innerNode.hasMore()) {
1017 rc = innerNode.decodeChoice(variable);
1023 rc = innerNode.readTagTrailer();
1028 rc = this->decodeChoice(variable);
1034template <
typename TYPE>
1045 "Expected CONSTRUCTED tag type for nullable");
1051 BerDecoder_Node innerNode(d_decoder);
1052 rc = innerNode.readTagHeader();
1058 return innerNode.logError(
"Expected CONTEXT tag class for "
1062 if (innerNode.tagNumber() != 0) {
1063 return innerNode.logError(
1064 "Expected 0 as tag number for inner nillable");
1075 rc = innerNode.readTagTrailer();
1090template <
typename TYPE>
1094 CustomizedManipulator baseManipulator = {
this};
1100template <
typename TYPE>
1112 return logError(
"Error converting enumeration value");
1118template <
typename TYPE>
1124 "Expected PRIMITIVE tag type for simple type");
1130 *d_decoder->d_options) != 0) {
1131 return logError(
"Error reading value for simple type");
1134 d_consumedBodyBytes = d_expectedLength;
1139template <
typename TYPE>
1145 "Expected CONSTRUCTED tag type for sequence");
1150 BerDecoder_Node innerNode(d_decoder);
1152 int rc = innerNode.readTagHeader();
1158 return innerNode.logError(
1159 "Expected CONTEXT tag class inside sequence");
1163 innerNode.tagNumber())) {
1165 BerDecoder_NodeVisitor visitor(&innerNode);
1170 innerNode.tagNumber());
1173 innerNode.tagNumber()) {
1174 rc = innerNode.decode(&d_decoder->d_arrayLengthHint,
1178 rc = innerNode.skipField();
1187 rc = innerNode.readTagTrailer();
1196template <
typename TYPE>
1203 return this->decodeArray(variable);
1206template <
typename TYPE>
1213template <
typename TYPE>
1214int BerDecoder_Node::decodeChoice(TYPE *variable)
1216 BerDecoder_Node innerNode(d_decoder);
1218 int rc = innerNode.readTagHeader();
1224 return innerNode.logError(
1225 "Expected CONTEXT tag class for internal ");
1229 innerNode.tagNumber())) {
1232 innerNode.tagNumber())) {
1233 return innerNode.logError(
1234 "Unable to make choice selection");
1237 BerDecoder_NodeVisitor visitor(&innerNode);
1242 rc = innerNode.skipField();
1251 return innerNode.readTagTrailer();
1254template <
typename TYPE>
1256BerDecoder_Node::decodeArray(TYPE *variable)
1259 return logError(
"Expected CONSTRUCTED tag class for array");
1277 const int arrayLengthHint = d_decoder->d_arrayLengthHint;
1278 d_decoder->d_arrayLengthHint = 0;
1281 static_cast<int>(bsl::min<bsl::streamsize>(
1282 bsl::min(arrayLengthHint, maxSize),
1283 d_decoder->d_streamBuf->in_avail() / 2)));
1290 return logError(
"Array size exceeds the limit");
1295 BerDecoder_UniversalElementVisitor visitor(d_decoder);
1298 return logError(
"Error in decoding array element");
1312BerDecoder_NodeVisitor::
1319template <
typename TYPE,
typename INFO>
1326 return d_node->operator()(variable);
1335BerDecoder_UniversalElementVisitor::
1336BerDecoder_UniversalElementVisitor(
BerDecoder *decoder)
1342template <
typename TYPE>
1345 int alternateTag = -1;
1357 return d_node.
logError(
"Expected UNIVERSAL tag class");
1360 if (d_node.
tagNumber() !=
static_cast<int>(expectedTagNumber)) {
1361 if (-1 == alternateTag || d_node.
tagNumber() != alternateTag) {
1362 return d_node.
logError(
"Unexpected tag number");
1366 rc = d_node(variable);
Definition balber_berdecoderoptions.h:76
const int & maxSequenceSize() const
Definition balber_berdecoderoptions.h:741
Definition balber_berdecoder.h:566
~BerDecoder_NodeVisitor()=default
int operator()(TYPE *variable, const INFO &info)
Definition balber_berdecoder.h:1321
Definition balber_berdecoder.h:388
BerDecoder_Node(BerDecoder *decoder, const TYPE *variable)
BerConstants::TagType tagType() const
Return the BER tag type for this node.
Definition balber_berdecoder.h:894
BerConstants::TagClass tagClass() const
Return the BER tag class for this node.
Definition balber_berdecoder.h:888
void setFieldName(const char *name)
Definition balber_berdecoder.h:931
void print(bsl::ostream &out, int depth, int spacePerLevel=0, const char *prefixText=0) const
int readVectorChar(bsl::vector< char > *variable)
const char * fieldName() const
Return field name for this node.
Definition balber_berdecoder.h:912
BerDecoder_Node * parent() const
Return the address of the parent node.
Definition balber_berdecoder.h:882
int operator()(TYPE *object, bslmf::Nil)
Definition balber_berdecoder.h:938
int logError(const char *msg)
int readVectorUnsignedChar(bsl::vector< unsigned char > *variable)
void setFormattingMode(int formattingMode)
Set formatting mode specified by formattingMode.
Definition balber_berdecoder.h:925
void printStack(bsl::ostream &out) const
int tagNumber() const
Return the BER tag number for this node.
Definition balber_berdecoder.h:900
int length() const
Return expected length of the body or -1 when the length is indefinite.
Definition balber_berdecoder.h:918
int formattingMode() const
Return formatting mode for this node.
Definition balber_berdecoder.h:906
int startPos() const
Return the position of node tag from the beginning of input stream.
bool hasMore()
Definition balber_berdecoder.h:869
~BerDecoder_Node()
Definition balber_berdecoder.h:854
Definition balber_berdecoder.h:598
~BerDecoder_UniversalElementVisitor()=default
int operator()(TYPE *variable)
Definition balber_berdecoder.h:1343
Definition balber_berdecoder.h:631
~BerDecoder_Zeroer()
Definition balber_berdecoder.h:644
BerDecoder_Zeroer(const BerDecoderOptions **options)
Definition balber_berdecoder.h:639
Definition balber_berdecoder.h:175
int numUnknownElementsSkipped() const
Definition balber_berdecoder.h:822
int decodeAny(bsl::streambuf *streamBuf, TYPE *variable)
Definition balber_berdecoder.h:777
bool maxDepthExceeded() const
Definition balber_berdecoder.h:816
int decode(bsl::streambuf *streamBuf, TYPE *variable)
Definition balber_berdecoder.h:732
int decodeAny(bsl::istream &stream, bdlar::AnyRef *variable)
bslstl::StringRef loggedMessages() const
Definition balber_berdecoder.h:805
void setNumUnknownElementsSkipped(int value)
Definition balber_berdecoder.h:784
int decodeAny(bsl::streambuf *streamBuf, bdlar::AnyRef *variable)
ErrorSeverity
Definition balber_berdecoder.h:228
@ BDEM_BER_SUCCESS
Definition balber_berdecoder.h:233
@ e_BER_SUCCESS
Definition balber_berdecoder.h:229
@ e_BER_ERROR
Definition balber_berdecoder.h:230
@ BDEM_BER_ERROR
Definition balber_berdecoder.h:234
BerDecoder(const BerDecoderOptions *options=0, bslma::Allocator *basicAllocator=0)
ErrorSeverity errorSeverity() const
Definition balber_berdecoder.h:799
const BerDecoderOptions * decoderOptions() const
Return the address of the BER decoder options.
Definition balber_berdecoder.h:793
Definition bdlar_anyref.h:85
static bsl::enable_if<!IsDynamic< t_TYPE >::value, AnyRef >::type makeAnyRef(t_TYPE &object)
Make AnyRef to the specified object.
Definition bdlar_refutil.h:209
Definition bdlsb_memoutstreambuf.h:212
Definition bslstl_vector.h:1120
Definition bslma_allocator.h:545
Definition bslstl_stringref.h:374
int length() const
Definition balber_berdecoder.h:685
const char * data() const
Definition balber_berdecoder.h:679
void reset()
Reset the internal streambuf to the empty state.
Definition balber_berdecoder.h:672
static int manipulateByCategory(TYPE *object, MANIPULATOR &manipulator)
Definition bdlat_typecategory.h:1414
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_OVERRIDE
Definition bsls_keyword.h:695
Definition balber_berconstants.h:84
int manipulateElement(TYPE *array, MANIPULATOR &manipulator, int index)
void resize(TYPE *array, int newSize)
bsl::size_t size(const TYPE &array)
Return the number of elements in the specified array.
int reserve(TYPE *array, int numElements)
bool hasSelection(const TYPE &object, const char *selectionName, int selectionNameLength)
int manipulateSelection(TYPE *object, MANIPULATOR &manipulator)
int makeSelection(TYPE *object, int selectionId)
int createBaseAndConvert(t_TYPE *object, t_MANIPULATOR &baseManipulator)
int manipulateValue(TYPE *object, MANIPULATOR &manipulator)
void makeValue(TYPE *object)
int manipulateAttribute(TYPE *object, MANIPULATOR &manipulator, const char *attributeName, int attributeNameLength)
bool hasAttribute(const TYPE &object, const char *attributeName, int attributeNameLength)
void reset(TYPE *object)
Reset the value of the specified object to its default value.
Definition bdlat_valuetypefunctions.h:939
Definition baljsn_encoder_testtypes.h:76
StringRefImp< char > StringRef
Definition bslstl_stringref.h:725
Definition balber_berconstants.h:94
TagType
Definition balber_berconstants.h:117
@ e_PRIMITIVE
Definition balber_berconstants.h:120
@ e_CONSTRUCTED
Definition balber_berconstants.h:121
TagClass
Definition balber_berconstants.h:96
@ e_CONTEXT_SPECIFIC
Definition balber_berconstants.h:101
@ e_UNIVERSAL
Definition balber_berconstants.h:99
static const int k_ARRAY_LENGTH_HINT_TAG_NUMBER
Definition balber_berconstants.h:132
Definition balber_berdecoder.h:961
int operator()(t_BASE_TYPE *value)
Definition balber_berdecoder.h:967
BerDecoder_Node * d_that
Definition balber_berdecoder.h:963
Value
Definition balber_beruniversaltagnumber.h:196
static Value select(const TYPE &object, int formattingMode, int *alternateTag)
Definition balber_beruniversaltagnumber.h:605
static int getValue(bsl::streambuf *streamBuf, TYPE *value, int length, const BerDecoderOptions &options=BerDecoderOptions())
Definition balber_berutil.h:3991
@ k_INDEFINITE_LENGTH
Definition balber_berutil.h:201
static int fromIntOrFallbackIfEnabled(TYPE *result, int number)
Definition bdlat_enumutil.h:333
Definition bdlat_typecategory.h:1037
Definition bdlat_typecategory.h:1038
Definition bdlat_typecategory.h:1039
Definition bdlat_typecategory.h:1036
Definition bdlat_typecategory.h:1040
Definition bdlat_typecategory.h:1041
Definition bdlat_typecategory.h:1042
Definition bdlat_typecategory.h:1043
Definition bslmf_nil.h:133
Definition bsls_objectbuffer.h:277