XRootD
XrdMpxXml Class Reference

#include <XrdMpxXml.hh>

+ Collaboration diagram for XrdMpxXml:

Public Types

enum  fmtType {
  fmtCGI ,
  fmtFlat ,
  fmtText ,
  fmtXML
}
 

Public Member Functions

 XrdMpxXml (fmtType ft, bool nz=false, bool dbg=false)
 
 ~XrdMpxXml ()
 
int Format (const char *Host, char *ibuff, char *obuff)
 

Detailed Description

Definition at line 35 of file XrdMpxXml.hh.

Member Enumeration Documentation

◆ fmtType

Enumerator
fmtCGI 
fmtFlat 
fmtText 
fmtXML 

Definition at line 39 of file XrdMpxXml.hh.

Constructor & Destructor Documentation

◆ XrdMpxXml()

XrdMpxXml::XrdMpxXml ( fmtType  ft,
bool  nz = false,
bool  dbg = false 
)
inline

Definition at line 43 of file XrdMpxXml.hh.

44  : fType(ft), Debug(dbg), noZed(nz)
45  {if (ft == fmtCGI) {vSep = '='; vSfx = '&';}
46  else {vSep = ' '; vSfx = '\n';}
47  doV2T = ft == fmtText;
48  }

References fmtCGI, and fmtText.

◆ ~XrdMpxXml()

XrdMpxXml::~XrdMpxXml ( )
inline

Definition at line 49 of file XrdMpxXml.hh.

49 {}

Member Function Documentation

◆ Format()

int XrdMpxXml::Format ( const char *  Host,
char *  ibuff,
char *  obuff 
)

Definition at line 242 of file XrdMpxXml.cc.

243 {
244  static const char *Hdr0 = "<statistics ";
245  static const int H0Len = strlen(Hdr0);
246 
247  XrdMpxVar xVar(Debug);
248  XrdOucTokenizer Data(ibuff);
249  VarInfo vHead[] = {{"tod", 0}, {"ver", 0}, {"src", 0}, {"tos", 0},
250  {"pgm", 0}, {"ins", 0}, {"pid", 0}, {0, 0}};
251  VarInfo vStat[] = {{"id", 0}, {0, 0}};
252  VarInfo vTail[] = {{"toe", 0}, {0, 0}};
253  char *lP = ibuff, *oP = obuff, *tP, *vP;
254  int i, rc;
255 
256 // Insert a newline for the first '>'
257 //
258  if (!(lP = (char *)index(lP, '>')))
259  return xmlErr("Invalid xml stream: ", ibuff);
260  *lP++ = '\n';
261 
262 // Now make the input tokenizable
263 //
264  while(*lP)
265  {if (*lP == '>' || (*lP == '<' && *(lP+1) == '/')) *lP = ' ';
266  lP++;
267  }
268 
269 // The first token better be '<statistics'
270 //
271  if (!(lP = Data.GetLine()) || strncmp(Hdr0, lP, H0Len))
272  return xmlErr("Stream does not start with '<statistics'.");
273  Data.GetToken(); getVars(Data, vHead);
274 
275 // Output the vars in the headers as 'stats..var'
276 //
277  for (i = 0; vHead[i].Name; i++)
278  {if (vHead[i].Data) oP = Add(oP, vHead[i].Name, vHead[i].Data);}
279 
280 // Add in the host name, if supplied
281 //
282  if (Host) oP = Add(oP, "host", Host);
283 
284 // Get the remainder
285 //
286  if (!Data.GetLine()) return xmlErr("Null xml stream after header.");
287 
288 // The following segment reads all of the "stats" entries
289 //
290  while((tP = Data.GetToken()) && strcmp(tP, "/statistics"))
291  { if (*tP == '/')
292  {if (!xVar.Pop(strcmp("/stats", tP) ? tP+1 : 0))
293  return xmlErr(tP, "invalid end for ", xVar.Var());
294  }
295  else if (*tP == '<')
296  {if (strcmp("<stats", tP)) rc = xVar.Push(tP+1);
297  else {getVars(Data, vStat);
298  rc = (vStat[0].Data ? xVar.Push(vStat[0].Data)
299  : xVar.Push(tP+1));
300  }
301  if (!rc) return xmlErr("Nesting too deep for ", xVar.Var());
302  }
303  else {if ((vP = index(tP, '<'))) *vP = '\0';
304  if (*tP == '"')
305  {i = strlen(tP)-1;
306  if (*(tP+i) == '"') {*(tP+i) = '\0'; i = 1;}
307  } else i = 0;
308  oP = Add(oP, xVar.Var(), tP+i);
309  if (vP) {*vP = '<';
310  if (vP != tP) memset(tP, ' ', vP - tP);
311  Data.RetToken();
312  }
313  }
314  }
315  if (!tP) return xmlErr("Missing '</statistics>' in xml stream.");
316  getVars(Data, vTail);
317  if (vTail[0].Data) oP = Add(oP, vTail[0].Name, vTail[0].Data);
318  if (*(oP-1) == '&') oP--;
319  *oP++ = '\n';
320  return oP - obuff;
321 }

References XrdOucTokenizer::GetLine(), XrdOucTokenizer::GetToken(), XrdMpxVar::Pop(), XrdMpxVar::Push(), XrdOucTokenizer::RetToken(), and XrdMpxVar::Var().

Referenced by main(), and XrdMpxOut::Run().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

The documentation for this class was generated from the following files: