00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef XRDMONSNDCODER_HH
00014 #define XRDMONSNDCODER_HH
00015
00016 #include "XrdMon/XrdMonCommon.hh"
00017 #include "XrdMon/XrdMonSndAdminEntry.hh"
00018 #include "XrdMon/XrdMonSndDebug.hh"
00019 #include "XrdMon/XrdMonSndDictEntry.hh"
00020 #include "XrdMon/XrdMonSndStageEntry.hh"
00021 #include "XrdMon/XrdMonSndPacket.hh"
00022 #include "XrdMon/XrdMonSndTraceEntry.hh"
00023 #include "XrdSys/XrdSysPlatform.hh"
00024 #include "XrdSys/XrdSysHeaders.hh"
00025 #include <assert.h>
00026 #include <netinet/in.h>
00027 #include <utility>
00028 #include <vector>
00029 using std::cerr;
00030 using std::cout;
00031 using std::endl;
00032 using std::string;
00033 using std::pair;
00034 using std::vector;
00035
00036
00037
00038 class XrdMonSndCoder {
00039 public:
00040 XrdMonSndCoder();
00041
00042 int prepare2Transfer(const XrdMonSndAdminEntry& ae);
00043 int prepare2Transfer(const vector<XrdMonSndTraceEntry>& vector);
00044 int prepare2Transfer(const vector<kXR_int32>& vector);
00045 int prepare2Transfer(const XrdMonSndDictEntry::CompactEntry& ce);
00046 int prepare2Transfer(const XrdMonSndStageEntry::CompactEntry& ce);
00047
00048 const XrdMonSndPacket& packet() { return _packet; }
00049 void reset() { _packet.reset(); }
00050 void printStats() const ;
00051
00052 private:
00053 char* writeHere() { return _packet.offset(_putOffset); }
00054 int reinitXrdMonSndPacket(packetlen_t newSize, char packetCode);
00055 pair<char, kXR_unt32> generateBigNumber(const char* descr);
00056
00057 inline void add_int08_t(int8_t value) {
00058 memcpy(writeHere(), &value, sizeof(int8_t));
00059 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00060 cout << "stored int08_t value " << (int) value
00061 << ", _putOffset " << _putOffset << endl;
00062 }
00063 _putOffset += sizeof(int8_t);
00064 }
00065 inline void add_kXR_int16(kXR_int16 value) {
00066 kXR_int16 v = htons(value);
00067 memcpy(writeHere(), &v, sizeof(kXR_int16));
00068 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00069 cout << "stored kXR_int16 value " << value
00070 << ", _putOffset " << _putOffset << endl;
00071 }
00072 _putOffset += sizeof(kXR_int16);
00073 }
00074 inline void add_kXR_unt16(kXR_unt16 value) {
00075 kXR_unt16 v = htons(value);
00076 memcpy(writeHere(), &v, sizeof(kXR_unt16));
00077 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00078 cout << "stored kXR_unt16 value " << value
00079 << ", _putOffset " << _putOffset << endl;
00080 }
00081 _putOffset += sizeof(kXR_unt16);
00082 }
00083 inline void add_kXR_int32(kXR_int32 value) {
00084 kXR_int32 v = htonl(value);
00085 memcpy(writeHere(), &v, sizeof(kXR_int32));
00086 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00087 cout << "stored kXR_int32 value " << value
00088 << ", _putOffset " << _putOffset << endl;
00089 }
00090 _putOffset += sizeof(kXR_int32);
00091 }
00092 inline void add_kXR_unt32(kXR_unt32 value) {
00093 kXR_unt32 v = htonl(value);
00094 memcpy(writeHere(), &v, sizeof(kXR_unt32));
00095 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00096 cout << "stored kXR_unt32 value " << value
00097 << ", _putOffset " << _putOffset << endl;
00098 }
00099 _putOffset += sizeof(kXR_unt32);
00100 }
00101 inline void add_kXR_int64(kXR_int64 value) {
00102 kXR_int64 v = htonll(value);
00103 memcpy(writeHere(), &v, sizeof(kXR_int64));
00104 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00105 cout << "stored kXR_int64 value " << value
00106 << ", _putOffset " << _putOffset << endl;
00107 }
00108 _putOffset += sizeof(kXR_int64);
00109 }
00110 inline void add_Mark(char mark, int noChars=8) {
00111 assert(noChars<=8);
00112 char x[8];
00113 memset(x, 0, 8);
00114 x[0] = mark;
00115 memcpy(writeHere(), x, 1);
00116 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00117 cout << "stored mark " << mark
00118 << ", _putOffset " << _putOffset << endl;
00119 }
00120
00121 _putOffset += noChars;
00122 }
00123 inline void add_string(const string& s) {
00124 kXR_int16 sLen = s.size();
00125 if ( 0 == sLen ) {
00126 cerr << "Error in add_string, size 0" << endl;
00127 return;
00128 }
00129 memcpy(writeHere(), s.c_str(), sLen);
00130 if ( XrdMonSndDebug::verbose(XrdMonSndDebug::SPacket) ) {
00131 cout << "stored string " << s
00132 << ", _putOffset " << _putOffset << endl;
00133 }
00134 _putOffset += sLen;
00135 }
00136
00137 private:
00138 XrdMonSndPacket _packet;
00139 kXR_int32 _putOffset;
00140 sequen_t _sequenceNo;
00141
00142 static kXR_int32 _serverStartTime;
00143
00144
00145 kXR_int32 _noDict;
00146 kXR_int32 _noOpen;
00147 kXR_int32 _noClose;
00148 kXR_int32 _noTrace;
00149 kXR_int32 _noTime;
00150 };
00151
00152 #endif