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
ErrorTraceHelper(ACSErr::ErrorTrace &et,
int depth);
00074
00075
00076
ErrorTraceHelper();
00077
00078
00079
ErrorTraceHelper (ACSErr::ACSErrType et, ACSErr::ErrorCode ec,
00080
const char* file,
int line,
const char* routine,
const char* sd,
00081 ACSErr::Severity severity,
00082 ACSErr::ErrorTrace &errortrace);
00083
00084
00085
ErrorTraceHelper (
const ACSErr::ErrorTrace &pet,
00086 ACSErr::ACSErrType et, ACSErr::ErrorCode ec,
00087
const char* file,
int line,
const char* routine,
const char* sd,
00088 ACSErr::Severity severity,
00089 ACSErr::ErrorTrace &errortrace);
00090
00094
ErrorTraceHelper&
operator=(ACSErr::ErrorTrace& eth);
00095
00096
public:
00097
00098
00115
void log(ACE_Log_Priority priorty=LM_ERROR);
00116
00120 std::string
toString();
00121
00128
void addData (
const char* name,
const char* value);
00129
00134 void addData (
const char* name,
char* value)
00135 {
00136
addData (name, (
const char*)value);
00137 }
00138
00146
template<
typename T>
00147 void addData (
const char* name, T value)
00148 {
00149
const char *s;
00150 std::ostringstream ostr;
00151 ostr << value << std::ends;
00152 std::string ts=ostr.str();
00153 s = ts.c_str();
00154
addData (name, s);
00155 }
00156
00163
void setMemberValue (
const char* name,
const char* value);
00164
00171
void setMemberValue (
const char* name, ACE_CString &value);
00172
00179
template<
typename T>
00180 void setMemberValue (
const char* name, T value)
00181 {
00182
const char *s;
00183
if (name==
NULL)
return;
00184
00185 std::ostringstream ostr;
00186 ostr << value << std::ends;
00187 std::string ts=ostr.str();
00188 s = ts.c_str();
00189
setMemberValue (name, s);
00190 }
00191
00197 ACE_CString
getData (
const char* name);
00198
00205 void getMemberValue(
const char* name,
char*& value)
00206 {
00207 value = CORBA::string_dup(
getData(name).c_str());
00208 }
00209
00217
template<
typename T>
00218 void getMemberValue (
const char* name, T &value)
00219 {
00220 std::istringstream istr(
getData(name).c_str());
00221 istr >> value;
00222 }
00223
00230
template<
typename T>
00231 T
getMemberValue (
const char* name);
00232
00239
char*
getDescription();
00240
00245
char*
getShortDescription();
00246
00251 char*
getFileName(){
return CORBA::string_dup(
m_current->file); }
00252
00257 CORBA::ULong
getLineNumber(){
return m_current->lineNum; }
00258
00263 char*
getRoutine(){
return CORBA::string_dup (
m_current->routine); }
00264
00269 char*
getHostName(){
return CORBA::string_dup (
m_current->host); }
00270
00275 char*
getProcessName(){
return CORBA::string_dup (
m_current->process); }
00276
00281 char*
getThread(){
return CORBA::string_dup (
m_current->thread); }
00282
00287 char*
getSourceObject(){
return CORBA::string_dup (
m_current->sourceObject); }
00292 CORBA::ULongLong
getTimeStamp (){
return m_current->timeStamp; }
00293
00298 ACSErr::ErrorCode
getErrorCode(){
return m_current->errorCode; }
00299
00304 ACSErr::ACSErrType
getErrorType(){
return m_current->errorType; }
00305
00309 ACSErr::Severity
getSeverity() {
return m_current->severity; }
00310
00315 unsigned int getDepth(){
return m_depth; }
00316
00321 void setTimeStamp (CORBA::ULongLong time){
m_current->timeStamp = time; }
00322
00328 void setSourceObject(
const char* so){
m_current->sourceObject = CORBA::string_dup (so); }
00329
00335 void setFileName(
const char* fn){
m_current->file = CORBA::string_dup (fn); }
00336
00342 void setLineNumber (CORBA::ULong ln){
m_current->lineNum = ln; }
00343
00350 void setError (ACSErr::ACSErrType ty, ACSErr::ErrorCode ec)
00351 {
m_current->errorType=ty;
m_current->errorCode=ec; }
00352
00358 void setSeverity(ACSErr::Severity severity) {
m_current->severity = severity; }
00359
00364
static void setHostName (
const char* hn);
00365
00370
static void setProcessName (
const char *pn);
00371
00377 ACSErr::ErrorTrace *
getNext();
00378
00383 bool last() {
return (
m_depth==0 ||
m_current->previousError.length()==0); }
00384
00389 ACSErr::ErrorTrace *
top(){
m_current =
m_errorTracePtr;
return m_current;}
00390
00396 ACSErr::ErrorTrace&
getErrorTrace(){
return *
m_current; }
00397
00398
static ACS::Time
getTime();
00399
00405 ErrorTraceHelper*
getErrorTraceHelper() {
return this; }
00406
00407
protected:
00408
00409
void fill (ACSErr::ACSErrType et, ACSErr::ErrorCode ec, ACSErr::Severity severity,
00410
const char* file,
int line,
const char* routine,
const char* sd);
00411
00420
void log (ACSErr::ErrorTrace * c,
00421
int level,
char *stackId,
00422 ACE_Log_Priority priorty=LM_ERROR);
00423
00424
void toString (ACSErr::ErrorTrace * c,
int level, std::ostringstream& oss);
00425
00426 ACSErr::ErrorTrace *
m_errorTracePtr;
00427
00428 ACSErr::ErrorTrace *
m_current;
00429 unsigned int m_depth;
00430
00431 static char m_hostName[64];
00432 static char m_processName[64];
00433 static const unsigned int m_maxDepth;
00434 };
00435
00436
00441 class CompletionInit :
public ACSErr::
Completion
00442 {
00443
public:
00444
CompletionInit(
const ACSErr::Completion &c);
00445
00446
CompletionInit(ACSErr::CompletionType t, ACSErr::CompletionCode c,
bool initTrace=
true);
00447
00452 ACSErr::CompletionCode
getCode(){
return code; }
00453
00458 ACSErr::CompletionType
getType(){
return type; }
00459
00464 CORBA::ULongLong
getTimeStamp (){
return timeStamp; }
00465 };
00466
00467
00468
00469
00470
00475 class CompletionImpl :
public CompletionInit
00476 {
00477
public:
00478
00479
CompletionImpl();
00480
00481 CompletionImpl (ACSErr::ACSErrType t, ACSErr::ErrorCode c) :
00482
CompletionInit(t, c, false),
00483
m_errorTraceHelper(previousError[0], previousError.length())
00484 {
00485 }
00486
00487 CompletionImpl (ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00488
const char* file,
int line,
const char* routine,
const char* sd,
00489 ACSErr::Severity severity) :
00490
CompletionInit(t, c),
00491
m_errorTraceHelper(t, c, file, line, routine, sd, severity, previousError[0])
00492 {}
00493
00494
00495 CompletionImpl (
const ACSErr::Completion &pc, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00496
const char* file,
int line,
const char* routine,
const char* sd,
00497 ACSErr::Severity severity) :
00498
CompletionInit(t, c),
00499
m_errorTraceHelper(pc.previousError[0], t, c, file, line, routine, sd, severity, previousError[0])
00500 {}
00501
00502 CompletionImpl (ACSErr::Completion *pc, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00503
const char* file,
int line,
const char* routine,
const char* sd,
00504 ACSErr::Severity severity) :
00505
CompletionInit(t, c),
00506
m_errorTraceHelper(pc->previousError[0], t, c, file, line, routine, sd, severity, previousError[0])
00507 {
delete pc; }
00508
00509
00510 CompletionImpl (
CompletionImpl *pc, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00511
const char* file,
int line,
const char* routine,
const char* sd,
00512 ACSErr::Severity severity) :
00513
CompletionInit(t, c),
00514
m_errorTraceHelper(pc->previousError[0], t, c, file, line, routine, sd, severity, previousError[0])
00515 {
delete pc; }
00516
00517
00518 CompletionImpl (
const ACSErr::ErrorTrace &et, ACSErr::ACSErrType t, ACSErr::ErrorCode c,
00519
const char* file,
int line,
const char* routine,
const char* sd,
00520 ACSErr::Severity severity) :
00521
CompletionInit(t, c),
00522
m_errorTraceHelper(et, t, c, file, line, routine, sd, severity, previousError[0])
00523 {}
00524
00525
00531
CompletionImpl(ACSErr::Completion* c,
bool del=
true);
00532
00538
CompletionImpl(ACSErr::Completion_var& c);
00539
00540
CompletionImpl (
const ACSErr::Completion &c);
00541
00545
CompletionImpl (
const CompletionImpl &c);
00546
00550 virtual ~CompletionImpl(){}
00551
00561 ACSErr::Completion*
returnCompletion (
bool deletion=
true)
00562 {
00563 ACSErr::Completion *tmp =
new ACSErr::Completion(*
this);
00564
if (deletion)
delete this;
00565
return tmp;
00566 }
00567
00578 ACSErr::Completion*
outCompletion(
bool del=
false) {
return this->
returnCompletion(del); }
00579
00585 bool isErrorFree(){
return (previousError.length() == 0); }
00586
00591 ErrorTraceHelper*
getErrorTraceHelper(){
return (
ErrorTraceHelper*)( (previousError.length() > 0) ? &
m_errorTraceHelper :
NULL); }
00592
00598
void log(ACE_Log_Priority priorty=LM_ERROR);
00599
00600
template<
typename T>
00601 void addData (
const char* name, T value)
00602 {
00603
if (!
isErrorFree())
00604 {
00605
m_errorTraceHelper.
addData(name, value);
00606 }
00607 }
00608
00609
00610
CompletionImpl&
operator=(
CompletionImpl&);
00611
00617
CompletionImpl&
operator=(
Completion* c);
00618
00624
CompletionImpl&
operator=(Completion_var& c);
00625
00626
00627
00628
protected:
00629 ErrorTraceHelper m_errorTraceHelper;
00630 };
00631
00632
00633
00634
00635
00636
00637
template<>
00638
char * ErrorTraceHelper::getMemberValue<char*> (
const char* name);
00639
00640
template<>
00641 ACE_CString ErrorTraceHelper::getMemberValue<ACE_CString> (
const char* name);
00642
00643
template<
typename T>
00644 T
ErrorTraceHelper::getMemberValue (
const char* name)
00645 {
00646 T value;
00647 std::istringstream istr(
getData(name).c_str());
00648 istr >> value;
00649
return value;
00650 }
00651
00652 }
00653
00654
00655
00656 typedef ACSErr::CompletionInit CompletionInit;
00657 typedef ACSErr::CompletionImpl CompletionImpl;
00658 typedef ACSErr::ErrorTraceHelper ErrorTraceHelper;
00659
00660
#endif