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
00060 int Send(XResponseType rcode, void *data, int dlen);
00061 int Send(XResponseType rcode, struct iovec *IOResp,
00062 int iornum, int iolen=-1);
00063 int Send(XResponseType rcode, int info, const char *data, int dsz=-1);
00064
00065 int Send(int fdnum, long long offset, int dlen);
00066 int Send(XrdOucSFVec *sfvec, int sfvnum, int dlen);
00067
00068 int Send(ServerResponseStatus &, int iLen=0);
00069 int Send(ServerResponseStatus &, int iLen, void *data, int dlen);
00070 int Send(ServerResponseStatus &, int iLen,
00071 struct iovec *, int iovcnt, int iolen=-1);
00072
00073 static int Send(XrdXrootdReqID &ReqID, XResponseType Status,
00074 struct iovec *IOResp, int iornum, int iolen);
00075
00076 inline void Set(XrdLink *lp) {Link = lp;}
00077 inline void Set(XrdXrootdTransit *tp) {Bridge = tp;}
00078 void Set(kXR_char *stream);
00079
00080 bool isOurs() {return Bridge == 0;}
00081
00082 XrdLink *theLink() {return Link;}
00083 void StreamID(kXR_char *sid) {sid[0] = Resp.streamid[0];
00084 sid[1] = Resp.streamid[1];
00085 }
00086
00087 XrdXrootdResponse(XrdXrootdResponse &rhs) {Set(rhs.Link);
00088 Set(rhs.Bridge);
00089 Set(rhs.Resp.streamid);
00090 }
00091
00092 XrdXrootdResponse() {Link = 0; Bridge = 0; *trsid = '\0';
00093 RespIO[0].iov_base = (caddr_t)&Resp;
00094 RespIO[0].iov_len = sizeof(Resp);
00095 }
00096 ~XrdXrootdResponse() {}
00097
00098 XrdXrootdResponse &operator =(const XrdXrootdResponse &rhs)
00099 {Set(rhs.Link);
00100 Set(rhs.Bridge);
00101 Set((unsigned char *)rhs.Resp.streamid);
00102 return *this;
00103 }
00104
00105 private:
00106 int srsComplete(ServerResponseStatus &, int iLen, int dlen=0);
00107
00108 XrdXrootdTransit *Bridge;
00109 ServerResponseHeader Resp;
00110 XrdLink *Link;
00111 struct iovec RespIO[3];
00112
00113 char trsid[8];
00114 static const char *TraceID;
00115 };
00116 #endif