00001 #ifndef __OUC_ERRINFO_H__
00002 #define __OUC_ERRINFO_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <string.h>
00017 #include <sys/types.h>
00018
00019 #include "XrdSys/XrdSysPlatform.hh"
00020
00021
00022
00023
00024
00025 struct XrdOucEI
00026 {
00027 static const size_t Max_Error_Len = 2048;
00028
00029 const char *user;
00030 int code;
00031 char message[Max_Error_Len];
00032
00033 void clear(const char *usr=0)
00034 {code=0; message[0]='\0'; user = (usr ? usr : "?");}
00035
00036 XrdOucEI &operator =(const XrdOucEI &rhs)
00037 {code = rhs.code;
00038 user = rhs.user;
00039 strcpy(message, rhs.message);
00040 return *this;
00041 }
00042 XrdOucEI(const char *usr) {clear(usr);}
00043 };
00044
00045
00046
00047
00048
00049 class XrdOucEICB;
00050 class XrdSysSemaphore;
00051
00052 class XrdOucErrInfo
00053 {
00054 public:
00055 void clear() {ErrInfo.clear();}
00056
00057 inline void setErrArg(unsigned long long cbarg=0) {ErrCBarg = cbarg;}
00058 inline void setErrCB(XrdOucEICB *cb, unsigned long long cbarg=0)
00059 {ErrCB = cb; ErrCBarg = cbarg;}
00060 inline int setErrCode(int code) {return ErrInfo.code = code;}
00061 inline int setErrInfo(int code, const char *message)
00062 {strlcpy(ErrInfo.message, message, sizeof(ErrInfo.message));
00063 return ErrInfo.code = code;
00064 }
00065 inline int setErrInfo(int code, const char *txtlist[], int n)
00066 {int i, j = 0, k = sizeof(ErrInfo.message), l;
00067 for (i = 0; i < n && k > 1; i++)
00068 {l = strlcpy(&ErrInfo.message[j], txtlist[i], k);
00069 j += l; k -= l;
00070 }
00071 return ErrInfo.code = code;
00072 }
00073 inline void setErrUser(const char *user) {ErrInfo.user = (user ? user : "?");}
00074
00075 inline unsigned long long getErrArg() {return ErrCBarg;}
00076
00077 inline char *getMsgBuff(int &mblen)
00078 {mblen = sizeof(ErrInfo.message);
00079 return ErrInfo.message;
00080 }
00081 inline XrdOucEICB *getErrCB() {return ErrCB;}
00082 inline XrdOucEICB *getErrCB(unsigned long long &ap)
00083 {ap = ErrCBarg; return ErrCB;}
00084 inline int getErrInfo() {return ErrInfo.code;}
00085 inline int getErrInfo(XrdOucEI &errorParm)
00086 {errorParm = ErrInfo; return ErrInfo.code;}
00087 inline const char *getErrText()
00088 {return (const char *)ErrInfo.message;}
00089 inline const char *getErrText(int &ecode)
00090 {ecode = ErrInfo.code;
00091 return (const char *)ErrInfo.message;}
00092 inline const char *getErrUser() {return ErrInfo.user;}
00093
00094 XrdOucErrInfo &operator =(const XrdOucErrInfo &rhs)
00095 {ErrInfo = rhs.ErrInfo;
00096 ErrCB = rhs.ErrCB;
00097 ErrCBarg= rhs.ErrCBarg;
00098 return *this;
00099 }
00100
00101 XrdOucErrInfo(const char *user=0,XrdOucEICB *cb=0,unsigned long long ca=0)
00102 : ErrInfo(user) {ErrCB = cb; ErrCBarg = ca;}
00103
00104 virtual ~XrdOucErrInfo() {}
00105
00106 protected:
00107
00108 XrdOucEI ErrInfo;
00109 XrdOucEICB *ErrCB;
00110 unsigned long long ErrCBarg;
00111 };
00112
00113
00114
00115
00116
00117 class XrdOucEICB
00118 {
00119 public:
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 virtual void Done(int &Result,
00133 XrdOucErrInfo *eInfo)=0;
00134
00135
00136
00137
00138 virtual int Same(unsigned long long arg1, unsigned long long arg2)=0;
00139
00140 XrdOucEICB() {}
00141 virtual ~XrdOucEICB() {}
00142 };
00143 #endif