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.
2220 lines
44 KiB
C++
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;
|
|
}
|