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 TypeFunction nameArguments
voidhdsDirlist::Generate(hzChain&,hzHttpEvent*,uint32_t&,)

Declared in file: hzDissemino.h
Defined in file : hdsGenerate.cpp

Function Logic:

0:START 1:items 2:unknown 3:items 4:rpath m_pApp apath crit items 5:unknown 6:unknown 7:items 8:unknown 9:de 10:unknown 11:items 12:items 13:unknown 14:items 15:unknown 16:items 17:unknown 18:unknown 19:unknown 20:dirents 21:unknown 22:unknown 23:dirents 24:unknown 25:unknown 26:dirents 27:unknown 28:unknown 29:dirents 30:items items items items items 31:unknown 32:col items 33:items 34:unknown 35:items 36:unknown 37:col 38:unknown 39:items 40:col.m_Title==Type 41:items 42:col.m_Title==Size 43:items 44:col.m_Title==Name 45:items 46:items 47:items 48:unknown 49:de 50:unknown 51:items 52:unknown 53:col 54:unknown 55:items items 56:col.m_Title==Type 57:items 58:col.m_Title==Size 59:items 60:col.m_Title==Name 61:items 62:items 63:items 64:unknown 65:de 66:unknown 67:items 68:unknown 69:col 70:unknown 71:items items 72:col.m_Title==Type 73:items 74:col.m_Title==Size 75:items 76:col.m_Title==Name 77:unknown 78:items 79:items 80:items 81:items 82:items 83: No text

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" ;
   }
}