Leaked source code of windows server 2003
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

/******************************************************************************
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);
}