XrdMonSndCoder.hh

Go to the documentation of this file.
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: XrdMonSndCoder.hh 24468 2008-06-22 16:47:03Z ganis $
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 */

Generated on Tue Jul 5 14:46:43 2011 for ROOT_528-00b_version by  doxygen 1.5.1