00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #include "fennel/common/CommonPreamble.h"
00025 #include "fennel/exec/ErrorSource.h"
00026 
00027 FENNEL_BEGIN_CPPFILE("$Id: //open/dev/fennel/exec/ErrorSource.cpp#5 $");
00028 
00029 ErrorSource::ErrorSource()
00030 {
00031     pErrorTarget.reset();
00032 }
00033 
00034 ErrorSource::ErrorSource(
00035     SharedErrorTarget pErrorTargetInit,
00036     const std::string &nameInit)
00037 {
00038     pErrorTarget.reset();
00039     initErrorSource(pErrorTargetInit, nameInit);
00040 }
00041 
00042 ErrorSource::~ErrorSource()
00043 {
00044     pErrorTarget.reset();
00045 }
00046 
00047 void ErrorSource::initErrorSource(
00048     SharedErrorTarget pErrorTargetInit,
00049     const std::string &nameInit)
00050 {
00051     pErrorTarget = pErrorTargetInit;
00052     name = nameInit;
00053 }
00054 
00055 void ErrorSource::postError(
00056     ErrorLevel level, const std::string &message,
00057     void *address, long capacity, int index)
00058 {
00059     if (hasTarget()) {
00060         getErrorTarget().notifyError(
00061             name, level, message, address, capacity, index);
00062     }
00063 }
00064 
00065 void ErrorSource::postError(
00066     ErrorLevel level, const std::string &message,
00067     const TupleDescriptor &errorDesc, const TupleData &errorTuple, int index)
00068 {
00069     if (!hasTarget()) {
00070         return;
00071     }
00072 
00073     if (!pErrorBuf) {
00074         errorAccessor.compute(errorDesc);
00075         uint cbMax = errorAccessor.getMaxByteCount();
00076         pErrorBuf.reset(new FixedBuffer[cbMax]);
00077     }
00078 
00079     uint cbTuple = errorAccessor.getByteCount(errorTuple);
00080     errorAccessor.marshal(errorTuple, pErrorBuf.get());
00081     postError(level, message, pErrorBuf.get(), cbTuple, index);
00082 }
00083 
00084 void ErrorSource::disableTarget()
00085 {
00086     pErrorTarget.reset();
00087 }
00088 
00089 FENNEL_END_CPPFILE("$Id: //open/dev/fennel/exec/ErrorSource.cpp#5 $");
00090 
00091