Return TypeFunction nameArguments
hzEcodehzFtpClient::GetDirList(hzVect<hzDirent>&,const hzString&,)

Declared in file: hzFtpClient.h
Defined in file : hzFtpClient.cpp

Function Logic:

0:START 1:nTry 2:nTry<2; 3:nTry==1 4:hzTcpClient::Close hzTcpClient::Close hzFtpClient::_reconnect rc 5:rc!=E_OK 6:hzFtpClient::_openpasv rc 7:rc!=E_OK 8:Criteria 9:sprintf 10:sprintf 11:strlen len 12:(rc=m_ConnControl.Send(m_c_sbuf,len))!=E_OK 13:(rc=_ftprecv(nRecv,*_fn))!=E_OK 14:m_nRescode!=150 15:hzFtpClient::_logrescode rc 16:nTotal hzChain::Clear nTryData 17:nTryData<3; 18:hzTcpClient::Recv rc 19:rc!=E_OK 20:!nRecv 21:nTotal m_x_rbuf items 22:hzTcpClient::Close 23:rc==E_TIMEOUT||nTryData==3 24:rc==E_RECVFAIL 25:Listing.Size() 26:(rc=_ftprecv(nRecv,*_fn))!=E_OK 27:m_nRescode!=226 28:rc 29:rc==E_OK 30:!Listing.Size() 31:Return rc 32:j z 33:!z.eof(); 34:*z==(char)13 35:*z==(char)10 36:* j hzFtpClient::_setmetafile rc 37:rc!=E_OK 38:hzVect::Add rc 39:rc!=E_OK 40:* 41:m_nTries 42:Return rc 43:Return rc

Function body:

hzEcode hzFtpClient::GetDirList (hzVect<hzDirent>& listing, const hzString& Criteria)
{
   _hzfunc("hzFtpClient::GetDirList") ;
   hzTcpClient     X ;
   hzDirent        meta ;
   hzChain         Listing ;
   hzChain::Iter   z ;
   hzString        filename ;
   uint32_t        nRecv ;
   uint32_t        nTotal ;
   uint32_t        len ;
   uint32_t        nTry ;
   uint32_t        nTryData ;
   char*           j ;
   char            cvLine [300];
   hzEcode         rc = E_OK ;
   /*
   **  ** Loop round until success
   **      */
   for (nTry = 0; nTry < 2; nTry++)
   {
       if (nTry == 1)
       {
           X.Close() ;
           m_ConnControl.Close() ;
           rc = _reconnect() ;
           if (rc != E_OK)
               break ;
       }
       rc = _openpasv(X) ;
       if (rc != E_OK)
       {
           threadLog("Failed PASV .. aborting\n") ;
           continue ;
       }
       if (Criteria)
           sprintf(m_c_sbuf, "LIST %s\r\n", *Criteria) ;
       else
           sprintf(m_c_sbuf, "LIST\r\n") ;
       len = strlen(m_c_sbuf) ;
       if ((rc = m_ConnControl.Send(m_c_sbuf, len)) != E_OK)
       {
           threadLog("Could not send LIST command\n") ;
           continue ;
       }
       if ((rc = _ftprecv(nRecv, *_fn)) != E_OK)
       {
           threadLog("Did not recieve a response to LIST command\n") ;
           continue ;
       }
       if (m_nRescode != 150)
       {
           threadLog("Expected code of 150 but got %d. Aborting\n", m_nRescode) ;
           _logrescode() ;
           rc = E_PROTOCOL ;
           break ;
       }
       nTotal = 0;
       Listing.Clear() ;
       for (nTryData = 0; nTryData < 3;)
       {
           rc = X.Recv(m_x_rbuf, nRecv, HZ_MAXPACKET) ;
           if (rc != E_OK)
           {
               threadLog("LIST: Read failed (total so far %d bytes)\n", nTotal) ;
               break ;
           }
           if (!nRecv)
               break ;
           nTotal += nRecv ;
           m_x_rbuf[nRecv] = 0;
           Listing << m_x_rbuf ;
       }
       X.Close() ;
       if (rc == E_TIMEOUT || nTryData == 3)
           continue ;
       if (rc == E_RECVFAIL)
           continue ;
       if (Listing.Size())
           threadLog("LIST: Total listing %d bytes\n", nTotal) ;
       else
           threadLog("LIST: Empty list. No files\n") ;
       if ((rc = _ftprecv(nRecv, *_fn)) != E_OK)
       {
           threadLog("Did not recieve a response to LIST command\n") ;
           continue ;
       }
       if (m_nRescode != 226)
       {
           threadLog("LIST: Expected code of 226 (Xfer complete) but got %d. Aborting\n", m_nRescode) ;
           rc = E_PROTOCOL ;
       }
       break ;
   }
   if (rc == E_OK)
   {
       if (!Listing.Size())
           return rc ;
       j = cvLine ;
       for (z = Listing ; !z.eof() ; z++)
       {
           if (*z == CHAR_CR)
               continue ;
           if (*z == CHAR_NL)
           {
               *j = 0;
               j = cvLine ;
               rc = _setmetafile(meta, cvLine) ;
               if (rc != E_OK)
                   break ;
               rc = listing.Add(meta) ;
               if (rc != E_OK)
                   break ;
               continue ;
           }
           *j++ = *z ;
       }
       m_nTries = 0;
       return rc ;
   }
   threadLog("Could not get directory listing\n\n") ;
   return rc ;
}