Files
firestorm/Gameleap/code/mw4/Tools/LabRat/LabRatDoc.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

2220 lines
44 KiB
C++

//===========================================================================//
// File: LabRatdoc.cpp
// Project: LabRat
// Contents:
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// ??/??/96 JSE Initial coding.
//---------------------------------------------------------------------------//
// Copyright (C) 1996, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#include "stdafx.h"
#include "LabRatDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Logical BigEndian = True;;
void BigEndianConvert(LONG &value)
{
ASSERT(sizeof(value) == 4);
if (BigEndian == True)
{
BYTE *array_of_bytes;
BYTE target[4];
array_of_bytes = (BYTE *)&value;
target[0] = array_of_bytes[3];
target[1] = array_of_bytes[2];
target[2] = array_of_bytes[1];
target[3] = array_of_bytes[0];
LONG return_value = SKIPPY_CAST(LONG, target);
value = return_value;
}
}
void BigEndianConvert(DWORD &value)
{
ASSERT(sizeof(value) == 4);
if (BigEndian == True)
{
BYTE *array_of_bytes;
BYTE target[4];
array_of_bytes = (BYTE *)&value;
target[0] = array_of_bytes[3];
target[1] = array_of_bytes[2];
target[2] = array_of_bytes[1];
target[3] = array_of_bytes[0];
DWORD return_value = SKIPPY_CAST(DWORD, target);
value = return_value;
}
}
void BigEndianConvert(WORD &value)
{
ASSERT(sizeof(value) == 2);
if (BigEndian == True)
{
BYTE *array_of_bytes;
BYTE target[2];
array_of_bytes = (BYTE *)&value;
target[0] = array_of_bytes[1];
target[1] = array_of_bytes[0];
WORD return_value = SKIPPY_CAST(WORD, target);
value = return_value;
}
}
void BigEndianConvert(int &value)
{
ASSERT(sizeof(value) == 4);
if (BigEndian == True)
{
BYTE *array_of_bytes;
BYTE target[4];
array_of_bytes = (BYTE *)&value;
target[0] = array_of_bytes[3];
target[1] = array_of_bytes[2];
target[2] = array_of_bytes[1];
target[3] = array_of_bytes[0];
DWORD return_value = SKIPPY_CAST(int, target);
value = return_value;
}
}
void BigEndianConvert(float &value)
{
ASSERT(sizeof(value) == 4);
if (BigEndian == True)
{
BYTE *array_of_bytes;
BYTE target[4];
array_of_bytes = (BYTE *)&value;
target[0] = array_of_bytes[3];
target[1] = array_of_bytes[2];
target[2] = array_of_bytes[1];
target[3] = array_of_bytes[0];
float return_value = SKIPPY_CAST(float, target);
value = return_value;
}
}
void BigEndianConvert(double &value)
{
ASSERT(sizeof(value) == 8);
if (BigEndian == True)
{
BYTE *array_of_bytes;
BYTE target[8];
array_of_bytes = (BYTE *)&value;
target[0] = array_of_bytes[7];
target[1] = array_of_bytes[6];
target[2] = array_of_bytes[5];
target[3] = array_of_bytes[4];
target[4] = array_of_bytes[3];
target[5] = array_of_bytes[2];
target[6] = array_of_bytes[1];
target[7] = array_of_bytes[0];
double return_value = SKIPPY_CAST(double, target);
value = return_value;
}
}
void BigEndianConvert(BYTE &value)
{
// KILL THE WARNING!!!
ASSERT(value == value);
}
/////////////////////////////////////////////////////////////////////////////
// CLabRatDoc
IMPLEMENT_DYNCREATE(CLabRatDoc, CDocument)
BEGIN_MESSAGE_MAP(CLabRatDoc, CDocument)
//{{AFX_MSG_MAP(CLabRatDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CObarrayHolder
CObarrayHolder::CObarrayHolder()
{
data = NULL;
traceType = -1;
traceEntryCount = -1;
}
CObarrayHolder::~CObarrayHolder()
{
if (data != NULL)
{
if(!VirtualFree(data, size, MEM_DECOMMIT))
{
// afxDump << "VirtualFree FAIL!!!!" << endl;
}
if(!VirtualFree(data, 0, MEM_RELEASE))
{
// afxDump << "VirtualFree FAIL!!!!" << endl;
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CLabRatDoc construction/destruction
CLabRatDoc::CLabRatDoc()
{
// TODO: add one-time construction code here
dataArray = NULL;
classIDList = NULL;
failedOpen = False;
BigEndian = False;
traceCount=0;
}
/////////////////////////////////////////////////////////////////////////////
CLabRatDoc::~CLabRatDoc()
{
}
BOOL CLabRatDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CLabRatDoc serialization
void CLabRatDoc::Serialize(CArchive& ar)
{
// afxDump << "CLabRatDoc::Serialize" << endl;
if (ar.IsStoring())
ar.SetStoreParams(); // use large defaults
else
ar.SetLoadParams(10240);
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
CLoadingLogDlg loadingDlg;
loadingDlg.DoModal(ar, this);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void CLabRatDoc::LoadResource(CArchive& ar, CLoadingLogDlg *dialog_box)
{
LONG Section;
CFile *sample_file = ar.GetFile();
ar.Flush();
sample_file->Seek(0, CFile::begin);
ar >> Section;
BigEndian = False;
if (Section == (int)'ONVR')
{
LONG size;
ar >> size;
LONG version;
ar >> version;
if (version == 0)
{
LoadOldResource(ar, dialog_box, 12);
return;
}
else if (version == 1)
{
LoadOnePointZeroResourceBackward(ar, dialog_box);
return;
}
else if (version == 2)
{
LoadTwoPointZeroResourceBackward(ar, dialog_box);
return;
}
BigEndian = True;
BigEndianConvert(size);
BigEndianConvert(version);
if (version == 2)
{
LoadTwoPointZeroResourceBackward(ar, dialog_box);
return;
}
}
else if (Section == (int)'RVNO')
{
LONG size;
ar >> size;
LONG version;
ar >> version;
if (version == 0)
{
LoadOldResource(ar, dialog_box, 12);
return;
}
else if (version == 1)
{
LoadOnePointZeroResource(ar, dialog_box);
return;
}
else if (version == 2)
{
LoadTwoPointZeroResource(ar, dialog_box);
return;
}
}
dialog_box->KillTimer(1);
dialog_box->CancelRecived();
failedOpen = True;
AfxThrowArchiveException(CArchiveException::badIndex);
return;
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadOnePointZeroResource(CArchive& ar, CLoadingLogDlg *dialog_box)
{
LONG section;
LONG size;
DWORD current_pos = 12;
LONG header_pos = -1;
LONG log_pos = -1;
LONG mesg_pos = -1;
CFile *sample_file = ar.GetFile();
LONG message_size;
DWORD total_size = sample_file->GetLength();
dialog_box->AddString("LOADING RESOURCE FORMAT 1.0");
while (current_pos < total_size)
{
ar >> section;
ar >> size;
current_pos += 8;
if (section == (int)'HDRS')
{
header_pos = current_pos;
}
else if (section == (int)'LOGS')
{
log_pos = current_pos;
sampleSize = size;
dialog_box->SetMaxCount(sampleSize * 2);
}
else if (section == (int)'MSGS')
{
mesg_pos = current_pos;
message_size = size;
}
current_pos += size;
ar.Flush();
sample_file->Seek(current_pos, CFile::begin);
}
if (header_pos == -1)
{
dialog_box->KillTimer(1);
dialog_box->CancelRecived();
failedOpen = True;
AfxThrowArchiveException(CArchiveException::badIndex);
return;
}
LoadHeader(ar, header_pos, dialog_box);
if (log_pos != -1)
{
LoadTracesOne(ar, log_pos, dialog_box);
}
LoadMessages(ar, mesg_pos, dialog_box, message_size);
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadTwoPointZeroResource(CArchive& ar, CLoadingLogDlg *dialog_box)
{
LONG section;
LONG size;
DWORD current_pos = 12;
LONG header_pos = -1;
LONG log_pos = -1;
LONG mesg_pos = -1;
CFile *sample_file = ar.GetFile();
LONG message_size;
DWORD total_size = sample_file->GetLength();
dialog_box->AddString("LOADING RESOURCE FORMAT 2.0");
while (current_pos < total_size)
{
ar >> section;
ar >> size;
current_pos += 8;
if (section == (int)'HDRS')
{
header_pos = current_pos;
}
else if (section == (int)'LOGS')
{
log_pos = current_pos;
sampleSize = size;
dialog_box->SetMaxCount(sampleSize * 2);
}
else if (section == (int)'MSGS')
{
mesg_pos = current_pos;
message_size = size;
}
current_pos += size;
ar.Flush();
sample_file->Seek(current_pos, CFile::begin);
}
if (header_pos == -1)
{
dialog_box->KillTimer(1);
dialog_box->CancelRecived();
failedOpen = True;
AfxThrowArchiveException(CArchiveException::badIndex);
return;
}
LoadHeader(ar, header_pos, dialog_box);
if (log_pos != -1)
{
LoadTracesTwo(ar, log_pos, dialog_box);
}
if (mesg_pos != -1)
{
LoadMessages(ar, mesg_pos, dialog_box, message_size);
}
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadOnePointZeroResourceBackward(CArchive& ar, CLoadingLogDlg *dialog_box)
{
LONG section;
LONG size;
DWORD current_pos = 12;
LONG header_pos = -1;
LONG log_pos = -1;
LONG mesg_pos = -1;
CFile *sample_file = ar.GetFile();
LONG message_size;
DWORD total_size = sample_file->GetLength();
dialog_box->AddString("LOADING RESOURCE FORMAT 1.0");
while (current_pos < total_size)
{
ar >> section;
ar >> size;
current_pos += 8;
if (section == (int)'SRDH')
{
header_pos = current_pos;
}
else if (section == (int)'SGOL')
{
log_pos = current_pos;
sampleSize = size;
dialog_box->SetMaxCount(sampleSize * 2);
}
else if (section == (int)'SGSM')
{
mesg_pos = current_pos;
message_size = size;
}
current_pos += size;
ar.Flush();
sample_file->Seek(current_pos, CFile::begin);
}
if (header_pos == -1)
{
dialog_box->KillTimer(1);
dialog_box->CancelRecived();
failedOpen = True;
AfxThrowArchiveException(CArchiveException::badIndex);
return;
}
LoadHeader(ar, header_pos, dialog_box);
if (log_pos != -1)
{
LoadTracesOne(ar, log_pos, dialog_box);
}
LoadMessages(ar, mesg_pos, dialog_box, message_size);
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadTwoPointZeroResourceBackward(CArchive& ar, CLoadingLogDlg *dialog_box)
{
LONG section;
LONG size;
DWORD current_pos = 12;
LONG header_pos = -1;
LONG log_pos = -1;
LONG mesg_pos = -1;
CFile *sample_file = ar.GetFile();
LONG message_size;
DWORD total_size = sample_file->GetLength();
dialog_box->AddString("LOADING RESOURCE FORMAT 2.0");
dialog_box->AddString("BACKWARD");
if (BigEndian)
{
dialog_box->AddString("8 BYTE BIG ENDIAN!!!!");
}
while (current_pos < total_size)
{
ar >> section;
ar >> size;
BigEndianConvert(size);
current_pos += 8;
if (section == (int)'SRDH')
{
header_pos = current_pos;
}
else if (section == (int)'SGOL')
{
log_pos = current_pos;
sampleSize = size;
dialog_box->SetMaxCount(sampleSize * 2);
}
else if (section == (int)'SGSM')
{
mesg_pos = current_pos;
message_size = size;
}
current_pos += size;
ar.Flush();
sample_file->Seek(current_pos, CFile::begin);
}
if (header_pos == -1)
{
dialog_box->KillTimer(1);
dialog_box->CancelRecived();
failedOpen = True;
AfxThrowArchiveException(CArchiveException::badIndex);
return;
}
LoadHeader(ar, header_pos, dialog_box);
if (log_pos != -1)
{
if (BigEndian == False)
{
LoadTracesTwo(ar, log_pos, dialog_box);
}
else
{
LoadTracesTwo8Byte(ar, log_pos, dialog_box);
}
}
LoadMessages(ar, mesg_pos, dialog_box, message_size);
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadMessages(CArchive& ar, LONG position, CLoadingLogDlg *dialog_box, LONG message_size)
{
CFile *sample_file = ar.GetFile();
ar.Flush();
sample_file->Seek(position, CFile::begin);
dialog_box->AddString("PROCESSING CLASSID::MESSAGEID LIST");
LONG bytes_read = 0;
LONG class_id;
LONG message_count;
char name[250];
classIDList = new CObList(100);
while (bytes_read < message_size)
{
ar >> class_id;
ar >> message_count;
BigEndianConvert(class_id);
BigEndianConvert(message_count);
bytes_read += 8;
ClassIDList *classID = new ClassIDList;
classID->classID = class_id;
classID->messageCount = message_count + 1;
classID->messageList = new CObArray;
classID->messageList->SetSize(classID->messageCount);
int i = 0;
BYTE character = 1;
while (character != '\0')
{
ar >> character;
name[i] = character;
bytes_read += 1;
++i;
}
classID->entityName = name;
classID->messageList->SetAt( 0, (CObject *) new CObjString( "NULLID" ) );
for (int count = 0; count < message_count; ++count)
{
i = 0;
character = 1;
while (character != '\0')
{
ar >> character;
name[i] = character;
++bytes_read;
++i;
}
CObject *obj = (CObject *)new CObjString(name);
classID->messageList->SetAt(count + 1, obj);
//BREAKABLE_LINE;
}
ar.Flush();
DWORD align = sample_file->GetPosition();
BYTE throw_away;
while ((align%4) != 0)
{
ar >> throw_away;
++align;
++bytes_read;
}
classIDList->AddTail(classID);
}
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadHeader(CArchive& ar, LONG position, CLoadingLogDlg *dialog_box)
{
CFile *sample_file = ar.GetFile();
ar.Flush();
sample_file->Seek(position, CFile::begin);
dialog_box->AddString("PROCESSING HEADER INFO");
LONG trace_count;
ar >> trace_count;
BigEndianConvert(trace_count);
++trace_count;
traceCount = trace_count;
char number_buffer[10];
char temp[200];
ltoa( traceCount, number_buffer, 10);
strcpy(temp, "trace count : ");
strcat(temp, number_buffer);
dialog_box->AddString(temp);
dataArray = new CObArray;
dataArray->SetSize(trace_count);
CObarrayHolder *trace;
BYTE bLetter;
char cLetter;
LONG trace_type;
LONG length;
for ( int i = 0; i < traceCount; ++i)
{
trace = new CObarrayHolder;
dataArray->SetAt(i, trace);
if ( i != (traceCount - 1))
{
ar >> length;
ar >> trace_type;
BigEndianConvert(length);
BigEndianConvert(trace_type);
trace->traceType = trace_type;
trace->name = "";
ar >> bLetter;
while(bLetter != NULL)
{
cLetter = bLetter;
trace->name += cLetter;
ar >> bLetter;
}
trace->traceEntryCount = 0;
ar.Flush();
DWORD align = sample_file->GetPosition();
BYTE throw_away;
while ((align%4) != 0)
{
ar >> throw_away;
++align;
}
}
else
{
trace->traceType = MarkerTraceType;
trace->name = "Marker";
trace->traceEntryCount = 0;
}
}
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadTracesOne(CArchive& ar, LONG position, CLoadingLogDlg *dialog_box)
{
dialog_box->AddString("PROCESSING LOGS");
CFile *sample_file = ar.GetFile();
CObarrayHolder *data_holder;
LONG length;
BYTE trace_number;
BYTE edge_flag;
WORD edge_tick;
float edge_fraction;
LONG total_bytes_read = 0;
DWORD next_entry = position;
dialog_box->count = 0;
MSG message;
int message_count = 0;
BOOL first_pass = TRUE;
while ( total_bytes_read < sampleSize )
{
ar.Flush();
sample_file->Seek(next_entry, CFile::begin);
if (dialog_box->stopProcess == TRUE)
{
for (int i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
data_holder->traceEntryCount = 0;
}
stillLoading = FALSE;
//dialog_box->CancelRecived();
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar.Flush();
next_entry = sample_file->GetPosition();
ar >> length;
BigEndianConvert(length);
int advance = length;
next_entry += length;
ar >> edge_fraction;
ar >> edge_tick;
ar >> trace_number;
ar >> edge_flag;
BigEndianConvert(edge_fraction);
BigEndianConvert(edge_tick);
BigEndianConvert(trace_number);
BigEndianConvert(edge_flag);
if (first_pass == TRUE)
{
first_pass = FALSE;
firstTrace = SECONDS(edge_tick, edge_fraction);
lastTrace = SECONDS(edge_tick, edge_fraction);
}
if (SECONDS(edge_tick, edge_fraction) < firstTrace)
{
firstTrace = SECONDS(edge_tick, edge_fraction);
}
if (SECONDS(edge_tick, edge_fraction) > lastTrace)
{
lastTrace = SECONDS(edge_tick, edge_fraction);
}
if (edge_flag == MarkerFlag)
{
data_holder = (CObarrayHolder *)dataArray->GetAt(traceCount - 1);
data_holder->traceEntryCount += 1;
}
else
{
data_holder = (CObarrayHolder *)dataArray->GetAt(trace_number);
data_holder->traceEntryCount += 1;
}
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read;
}
int total_size = 0;
char number_buffer[20];
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("ALLOCATING MEMORY");
dialog_box->AddString("");
char temp[100];
dialog_box->AddString("Trace List:");
for (int i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
TraceStorage::AllocateStorage(data_holder);
strcpy(temp, data_holder->name);
strcat(temp, " - elements: ");
ltoa( data_holder->traceEntryCount,number_buffer, 10);
strcat(temp, number_buffer);
strcat(temp, " bytes : ");
ltoa(data_holder->size, number_buffer, 10);
strcat(temp, number_buffer);
dialog_box->AddString(temp);
data_holder->traceEntryCount = 0;
total_size += data_holder->size;
}
dialog_box->AddString("");
dialog_box->AddString("");
ltoa(total_size, number_buffer, 10);
dialog_box->AddString("TOTAL MEMORY ALLOCATED: ");
dialog_box->AddString(number_buffer);
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("COPYING DATA INTO MEMORY");
next_entry = position;
message_count = 0;
total_bytes_read = 0;
while ( total_bytes_read < sampleSize )
{
ar.Flush();
sample_file->Seek(next_entry, CFile::begin);
if (dialog_box->stopProcess == TRUE)
{
stillLoading = FALSE;
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar.Flush();
next_entry = sample_file->GetPosition();
ar >> length;
BigEndianConvert(length);
int advance = length;
next_entry += length;
ar >> edge_fraction;
ar >> edge_tick;
ar >> trace_number;
ar >> edge_flag;
BigEndianConvert(edge_fraction);
BigEndianConvert(edge_tick);
BigEndianConvert(trace_number);
BigEndianConvert(edge_flag);
if (edge_flag == MarkerFlag)
{
trace_number = (unsigned char)(traceCount - 1);
}
data_holder = (CObarrayHolder*)dataArray->GetAt(trace_number);
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(SECONDS(edge_tick, edge_fraction) - firstTrace);
if (data_holder->traceEntryCount > 0)
{
if(TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->GetTraceTime() <
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount-1)->GetTraceTime())
{
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(SECONDS(edge_tick + 1, edge_fraction) - firstTrace);
}
}
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->LoadData(ar, data_holder, edge_flag);
data_holder->traceEntryCount += 1;
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read + sampleSize;
}
lastTrace -= firstTrace;
firstTrace = 0.0f;
stillLoading = FALSE;
}
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadTracesTwo(CArchive& ar, LONG position, CLoadingLogDlg *dialog_box)
{
dialog_box->AddString("PROCESSING LOGS");
CFile *sample_file = ar.GetFile();
CObarrayHolder *data_holder;
LONG length;
BYTE trace_number;
BYTE edge_flag;
BYTE throwaway;
double trace_time;
LONG total_bytes_read = 0;
DWORD next_entry = position;
dialog_box->count = 0;
MSG message;
int message_count = 0;
BOOL first_pass = TRUE;
while ( total_bytes_read < sampleSize )
{
ar.Flush();
sample_file->Seek(next_entry, CFile::begin);
if (dialog_box->stopProcess == TRUE)
{
for (int i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
data_holder->traceEntryCount = 0;
}
stillLoading = FALSE;
//dialog_box->CancelRecived();
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar.Flush();
next_entry = sample_file->GetPosition();
ar >> length;
BigEndianConvert(length);
int advance = length;
next_entry += length;
ar >> trace_time;
ar >> trace_number;
ar >> edge_flag;
BigEndianConvert(trace_time);
BigEndianConvert(trace_number);
BigEndianConvert(edge_flag);
if (first_pass == TRUE)
{
first_pass = FALSE;
firstTrace = trace_time;
lastTrace = trace_time;
}
if (trace_time < firstTrace)
{
firstTrace = trace_time;
}
if (trace_time > lastTrace)
{
lastTrace = trace_time;
}
if (edge_flag == MarkerFlag)
{
data_holder = (CObarrayHolder *)dataArray->GetAt(traceCount - 1);
data_holder->traceEntryCount += 1;
}
else
{
data_holder = (CObarrayHolder *)dataArray->GetAt(trace_number);
data_holder->traceEntryCount += 1;
}
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read;
}
int total_size = 0;
char number_buffer[20];
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("ALLOCATING MEMORY");
dialog_box->AddString("");
char temp[100];
dialog_box->AddString("Trace List:");
for (int i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
TraceStorage::AllocateStorage(data_holder);
strcpy(temp, data_holder->name);
strcat(temp, " - elements: ");
ltoa( data_holder->traceEntryCount,number_buffer, 10);
strcat(temp, number_buffer);
strcat(temp, " bytes : ");
ltoa(data_holder->size, number_buffer, 10);
strcat(temp, number_buffer);
dialog_box->AddString(temp);
data_holder->traceEntryCount = 0;
total_size += data_holder->size;
}
dialog_box->AddString("");
dialog_box->AddString("");
ltoa(total_size, number_buffer, 10);
dialog_box->AddString("TOTAL MEMORY ALLOCATED: ");
dialog_box->AddString(number_buffer);
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("COPYING DATA INTO MEMORY");
next_entry = position;
message_count = 0;
total_bytes_read = 0;
while ( total_bytes_read < sampleSize )
{
ar.Flush();
sample_file->Seek(next_entry, CFile::begin);
if (dialog_box->stopProcess == TRUE)
{
stillLoading = FALSE;
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar.Flush();
next_entry = sample_file->GetPosition();
ar >> length;
BigEndianConvert(length);
int advance = length;
next_entry += length;
ar >> trace_time;
ar >> trace_number;
ar >> edge_flag;
ar >> throwaway;
ar >> throwaway;
BigEndianConvert(trace_time);
BigEndianConvert(trace_number);
BigEndianConvert(edge_flag);
if (edge_flag == MarkerFlag)
{
trace_number = (unsigned char)(traceCount - 1);
}
data_holder = (CObarrayHolder*)dataArray->GetAt(trace_number);
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(trace_time - firstTrace);
if (data_holder->traceEntryCount > 0)
{
if(TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->GetTraceTime() <
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount-1)->GetTraceTime())
{
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(TraceStorage::FindElement(data_holder, data_holder->traceEntryCount-1)->GetTraceTime());
}
}
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->LoadData(ar, data_holder, edge_flag);
data_holder->traceEntryCount += 1;
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read + sampleSize;
}
lastTrace -= firstTrace;
firstTrace = 0.0f;
stillLoading = FALSE;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadTracesTwo8Byte(CArchive& ar, LONG position, CLoadingLogDlg *dialog_box)
{
double one = 1.0;
dialog_box->AddString("PROCESSING LOGS");
CFile *sample_file = ar.GetFile();
CObarrayHolder *data_holder;
LONG length;
BYTE trace_number;
BYTE edge_flag;
BYTE throwaway;
double trace_time;
LONG total_bytes_read = 0;
DWORD next_entry = position;
dialog_box->count = 0;
MSG message;
int message_count = 0;
BOOL first_pass = TRUE;
while ( total_bytes_read < sampleSize )
{
ar.Flush();
sample_file->Seek(next_entry, CFile::begin);
if (dialog_box->stopProcess == TRUE)
{
for (int i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
data_holder->traceEntryCount = 0;
}
stillLoading = FALSE;
//dialog_box->CancelRecived();
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar.Flush();
next_entry = sample_file->GetPosition();
ar >> length;
BigEndianConvert(length);
// 8 BYTE ALIGHN
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
int advance = length;
next_entry += length;
ar >> trace_time;
ar >> trace_number;
ar >> edge_flag;
// 8 byte align
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
BigEndianConvert(trace_time);
BigEndianConvert(trace_number);
BigEndianConvert(edge_flag);
if (first_pass == TRUE)
{
first_pass = FALSE;
firstTrace = trace_time;
lastTrace = trace_time;
}
if (trace_time < firstTrace)
{
firstTrace = trace_time;
}
if (trace_time > lastTrace)
{
lastTrace = trace_time;
}
if (edge_flag == MarkerFlag)
{
data_holder = (CObarrayHolder *)dataArray->GetAt(traceCount - 1);
data_holder->traceEntryCount += 1;
}
else
{
data_holder = (CObarrayHolder *)dataArray->GetAt(trace_number);
data_holder->traceEntryCount += 1;
}
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read;
}
int total_size = 0;
char number_buffer[20];
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("ALLOCATING MEMORY");
dialog_box->AddString("");
char temp[100];
dialog_box->AddString("Trace List:");
for (int i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
TraceStorage::AllocateStorage(data_holder);
strcpy(temp, data_holder->name);
strcat(temp, " - elements: ");
ltoa( data_holder->traceEntryCount,number_buffer, 10);
strcat(temp, number_buffer);
strcat(temp, " bytes : ");
ltoa(data_holder->size, number_buffer, 10);
strcat(temp, number_buffer);
dialog_box->AddString(temp);
data_holder->traceEntryCount = 0;
total_size += data_holder->size;
}
dialog_box->AddString("");
dialog_box->AddString("");
ltoa(total_size, number_buffer, 10);
dialog_box->AddString("TOTAL MEMORY ALLOCATED: ");
dialog_box->AddString(number_buffer);
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("COPYING DATA INTO MEMORY");
next_entry = position;
message_count = 0;
total_bytes_read = 0;
while ( total_bytes_read < sampleSize )
{
ar.Flush();
sample_file->Seek(next_entry, CFile::begin);
if (dialog_box->stopProcess == TRUE)
{
stillLoading = FALSE;
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar.Flush();
next_entry = sample_file->GetPosition();
ar >> length;
// 8 BYTE ALIGHN
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
BigEndianConvert(length);
int advance = length;
next_entry += length;
ar >> trace_time;
ar >> trace_number;
ar >> edge_flag;
// 8 byte align
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
ar >> throwaway;
BigEndianConvert(trace_time);
BigEndianConvert(trace_number);
BigEndianConvert(edge_flag);
if (edge_flag == MarkerFlag)
{
trace_number = (unsigned char)(traceCount - 1);
}
data_holder = (CObarrayHolder*)dataArray->GetAt(trace_number);
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(trace_time - firstTrace);
if (data_holder->traceEntryCount > 0)
{
if(TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->GetTraceTime() <
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount-1)->GetTraceTime())
{
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(TraceStorage::FindElement(data_holder, data_holder->traceEntryCount-1)->GetTraceTime());
}
}
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->LoadData(ar, data_holder, edge_flag);
data_holder->traceEntryCount += 1;
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read + sampleSize;
}
lastTrace -= firstTrace;
firstTrace = 0.0f;
stillLoading = FALSE;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void
CLabRatDoc::LoadOldResource(CArchive& ar, CLoadingLogDlg *dialog_box, int file_start)
{
stillLoading = TRUE;
LONG sample_size;
LONG sample_start;
BYTE trace_count;
sample_start = 1 + file_start;
sample_size = 0;
trace_count = 0;
dialog_box->AddString("OPENING OLD FILE FORMAT");
ar >> trace_count;
++trace_count;
traceCount = trace_count;
dataArray = new CObArray;
dataArray->SetSize(trace_count);
CObarrayHolder *trace;
BYTE bLetter;
char cLetter;
BYTE trace_type;
CFile *sample_file = ar.GetFile();
for ( int i = 0; i < traceCount; ++i)
{
trace = new CObarrayHolder;
dataArray->SetAt(i, trace);
if ( i != (traceCount - 1))
{
ar >> trace_type;
sample_start += 1;
trace->traceType = trace_type;
trace->name = "";
ar >> bLetter;
sample_start += 1;
while(bLetter != NULL)
{
cLetter = bLetter;
trace->name += cLetter;
ar >> bLetter;
sample_start += 1;
}
trace->traceEntryCount = 0;
}
else
{
trace->traceType = MarkerTraceType;
trace->name = "Marker";
trace->traceEntryCount = 0;
}
}
ar >> sample_size;
sample_start += 4;
dialog_box->SetMaxCount(sample_size * 2);
CObarrayHolder *data_holder;
BYTE trace_number;
BYTE edge_flag;
WORD edge_tick;
float edge_fraction;
LONG integer_snap_shot;
float scalar_snap_shot;
LONG total_bytes_read = 0;
dialog_box->count = 0;
MSG message;
int message_count = 0;
BOOL first_pass = TRUE;
while ( total_bytes_read < sample_size )
{
int advance = 8;
if (dialog_box->stopProcess == TRUE)
{
for (i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
data_holder->traceEntryCount = 0;
}
stillLoading = FALSE;
//dialog_box->CancelRecived();
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar >> edge_fraction;
ar >> edge_tick;
ar >> trace_number;
ar >> edge_flag;
if (first_pass == TRUE)
{
first_pass = FALSE;
firstTrace = SECONDS(edge_tick, edge_fraction);
lastTrace = SECONDS(edge_tick, edge_fraction);
}
if (SECONDS(edge_tick, edge_fraction) < firstTrace)
{
firstTrace = SECONDS(edge_tick, edge_fraction);
}
if (SECONDS(edge_tick, edge_fraction) > lastTrace)
{
lastTrace = SECONDS(edge_tick, edge_fraction);
}
if (edge_flag == MarkerFlag)
{
data_holder = (CObarrayHolder *)dataArray->GetAt(traceCount - 1);
data_holder->traceEntryCount += 1;
}
else
{
data_holder = (CObarrayHolder *)dataArray->GetAt(trace_number);
data_holder->traceEntryCount += 1;
}
if (edge_flag == IntegerSnapShotFlag)
{
ar >> integer_snap_shot;
advance += 4;
}
else if (edge_flag == ScalarSnapShotFlag)
{
ar >> scalar_snap_shot;
advance += 4;
}
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read;
}
int total_size = 0;
char number_buffer[20];
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("ALLOCATING MEMORY");
dialog_box->AddString("");
char temp[100];
dialog_box->AddString("Standard Trace Sizes:");
ltoa( sizeof(TraceStorage), number_buffer, 10);
strcpy(temp, "trace size : ");
strcat(temp, number_buffer);
dialog_box->AddString(temp);
ltoa(sizeof(MarkerTraceStorage),number_buffer, 10);
strcpy(temp, "Marker size : ");
strcat(temp, number_buffer);
dialog_box->AddString(temp);
ltoa( sizeof(ToggleTraceStorage),number_buffer, 10);
strcpy(temp, "Toggle size : ");
strcat(temp, number_buffer);
dialog_box->AddString(temp);
ltoa( sizeof(IntegerTraceStorage),number_buffer, 10);
strcpy(temp, "Integer size : ");
strcat(temp, number_buffer);
dialog_box->AddString(temp);
ltoa(sizeof(ScalarTraceStorage), number_buffer, 10);
strcpy(temp, "Scalar size : ");
strcat(temp, number_buffer);
dialog_box->AddString(temp);
dialog_box->AddString(" ");
dialog_box->AddString("Trace List:");
for (i = 0; i < traceCount; ++i)
{
data_holder = (CObarrayHolder*)dataArray->GetAt(i);
if (data_holder->traceEntryCount == 0)
{
continue;
}
switch (data_holder->traceType)
{
case LogicalTraceType:
data_holder->size = sizeof(ToggleTraceStorage) * data_holder->traceEntryCount;
data_holder->data = (TraceStorage*)
VirtualAlloc(NULL, data_holder->size,
MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE);
break;
case IntegerTraceType:
data_holder->size = sizeof(IntegerTraceStorage) * data_holder->traceEntryCount;
data_holder->data = (TraceStorage*)
VirtualAlloc(NULL, data_holder->size,
MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE);
break;
case ScalarTraceType:
data_holder->size = sizeof(ScalarTraceStorage) * data_holder->traceEntryCount;
data_holder->data = (TraceStorage*)
VirtualAlloc(NULL, data_holder->size,
MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE);
break;
case MarkerTraceType:
data_holder->size = sizeof(MarkerTraceStorage) * data_holder->traceEntryCount;
data_holder->data = (TraceStorage*)
VirtualAlloc(NULL, data_holder->size,
MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, PAGE_READWRITE);
break;
}
strcpy(temp, data_holder->name);
strcat(temp, " - elements: ");
ltoa( data_holder->traceEntryCount,number_buffer, 10);
strcat(temp, number_buffer);
strcat(temp, " bytes : ");
ltoa(data_holder->size, number_buffer, 10);
strcat(temp, number_buffer);
dialog_box->AddString(temp);
data_holder->traceEntryCount = 0;
total_size += data_holder->size;
}
dialog_box->AddString("");
dialog_box->AddString("");
ltoa(total_size, number_buffer, 10);
dialog_box->AddString("TOTAL MEMORY ALLOCATED: ");
dialog_box->AddString(number_buffer);
dialog_box->AddString("");
dialog_box->AddString("##############################");
dialog_box->AddString("COPYING DATA INTO MEMORY");
sample_file->Seek(sample_start, CFile::begin);
message_count = 0;
total_bytes_read = 0;
while ( total_bytes_read < sample_size )
{
int advance = 8;
if (dialog_box->stopProcess == TRUE)
{
stillLoading = FALSE;
AfxThrowArchiveException(CArchiveException::badIndex);
failedOpen = True;
return;
}
ar >> edge_fraction;
ar >> edge_tick;
ar >> trace_number;
ar >> edge_flag;
if (edge_flag == IntegerSnapShotFlag)
{
ar >> integer_snap_shot;
advance += 4;
}
else if (edge_flag == ScalarSnapShotFlag)
{
ar >> scalar_snap_shot;
advance += 4;
}
if (edge_flag == MarkerFlag)
{
trace_number = (unsigned char)(traceCount - 1);
}
data_holder = (CObarrayHolder*)dataArray->GetAt(trace_number);
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(SECONDS(edge_tick, edge_fraction) - firstTrace);
if (data_holder->traceEntryCount > 0)
{
if(TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->GetTraceTime() <
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount - 1)->GetTraceTime())
{
TraceStorage::FindElement(data_holder, data_holder->traceEntryCount)->SetTraceTime(SECONDS(edge_tick + 1, edge_fraction) - firstTrace);
}
}
switch (data_holder->traceType)
{
case LogicalTraceType:
{
ToggleTraceStorage *entry =
(ToggleTraceStorage *) TraceStorage::FindElement(data_holder, data_holder->traceEntryCount);
if (edge_flag == GoingUpFlag)
{
entry->SetPosition(TRUE);
}
else
{
entry->SetPosition(FALSE);
}
break;
}
case IntegerTraceType:
{
IntegerTraceStorage *entry =
(IntegerTraceStorage *)TraceStorage::FindElement(data_holder, data_holder->traceEntryCount);
entry->SetPosition(integer_snap_shot);
break;
}
case ScalarTraceType:
{
ScalarTraceStorage *entry =
(ScalarTraceStorage *)TraceStorage::FindElement(data_holder, data_holder->traceEntryCount);
entry->SetPosition(scalar_snap_shot);
break;
}
}
data_holder->traceEntryCount += 1;
if (message_count > 800)
{
message_count = 0;
if (::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
}
++message_count;
total_bytes_read += advance;
dialog_box->count = total_bytes_read + sample_size;
}
lastTrace -= firstTrace;
firstTrace = 0.0f;
stillLoading = FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CLabRatDoc diagnostics
#ifdef _DEBUG
void CLabRatDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CLabRatDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLabRatDoc commands
BOOL CLabRatDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
if (failedOpen)
return False;
return TRUE;
}
void CLabRatDoc::DeleteContents()
{
// TODO: Add your specialized code here and/or call the base class
CDocument::DeleteContents();
if (dataArray != NULL)
{
CObarrayHolder *delete_me;
for (int i = 0; i < traceCount; ++i)
{
delete_me = (CObarrayHolder *)dataArray->GetAt(i);
delete(delete_me);
}
delete dataArray;
}
if (classIDList != NULL)
{
ClassIDList *pos;
CObjString *st_pos;
while (!classIDList->IsEmpty())
{
pos = (ClassIDList *)classIDList->RemoveHead();
for(int i = 0; i < pos->messageCount; ++i)
{
st_pos = (CObjString *)pos->messageList->GetAt(i);
delete st_pos;
}
pos->messageList->RemoveAll();
delete pos->messageList;
delete pos;
}
classIDList->RemoveAll();
delete classIDList;
}
}
ClassIDList *CLabRatDoc::FindClass(int id)
{
ClassIDList *class_list;
POSITION pos = classIDList->GetHeadPosition();
while(pos != NULL)
{
class_list = (ClassIDList *) classIDList->GetNext(pos);
if (class_list->classID == id)
{
return class_list;
}
}
return NULL;
}