//Copyright (c) 1998 - 1999 Microsoft Corporation

//
// subcomp.h
// defines a subcomponent class
//

#ifndef _subcomp_h_
#define _subcomp_h_

#include "hydraoc.h"

#define RUNONCE_SECTION_KEYWORD     _T("RunOnce.Setup")
#define RUNONCE_DEFAULTWAIT         5 * 60 * 1000 // 5 mins default wait for process to complete.
#define RUNONCE_CMDBUFSIZE          512

class OCMSubComp
{
    private:
    LONG m_lTicks;

    public:
    enum ESections
    {
        kFileSection,
        kRegistrySection,
        kDiskSpaceAddSection
    };

    OCMSubComp ();

    void    Tick (DWORD  dwTickCount  =  1);
    void    TickComplete ();

    BOOL    HasStateChanged() const;
    BOOL    GetCurrentSubCompState () const;
    BOOL    GetOriginalSubCompState () const;
    DWORD   LookupTargetSection (LPTSTR szTargetSection, DWORD dwSize, LPCTSTR lookupSection);
    DWORD   GetTargetSection (LPTSTR szTargetSection, DWORD dwSize, ESections eSectionType, BOOL *pbNoSection);

    virtual LPCTSTR GetSubCompID    () const = 0;
    virtual LPCTSTR GetSectionToBeProcessed (ESections) const = 0;


    //
    // default implementaion is provided for all these
    //
    virtual BOOL Initialize ();
    virtual BOOL BeforeCompleteInstall  ();
    virtual BOOL AfterCompleteInstall   ();

    virtual DWORD GetStepCount          () const;

    virtual DWORD OnQuerySelStateChange (BOOL bNewState, BOOL bDirectSelection) const;
    virtual DWORD OnQueryState          (UINT uiWhichState) const;
    virtual DWORD OnCalcDiskSpace       (DWORD addComponent, HDSKSPC dspace);
    virtual DWORD OnQueueFiles          (HSPFILEQ queue);
    virtual DWORD OnCompleteInstall     ();
    virtual DWORD OnAboutToCommitQueue  ();

    // implemented by this class.
    DWORD OnQueryStepCount              ();

    virtual VOID SetupRunOnce( HINF inf, LPCTSTR SectionName );


};

#endif // _subcomp_h_