//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\
//
// persist.h 
//
//   The definitions for cdf IPersistFile and IPersistFolder interfaces.  This
//   class is used as a base class by the CCdfView and CIconHandler.
//
//   History:
//
//       4/23/97  edwardp   Created.
//
////////////////////////////////////////////////////////////////////////////////

//
// Check for previous includes of this file.
//

#ifndef _PERSIST_H_

#define _PERSIST_H_

//
// Function prototypes.
//

HRESULT ClearGleamFlag(LPCTSTR pszURL, LPCTSTR pszPath);

HRESULT URLGetLocalFileName(LPCTSTR pszURL,
                            LPTSTR szLocalFile,
                            int cch,
                            FILETIME* pftLastMod);

HRESULT URLGetLastModTime(LPCTSTR pszURL, FILETIME* pftLastMod);

//
// Data types.
//

typedef enum _tagINITTYPE
{
    IT_UNKNOWN = 0,
    IT_FILE,
    IT_INI,
    IT_SHORTCUT
} INITTYPE;

//
// Parse flags.
//

#define PARSE_LOCAL                   0x00000001
#define PARSE_NET                     0x00000002
#define PARSE_REPARSE                 0x00000004
#define PARSE_REMOVEGLEAM             0x00000008

//
// Strings used by initialization helper functions.
//

#define TSTR_INI_FILE        TEXT(FILENAME_SEPARATOR_STR)##TEXT("desktop.ini")   // Must include leading \.
#define TSTR_INI_SECTION     TEXT("Channel")
#define TSTR_INI_URL         TEXT("CDFURL")
#define TSTR_INI_LOGO        TEXT("Logo")
#define TSTR_INI_WIDELOGO    TEXT("WideLogo")
#define TSTR_INI_ICON        TEXT("Icon")

//
// Function protoypes
//

#define WM_NAVIGATE         (WM_USER+1)
#define WM_NAVIGATE_PANE    (WM_USER+2)

LRESULT CALLBACK NavigateWndProc(HWND hwnd, UINT msg, WPARAM wParam,
                                 LPARAM lParam);


//
// Class definition for CPersist
//

class CPersist : public IPersistFile,
                 public IPersistFolder,
                 public IPersistMoniker,
                 public IOleObject
{
//
// Methods.
//

public:
    
    // Constructor and destructor.
    CPersist(void);
    CPersist(BOOL bCdfParsed);
    ~CPersist(void);

    //IUnknown - Pure virtual functions.
    // IUnknown
    virtual STDMETHODIMP         QueryInterface(REFIID, void **) PURE;
    virtual STDMETHODIMP_(ULONG) AddRef(void) PURE;
    virtual STDMETHODIMP_(ULONG) Release(void) PURE;

    //IPersist - Shared by IPersistFile and IPersistFolder.
    STDMETHODIMP GetClassID(LPCLSID lpClassID);

    //IPersistFile
    STDMETHODIMP IsDirty(void);
    STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode);
    STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember);
    STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName);
    STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName);

    // IPersistFolder
    virtual STDMETHODIMP Initialize(LPCITEMIDLIST pidl);

    // IPersistMoniker
    //STDMETHODIMP IsDirty(void);

    STDMETHODIMP Load(BOOL fFullyAvailable, IMoniker* pIMoniker,
                      IBindCtx* pIBindCtx, DWORD grfMode);

    STDMETHODIMP Save(IMoniker* pIMoniker, IBindCtx* pIBindCtx, BOOL fRemember);
    STDMETHODIMP SaveCompleted(IMoniker* pIMoniker, IBindCtx* pIBindCtx);
    STDMETHODIMP GetCurMoniker(IMoniker** ppIMoniker);

    // IOleObject.
    STDMETHODIMP SetClientSite(IOleClientSite *pClientSite);
    STDMETHODIMP GetClientSite(IOleClientSite **ppClientSite);
    STDMETHODIMP SetHostNames(LPCOLESTR szContainerApp,
                              LPCOLESTR szContainerObj);
    STDMETHODIMP Close(DWORD dwSaveOption);
    STDMETHODIMP SetMoniker(DWORD dwWhichMoniker, IMoniker *pmk);
    STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker,
                            IMoniker **ppmk);
    STDMETHODIMP InitFromData(IDataObject *pDataObject, BOOL fCreation,
                              DWORD dwReserved);
    STDMETHODIMP GetClipboardData(DWORD dwReserved,IDataObject **ppDataObject);
    STDMETHODIMP DoVerb(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,
                        LONG lindex,HWND hwndParent,LPCRECT lprcPosRect);
    STDMETHODIMP EnumVerbs(IEnumOLEVERB **ppEnumOleVerb);
    STDMETHODIMP Update(void);
    STDMETHODIMP IsUpToDate(void);
    STDMETHODIMP GetUserClassID(CLSID *pClsid);
    STDMETHODIMP GetUserType(DWORD dwFormOfType, LPOLESTR *pszUserType);
    STDMETHODIMP SetExtent(DWORD dwDrawAspect, SIZEL *psizel);
    STDMETHODIMP GetExtent(DWORD dwDrawAspect, SIZEL *psizel);
    STDMETHODIMP Advise(IAdviseSink *pAdvSink, DWORD *pdwConnection);
    STDMETHODIMP Unadvise(DWORD dwConnection);
    STDMETHODIMP EnumAdvise(IEnumSTATDATA **ppenumAdvise);
    STDMETHODIMP GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus);
    STDMETHODIMP SetColorScheme(LOGPALETTE *pLogpal);

//protected:

    //Helper functions derived classes can call.
    HRESULT  ParseCdf(HWND hwndOwner, IXMLDocument** ppIXMLDocument, 
                      DWORD dwParseFlags);

    BSTR     ReadFromIni(LPCTSTR pszKey);

    BOOL     IsUnreadCdf(void);
    BOOL     IsRecentlyChangedURL(LPCTSTR pszURL);

private:

    // Internal helper functions.
    HRESULT  Parse(LPTSTR szURL, IXMLDocument** ppIXMLDocument);
    INITTYPE GetInitType(LPTSTR szPath);
    BOOL     ReadFromIni(LPCTSTR pszKey, LPTSTR szOut, int cch);
    HRESULT  InitializeFromURL(LPTSTR szURL, IXMLDocument** ppIXMLDocument,
                               DWORD dwParseFlags);

    HRESULT  OpenChannel(LPCWSTR pszSubscribedURL);
    HWND     CreateNavigationWorkerWindow(HWND hwndParent,
                                          IWebBrowser2* pIWebBrowser2);

    void QuickCheckInitType( void );
//
// Member variables.
//

protected:

    BOOL            m_bCdfParsed;
    TCHAR           m_szPath[INTERNET_MAX_URL_LENGTH];
    LPOLESTR        m_polestrURL;
    IWebBrowser2*   m_pIWebBrowser2;
    HWND            m_hwnd;
    IXMLDocument*   m_pIXMLDocument;
    BOOL            m_fPendingNavigation;
    INITTYPE        m_rgInitType;

#ifdef IMP_CLIENTSITE

    IOleClientSite* m_pOleClientSite;

#endif
};

#endif // _PERSIST_H_