Does not in itself produce HTML but the subtags do. The complete set of subtags are called for each member of the list the hdsTable controls. Returns: None
| Return Type | Function name | Arguments |
|---|---|---|
| void | hdsDirlist::Generate | (hzChain&,hzHttpEvent*,uint32_t&,) |
Declared in file: hzDissemino.h
Defined in file : hdsGenerate.cpp
Function Logic:
Function body:
void hdsDirlist::Generate (hzChain& C)hzHttpEvent* pE, uint32_t& nLine,
{
// Does not in itself produce HTML but the subtags do. The complete set of subtags are called for each member of the list the hdsTable controls.
//
// Arguments: 1) C The HTML output chain
// 2) pE The HTTP event being responded to
// 3) nLine Line number tracker (controls NL printing)
//
// Returns: None
_hzfunc("hdsDirlist::Generate") ;
hzMapS <hzString,hzDirent> byName ; // Directory entries by name
hzMapM <uint32_t,hzDirent> byDate ; // Directory entries by name
hzVect <hzDirent> dirents ; // List of directories
hzList <hdsCol>::Iter ci ; // Column iterator
hzDirent de ; // Directory entry
hzXDate date ; // Last mod date
hdsCol col ; // Column
hzAtom atom ; // Current value
hdsVE* pVE ; // Visible entitiy
hzString apath ; // Translated path (absolute so includes doc root)
hzString rpath ; // Translated path (relative to doc root)
hzString crit ; // Resolved criteria
uint32_t nDirs ; // Number of directories
uint32_t nFiles ; // Number of files
uint32_t x ; // Table controller
uint32_t y ; // Table controller
// Do the heading
C.AddByte(CHAR_NL) ;
for (x = m_Indent ; x ; x--)
C.AddByte(CHAR_TAB) ;
// Obtain resolved parmeters
rpath = m_pApp->ConvertText(m_Directory, pE) ;
apath = m_pApp->m_Docroot + rpath ;
crit = m_pApp->ConvertText(m_Criteria, pE) ;
// Provide filelist matching the criteria
ReadDir(dirents, *apath, *crit) ;
if (!dirents.Count())
{
// Print the ifnone tags
for (pVE = m_pNone ; pVE ; pVE = pVE->Sibling())
pVE->Generate(C, pE, nLine) ;
}
else
{
// Sort directory entries
for (nDirs = nFiles = x = 0; x < dirents.Count() ; x++)
{
de = dirents[x] ;
if (de.IsDir())
nDirs++ ;
else
nFiles++ ;
if (m_Order == 1|| m_Order == 2)
byName.Insert(de.strName(), de) ;
if (m_Order == 3|| m_Order == 4)
byDate.Insert(de.Mtime(), de) ;
}
if (m_Order)
{
// Now place back in array
if (m_Order == 1)
for (x = 0; x < dirents.Count() ; x++)
dirents[x] = byName.GetObj(x) ;
if (m_Order == 3)
for (x = 0; x < dirents.Count() ; x++)
dirents[x] = byDate.GetObj(x) ;
if (m_Order == 2)
for (y = dirents.Count() - 1,x = 0; x < dirents.Count() ; y--, x++)
dirents[x] = byName.GetObj(y) ;
if (m_Order == 4)
for (y = dirents.Count() - 1,x = 0; x < dirents.Count() ; y--, x++)
dirents[x] = byDate.GetObj(y) ;
}
// Create HTML table for listing
C.Printf("<table width=\"%d\" align=\"center\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" class=\"%s\">\n", m_Width, *m_CSS) ;
C.Printf("<tr valign=\"top\" height=\"20\"><td>Listing %d directories and %d files</td></tr>\n", nDirs, nFiles) ;
C.Printf("<tr valign=\"top\" height=\"%d\">\n\t<td>\n", m_Height) ;
C.Printf("\t<table width=\"%d\" align=\"center\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\" class=\"%s\">\n", m_Width, *m_CSS) ;
// Do table headers
C << "\t<tr>\n" ;
for (ci = m_Cols ; ci.Valid() ; ci++)
{
col = ci.Element() ;
C.Printf("\t<th width=\"%d\">%s</th>\n", col.m_nSize, *col.m_Title) ;
}
C << "\t</tr>\n" ;
// Do first rows as parent directory
if (pE->m_Resarg)
{
C << "\t<tr>" ;
for (ci = m_Cols ; ci.Valid() ; ci++)
{
col = ci.Element() ;
if (col.m_Title == "Mtime")
C << "<td>---</td>" ;
else if (col.m_Title == "Type")
C << "<td>DIR</td>" ;
else if (col.m_Title == "Size")
C << "<td>---</td>" ;
else if (col.m_Title == "Name")
C.Printf("<td><a href=\"%s\">Back to parent dir</a></td>", *m_Directory) ;
else
C << "<td> </td>" ;
}
C << "\t</tr>\n" ;
}
// Do table rows (directories)
for (x = 0; x < dirents.Count() ; x++)
{
de = dirents[x] ;
if (!de.IsDir())
continue ;
C << "\t<tr>" ;
for (ci = m_Cols ; ci.Valid() ; ci++)
{
col = ci.Element() ;
if (col.m_Title == "Mtime") { date.SetByEpoch(de.Mtime()) ; C.Printf("<td>%s</td>", *date) ; }
else if (col.m_Title == "Type") C << "<td>DIR</td>" ;
else if (col.m_Title == "Size") C.Printf("<td alight=\"right\">%s</td>", FormalNumber(de.Size())) ;
else if (col.m_Title == "Name") C.Printf("<td><a href=\"%s-%s\"> %s</a></td>", *m_Directory, de.txtName(), de.txtName()) ;
else
C << "<td> </td>" ;
}
C << "\t</tr>\n" ;
}
// Do table rows (files)
for (x = 0; x < dirents.Count() ; x++)
{
de = dirents[x] ;
if (de.IsDir())
continue ;
C << "\t<tr>" ;
for (ci = m_Cols ; ci.Valid() ; ci++)
{
col = ci.Element() ;
if (col.m_Title == "Mtime")
{ date.SetByEpoch(de.Mtime()) ; C.Printf("<td>%s</td>", *date) ; }
else if (col.m_Title == "Type")
C << "<td>File</td>" ;
else if (col.m_Title == "Size")
C.Printf("<td alight=\"right\">%s</td>", FormalNumber(de.Size())) ;
else if (col.m_Title == "Name")
{
if (pE->m_Resarg)
C.Printf("<td><a href=\"/userdir/%s/%s\"> %s</a></td>", *pE->m_Resarg, de.txtName(), de.txtName()) ;
else
C.Printf("<td><a href=\"/userdir/%s\"> %s</a></td>", de.txtName(), de.txtName()) ;
}
else
C << "<td> </td>" ;
}
C << "\t</tr>\n" ;
}
C << "\t</table>\n</table>\n" ;
}
}