#ifndef ASCSTR_H
#define ASCSTR_H

#include "ftcmmn.h"

#define ASENUM                          DWORD
#define ASENUM_NONE                     0x00000000
#define ASENUM_EXT                      0x00000001
#define ASENUM_PROGID                   0x00000002
#define ASENUM_ACTION                   0x00000004
#define ASENUM_ASSOC_YES                0x10000000
#define ASENUM_ASSOC_NO                 0x20000000
#define ASENUM_ASSOC_ALL                (ASENUM_ASSOC_YES | ASENUM_ASSOC_NO)
#define ASENUM_NOEXCLUDED               0x40000000
#define ASENUM_NOEXPLORERSHELLACTION    0x80000000
#define ASENUM_NOEXE                    0x01000000
#define ASENUM_SHOWONLY                 0x02000000

#define ASENUM_MAINMASK                 0x00000007


#define AIINIT                          DWORD
#define AIINIT_NONE                     0x00000000
#define AIINIT_EXT                      0x00000001
#define AIINIT_PROGID                   0x00000002
#define AIINIT_ACTION                   0x00000004

// Watch out! Begin
// All flags in this section can be OR'ed with the other flags AIBOOL, AISTR, ...
// so keep these values "globally" unique.
#define AIALL                           DWORD
#define AIALL_NONE                      0x00000000
#define AIALL_PERUSER                   0x10000000
// Watch out! End

#define AISTR                           DWORD
#define AISTR_NONE                      0x00000000
// This returns an extension WITHOUT the dot
#define AISTR_EXT                       0x00000001 
// This returns an extension WITH the dot
#define AISTR_DOTEXT                    0x00000002
#define AISTR_PROGID                    0x00000004
#define AISTR_PROGIDDESCR               0x00000008
#define AISTR_APPPATH                   0x00000010
#define AISTR_APPFRIENDLY               0x00000020
#define AISTR_ACTION                    0x00000040
#define AISTR_PROGIDDEFAULTACTION       0x00000080
#define AISTR_ICONLOCATION              0x00000100
#define AISTR_ACTIONFRIENDLY            0x00000200

#define AIDWORD                         DWORD
#define AIDWORD_NONE                    0x00000000
#define AIDWORD_APPSMALLICON            0x00000001
#define AIDWORD_APPLARGEICON            0x00000002
#define AIDWORD_DOCSMALLICON            0x00000004
#define AIDWORD_DOCLARGEICON            0x00000008
#define AIDWORD_PROGIDEDITFLAGS         0x00000010
#define AIDWORD_ACTIONATTRIBUTES        0x00000020

#define AIBOOL                          DWORD
#define AIBOOL_CONFIRMOPEN              0x00000001
// removed quick view constant - dsheldon
#define AIBOOL_ALWAYSSHOWEXT            0x00000004
#define AIBOOL_BROWSEINPLACE            0x00000008
#define AIBOOL_BROWSEINPLACEENABLED     0x00000010
#define AIBOOL_EDITDESCR                0x00000020
#define AIBOOL_EDITDOCICON              0x00000040
#define AIBOOL_EDIT                     0x00000080
#define AIBOOL_EDITREMOVE               0x00000100
#define AIBOOL_EXTASSOCIATED            0x00000200
#define AIBOOL_EXTEXIST                 0x00000400
#define AIBOOL_EXCLUDE                  0x00000800
#define AIBOOL_SHOW                     0x00001000
#define AIBOOL_PERUSERINFOAVAILABLE     0x00002000
#define AIBOOL_PROGIDHASNOEXT           0x00004000

#define AIDATA                          DWORD
#define AIDATA_PROGIDACTION             0x00000001

class IAssocInfo : public IUnknown
{
public:
    // IUnknown methods
    STDMETHOD(QueryInterface)(REFIID riid, PVOID* ppv) PURE;
    STDMETHOD_(ULONG, AddRef)() PURE;
    STDMETHOD_(ULONG,Release)() PURE;

    // IAssocInfo methods
    //  Init
    STDMETHOD(Init)(AIINIT aiinitFlags, LPTSTR pszStr) PURE;
    STDMETHOD(InitComplex)(AIINIT aiinitFlags1, LPTSTR pszStr1,
        AIINIT aiinitFlags2, LPTSTR pszStr2) PURE;
    //  Get
    STDMETHOD(GetString)(AISTR aistrFlags, LPTSTR pszStr, DWORD* cchStr) PURE;
    STDMETHOD(GetDWORD)(AIDWORD aidwordFlags, DWORD* pdwdata) PURE;
    STDMETHOD(GetBOOL)(AIDWORD aiboolFlags, BOOL* pfBool) PURE;
    STDMETHOD(GetData)(AIDWORD aidataFlags, PBYTE pbData, DWORD* pcbData) PURE;
    //  Set
    STDMETHOD(SetString)(AISTR aistrFlags, LPTSTR pszStr) PURE;
    STDMETHOD(SetDWORD)(AIDWORD aidwordFlags, DWORD dwData) PURE;
    STDMETHOD(SetBOOL)(AIDWORD aiboolFlags, BOOL fBool) PURE;
    STDMETHOD(SetData)(AIDWORD aidataFlags, PBYTE pbData, DWORD cbData) PURE;
    //  Create
    STDMETHOD(Create)() PURE;
    //  Delete
    STDMETHOD(DelString)(AISTR aistrFlags) PURE;
    STDMETHOD(Delete)(AIALL aiallFlags) PURE;
};

class IEnumAssocInfo : public IUnknown
{
public:
    // IUnknown methods
    STDMETHOD(QueryInterface)(REFIID riid, PVOID* ppv) PURE;
    STDMETHOD_(ULONG, AddRef)() PURE;
    STDMETHOD_(ULONG, Release)() PURE;

    // IEnumAssocInfo methods
    //  Initialization
    STDMETHOD(Init)(ASENUM asenumFlags, LPTSTR pszStr,
        AIINIT aiinitFlags) PURE;

    //  Standard IEnum methods
    STDMETHOD(Next)(IAssocInfo** ppAI) PURE;
    STDMETHOD(Skip)(DWORD dwSkip) PURE;
    STDMETHOD(Reset)() PURE;
    STDMETHOD(Clone)(IEnumAssocInfo* pEnum) PURE;
};

class IAssocStore : public IUnknown
{
public:
    // IUnknown methods
    STDMETHOD(QueryInterface)(REFIID riid, PVOID* ppv) PURE;
    STDMETHOD_(ULONG, AddRef)() PURE;
    STDMETHOD_(ULONG,Release)() PURE;

    // IAssocStore methods
    //  Enum
    STDMETHOD(EnumAssocInfo)(ASENUM asenumFlags, LPTSTR pszStr, 
        AIINIT aiinitFlags, IEnumAssocInfo** ppEnum) PURE;
    //  Get/Set
    STDMETHOD(GetAssocInfo)(LPTSTR pszStr, AIINIT aiinitFlags, 
        IAssocInfo** ppAI) PURE;
    STDMETHOD(GetComplexAssocInfo)(LPTSTR pszStr1, AIINIT aiinitFlags1, 
        LPTSTR pszStr2, AIINIT aiinitFlags2, IAssocInfo** ppAI) PURE;
    // 
    STDMETHOD(CheckAccess)() PURE;
};

#endif //ASCSTR_H