00001
00002
00003 const char *XrdSutBuckeCVSID = "$Id: XrdSutBucket.cc 30949 2009-11-02 16:37:58Z ganis $";
00004
00005
00006
00007
00008
00009
00010
00011
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
00023
00024 static kXR_int32 XrdSutCharMsk[4][4] =
00025 { {0x00000000, 0xffffffff, 0xffffffff, 0xfffffffe},
00026 {0x00000000, 0x0000ffc0, 0x7fffffe0, 0x7fffffe0},
00027 {0x00000000, 0x0000ffc0, 0x7e000000, 0x7e000000},
00028 {0x00000000, 0x03ffc000, 0x07fffffe, 0x07fffffe} };
00029
00030
00031
00032
00033
00034
00035
00036 XrdSutBucket::XrdSutBucket(char *bp, int sz, int ty)
00037 {
00038
00039
00040 buffer = membuf = bp;
00041 size=sz;
00042 type=ty;
00043 }
00044
00045
00046 XrdSutBucket::XrdSutBucket(XrdOucString &s, int ty)
00047 {
00048
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
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
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
00096
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
00119
00120
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
00142
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
00158
00159
00160
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
00226
00227 if (b.size == size)
00228 if (!memcmp(buffer,b.buffer,size))
00229 return 1;
00230 return 0;
00231 }