xrootd
|
00001 /*****************************************************************************/ 00002 /* */ 00003 /* XrdMonSndCoder.hh */ 00004 /* */ 00005 /* (c) 2005 by the Board of Trustees of the Leland Stanford, Jr., University */ 00006 /* All Rights Reserved */ 00007 /* Produced by Jacek Becla for Stanford University under contract */ 00008 /* DE-AC02-76SF00515 with the Department of Energy */ 00009 /*****************************************************************************/ 00010 00011 // $Id$ 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> // for pair 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 // The class responsible for coding data into a binary packet 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; // tracks where to write inside packet 00140 sequen_t _sequenceNo; 00141 00142 static kXR_int32 _serverStartTime; 00143 00144 // statistics 00145 kXR_int32 _noDict; 00146 kXR_int32 _noOpen; 00147 kXR_int32 _noClose; 00148 kXR_int32 _noTrace; 00149 kXR_int32 _noTime; 00150 }; 00151 00152 #endif /* XRDMONSNDCODER_HH */