/*
 * urlprop.h - URL properties class implementation description.
 */

#ifndef _URLPROP_H_
#define _URLPROP_H_

#include "propstg.h"

#ifdef __cplusplus

// URL Property object

class URLProp : public IPropertyStorage
    {
private:
    ULONG       m_cRef;
    CLSID       m_clsid;
    FMTID       m_fmtid;
    DWORD       m_grfFlags;

    // private methods

protected:
    HPROPSTG    m_hstg;
    FILETIME    m_ftModified;
    FILETIME    m_ftCreated;
    FILETIME    m_ftAccessed;

public:
    URLProp(void);
    virtual ~URLProp(void);

    // IUnknown methods
    
    virtual STDMETHODIMP  QueryInterface(REFIID riid, PVOID *ppvObj);
    virtual STDMETHODIMP_(ULONG) AddRef(void);
    virtual STDMETHODIMP_(ULONG) Release(void);
    
    // IPropertyStorage methods

    virtual STDMETHODIMP ReadMultiple(ULONG cpspec, const PROPSPEC rgpspec[], PROPVARIANT rgvar[]);
    virtual STDMETHODIMP WriteMultiple(ULONG cpspec, const PROPSPEC rgpspec[], const PROPVARIANT rgvar[], PROPID propidNameFirst);
    virtual STDMETHODIMP DeleteMultiple(ULONG cpspec, const PROPSPEC rgpspec[]);
    virtual STDMETHODIMP ReadPropertyNames(ULONG cpropid, const PROPID rgpropid[], LPOLESTR rglpwstrName[]);
    virtual STDMETHODIMP WritePropertyNames(ULONG cpropid, const PROPID rgpropid[], const LPOLESTR rglpwstrName[]);
    virtual STDMETHODIMP DeletePropertyNames(ULONG cpropid, const PROPID rgpropid[]);
    virtual STDMETHODIMP SetClass(REFCLSID clsid);
    virtual STDMETHODIMP Commit(DWORD grfCommitFlags);
    virtual STDMETHODIMP Revert(void);
    virtual STDMETHODIMP Enum(IEnumSTATPROPSTG** ppenm);
    virtual STDMETHODIMP Stat(STATPROPSETSTG* pstatpsstg);
    virtual STDMETHODIMP SetTimes(const FILETIME* pmtime, const FILETIME* pctime, const FILETIME* patime);

    // other methods
    
    virtual STDMETHODIMP Init(void);

    STDMETHODIMP GetProp(PROPID pid, LPTSTR pszBuf, int cchBuf);
    STDMETHODIMP GetProp(PROPID pid, int * piVal);
    STDMETHODIMP GetProp(PROPID pid, LPDWORD pdwVal);
    STDMETHODIMP GetProp(PROPID pid, WORD * pwVal);
    STDMETHODIMP GetProp(PROPID pid, IStream **ppStream);
    STDMETHODIMP SetProp(PROPID pid, LPCTSTR psz);
    STDMETHODIMP SetProp(PROPID pid, int iVal);
    STDMETHODIMP SetProp(PROPID pid, DWORD dwVal);
    STDMETHODIMP SetProp(PROPID pid, WORD wVal);
    STDMETHODIMP SetProp(PROPID pid, IStream *pStream);

    STDMETHODIMP IsDirty(void);

#ifdef DEBUG
    virtual STDMETHODIMP_(void) Dump(void);
    friend BOOL IsValidPCURLProp(const URLProp *pcurlprop);
#endif

    };

typedef URLProp * PURLProp;
typedef const URLProp CURLProp;
typedef const URLProp * PCURLProp;


// Internet Shortcut Property object

class IntshcutProp : public URLProp
    {

    typedef URLProp super;

private:
    TCHAR       m_szFile[MAX_PATH];

    // private methods

    STDMETHODIMP LoadFromFile(LPCTSTR pszFile);

public:
    IntshcutProp(void);
    ~IntshcutProp(void);

    // IPropertyStorage methods

    virtual STDMETHODIMP Commit(DWORD grfCommitFlags);

    // other methods
    
    STDMETHODIMP Init(void);
    STDMETHODIMP InitFromFile(LPCTSTR pszFile);

    STDMETHODIMP SetFileName(LPCTSTR pszFile);
    STDMETHODIMP SetURLProp(LPCTSTR pszURL, DWORD dwFlags);
    STDMETHODIMP SetIDListProp(LPCITEMIDLIST pcidl);

    STDMETHODIMP SetProp(PROPID pid, LPCTSTR psz);
    STDMETHODIMP SetProp(PROPID pid, int iVal)          { return super::SetProp(pid, iVal); }
    STDMETHODIMP SetProp(PROPID pid, DWORD dwVal)       { return super::SetProp(pid, dwVal); }
    STDMETHODIMP SetProp(PROPID pid, WORD wVal)         { return super::SetProp(pid, wVal); }
    STDMETHODIMP SetProp(PROPID pid, IStream *pStream)  { return super::SetProp(pid, pStream); }

#ifdef DEBUG
    virtual STDMETHODIMP_(void) Dump(void);
    friend BOOL IsValidPCIntshcutProp(const IntshcutProp *pcisprop);
#endif

    };

typedef IntshcutProp * PIntshcutProp;
typedef const IntshcutProp CIntshcutProp;
typedef const IntshcutProp * PCIntshcutProp;

class Intshcut;

// Internet Site Property object

class IntsiteProp : public URLProp
    {
private:
    TCHAR       m_szURL[INTERNET_MAX_URL_LENGTH];
    Intshcut *  m_pintshcut;
    BOOL        m_fPrivate;

    // private methods

    STDMETHODIMP LoadFromDB(LPCTSTR pszURL);

public:
    IntsiteProp(void);
    ~IntsiteProp(void);

    // IPropertyStorage methods

    virtual STDMETHODIMP Commit(DWORD grfCommitFlags);

    // other methods
    
    STDMETHODIMP Init(void);
    STDMETHODIMP InitFromDB(LPCTSTR pszURL, Intshcut * pintshcut, BOOL fPrivObj);

#ifdef DEBUG
    virtual STDMETHODIMP_(void) Dump(void);
    friend BOOL IsValidPCIntsiteProp(const IntsiteProp *pcisprop);
#endif

    };

typedef IntsiteProp * PIntsiteProp;
typedef const IntsiteProp CIntsiteProp;
typedef const IntsiteProp * PCIntsiteProp;


DWORD
SchemeTypeFromURL(
   LPCTSTR pszURL);

#endif  // __cplusplus


//
// Prototypes for all modules
//

#ifdef __cplusplus
extern "C" {
#endif

typedef const PARSEDURL CPARSEDURL;
typedef const PARSEDURL * PCPARSEDURL;

STDAPI
CIntshcutProp_CreateInstance(
   IN  LPUNKNOWN punkOuter, 
   IN  REFIID    riid, 
   OUT LPVOID *  ppvOut);

STDAPI
CIntsiteProp_CreateInstance(
   IN  LPUNKNOWN punkOuter, 
   IN  REFIID    riid, 
   OUT LPVOID *  ppvOut);


// Worker routines for updating the ini file corresponding to a shortcut

HRESULT 
ReadStringFromFile(IN  LPCTSTR    pszFile, 
                   IN  LPCTSTR    pszSectionName,
                   IN  LPCTSTR    pszName,
                   OUT LPWSTR *   ppwsz,
                   IN  CHAR *     pszBuf);

HRESULT 
ReadBStrFromFile(IN  LPCTSTR      pszFile, 
                 IN  LPCTSTR      pszSectionName,
                 IN  LPCTSTR      pszName,
                 OUT BSTR *       pBstr);

HRESULT
ReadUnsignedFromFile(
    IN  LPCTSTR pszFile,
    IN  LPCTSTR pszSectionName,
    IN  LPCTSTR pszName,
    OUT LPDWORD pdwVal);

HRESULT 
WriteGenericString(
    IN LPCTSTR pszFile, 
    IN LPCTSTR pszSectionName,
    IN LPCTSTR pszName,
    IN LPCWSTR pwsz);

HRESULT 
WriteSignedToFile(
    IN LPCTSTR  pszFile,
    IN LPCTSTR  pszSectionName,
    IN LPCTSTR  pszName,
    IN int      nVal);

HRESULT 
WriteUnsignedToFile(
    IN LPCTSTR  pszFile,
    IN LPCTSTR  pszSectionName,
    IN LPCTSTR  pszName,
    IN DWORD    nVal);

HRESULT 
ReadURLFromFile(
    IN  LPCTSTR  pszFile, 
    IN  LPCTSTR pszSectionName,
    OUT LPTSTR * ppsz);

HRESULT 
ReadBinaryFromFile(
   IN LPCTSTR pszFile,
   IN LPCTSTR pszSectionName,
   IN LPCTSTR pszName,
   IN LPVOID  pvData,
   IN DWORD   cbData);

HRESULT 
WriteBinaryToFile(
  IN LPCTSTR pszFile,
  IN  LPCTSTR pszSectionName,
  IN LPCTSTR pszName,
  IN LPVOID  pvData,
  IN DWORD   cbSize);

#define DeletePrivateProfileString(pszSection, pszKey, pszFile) \
WritePrivateProfileString(pszSection, pszKey, NULL, pszFile)
#define SHDeleteIniString(pszSection, pszKey, pszFile) \
           SHSetIniString(pszSection, pszKey, NULL, pszFile)
#ifdef __cplusplus
};  // extern "C"
#endif

#endif  // _URLPROP_H_