#ifndef __WBEM_EMAIL_CONSUMER__H_
#define __WBEM_EMAIL_CONSUMER__H_

#include <unk.h>


#include <wbemidl.h>
#include <mapix.h>

#include "txttempl.h"

class CEmailConsumer : public CUnk
{
protected:
    class XProvider : public CImpl<IWbemEventConsumerProvider, CEmailConsumer>
    {
    public:
        XProvider(CEmailConsumer* pObj)
            : CImpl<IWbemEventConsumerProvider, CEmailConsumer>(pObj){}
    
        HRESULT STDMETHODCALLTYPE FindConsumer(
                    IWbemClassObject* pLogicalConsumer,
                    IWbemUnboundObjectSink** ppConsumer);
    } m_XProvider;
    friend XProvider;

protected:
    HANDLE m_hAttention;
    HANDLE m_hDone;
    HANDLE m_hThread;
    IWbemClassObject* m_pLogicalConsumer;
    IStream* m_pStream;

    static DWORD staticWorker(void*);
    void Worker();
public:
    CEmailConsumer(CLifeControl* pControl = NULL, IUnknown* pOuter = NULL);
    ~CEmailConsumer();
    void* GetInterface(REFIID riid);
};


class CEmailSink : public CUnk
{
protected:
    class XSink : public CImpl<IWbemUnboundObjectSink, CEmailSink>
    {
    public:
        XSink(CEmailSink* pObj) : 
            CImpl<IWbemUnboundObjectSink, CEmailSink>(pObj){}

        HRESULT STDMETHODCALLTYPE IndicateToConsumer(
            IWbemClassObject* pLogicalConsumer, long lNumObjects, 
            IWbemClassObject** apObjects);
    } m_XSink;
    friend XSink;

protected:
    IMAPISession* m_pSession;
    IMAPIFolder* m_pOutbox;
    IMsgStore* m_pStore;
    IAddrBook* m_pAddrBook;
    ADRLIST* m_pAddrList;

    CTextTemplate m_SubjectTemplate;
    CTextTemplate m_MessageTemplate;

    WString m_wsProfile;
    WString m_wsAddressee;

public:
    CEmailSink(CLifeControl* pControl = NULL);
    ~CEmailSink();

    HRESULT Initialize(IWbemClassObject* pLogicalConsumer);

    void* GetInterface(REFIID riid);
};

#endif