#ifndef _INC_COMMNEWSACT
#define _INC_COMMNEWSACT

typedef struct tagCOMMNEWSACCTINFO
    {
    DWORD_PTR dwCookie;
    char szUserPath[MAX_PATH];
    char szDisplay[CCHMAX_ACCOUNT_NAME];
    } COMMNEWSACCTINFO;

typedef struct tagNEWSSERVERS
{
    struct  tagNEWSSERVERS *pNext;
    char    szServerName[MAX_PATH];
    char    szFilePath[MAX_PATH];
}NEWSSERVERS;

#define NEWSUSERCOLS    512
#define NEWSUSERROWS    4

// {0FF15AA0-2F93-11d1-83B0-00C04FBD7C09}
DEFINE_GUID(CLSID_CEnumCOMMNEWSACCT, 0xff15aa0, 0x2f93, 0x11d1, 0x83, 0xb0, 0x0, 0xc0, 0x4f, 0xbd, 0x7c, 0x9);

class CEnumCOMMNEWSACCT : public IEnumIMPACCOUNTS
    {
    private:
        ULONG           m_cRef;
        int             m_iInfo;
        UINT            m_cInfo;
        COMMNEWSACCTINFO    *m_rgInfo;

    public:
        CEnumCOMMNEWSACCT(void);
        ~CEnumCOMMNEWSACCT(void);

        STDMETHODIMP QueryInterface(REFIID, LPVOID *);
        STDMETHODIMP_(ULONG) AddRef(void);
        STDMETHODIMP_(ULONG) Release(void);
        
        HRESULT STDMETHODCALLTYPE Next(IMPACCOUNTINFO *pinfo);
        HRESULT STDMETHODCALLTYPE Reset(void);

        HRESULT Init(COMMNEWSACCTINFO *pinfo, int cinfo);
    };

// {0FF15AA1-2F93-11d1-83B0-00C04FBD7C09}
DEFINE_GUID(CLSID_CCommNewsAcctImport, 0xff15aa1, 0x2f93, 0x11d1, 0x83, 0xb0, 0x0, 0xc0, 0x4f, 0xbd, 0x7c, 0x9);

class CCommNewsAcctImport : public IAccountImport, public IAccountImport2
    {
    private:
        ULONG               m_cRef;
        BOOL                m_fIni;
        TCHAR               m_szIni[MAX_PATH];
        char                *m_szSubList;
        UINT                m_cInfo;
        COMMNEWSACCTINFO    *m_rgInfo;
        NEWSSERVERS         *m_rgServ;
        DWORD               m_nNumServ;
        DWORD               m_dwSelServ;

        HRESULT GetUserPrefs(char *szUserPath, char szUserPrefs[][NEWSUSERCOLS], int nInLoop, BOOL *pbPop);
        HRESULT GetSubListGroups(char *pFileName, char **pListGroups);
        HRESULT GetNumAccounts(DWORD_PTR dwCookie);
        HRESULT IsValidUser(char *pszFilePath);
        HRESULT IGetSettings(DWORD_PTR dwCookie, IImnAccount *pAcct, IMPCONNINFO *pInfo);

    public:
        CCommNewsAcctImport(void);
        ~CCommNewsAcctImport(void);

        STDMETHODIMP QueryInterface(REFIID, LPVOID *);
        STDMETHODIMP_(ULONG) AddRef(void);
        STDMETHODIMP_(ULONG) Release(void);
        
        // Methods from the IAccountImport interface.        
        HRESULT STDMETHODCALLTYPE AutoDetect(DWORD *pcAcct, DWORD dwReserved);
        HRESULT STDMETHODCALLTYPE EnumerateAccounts(IEnumIMPACCOUNTS **ppEnum);
        HRESULT STDMETHODCALLTYPE GetSettings(DWORD_PTR dwCookie, IImnAccount *pAcct);

        // Methods from the IAccountImport2 interface.
        HRESULT STDMETHODCALLTYPE InitializeImport(HWND hwnd, DWORD_PTR dwCookie);
        HRESULT STDMETHODCALLTYPE GetNewsGroup(INewsGroupImport *pImp, DWORD dwReserved);
        HRESULT STDMETHODCALLTYPE GetSettings2(DWORD_PTR dwCookie, IImnAccount *pAcct, IMPCONNINFO *pInfo);
    };

#endif // _INC_COMMNEWSACT