A logger plug-in which exports a logger file to a text file. This is a working example which is integrated into the actual logger. The output of the logger dump can be seen by using the export menu and selecting plain text.
#if DtDIS
#include <vl/enum2string.h>
#include <vl/disPduFactory.h>
#include <vl/unknownPdu.h>
#include <vlutil/vlPrint.h>
#include <vlutil/vlPrintUtil.h>
#include <iomanip>
#include <time.h>
namespace MAKLogger
{
static bool printHeader = true;
static bool printData = true;
std::ostream&
operator << (std::ostream & output,
const DtPdu& pdu)
{
if(printHeader)
{
const char *str = DtEnumString(pdu.kind());
if ((pdu.protocolVersion() == 4) &&
pdu.kind() == DtMessagePduKind) { str = "MessagePduKind"; }
DtString tmpStr = "Absolute";
if (pdu.timeStampType() == DtRELATIVE) { tmpStr = "Relative"; }
DtPrintAndIndent(output, "PduKind");
if (str)
{
output << str << " (" << pdu.kind() << ")" << std::endl;
}
else
{
output << " (" << pdu.kind() << ")" << std::endl;
}
DtPrintAttribute(output, "Version", pdu.protocolVersion());
DtPrintAttribute(output, "Exercise", pdu.exerciseId());
DtPrintAttribute(output, "ProtocolFamily", pdu.protocolFamily());
DtPrintAttribute(output, "TimeStamp", pdu.timeStamp());
DtPrintAttribute(output, "TimeStampType", tmpStr);
DtPrintAttribute(output, "Size", pdu.length());
output << "-----------------------------------------\n";
}
if(printData)
{
DtString str;
pdu.printDataToString(str);
output << str;
}
return output;
}
DtString DtTimeAndDate(double time)
{
double intPart = 0;
time = modf(time, &intPart);
int fractionalPart = time * 10000;
time_t timeValue = intPart;
struct tm * timeinfo;
timeinfo = localtime ( &timeValue );
char dateBuffer[80];
char timeBuffer[80];
strftime (dateBuffer,80," %a %b %d, %Y",timeinfo);
strftime (timeBuffer,80,"%X",timeinfo);
DtString dateAndTime(timeBuffer);
dateAndTime += ".";
sprintf(timeBuffer, "%04d", fractionalPart);
dateAndTime += timeBuffer;
dateAndTime += dateBuffer;
return dateAndTime;
}
(raw))
(bool raw),(raw))
DtLgrDisPacketPrinter::DtLgrDisPacketPrinter( bool raw)
: DtLgrPacketPrinter()
, myPduFactory( new DtDisPduFactory() )
, myPduCount( 0 )
, myPacketCount( 0)
, myCheckpointCount(0)
, myPrintRawData( raw )
, myPrintFunctionMap()
, myOutputFile(0)
, myFileDateTime(-1)
, myUnpauseTime(0)
, myFormatter(0)
{
}
{
}
{
std::ios_base::fmtflags original_flags =
outputStream().flags();
<< " Size=" << std::setw(6) << (unsigned int)packet.size()
<< " time=" << packet.time().toString(4);
{
}
}
{
outputStream() <<
"********************************************************************************" << std::endl;
}
{
{
return;
}
{
}
{
}
else
{
(this->*funcIter->second)(packet);
}
}
{
<< ")************************************************" << std::endl;
}
{
DtNetFloat64* netFileTime = (DtNetFloat64*)packet.data();
DtFloat64 internalFileTime = *netFileTime;
outputStream() <<
"******** Type=DateTime *********************************************************" << std::endl;
outputStream() <<
"Time and date: " << DtTimeAndDate(internalFileTime) << std::endl;
}
{
std::ios_base::fmtflags original_flags =
outputStream().flags();
DtLgrConfigData config;
config.deserialize(packet.data());
outputStream() <<
"******** Type=Config ***********************************************************" << std::endl;
outputStream() <<
"FileName:" << config.configFileName().string() << std::endl;
outputStream() << config.configFileContents().string() << std::endl;
}
{
const int updateHeadersSize = sizeof(DtNetPduHeader) +
(includeUpdateHeaders ? sizeof(const DtLgrDisMessageState::NetInitialStateUpdateHeader) : 0);
int pduIndex = 0;
size_t numberBytesUsed = 0;
while (numberBytesUsed < bufferSize && bufferSize >= updateHeadersSize)
{
DtFloat64 arrivalTime = 0.0;
if (includeUpdateHeaders)
{
const DtLgrDisMessageState::NetInitialStateUpdateHeader* updateHeader = (const DtLgrDisMessageState::NetInitialStateUpdateHeader*)buffer;
arrivalTime = updateHeader->arrivalTime;
buffer += sizeof(DtLgrDisMessageState::NetInitialStateUpdateHeader);
numberBytesUsed += sizeof(DtLgrDisMessageState::NetInitialStateUpdateHeader);
}
unsigned int length = ((DtNetPduHeader*)buffer)->DtLength;
if (length > 4000)
{
break;
}
else
{
DtPdu* pdu =
myPduFactory->createPdu((DtNetPacket*)buffer, (DtBufferPtr)buffer);
if (!pdu)
{
break;
}
const char* pduKindStr = DtEnumString(pdu->kind());
outputStream() <<
"************ Checkpoint PDU #" << std::setw(6) << std::setfill(
' ') << std::left << pduIndex
<< " Kind=" << (pduKindStr ? pduKindStr : "Unknown") << "(" << pdu->kind() << ")"
<< " Size=" << std::setw(6) << length
<< " Time=" << std::setw(6) << pdu->timeStamp();
if (includeUpdateHeaders)
{
}
delete pdu;
buffer += length;
numberBytesUsed += length;
}
pduIndex++;
}
}
{
std::ios_base::fmtflags original_flags =
outputStream().flags();
<< "*******************************************" << std::endl;
size_t bufferSize = packet.size();
const char* buffer = packet.data();
{
DtMessageState::NetInitialStateHeader* initialStateHeader =
(DtMessageState::NetInitialStateHeader*)buffer;
outputStream() <<
"Number Checkpoints: " << (DtInt64)initialStateHeader->numberCheckpoints
<< " Offset: " << (DtFloat64)initialStateHeader->offset << std::endl;
buffer += sizeof(*initialStateHeader);
bufferSize -= sizeof(*initialStateHeader);
}
}
{
std::ios_base::fmtflags original_flags =
outputStream().flags();
<< "*******************************************" << std::endl;
size_t bufferSize = packet.size();
const char* buffer = packet.data();
{
DtMessageState::NetCheckpointHeader* checkpointHeader =
(DtMessageState::NetCheckpointHeader*)buffer;
outputStream() <<
"Number Checkpoints: " << (DtInt64)checkpointHeader->numCheckpoints
<< " Previous/Next Positions: " << (DtInt64)checkpointHeader->previousCheckpoint
<< " / " << (DtInt64)checkpointHeader->nextCheckpoint << std::endl;
buffer += sizeof(*checkpointHeader);
bufferSize -= sizeof(*checkpointHeader);
}
}
{
std::ios_base::fmtflags original_flags =
outputStream().flags();
DtLgrPacketIndexer packetIndexer;
packetIndexer.decodePacket(&packet);
int indexCount = packetIndexer.indexCount();
outputStream() <<
"******** Type=IndexTable Count=" << std::setw(6) << indexCount
<< " ******************************************" << std::endl;
for (int index=0; index <indexCount; ++index)
{
<< " Position: " << packetIndexer.getPositionOfIndex(index)
<< " Time: " << packetIndexer.getTimeOfIndex(index)
<< " Size: " << packetIndexer.getSizeOfIndex(index) << std::endl;
}
}
{
DtFloat64 duration = *(DtNetFloat64*)packet.data();
outputStream() <<
"******** Type=RecordingInfo ****************************************************" << std::endl;
outputStream() <<
"File Duration: " << duration << std::endl;
}
{
DtLgrEntityTrackingFormat::NetStartEndTime* times =
(DtLgrEntityTrackingFormat::NetStartEndTime*)packet.data();
double startTime = (DtNetFloat64)times->startTime;
double endTime = (DtNetFloat64)times->endTime;
outputStream() <<
"******** Type=StartTime/EndTime ****************************************************" << std::endl;
outputStream() <<
"Start/End: " << startT.toString(3) <<
"/" << endT.toString(3) << std::endl;
}
{
DtString description = packet.data();
outputStream() <<
"******** Type=Description ****************************************************" << std::endl;
outputStream() <<
"File Description: " << description << std::endl;
}
{
std::ios_base::fmtflags original_flags =
outputStream().flags();
<< " Count=" << std::setw(6) << tracker->entityCount()
<< " ****************************************" << std::endl;
for ( ; entryIter != entryEnd; ++entryIter)
{
<< " Type: " << std::setw(20) << tracker->entityType(entryIter)
<< " Force: " << std::setw(2) << tracker->entityForce(entryIter)
<< std::setiosflags(std::ios::fixed) << std::setprecision(2) << std::right
<< " First: " << std::setw(10) << tracker->entityFirstTime(entryIter)
<< " Last: " << std::setw(10) << tracker->entityLastTime(entryIter)
<< " Name: " << std::left << tracker->entityName(entryIter)
<< std::endl;
}
delete tracker;
}
{
std::ios_base::fmtflags original_flags =
outputStream().flags();
DtConstLgrDisMessage disMsg(packet);
size_t pktSize = (size_t)(disMsg.netPduHeader()->DtLength);
if ( packet.size() != pktSize )
{
(unsigned int)packet.size() << "), DIS header(" << pktSize << ") ####\n";
}
int disVersion = disMsg.netPduHeader()->version;
DtPdu* pdu(0);
disVersion >= DtProtocolVersionToRecvMin &&
disVersion <= DtProtocolVersionToRecvMax )
{
(DtBufferPtr)packet.data() );
}
else
{
pdu = new DtUnknownPdu(disMsg.netPduHeader(),(DtBufferPtr)packet.data() );
}
if(!pdu)
{
}
else
{
<< "***************************************************" << std::endl;
delete pdu;
}
}
{
DtNetFloat64* netFileTime = (DtNetFloat64*)packet.data();
DtFloat64 internalFileTime = *netFileTime;
outputStream() <<
"******** Type=Pause *********************************************************" << std::endl;
outputStream() <<
"Time and date: " << DtTimeAndDate(internalFileTime) << std::endl;
}
{
DtNetFloat64* netFileTime = (DtNetFloat64*)packet.data();
DtFloat64 internalFileTime = *netFileTime;
outputStream() <<
"******** Type=Unpause *********************************************************" << std::endl;
outputStream() <<
"Time and date: " << DtTimeAndDate(internalFileTime) << std::endl;
}
{
{
}
else
{
DtTHROW_NEW(DtCorruptedState,"Output Stream not initialize.");
}
}
const DtMessageInput* msgInput, const DtString& destination )
{
{
}
{
DtString(" for export."));
}
if (msgInput)
{
const DtLgrFileInput* fileInput = dynamic_cast<const DtLgrFileInput*>(msgInput);
const DtLgrFileFormatter* formatter = fileInput->playbackFile()->formatter();
const DtLoggerFileMetaData* metaData = formatter->metaData();
if (packet)
{
}
outputStream() <<
"Logger tape: " << fileInput->filename().string() << std::endl;
outputStream() <<
"Protocol: " << info->protocol() <<
" / Version: "
<< "(" << formatter->loggerFile()->fileVersion() << ")" << std::endl;
{
}
outputStream() <<
"********************************************************************************" << std::endl;
outputStream() <<
"\n********************************************************************************" << std::endl;
outputStream() <<
"**** Start Metadata ***********************************************************" << std::endl;
outputStream() <<
"********************************************************************************\n" << std::endl;
outputStream() <<
"********************************************************************************" << std::endl;
DtMessageBuffer::PacketList::const_iterator curIter = startMetadata.begin();
DtMessageBuffer::PacketList::const_iterator endIter = startMetadata.end();
for( ; curIter != endIter ; ++curIter)
{
}
outputStream() <<
"\n********************************************************************************" << std::endl;
outputStream() <<
"**** Serial Packets ************************************************************" << std::endl;
outputStream() <<
"********************************************************************************\n" << std::endl;
outputStream() <<
"********************************************************************************" << std::endl;
curIter = endMetadata.begin();
endIter = endMetadata.end();
for( ; curIter != endIter ; ++curIter)
{
DtPacket* packet =
DtPacket::create((*curIter)->size(),(*curIter)->time(),(*curIter)->type());
memcpy(packet->data(),(*curIter)->data(),(*curIter)->size());
}
}
}
{
{
outputStream() <<
"\n********************************************************************************" << std::endl;
outputStream() <<
"**** End Metadata **************************************************************" << std::endl;
outputStream() <<
"********************************************************************************\n" << std::endl;
outputStream() <<
"********************************************************************************" << std::endl;
for( ; curIter != endIter ; ++curIter)
{
}
}
}
}
#endif
#if DtHLA
#include <vlutil/vlPrintUtil.h>
#include "vlutil/vlUtil.h"
#include <iomanip>
#include <time.h>
namespace MAKLogger
{
DtString DtTimeAndDate(double time)
{
double intPart = 0;
time = modf(time, &intPart);
int fractionalPart = time * 10000;
time_t timeValue = intPart;
struct tm * timeinfo;
timeinfo = localtime ( &timeValue );
char dateBuffer[80];
char timeBuffer[80];
strftime (dateBuffer,80," %a %b %d, %Y",timeinfo);
strftime (timeBuffer,80,"%X",timeinfo);
DtString dateAndTime(timeBuffer);
dateAndTime += ".";
sprintf(timeBuffer, "%04d", fractionalPart);
dateAndTime += timeBuffer;
dateAndTime += dateBuffer;
return dateAndTime;
}
(DtLogger& logger,bool raw),
(logger,raw))
(DtLogger& logger,bool raw),
(logger,raw))
DtLgrHlaPacketPrinter::DtLgrHlaPacketPrinter( DtLogger& logger,bool raw)
: DtLgrPacketPrinter()
, myPacketCount(0)
, myCheckpointCount(0)
, myUpdateCount(0)
, myInteractionCount(0)
, myRemovalCount(0)
, myFileDateTime(-1)
, myUnpauseTime(0)
, myPrintRawData(raw)
, myPrintFunctionMap()
, myOutputFile(0)
, myLogger(&logger)
, myOutputFom(0)
{
}
DtLgrHlaPacketPrinter::~DtLgrHlaPacketPrinter()
{
endPrinting();
}
void DtDumpLineOfHex(
std::ostream & stream, DtU8 *address, size_t num_bytes)
{
std::ios_base::fmtflags original_flags = stream.flags();
DtU8 *p=0;
int i = 0;
for (p=address; p<(address+num_bytes); p++)
{
stream << std::hex << std::right << std::setfill('0') << std::setw(2)
<< (unsigned short) *p << ' ';
}
stream << std::endl;
stream.flags(original_flags);
}
void DtDumpHex(std::ostream& stream, const char * address,
size_t num_bytes, bool offsetLabel=false)
{
const char * addr;
unsigned int offset = 0;
for (addr=address; offset<num_bytes; offset+=8)
{
if (offsetLabel)
{
stream << std::hex << std::right << std::setfill('0') << std::setw(4)
<< offset << ": ";
}
DtDumpLineOfHex(stream, (DtU8 *)(addr+offset),
DtMin((unsigned int)8, (unsigned int)(num_bytes-offset)));
}
}
void DtLgrHlaPacketPrinter::printPacketHeader(const DtPacket& packet)
{
std::ios_base::fmtflags original_flags = outputStream().flags();
outputStream() << std::setfill(' ') << std::left;
outputStream() << "**** Packet #" << std::setw(6) << myPacketCount
<< " Size=" << std::setw(6) << (unsigned int)packet.size()
<< " time=" << packet.time().toString(4);
if (myFileDateTime > 0)
{
outputStream() << ", " << DtTimeAndDate(myFileDateTime - myUnpauseTime + packet.time().seconds());
}
outputStream() << std::endl;
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printPacketTail(const DtPacket& packet)
{
outputStream() << "********************************************************************************" << std::endl;
}
void DtLgrHlaPacketPrinter::printPacket( const DtPacket& packet )
{
{
myFileDateTime = *(DtNetFloat64*)packet.data();
myUnpauseTime = packet.time().seconds();
}
++myPacketCount;
printPacketHeader(packet);
PrintFunctionMap::iterator funcIter = myPrintFunctionMap.find(type);
if(funcIter == myPrintFunctionMap.end())
{
printOtherPacket(packet);
}
else
{
(this->*funcIter->second)(packet);
}
printPacketTail(packet);
}
void DtLgrHlaPacketPrinter::printOtherPacket(const DtPacket& packet)
{
outputStream() << "******** Type=Other(" << packet.type()
<< ")************************************************" << std::endl;
}
void DtLgrHlaPacketPrinter::printFomPacket( const DtPacket& packet )
{
std::ios_base::fmtflags original_flags = outputStream().flags();
std::auto_ptr<DtBaseFomDesc> fomDesc(DtBaseFomDesc::create());
fomDesc->setFromSerialForm(packet.data());
outputStream() << std::setfill(' ') << std::left;
outputStream() << "******** Type=FOM ***********************************************************" << std::endl;
outputStream() << "ObjectClassCount=" << std::setw(6) << fomDesc->objectClassCount()
<< "InteractionClassCount=" << std::setw(6) << fomDesc->interactionClassCount() << std::endl;
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printConfigPacket(const DtPacket& packet)
{
std::ios_base::fmtflags original_flags = outputStream().flags();
DtLgrHlaConfigData config;
config.deserialize(packet.data());
outputStream() << std::setfill(' ') << std::left;
outputStream() << "******** Type=Config ***********************************************************" << std::endl;
outputStream() << "FomVersion:" << config.fomVersion().string() << std::endl;
outputStream() << "FomMapperName:" << (config.fomMapperName().isEmpty() ? "N/A" : config.fomMapperName().string()) << std::endl;
outputStream() << "FederationName:" << config.federationName().string() << std::endl;
outputStream() << "FederateType:" << config.federateType().string() << std::endl;
#if DtHLA_1516_EVOLVED
outputStream() << "FederateName:" << config.federateName().string() << std::endl;
outputStream() << "FomModules:" << config.fomModules().string() << std::endl;
outputStream() << "Mim:" << config.mim().string() << std::endl;
#endif
outputStream() << "ConfigFileName:" << config.configFileName().string() << std::endl;
outputStream() << config.configFileContents().string() << std::endl;
outputStream() << "----------------------------------------" << std::endl;
outputStream() << "FomFileName:" << config.fedFile().string() << std::endl;
outputStream() << config.fedFileContent().string() << std::endl;
outputStream() << "----------------------------------------" << std::endl;
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printDateTimePacket(const DtPacket& packet)
{
DtNetFloat64* netFileTime = (DtNetFloat64*)packet.data();
DtFloat64 internalFileTime = *netFileTime;
outputStream() << "******** Type=DateTime *********************************************************" << std::endl;
outputStream() << "Time and date: " << DtTimeAndDate(internalFileTime) << std::endl;
}
void DtLgrHlaPacketPrinter::printState(const char* checkpointBuffer, size_t bufferSize,
int numberCheckpoints)
{
size_t numberBytesUsed = 0;
const int packetOffset = sizeof(NetCheckpointUpdateHeader) +
sizeof(NetCheckpointUpdateTail);
int updateCount = 0;
int interactionCount = 0;
int checkpointCount = 0;
outputStream() << "buffer size " << bufferSize << std::endl;
while (numberBytesUsed < bufferSize && checkpointCount < numberCheckpoints)
{
NetCheckpointUpdateHeader* header = (NetCheckpointUpdateHeader*)checkpointBuffer;
DtU32 size = header->numBytes;
DtU32 packetType = header->flags;
DtFloat64 arrivalTime = header->arrivalTime;
DtFloat64 packetTime = DtAbs(arrivalTime);
checkpointBuffer += sizeof(NetCheckpointUpdateHeader);
{
memcpy(aPacket->data(),checkpointBuffer,size);
++updateCount;
outputStream() << "******** Checkpoint Update #" << std::setw(6) << updateCount
<< " Size=" << std::setw(6) << size
<< " Time=" << std::setw(6) << arrivalTime << std::endl;
printUpdatePacketData(*aPacket, false);
delete aPacket;
}
else
{
memcpy(aPacket->data(),checkpointBuffer,size);
++interactionCount;
outputStream() << "******** Checkpoint Interaction #" << std::setw(6) << interactionCount
<< " Size=" << std::setw(6) << size
<< " Time=" << std::setw(6) << arrivalTime << std::endl;
printInteractionPacketData(*aPacket, false);
delete aPacket;
}
++checkpointCount;
checkpointBuffer += size;
checkpointBuffer += sizeof(NetCheckpointUpdateTail);
numberBytesUsed += size + packetOffset;
outputStream() << "bytes used " << numberBytesUsed << " buffer size " << bufferSize << std::endl;
}
}
void DtLgrHlaPacketPrinter::printInitialStatePacket(const DtPacket& packet)
{
std::ios_base::fmtflags original_flags = outputStream().flags();
outputStream() << std::setfill(' ') << std::left;
outputStream() << "******** Type=Initial State"
<< " *******************************************" << std::endl;
const char* initialStateBuffer = packet.data();
size_t bufferSize = packet.size();
DtInt64 numberCheckpoints = 0;
DtFloat64 offset = 0.0;
if (myFormatter->loggerFile()->fileVersion() <= -70)
{
DtMessageState::NetInitialStateHeader* initialStateHeader =
(DtMessageState::NetInitialStateHeader*)initialStateBuffer;
numberCheckpoints = initialStateHeader->numberCheckpoints;
offset = initialStateHeader->offset;
outputStream() << "Number Checkpoints: " << numberCheckpoints
<< " Offset: " << offset << std::endl;
initialStateBuffer += sizeof(*initialStateHeader);
bufferSize -= sizeof(*initialStateHeader);
}
if (bufferSize > 0 && numberCheckpoints > 0)
{
printState(initialStateBuffer, bufferSize, numberCheckpoints);
}
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printCheckpointPacket(const DtPacket& packet)
{
std::ios_base::fmtflags original_flags = outputStream().flags();
outputStream() << std::setfill(' ') << std::left;
++myCheckpointCount;
outputStream() << "******** Type=Checkpoint #"
<< std::setw(10) << myCheckpointCount
<< " *******************************************" << std::endl;
const char* checkpointBuffer = packet.data();
size_t bufferSize = packet.size();
DtInt64 numberCheckpoints = 0;
DtFloat64 offset = 0.0;
if (myFormatter->loggerFile()->fileVersion() <= -70)
{
DtMessageState::NetCheckpointHeader* checkpointHeader =
(DtMessageState::NetCheckpointHeader*)checkpointBuffer;
numberCheckpoints = checkpointHeader->numCheckpoints;
outputStream() << "Number Checkpoints: " << numberCheckpoints
<< " Previous/Next Positions: " << (DtInt64)checkpointHeader->previousCheckpoint
<< " / " << (DtInt64)checkpointHeader->nextCheckpoint << std::endl;
checkpointBuffer += sizeof(*checkpointHeader);
bufferSize -= sizeof(*checkpointHeader);
}
if (bufferSize > 0 && numberCheckpoints > 0)
{
printState(checkpointBuffer, bufferSize, numberCheckpoints);
}
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printIndexTablePacket(const DtPacket& packet)
{
std::ios_base::fmtflags original_flags = outputStream().flags();
DtLgrPacketIndexer packetIndexer;
packetIndexer.decodePacket(&packet);
int indexCount = packetIndexer.indexCount();
outputStream() << std::setfill(' ') << std::left;
outputStream() << "******** Type=IndexTable Count=" << std::setw(6) << indexCount
<< " ******************************************" << std::endl;
for (int index=0; index <indexCount; ++index)
{
outputStream() << std::setw(6) << index
<< " Position: " << packetIndexer.getPositionOfIndex(index)
<< " Time: " << packetIndexer.getTimeOfIndex(index)
<< " Size: " << packetIndexer.getSizeOfIndex(index) << std::endl;
}
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printRecordingDataPacket(const DtPacket& packet)
{
DtFloat64 duration = *(DtNetFloat64*)packet.data();
outputStream() << "******** Type=RecordingInfo ****************************************************" << std::endl;
outputStream() << "File Duration: "
<< std::setiosflags(std::ios::fixed) << std::setprecision(2) << duration << std::endl;
}
void DtLgrHlaPacketPrinter::printStartEndTimePacket(const DtPacket& packet)
{
DtLgrEntityTrackingFormat::NetStartEndTime* times =
(DtLgrEntityTrackingFormat::NetStartEndTime*)packet.data();
double startTime = (DtNetFloat64)times->startTime;
double endTime = (DtNetFloat64)times->endTime;
outputStream() << "******** Type=StartTime/EndTime ****************************************************" << std::endl;
outputStream() << "Start/End: " << startT.toString(3) << "/" << endT.toString(3) << std::endl;
}
void DtLgrHlaPacketPrinter::printDescriptionPacket(const DtPacket& packet)
{
DtString description = packet.data();
size_t desclength = packet.size();
outputStream() << "******** Type=Description ****************************************************" << std::endl;
outputStream() << "File Description: " << description << std::endl;
}
void DtLgrHlaPacketPrinter::printEntityTablePacket(const DtPacket& packet)
{
std::ios_base::fmtflags original_flags = outputStream().flags();
DtLgrEntityTracker* tracker = myFormatter->entityTracker()->createFromPacket(packet);
outputStream() << std::setfill(' ') << std::left;
outputStream() << "******** Type=EntityTable "
<< " Count=" << std::setw(6) << tracker->entityCount()
<< " ****************************************" << std::endl;
for ( ; entryIter != entryEnd; ++entryIter)
{
outputStream() << " " << std::setw(6) << entryIter
<< " Type: " << std::setw(20) << tracker->entityType(entryIter)
<< " Force: " << std::setw(2) << tracker->entityForce(entryIter)
<< std::setiosflags(std::ios::fixed) << std::setprecision(2) << std::right
<< " First: " << std::setw(10) << tracker->entityFirstTime(entryIter)
<< " Last: " << std::setw(10) << tracker->entityLastTime(entryIter)
<< " Name: " << std::left << tracker->entityName(entryIter)
<< std::endl;
}
outputStream().flags(original_flags);
delete tracker;
}
void DtLgrHlaPacketPrinter::printRegionDescriptorSet(const DtRegionDescSet& regionSet)
{
if (regionSet.size() > 0)
{
std::ios_base::fmtflags original_flags = outputStream().flags();
outputStream() << std::setfill(' ') << std::left;
outputStream() << std::setw(22) << "Region Count: " << (unsigned int)regionSet.size() << std::endl;
DtRegionDescSet::const_iterator regionIter = regionSet.begin();
int regionIndex = 1;
for ( ; regionIter != regionSet.end(); ++regionIter)
{
outputStream() << std::setw(22) << "Region #" << std::setw(2) << regionIndex
#if DtHLA_1516
<< ", Handle: " << std::setw(3) << regionIter->space.c_str()
#else
<< ", Handle: " << std::setw(3) << regionIter->regionToken
<< ", Space: " << regionIter->space.c_str()
#endif
<< ", Number of Extents: " << (unsigned int)regionIter->extents.size() << std::endl;
int extentIndex = 1;
DtExtentDescSet::const_iterator extentIter = regionIter->extents.begin();
int regionIndex = 1;
for ( ; extentIter != regionIter->extents.end(); ++extentIter)
{
outputStream() << std::setw(22) << "Extent #" << std::setw(2) << extentIndex << std::endl;
DtDimensionDescSet::const_iterator dimIter = extentIter->dimensions.begin();
int dimIndex = 1;
for ( ; dimIter != extentIter->dimensions.end(); ++dimIter)
{
outputStream() << std::setw(22) << "Dimension #" << std::setw(2) << dimIndex << std::endl;
outputStream() << std::setw(22) << "Dim Name: " << dimIter->name.c_str()
<< ", Lower: " << dimIter->lower << ", Upper: " << dimIter->upper << std::endl;
}
}
}
outputStream().flags(original_flags);
}
}
void DtLgrHlaPacketPrinter::printInteractionPacket( const DtPacket& packet )
{
++myInteractionCount;
outputStream() << "******** Type=Interaction #"
<< std::setw(10) << myInteractionCount
<< " ******************************************" << std::endl;
printInteractionPacketData(packet, true);
}
void DtLgrHlaPacketPrinter::printInteractionPacketData( const DtPacket& packet, bool printTag )
{
DtConstLgrHlaMessage hlaInfo(packet);
std::ios_base::fmtflags original_flags = outputStream().flags();
outputStream() << std::setfill(' ') << std::left;
const DtBaseInterClassDesc* intDesc = myOutputFom->interDesc(hlaInfo.interactionClassHandle());
if(intDesc)
{
outputStream() << std::setw(30) << "Interaction Class Name(Handle): " << intDesc->name()
<< "(" << hlaInfo.interactionClassHandle() << ")" << std::endl;
}
else
{
outputStream() << std::setw(30) << "Interaction Class Handle: " <<
hlaInfo.interactionClassHandle() << std::endl;
}
if (printTag)
{
outputStream() << "Tag as timestamp: " << hlaInfo.tagAsTimestamp() << std::endl;
#if DtHLA_1516
outputStream() << "Tag:" << std::endl;
DtDumpHex(outputStream(), (char *) hlaInfo.binaryTag().data(), hlaInfo.binaryTag().size(), true);
#else
outputStream() << "Tag: " << hlaInfo.asciiTag() << std::endl;
#endif
}
DtRegionDescSet regionSet;
if (hlaInfo.getInteractionDDMRegionDescSet(regionSet) > 0)
{
printRegionDescriptorSet(regionSet);
}
std::auto_ptr<DtLgrHandleValueMap> params = hlaInfo.createParams();
outputStream() << "Parameter Count: " << (unsigned int)params->size() << std::endl;
int parameterIndex = 1;
DtLgrHandleValueMap::const_iterator curIter = params->begin();
DtLgrHandleValueMap::const_iterator endIter = params->end();
for(;curIter != endIter;++curIter,++parameterIndex)
{
outputStream() <<"Parameter #" << std::setw(3) << parameterIndex
<< " Size: " << std::setw(4) << std::right << (unsigned int)curIter->second.size();
const DtBaseParamDesc* paramDesc = 0;
if(intDesc)
{
paramDesc = intDesc->findValueByHandle(curIter->first,false);
}
if(!paramDesc)
{
outputStream() << ", Handle: " << curIter->first << std::endl;
}
else
{
outputStream() << ", Name(Handle): " << paramDesc->name()
<< "(" << curIter->first << ")" << std::endl;
}
outputStream() << std::right;
DtPrintAttributeHex(outputStream(),"Value",
curIter->second.data(),curIter->second.size());
outputStream() << std::setfill(' ') << std::left;
}
outputStream().flags(original_flags);
}
void DtPrintAttributeHex(std::ostream &stream, const char *label, const void *bytes, int size)
{
DtPrintAndIndent(stream, label);
stream << std::endl;
DtDumpHex(stream, (char *) bytes, size, true);
}
void DtLgrHlaPacketPrinter::printUpdatePacket( const DtPacket& packet )
{
++myUpdateCount;
outputStream() << "******** Type=Update #"
<< std::setw(10) << myUpdateCount
<< " ***********************************************" << std::endl;
printUpdatePacketData(packet, true);
}
void DtLgrHlaPacketPrinter::printUpdatePacketData( const DtPacket& packet, bool printTag )
{
DtConstLgrHlaMessage hlaInfo(packet);
std::ios_base::fmtflags original_flags = outputStream().flags();
outputStream() << std::setfill(' ') << std::left;
outputStream() << std::setw(30) << "Object Name(Handle): " << hlaInfo.objectName()
<< "(" << hlaInfo.objectHandle() << ")" << std::endl;
const DtBaseObjClassDesc* objDesc = myOutputFom->objDesc(hlaInfo.objectClassHandle());
if(objDesc)
{
outputStream() << std::setw(30) << "Object Class Name(Handle): " << objDesc->name()
<< "(" << hlaInfo.objectClassHandle() << ")" << std::endl;
}
else
{
outputStream() << std::setw(30) << "Object Class Handle: " <<
hlaInfo.objectClassHandle() << std::endl;
}
if (printTag)
{
outputStream() << "Tag as timestamp: " << hlaInfo.tagAsTimestamp() << std::endl;
#if DtHLA_1516
outputStream() << "Tag:" << std::endl;
DtDumpHex(outputStream(), (char *) hlaInfo.binaryTag().data(), hlaInfo.binaryTag().size(), true);
#else
outputStream() << "Tag: " << hlaInfo.asciiTag() << std::endl;
#endif
}
DtRegionDescSet regionSet;
if (hlaInfo.getObjectDDMRegionDescSet(regionSet) > 0)
{
printRegionDescriptorSet(regionSet);
}
std::auto_ptr<DtLgrHandleValueMap> params = hlaInfo.createAttrs();
outputStream() << "Attribute Count: " << (unsigned int)params->size() << std::endl;
int attrIndex = 1;
DtLgrHandleValueMap::const_iterator curIter = params->begin();
DtLgrHandleValueMap::const_iterator endIter = params->end();
for(;curIter != endIter;++curIter,++attrIndex)
{
outputStream() << "Attribute #" << std::setw(3) << attrIndex
<< " Size: " << std::setw(4) << std::right << (unsigned int)curIter->second.size();
const DtBaseAttrDesc* attrDesc = 0;
if (objDesc)
{
attrDesc = objDesc->findValueByHandle(curIter->first,false);
}
if (!attrDesc)
{
outputStream() << ", Handle: " << curIter->first << std::endl;
}
else
{
outputStream() << ", Name(Handle): " << attrDesc->name()
<< "(" << curIter->first << ")" << std::endl;
}
outputStream() << std::right;
DtPrintAttributeHex(outputStream(),"Value",
curIter->second.data(),curIter->second.size());
outputStream() << std::setfill(' ') << std::left;
}
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printRemovalPacket( const DtPacket& packet )
{
std::ios_base::fmtflags original_flags = outputStream().flags();
outputStream() << std::setfill(' ') << std::left;
DtConstLgrHlaMessage hlaInfo(packet);
++myRemovalCount;
outputStream() << "******** Type=Removal #"
<< std::setw(10) << myRemovalCount
<< " **********************************************" << std::endl;
outputStream() << std::setw(30) << "Object Name(Handle): " << hlaInfo.objectName()
<< "(" << hlaInfo.objectHandle() << ")" << std::endl;
const DtBaseObjClassDesc* objDesc = myOutputFom->objDesc(hlaInfo.objectClassHandle());
if(objDesc)
{
outputStream() << std::setw(30) << "Object Class Name(Handle): " << objDesc->name()
<< "(" << hlaInfo.objectClassHandle() << ")" << std::endl;
}
else
{
outputStream() << std::setw(30) << "Object Class Handle: " <<
hlaInfo.objectClassHandle() << std::endl;
}
outputStream().flags(original_flags);
}
void DtLgrHlaPacketPrinter::printPausePacket( const DtPacket& packet )
{
DtNetFloat64* netFileTime = (DtNetFloat64*)packet.data();
DtFloat64 internalFileTime = *netFileTime;
outputStream() << "******** Type=Pause *********************************************************" << std::endl;
outputStream() << "Time and date: " << DtTimeAndDate(internalFileTime) << std::endl;
}
void DtLgrHlaPacketPrinter::printUnpausePacket( const DtPacket& packet )
{
DtNetFloat64* netFileTime = (DtNetFloat64*)packet.data();
DtFloat64 internalFileTime = *netFileTime;
outputStream() << "******** Type=Unpause *********************************************************" << std::endl;
outputStream() << "Time and date: " << DtTimeAndDate(internalFileTime) << std::endl;
}
void DtLgrHlaPacketPrinter::beginPrinting(const DtMessageIOInfo* info,
const DtMessageInput* msgInput, const DtString& destination )
{
if (myOutputFile)
{
endPrinting();
}
if(myOutputFom)
{
delete myOutputFom;
myOutputFom = 0;
}
const DtLgrHlaMessageIOInfo* hlaInfo = dynamic_cast<const DtLgrHlaMessageIOInfo*>(info);
if(hlaInfo)
{
myOutputFom = DtBaseFomDesc::copy(hlaInfo->fom());
}
myOutputFile = new std::ofstream();
myOutputFile->open(destination.c_str());
if(!myOutputFile->good())
{
DtString(" for export."));
delete myOutputFile;
myOutputFile = 0;
}
myPacketCount = 0;
myCheckpointCount = 0;
myInteractionCount = 0;
myUpdateCount = 0;
myFileDateTime = -1;
myUnpauseTime = 0;
if (msgInput)
{
const DtLgrFileInput* fileInput = dynamic_cast<const DtLgrFileInput*>(msgInput);
myFormatter = fileInput->playbackFile()->formatter();
const DtLoggerFileMetaData* metaData = myFormatter->metaData();
if (packet)
{
myFileDateTime = *(DtNetFloat64*)packet->data();
}
outputStream() << "Logger tape: " << fileInput->filename().string() << std::endl;
outputStream() << "Protocol: " << hlaInfo->protocol() << " / Version: "
<< DtLgrHlaFileFormats::versionString(myFormatter->loggerFile()->fileVersion())
<< "(" << myFormatter->loggerFile()->fileVersion() << ")" << std::endl;
if (myFileDateTime > 0)
{
outputStream() << "Time and date: " << DtTimeAndDate(myFileDateTime) << std::endl;
}
outputStream() << "********************************************************************************" << std::endl;
outputStream() << "\n********************************************************************************" << std::endl;
outputStream() << "**** Start Metadata ***********************************************************" << std::endl;
outputStream() << "********************************************************************************\n" << std::endl;
outputStream() << "********************************************************************************" << std::endl;
DtMessageBuffer::PacketList::const_iterator curIter = startMetadata.begin();
DtMessageBuffer::PacketList::const_iterator endIter = startMetadata.end();
for( ; curIter != endIter ; ++curIter)
{
printPacket(**curIter);
}
outputStream() << "\n********************************************************************************" << std::endl;
outputStream() << "**** Serial Packets ************************************************************" << std::endl;
outputStream() << "********************************************************************************\n" << std::endl;
outputStream() << "********************************************************************************" << std::endl;
myEndMetadata.clear();
curIter = endMetadata.begin();
endIter = endMetadata.end();
for( ; curIter != endIter ; ++curIter)
{
DtPacket* packet =
DtPacket::create((*curIter)->size(),(*curIter)->time(),(*curIter)->type());
memcpy(packet->data(),(*curIter)->data(),(*curIter)->size());
myEndMetadata.add(packet);
}
}
}
void DtLgrHlaPacketPrinter::endPrinting()
{
if(myOutputFile)
{
outputStream() << "\n********************************************************************************" << std::endl;
outputStream() << "**** End Metadata **************************************************************" << std::endl;
outputStream() << "********************************************************************************\n" << std::endl;
outputStream() << "********************************************************************************" << std::endl;
DtMessageBuffer::PacketList::const_iterator curIter = myEndMetadata.begin();
DtMessageBuffer::PacketList::const_iterator endIter = myEndMetadata.end();
for( ; curIter != endIter ; ++curIter)
{
printPacket(**curIter);
}
myOutputFile->close();
delete myOutputFile;
myOutputFile = 0;
}
if(myOutputFom)
{
delete myOutputFom;
myOutputFom = 0;
}
}
std::ofstream& DtLgrHlaPacketPrinter::outputStream()
{
return *myOutputFile;
}
}
#endif