00001 #ifndef __XROOTD_RESPONSE_H__
00002 #define __XROOTD_RESPONSE_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 #include <string.h>
00033 #include <unistd.h>
00034 #include <sys/uio.h>
00035
00036 #include "XProtocol/XProtocol.hh"
00037 #include "XProtocol/XPtypes.hh"
00038 #include "XrdXrootd/XrdXrootdReqID.hh"
00039
00040
00041
00042
00043
00044 class XrdLink;
00045 class XrdOucSFVec;
00046 class XrdXrootdTransit;
00047
00048 class XrdXrootdResponse
00049 {
00050 public:
00051
00052 const char *ID() {return (const char *)trsid;}
00053
00054 int Send(void);
00055 int Send(const char *msg);
00056 int Send(XErrorCode ecode, const char *msg);
00057 int Send(void *data, int dlen);
00058 int Send(struct iovec *, int iovcnt, int iolen=-1);
00059 int Send(XResponseType rcode, void *data, int dlen);
00060 int Send(XResponseType rcode, struct iovec *IOResp,
00061 int iornum, int iolen=-1);
00062 int Send(XResponseType rcode, int info, const char *data, int dsz=-1);
00063 int Send(int fdnum, long long offset, int dlen);
00064 int Send(XrdOucSFVec *sfvec, int sfvnum, int dlen);
00065 static int Send(XrdXrootdReqID &ReqID, XResponseType Status,
00066 struct iovec *IOResp, int iornum, int iolen);
00067
00068 inline void Set(XrdLink *lp) {Link = lp;}
00069 inline void Set(XrdXrootdTransit *tp) {Bridge = tp;}
00070 void Set(kXR_char *stream);
00071
00072 bool isOurs() {return Bridge == 0;}
00073
00074 XrdLink *theLink() {return Link;}
00075 void StreamID(kXR_char *sid) {sid[0] = Resp.streamid[0];
00076 sid[1] = Resp.streamid[1];
00077 }
00078
00079 XrdXrootdResponse(XrdXrootdResponse &rhs) {Set(rhs.Link);
00080 Set(rhs.Bridge);
00081 Set(rhs.Resp.streamid);
00082 }
00083
00084 XrdXrootdResponse() {Link = 0; Bridge = 0; *trsid = '\0';
00085 RespIO[0].iov_base = (caddr_t)&Resp;
00086 RespIO[0].iov_len = sizeof(Resp);
00087 }
00088 ~XrdXrootdResponse() {}
00089
00090 XrdXrootdResponse &operator =(const XrdXrootdResponse &rhs)
00091 {Set(rhs.Link);
00092 Set(rhs.Bridge);
00093 Set((unsigned char *)rhs.Resp.streamid);
00094 return *this;
00095 }
00096
00097 private:
00098
00099 XrdXrootdTransit *Bridge;
00100 ServerResponseHeader Resp;
00101 XrdLink *Link;
00102 struct iovec RespIO[3];
00103
00104 char trsid[8];
00105 static const char *TraceID;
00106 };
00107 #endif