When C++ code generation is specified, the ASN1C compiler generates a control class for PDU types. The control class wraps the C function, providing a simplified calling interface because it hides things such as the context structure.
Calling the generated C++ class encode method is done as follows:
stat = <object>.Encode();
In this definition, <object> is an instance of the control class (i.e.,
ASN1C_<prodName>) generated for the given production. The function result variable
stat returns 0 (success) or an error code. Error
status codes are defined in rtsrc/asn1ErrCodes.h
and rtxsrc/rtxErrCodes.h.
The procedure to encode a message using the C++ class interface is as follows:
Create a variable of the ASN1T_<name> type and populate it with the data to be encoded.
Create an ASN1AVNEncodeBuffer object. ASN1AVNEncodeBuffer has constructors for encoding to a dynamic or static buffer and for encoding to a stream (any OSRTOutputStream subclass).
Create a variable of the generated ASN1C_<name> class specifying the items created in 1 and 2 as arguments to the constructor.
Invoke the Encode method.
After the data to be encoded is set, the Encode method is called. This method
returns 0 (success) or an error code. Error status codes are defined in rtsrc/asn1ErrCodes.h
and rtxsrc/rtxErrCodes.h and are listed in
Appendix A of the C/C++ Common Functions Reference
Manual.
After you successfully encode into a buffer, ASN1AVNEncodeBuffer methods
GetMsgPtr() or GetMsgCopy can be used
to access the encoded message. As the name implies, GetMsgCopy
will return a copy of the message; memory is allocated using the standard new operator, so
it is up to you to free this memory using delete.
The buffer will not be null-terminated; use ASN1AVNEncodeBuffer.nullTerminate()
to add a null terminator character if you want it.
When encoding to a buffer, after you have retrieved your encoded message, you may wish
to reuse the same objects to encode a second message. This can be done by calling init()
on the ASN1AVNEncodeBuffer
A program fragment that could be used to encode an employee record is as follows. This example uses a dynamic encode buffer:
#include employee.h // include file generated by ASN1C
main ()
{
const char* filename = "message.txt";
// step 1: construct ASN1C C++ generated class.
// this specifies a dynamic encode message buffer
ASN1AVNEncodeBuffer encodeBuffer (0, 0);
ASN1T_PersonnelRecord msgData;
ASN1C_PersonnelRecord employee (encodeBuffer, msgData);
// step 2: populate msgData structure with data to be encoded
msgData.name = “SMITH”;
...
// step 3: invoke Encode method
if (employee.Encode() == 0) {
/* Encoding successful. Null terminate the message so it can be
treated as a C string. */
encodeBuffer.nullTerminate();
printf ("encoded AVN message:\n");
printf ((const char*)encodeBuffer.getMsgPtr());
msgptr = encodeBuffer.getMsgPtr();
}
else
error processing...
}
To encode to a stream using the C++ control class, simply create
the ASN1AVNEncodeBuffer object on a stream object.
There are several OSRTOutputStream subclasses
available. These include OSRTFileOutputStream,
OSRTMemoryOutputStream, and OSRTSocketOutputStream.
Here is an illustration of encoding to a file stream:
#include employee.h // include file generated by ASN1C
#include "rtxsrc/OSRTFileOutputStream.h"
main ()
{
const char* filename = “message.dat”;
int stat = 0;
// step 1: construct output stream object.
OSRTFileOutputStream ostream(filename);
ASN1AVNEncodeBuffer encodeBuffer (ostream);
if (encodeBuffer.getStatus () != 0) {
encodeBuffer.printErrorInfo ();
return -1;
}
// step 2: construct ASN1C C++ generated class.
ASN1T_PersonnelRecord msgData;
ASN1C_PersonnelRecord employee (encodeBuffer, msgData);
// step 3: populate msgData structure with data to be
// encoded. (note: this uses the generated assignment
// operator to assign a string).
msgData.name = “SMITH”;
...
// step 4: invoke Encode method
stat = employee.Encode();
if ( stat != 0 )
{
printf ("Encoding failed. Status = %i\n", stat);
encodeBuffer.printErrorInfo ();
return -1;
}
if (trace) {
printf ("Encoding was successful\n");
}
}