00001 #ifndef _ACSERR__H_
00002 #define _ACSERR__H_
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 #ifndef __cplusplus
00045 #error This is a C++ include file and cannot be used from plain C
00046 #endif
00047 
00048 
00049 #include "acserrLegacy.h"
00050 #include <sstream>
00051 
00052 
00053 class ACSLogImpl;
00054 
00055 namespace ACSErr
00056 {
00057 
00063 class ErrorTraceHelper
00064 {
00065   protected:
00066     friend class CompletionImpl;
00067     friend class ::ACSLogImpl;
00068     friend class ::ACSError;
00069 
00070     ErrorTraceHelper(ACSErr::ErrorTrace &et);
00071 
00072 
00073      void setErrorTrace(ACSErr::ErrorTrace &et, int depth);
00074 
00075 
00076     ErrorTraceHelper()
00077         : m_errorTracePtr(0), m_current(0), m_depth(0)
00078         {}
00079 
00080 
00081     ErrorTraceHelper (ACSErr::ACSErrType et, ACSErr::ErrorCode ec,
00082                       const char* file, int line, const char* routine, const char* sd,
00083                       ACSErr::Severity severity,
00084                       ACSErr::ErrorTrace &errortrace);
00085 
00086 
00087     ErrorTraceHelper (const ACSErr::ErrorTrace &pet,
00088                       ACSErr::ACSErrType et, ACSErr::ErrorCode ec,
00089                       const char* file, int line, const char* routine, const char* sd, 
00090                       ACSErr::Severity severity,
00091                       ACSErr::ErrorTrace &errortrace);
00092 
00096     ErrorTraceHelper& operator=(ACSErr::ErrorTrace& eth);
00097 
00098   public:
00099 
00100 
00117     void log(ACE_Log_Priority priorty=LM_ERROR);
00118 
00122     std::string toString();
00123 
00130     void addData (const char* name, const char* value);
00131     
00136     void addData (const char* name, char* value)
00137         {
00138             addData (name, (const char*)value);
00139         }
00140 
00148     template<typename T>
00149     void addData (const char* name, T value)
00150         {
00151             const char *s;
00152             std::ostringstream ostr;
00153             ostr << value << std::ends;
00154             std::string ts=ostr.str(); 
00155             s = ts.c_str();
00156             addData (name, s);
00157         }
00158 
00165     void setMemberValue (const char* name, const char* value);
00166 
00173     void setMemberValue (const char* name, ACE_CString &value);
00174 
00181     template<typename T>
00182     void setMemberValue (const char* name, T value)
00183         { 
00184             const char *s;
00185             if (name==NULL) return;
00186 
00187             std::ostringstream ostr;
00188             ostr << value << std::ends;
00189             std::string ts=ostr.str(); 
00190             s = ts.c_str();
00191             setMemberValue (name, s);
00192         }
00193 
00199     ACE_CString getData (const char* name);
00200 
00207     void getMemberValue(const char* name, char*& value)
00208         {
00209             value = CORBA::string_dup(getData(name).c_str());
00210         }
00211     
00219     template<typename T>
00220     void getMemberValue (const char* name, T &value)
00221         {
00222             std::istringstream istr(getData(name).c_str());
00223             istr >> value;
00224         }
00225 
00232     template<typename T>
00233     T getMemberValue (const char* name);
00234 
00241     char* getDescription();
00242 
00247     char* getShortDescription();
00248 
00253   char* getFileName(){ return CORBA::string_dup(m_current->file); }
00254 
00259   CORBA::ULong getLineNumber(){ return m_current->lineNum; }
00260 
00265   char* getRoutine(){ return CORBA::string_dup (m_current->routine); }
00266 
00271   char* getHostName(){ return CORBA::string_dup (m_current->host); }
00272 
00277   char* getProcessName(){ return CORBA::string_dup (m_current->process); }
00278 
00283   char* getThread(){ return CORBA::string_dup (m_current->thread); }
00284 
00289   char* getSourceObject(){ return CORBA::string_dup (m_current->sourceObject); }
00294   CORBA::ULongLong getTimeStamp (){ return m_current->timeStamp; }
00295 
00300     ACSErr::ErrorCode getErrorCode(){ return m_current->errorCode; }
00301 
00306     ACSErr::ACSErrType getErrorType(){ return m_current->errorType; }
00307 
00311   ACSErr::Severity getSeverity() { return m_current->severity; }
00312 
00317   unsigned int getDepth(){ return m_depth; }
00318 
00323  void setTimeStamp (CORBA::ULongLong time){ m_current->timeStamp = time; }
00324 
00330   void setSourceObject(const char* so){ m_current->sourceObject = CORBA::string_dup (so); }
00331 
00337   void setFileName(const char* fn){ m_current->file = CORBA::string_dup (fn); }
00338 
00344   void setLineNumber (CORBA::ULong ln){ m_current->lineNum = ln; }
00345 
00352   void setError (ACSErr::ACSErrType ty, ACSErr::ErrorCode ec) 
00353         { m_current->errorType=ty; m_current->errorCode=ec; }
00354 
00360   void setSeverity(ACSErr::Severity severity) {m_current->severity = severity; }
00361 
00366   static void setHostName (const char* hn);
00367   
00372   static void setProcessName (const char *pn); 
00373 
00379   ACSErr::ErrorTrace *getNext();
00380 
00385     bool last() { return (m_depth==0 || m_current->previousError.length()==0); }
00386   
00391   ACSErr::ErrorTrace *top(){ m_current = m_errorTracePtr; return m_current;}
00392 
00398     ACSErr::ErrorTrace& getErrorTrace(){ return *m_current; } 
00399     
00400     static ACS::Time getTime();
00401     
00407     ErrorTraceHelper*  getErrorTraceHelper() { return this; }
00408 
00409   protected:
00410 
00411     void fill (ACSErr::ACSErrType et, ACSErr::ErrorCode ec, ACSErr::Severity severity,
00412                const char* file, int line, const char* routine, const char* sd);
00413 
00422     void log (ACSErr::ErrorTrace * c,
00423               int level, char *stackId,
00424               ACE_Log_Priority priorty=LM_ERROR);
00425 
00426     void toString (ACSErr::ErrorTrace * c, int level, std::ostringstream& oss);
00427 
00428     ACSErr::ErrorTrace *m_errorTracePtr;
00429 
00430     ACSErr::ErrorTrace *m_current;
00431     unsigned int m_depth;
00432     
00433     static char m_hostName[64];
00434     static char m_processName[64];
00435     static const unsigned int m_maxDepth;
00436 };
00437 
00438 
00443 class CompletionInit : public ACSErr::Completion
00444 {
00445   public:
00446     CompletionInit(const ACSErr::Completion &c);
00447 
00448     CompletionInit(ACSErr::CompletionType t, ACSErr::CompletionCode c, bool initTrace=true);
00449     
00454     ACSErr::CompletionCode getCode(){ return code; }
00455 
00460     ACSErr::CompletionType getType(){ return type; }
00461 
00466   CORBA::ULongLong getTimeStamp (){ return timeStamp; }
00467 };
00468 
00469 
00470 
00471 
00472 
00477 class CompletionImpl : public CompletionInit 
00478 {
00479   public:
00480 
00481     CompletionImpl();
00482 
00483     CompletionImpl (ACSErr::ACSErrType t, ACSErr::ErrorCode c) :
00484         CompletionInit(t, c, false)
00485 
00486 
00487         {
00488         }
00489 
00490     CompletionImpl (ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00491                       const char* file, int line, const char* routine, const char* sd,
00492                       ACSErr::Severity severity) : 
00493         CompletionInit(t, c),
00494         m_errorTraceHelper(t, c, file, line, routine, sd, severity, previousError[0])
00495         {}
00496 
00497 
00498     CompletionImpl (const ACSErr::Completion &pc, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00499                       const char* file, int line, const char* routine, const char* sd,
00500                       ACSErr::Severity severity) :
00501         CompletionInit(t, c),
00502         m_errorTraceHelper(pc.previousError[0], t, c, file, line, routine, sd, severity, previousError[0])
00503         {}
00504 
00505     CompletionImpl (ACSErr::Completion *pc, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00506                       const char* file, int line, const char* routine, const char* sd,
00507                       ACSErr::Severity severity) :
00508         CompletionInit(t, c),
00509         m_errorTraceHelper(pc->previousError[0], t, c, file, line, routine, sd, severity, previousError[0])
00510         { delete pc; }
00511 
00512 
00513     CompletionImpl (CompletionImpl *pc, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00514                       const char* file, int line, const char* routine, const char* sd,
00515                       ACSErr::Severity severity) :
00516         CompletionInit(t, c),
00517         m_errorTraceHelper(pc->previousError[0], t, c, file, line, routine, sd, severity, previousError[0])
00518         { delete pc; }
00519 
00520 
00521     CompletionImpl (const ACSErr::ErrorTrace &et, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00522                       const char* file, int line, const char* routine, const char* sd,
00523                       ACSErr::Severity severity) :
00524         CompletionInit(t, c),
00525         m_errorTraceHelper(et, t, c, file, line, routine, sd, severity, previousError[0])
00526         {}
00527 
00528 
00534     CompletionImpl(ACSErr::Completion* c, bool del=true);
00535 
00541     CompletionImpl(ACSErr::Completion_var& c);
00542 
00543     CompletionImpl (const ACSErr::Completion &c);
00544 
00548     CompletionImpl (const CompletionImpl &c);
00549 
00553     virtual ~CompletionImpl(){}
00554     
00564     ACSErr::Completion* returnCompletion (bool deletion=true)
00565         {
00566             ACSErr::Completion *tmp = new ACSErr::Completion(*this);
00567             if (deletion) delete this;
00568             return tmp;
00569         }
00570 
00581     ACSErr::Completion* outCompletion(bool del=false) { return this->returnCompletion(del); }
00582 
00588     bool isErrorFree(){ return (previousError.length() == 0); }
00589 
00594     ErrorTraceHelper*  getErrorTraceHelper(){ return (ErrorTraceHelper*)( (previousError.length() > 0) ? &m_errorTraceHelper : NULL); }
00595     
00601     void log(ACE_Log_Priority priorty=LM_ERROR);
00602 
00603     template<typename T>
00604     void addData (const char* name, T value)
00605         {
00606             if (!isErrorFree())
00607                 {
00608                 m_errorTraceHelper.addData(name, value);
00609                 }
00610         }
00611 
00612 
00613     CompletionImpl& operator=(CompletionImpl&);
00614 
00620     CompletionImpl& operator=(Completion* c);
00621 
00627     CompletionImpl& operator=(Completion_var& c);
00628 
00629 
00630 
00631   protected:
00632     ErrorTraceHelper m_errorTraceHelper;
00633 };
00634 
00635 
00636 
00637 
00638 
00639 
00640 template<>
00641 char * ErrorTraceHelper::getMemberValue<char*> (const char* name);
00642 
00643 template<>
00644 ACE_CString ErrorTraceHelper::getMemberValue<ACE_CString> (const char* name);
00645 
00646 template<typename T>
00647 T ErrorTraceHelper::getMemberValue (const char* name)
00648 {
00649     T value;
00650     std::istringstream istr(getData(name).c_str());
00651     istr >> value;
00652     return value;
00653 }
00654 
00655 }
00656 
00657 
00658 
00659 typedef ACSErr::CompletionInit CompletionInit;
00660 typedef ACSErr::CompletionImpl CompletionImpl;
00661 typedef ACSErr::ErrorTraceHelper ErrorTraceHelper;
00662 
00663 #endif