/*****************************************************************************
 *	ftpeidl.h
 *****************************************************************************/

#ifndef _FTPEIDL_H
#define _FTPEIDL_H

#include "cowsite.h"


/*****************************************************************************
 *
 *	CFtpEidl
 *
 *	The stuff that tracks the state of an enumeration.
 *
 *****************************************************************************/

class CFtpEidl          : public IEnumIDList
                        , public CObjectWithSite
{
public:
    //////////////////////////////////////////////////////
    // Public Interfaces
    //////////////////////////////////////////////////////
    
    // *** IUnknown ***
    virtual STDMETHODIMP_(ULONG) AddRef(void);
    virtual STDMETHODIMP_(ULONG) Release(void);
    virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
    
    // *** IEnumIDList ***
    virtual STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched);
    virtual STDMETHODIMP Skip(ULONG celt);
    virtual STDMETHODIMP Reset(void);
    virtual STDMETHODIMP Clone(IEnumIDList **ppenum);

public:
    CFtpEidl();
    ~CFtpEidl(void);

    // Friend Functions
    friend HRESULT CFtpEidl_Create(CFtpDir * pfd, CFtpFolder * pff, HWND hwndOwner, DWORD shcontf, IEnumIDList ** ppenum);

protected:
    // Private Member Variables

    int                     m_cRef;
    BITBOOL                 m_fInited : 1;      // Have we been inited?
    BITBOOL                 m_fDead : 1;        // Is this enumerator dead because we had to do a redirect (because password was needed or was invalid).
    BITBOOL                 m_fErrorDisplayed : 1; // Only show one error per enum.  This is how we keep track.
    DWORD                   m_nIndex;           // Current Item in the list
    DWORD                   m_shcontf;          // Filter flags
    CFtpPidlList *          m_pflHfpl;          // Where the cache lives
    CFtpDir *               m_pfd;              // My FtpDir
    CFtpFolder *            m_pff;              // My FtpDir
    IMalloc *               m_pm;               // Today's itemid allocator
    HWND                    m_hwndOwner;        // My UI window
    HRESULT                 m_hrOleInited;      // We need to Init Ole because of Win95's Shell32 doesn't do that on the background enum thread.
// CAN DO: Someday we could implement hiden files:  int m_cHiddenFiles;


    // Public Member Functions
    BOOL _fFilter(DWORD shcontf, DWORD dwFAFLFlags);
    HRESULT _Init(void);
    LPITEMIDLIST _NextOne(DWORD * pdwIndex);
    HRESULT _PopulateItem(HINTERNET hint0, HINTPROCINFO * phpi);
    HRESULT _AddFindDataToPidlList(LPCITEMIDLIST pidl);
    HRESULT _HandleSoftLinks(HINTERNET hint, LPITEMIDLIST pidl, LPWIRESTR pwCurrentDir, DWORD cchSize);
    BOOL _IsNavigationItem(LPWIN32_FIND_DATA pwfd);
    static HRESULT _PopulateItemCB(HINTERNET hint0, HINTPROCINFO * phpi, LPVOID pvCFtpEidl, BOOL * pfReleaseHint) {return ((CFtpEidl *)pvCFtpEidl)->_PopulateItem(hint0, phpi);};

    
    // Friend Functions
    friend HRESULT CFtpEidl_Create(CFtpDir * pfd, CFtpFolder * pff, HWND hwndOwner, DWORD shcontf, CFtpEidl ** ppfe);
    friend HRESULT CFtpEidl_Create(CFtpDir * pfd, CFtpFolder * pff, HWND hwndOwner, DWORD shcontf, DWORD dwIndex, IEnumIDList ** ppenum);
};

#endif // _FTPEIDL_H