XrdSutBucket.cc

Go to the documentation of this file.
00001 // $Id: XrdSutBucket.cc 30949 2009-11-02 16:37:58Z ganis $
00002 
00003 const char *XrdSutBuckeCVSID = "$Id: XrdSutBucket.cc 30949 2009-11-02 16:37:58Z ganis $";
00004 /******************************************************************************/
00005 /*                                                                            */
00006 /*                      X r d S u t B u c k e t . c c                         */
00007 /*                                                                            */
00008 /* (c) 2004 by the Board of Trustees of the Leland Stanford, Jr., University  */
00009 /*       All Rights Reserved. See XrdInfo.cc for complete License Terms       */
00010 /*   Produced by Andrew Hanushevsky for Stanford University under contract    */
00011 /*              DE-AC03-76-SFO0515 with the Department of Energy              */
00012 /******************************************************************************/
00013 
00014 #include <stdio.h>
00015 #include <string.h>
00016 
00017 #include <XrdOuc/XrdOucString.hh>
00018 #include <XrdSut/XrdSutBucket.hh>
00019 #include <XrdSut/XrdSutTrace.hh>
00020 
00021 /******************************************************************************/
00022 /*             M a s k s  f o r   A S C I I  c h a r a c t e r s              */
00023 /******************************************************************************/
00024 static kXR_int32 XrdSutCharMsk[4][4] =
00025    { {0x00000000, 0xffffffff, 0xffffffff, 0xfffffffe},   // any printable char
00026      {0x00000000, 0x0000ffc0, 0x7fffffe0, 0x7fffffe0},   // letters/numbers  (up/low case)
00027      {0x00000000, 0x0000ffc0, 0x7e000000, 0x7e000000},   // hex characters   (up/low case)
00028      {0x00000000, 0x03ffc000, 0x07fffffe, 0x07fffffe} }; // crypt like [a-zA-Z0-9./]
00029 
00030 /******************************************************************************/
00031 /*                                                                            */
00032 /*  Unit for information exchange                                             */
00033 /*                                                                            */
00034 /******************************************************************************/
00035 //______________________________________________________________________________
00036 XrdSutBucket::XrdSutBucket(char *bp, int sz, int ty)
00037 {
00038    // Default constructor
00039 
00040    buffer = membuf = bp;
00041    size=sz;
00042    type=ty;
00043 }
00044 
00045 //______________________________________________________________________________
00046 XrdSutBucket::XrdSutBucket(XrdOucString &s, int ty) 
00047 {
00048    // Constructor
00049 
00050    membuf = 0;
00051    size = 0;
00052    type = ty;
00053 
00054    if (s.length()) {
00055        membuf = new char [s.length()];
00056        if (membuf) {
00057           memcpy(membuf,s.c_str(),s.length());
00058           buffer = membuf;
00059           size = s.length();
00060        }
00061    }
00062 }
00063 
00064 //______________________________________________________________________________
00065 XrdSutBucket::XrdSutBucket(XrdSutBucket &b)
00066 {
00067    // Copy constructor
00068 
00069    membuf = new char[b.size]; 
00070    if (membuf) {
00071       memcpy(membuf,b.buffer,b.size);
00072       buffer = membuf;
00073       type = b.type;
00074       size = b.size;
00075    }
00076 }
00077 
00078 //______________________________________________________________________________
00079 void XrdSutBucket::Update(char *nb, int ns, int ty)
00080 {
00081    // Update content 
00082 
00083    if (membuf) 
00084       delete[] membuf;
00085    buffer = membuf = nb;
00086    size = ns;
00087 
00088    if (ty)
00089       type = ty;
00090 }
00091 
00092 //______________________________________________________________________________
00093 int XrdSutBucket::Update(XrdOucString &s, int ty)
00094 {
00095    // Update content 
00096    // Returns 0 if ok, -1 otherwise.
00097 
00098    if (membuf)
00099       delete[] membuf;
00100    membuf = buffer = 0;
00101    if (s.length()) {
00102       membuf = new char [s.length()];
00103       if (membuf) {
00104          memcpy(membuf,s.c_str(),s.length());
00105          buffer = membuf;
00106          size = s.length();
00107          if (ty)
00108             type = ty;
00109          return 0;
00110       }
00111    }
00112    return -1;
00113 }
00114 
00115 //______________________________________________________________________________
00116 int XrdSutBucket::SetBuf(const char *nb, int ns)
00117 {
00118    // Fill local buffer with ns bytes at nb.
00119    // Memory is properly allocated / deallocated
00120    // Returns 0 if ok, -1 otherwise.
00121 
00122    if (membuf)
00123       delete[] membuf;
00124    size = 0;
00125    membuf = buffer = 0;
00126    if (nb && ns) {
00127       membuf = new char [ns];
00128       if (membuf) {
00129          memcpy(membuf,nb,ns);
00130          buffer = membuf;
00131          size = ns;
00132          return 0;
00133       }
00134    }
00135    return -1;
00136 }
00137 
00138 //______________________________________________________________________________
00139 void XrdSutBucket::ToString(XrdOucString &s)
00140 {
00141    // Convert content into a null terminated string
00142    // (nb: the caller must be sure that the operation makes sense)
00143 
00144    s = "";
00145    char *b = new char[size+1];
00146    if (b) {
00147       memcpy(b,buffer,size);
00148       b[size] = 0;
00149       s = (const char *)b;
00150       delete[] b;
00151    }
00152 }
00153 
00154 //_____________________________________________________________________________
00155 void XrdSutBucket::Dump(int opt)
00156 {
00157    // Dump content of bucket
00158    // Options:
00159    //             1    print header and tail (default)
00160    //             0    dump only content
00161    EPNAME("Bucket::Dump");
00162 
00163    if (opt == 1) {
00164       PRINT("//-----------------------------------------------------//");
00165       PRINT("//                                                     //");
00166       PRINT("//             XrdSutBucket DUMP                       //");
00167       PRINT("//                                                     //");
00168    }
00169 
00170    PRINT("//  addr: " <<this);
00171    PRINT("//  type: " <<type<<" ("<<XrdSutBuckStr(type)<<")");
00172    PRINT("//  size: " <<size <<" bytes");
00173    PRINT("//  content:");
00174    char bhex[XrdSutPRINTLEN] = {0};
00175    char bpri[XrdSutPRINTLEN] = {0};
00176    unsigned int nby = size;
00177    unsigned int k = 0, curhex = 0, curpri = 0;
00178    unsigned char i = 0, j = 0, l = 0;
00179    for (k = 0; k < nby; k++) {
00180       i = (unsigned char)buffer[k];
00181       bool isascii = (i > 127) ? 0 : 1;
00182       if (isascii) {
00183          j = i / 32;
00184          l = i - j * 32;
00185       }
00186       char chex[8];
00187       sprintf(chex," 0x%02x",(int)(i & 0xFF));
00188       sprintf(bhex,"%s%s",bhex,chex);
00189       curhex += strlen(chex);
00190       if (isascii && ((XrdSutCharMsk[0][j] & (1 << (31-l+1))) || i == 0x20)) {
00191          bpri[curpri] = i;
00192       } else {
00193          bpri[curpri] = '.';
00194       }
00195       curpri++;
00196       if (curpri > 7) {
00197          bhex[curhex] = 0;
00198          bpri[curpri] = 0;
00199          PRINT("// " <<bhex<<"    "<<bpri);
00200          memset(bhex,0,sizeof(bhex));
00201          memset(bpri,0,sizeof(bpri));
00202          curhex = 0;
00203          curpri = 0;
00204       }
00205    }
00206    bpri[curpri] = 0;
00207    if (curpri > 0) { 
00208       while (curpri++ < 8) {
00209          sprintf(bhex,"%s     ",bhex);
00210          curhex += 5;
00211       }
00212    }
00213    bhex[curhex] = 0;
00214    PRINT("// " <<bhex<<"    "<<bpri);
00215 
00216    if (opt == 1) {
00217       PRINT("//                                                     //");
00218       PRINT("//-----------------------------------------------------//");
00219    }
00220 }
00221 
00222 //______________________________________________________________________________
00223 int XrdSutBucket::operator==(const XrdSutBucket &b)
00224 {
00225    // Compare bucket b to local bucket: return 1 if matches, 0 if not
00226 
00227    if (b.size == size)
00228       if (!memcmp(buffer,b.buffer,size))
00229          return 1;
00230    return 0;
00231 }

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