//==================== DEFINE IF SIMULATING ERRORS =============
#ifdef SIMERR
const char *SAMPLE_ERROR_LOG = "simerr.txt";
/*--------------------------------------------------------------
g_errorInfo defines each error type and whether it throws
an exception
---------------------------------------------------------------*/
static errorInfo_t g_errorInfo[] =
{
{ SIMERR_RESULT_ERROR, "RESULT", SIMERR_TYPE_ERROR },
{ SIMERR_MEMORY_ERROR, "MEMORY", SIMERR_TYPE_ERROR },
{ SIMERR_DEVICE_EXCEPTION, "DEVICE", SIMERR_TYPE_EXCEPTION },
{ SIMERR_DATABASE_EXCEPTION, "DATABASE", SIMERR_TYPE_EXCEPTION }
};
/*--------------------------------------------------------------
PrintSimulatorMessage Redirect messages from error simulator
--------------------------------------------------------------*/
static void PrintSimulatorMessage(const char *pMsg)
{
printf("<SIMERR> %s\n", pMsg);
}
/*--------------------------------------------------------------
ThrowSimulatorException Throw an exception corresponding to
an error type.
The simulator calls this function to simulate an
application-specific exception.
--------------------------------------------------------------*/
static void ThrowSimulatorException(int nErrorType,
const char *pSourceFilename,
int nSourceLine)
{
switch(nErrorType)
{
case SIMERR_DEVICE_EXCEPTION:
{
CDeviceException *pException = new CDeviceException();
throw(pException);
break;
}
case SIMERR_DATABASE_EXCEPTION:
{
CDatabaseException *pException = new CDatabaseException();
throw(pException);
break;
}
default:
PrintSimulatorMessage("Invalid exception type");
}
}
/*--------------------------------------------------------------
ValidateErrorTypes Make sure error info array matches
ERROR_TYPE enum
--------------------------------------------------------------*/
static bool ValidateErrorTypes(void)
{
bool bOK = true;
int nErrorTypes = sizeof(g_errorInfo) / sizeof(errorInfo_t);
if (nErrorTypes == NUM_SIMERR_TYPES)
{
for (int i=0; bOK && (i < NUM_SIMERR_TYPES); ++i)
{
if (g_errorInfo[i].m_nErrorType != i)
{
bOK = false;
}
}
}
else
{
bOK = false;
}
if (!bOK)
{
PrintSimulatorMessage
("error type enum does not match g_errorInfo.");
}
return bOK;
}
/*--------------------------------------------------------------
SimErrSampleInit Allocate and initialize the sample
error simulator.
--------------------------------------------------------------*/
bool SimErrCustomInit(int nSeed, SIMERR_TEST_TYPE testType)
{
bool bOK = false;
// Make sure we didn't add an error type without
// modifying g_errorInfo
bOK = ValidateErrorTypes();
if (bOK)
{
// Fill in information that initializes the simulator
simerrInit_t init;
init.m_nVersion = SIMERR_VERSION;
init.m_pFilename = "errlog.txt";
init.m_nSeed = nSeed;
init.m_testType = testType;
init.m_pfMsg = PrintSimulatorMessage;
init.m_pfThrow = ThrowSimulatorException;
init.m_pErrInfo = g_errorInfo;
init.m_nErrTypes = NUM_SIMERR_TYPES;
// Init simulator
bOK = SimErrInit(&init);
}
if (!bOK)
{
PrintSimulatorMessage
("error simulator could not be initialized.");
}
return bOK;
}
#endif //SIMERR
//End of File