You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
6.0 KiB
215 lines
6.0 KiB
/******************************************************************************
|
|
|
|
Source File: Glue.CPP
|
|
|
|
This file contains the functions needed to make the GPD parser code work on
|
|
both platforms, as well as stubs to support function I do not need to supply.
|
|
|
|
Copyright (c) 1997 by Microsoft Corporation, All Rights Reserved.
|
|
|
|
A Pretty Penny Enterprises Production
|
|
|
|
Change History:
|
|
03/28/1997 [email protected] Created it
|
|
|
|
******************************************************************************/
|
|
|
|
#include "StdAfx.H"
|
|
#include "ProjNode.H"
|
|
#include "Resource.H"
|
|
#include "GPDFile.H"
|
|
|
|
// I'll use a class to guarantee memory never leaks from here.
|
|
|
|
class CMaps {
|
|
CObArray m_coaMaps;
|
|
|
|
public:
|
|
CMaps() { m_coaMaps.Add(NULL); }
|
|
~CMaps() {
|
|
for (int i = 0; i < m_coaMaps.GetSize(); i++)
|
|
if (m_coaMaps[i])
|
|
delete m_coaMaps[i];
|
|
}
|
|
unsigned Count() { return (unsigned)m_coaMaps.GetSize(); }
|
|
unsigned HandleFor(CByteArray* cba) {
|
|
for (unsigned u = 1; u < Count(); u++) {
|
|
if (!m_coaMaps[u]) {
|
|
m_coaMaps[u] = cba;
|
|
return u;
|
|
}
|
|
}
|
|
m_coaMaps.Add(cba);
|
|
return Count();
|
|
}
|
|
|
|
void Free(unsigned u) {
|
|
if (!u || u >= Count() || !m_coaMaps[u])
|
|
return;
|
|
|
|
delete m_coaMaps[u];
|
|
m_coaMaps[u] = NULL;
|
|
}
|
|
};
|
|
|
|
static CMaps scmAll;
|
|
|
|
extern "C" unsigned MapFileIntoMemory(LPCWSTR pstrFile, PVOID *ppvData,
|
|
PDWORD pdwSize) {
|
|
|
|
if (!pstrFile || !ppvData || !pdwSize)
|
|
return 0;
|
|
|
|
CFile cfMap;
|
|
CByteArray* pcbaMap = new CByteArray;
|
|
CString csFile(pstrFile);
|
|
|
|
if (!pcbaMap)
|
|
return 0;
|
|
|
|
if (!cfMap.Open(csFile, CFile::modeRead | CFile::shareDenyWrite))
|
|
return 0;
|
|
|
|
try {
|
|
pcbaMap -> SetSize(*pdwSize = cfMap.GetLength());
|
|
cfMap.Read(pcbaMap -> GetData(), cfMap.GetLength());
|
|
*ppvData = pcbaMap -> GetData();
|
|
return scmAll.HandleFor(pcbaMap);
|
|
}
|
|
catch (CException *pce) {
|
|
pce -> ReportError();
|
|
pce -> Delete();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
extern "C" void UnmapFileFromMemory(unsigned uFile) {
|
|
scmAll.Free(uFile);
|
|
}
|
|
|
|
// This one is just a stub to make the whole thing work for us- we don't use
|
|
// the checksum- it's there for the end product to tell if a GPD file has
|
|
// been altered since it was converted lase.
|
|
|
|
extern "C" DWORD ComputeCrc32Checksum(PBYTE pbuf,DWORD dwCount,
|
|
DWORD dwChecksum) {
|
|
return dwCount ^ dwChecksum ^ (PtrToUlong(pbuf));
|
|
}
|
|
|
|
// The next two variables are used to control how and when GPD parsing/conversion
|
|
// log messages are saved.
|
|
// pcsaLog Ptr to string array to load with messages
|
|
// bEnableLogging True iff logging is enabled
|
|
|
|
static CStringArray* pcsaLog = NULL ;
|
|
static bool bEnableLogging = false ;
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
CModelData::SetLog
|
|
|
|
Prepare to log parse/conversion error and warning messages.
|
|
|
|
******************************************************************************/
|
|
|
|
void CModelData::SetLog()
|
|
{
|
|
m_csaConvertLog.RemoveAll() ;
|
|
pcsaLog = &m_csaConvertLog ;
|
|
bEnableLogging = true ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
CModelData::EndLog
|
|
|
|
Turn off parse/conversion error and warning message logging.
|
|
|
|
******************************************************************************/
|
|
|
|
void CModelData::EndLog()
|
|
{
|
|
pcsaLog = NULL ;
|
|
bEnableLogging = false ;
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
DebugPrint
|
|
|
|
This routine is called to log the parsing/conversion error and warning
|
|
messages.
|
|
|
|
******************************************************************************/
|
|
|
|
extern "C" void DebugPrint(LPCTSTR pstrFormat, ...)
|
|
{
|
|
CString csOutput;
|
|
va_list ap;
|
|
|
|
// Don't do anything if logging is not enabled.
|
|
|
|
if (!bEnableLogging)
|
|
return ;
|
|
|
|
va_start(ap, pstrFormat);
|
|
vsprintf(csOutput.GetBuffer(1000), pstrFormat, ap);
|
|
va_end(ap);
|
|
csOutput.ReleaseBuffer();
|
|
csOutput.TrimLeft();
|
|
CStringArray& csaError = *pcsaLog;
|
|
|
|
// If this routine is being called when we're NOT recording problems with a
|
|
// GPD, display the message when debugging.
|
|
|
|
if (pcsaLog == NULL) {
|
|
CString csmsg ;
|
|
csmsg.LoadString(IDS_XXXUnexpectedCPError) ;
|
|
csmsg += csOutput ;
|
|
AfxMessageBox(csmsg, MB_ICONEXCLAMATION) ;
|
|
//#ifdef _DEBUG
|
|
// afxDump << csOutput ;
|
|
// if (csOutput.Right(1) != _T("\n"))
|
|
// afxDump << _T("\n") ;
|
|
//#endif
|
|
return ;
|
|
} ;
|
|
|
|
if (!csaError.GetSize()) {
|
|
csaError.Add(csOutput);
|
|
return;
|
|
}
|
|
|
|
if (csaError[-1 + csaError.GetSize()].Find(_T('\n')) >= 0) {
|
|
csaError[-1 + csaError.GetSize()].TrimRight();
|
|
pcsaLog -> Add(csOutput);
|
|
}
|
|
else
|
|
csaError[-1 + csaError.GetSize()] += csOutput;
|
|
}
|
|
|
|
/******************************************************************************
|
|
|
|
MDSCreateFileW
|
|
|
|
I implement a version of this API here which calls the ANSI API, so I can
|
|
compile the parser code with UNICODE on, but still run the resulting binary
|
|
on Win95.
|
|
|
|
******************************************************************************/
|
|
|
|
extern "C" HANDLE MDSCreateFileW(LPCWSTR lpstrFile, DWORD dwDesiredAccess,
|
|
DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpsa,
|
|
DWORD dwCreateFlags, DWORD dwfAttributes,
|
|
HANDLE hTemplateFile) {
|
|
CString csFile(lpstrFile); // Let CString conversions do the hard work!
|
|
|
|
return CreateFile(csFile, dwDesiredAccess, dwShareMode, lpsa,
|
|
dwCreateFlags, dwfAttributes, hTemplateFile);
|
|
}
|
|
|
|
|