text: #ifndef OFFLINE_CPP_H
  #define OFFLINE_CPP_H
  
  #ifdef __cplusplus
  
  //  #include <debug.h>
  //  #include <crtfree.h>
  
  // Forward class declarations
  class COfflineFolderEnum;
  class COfflineFolder;
  class COfflineObjectItem;
  class COfflineDropTarget;
  
  #define PROP_WEBCRAWL_SIZE      0x00000001
  #define PROP_WEBCRAWL_FLAGS     0x00000002
  #define PROP_WEBCRAWL_LEVEL     0x00000004
  #define PROP_WEBCRAWL_ACTUALSIZE    0x00000008
  #define PROP_WEBCRAWL_URL       0x00000010
  #define PROP_WEBCRAWL_NAME      0x00000020
  #define PROP_WEBCRAWL_EMAILNOTF 0x00000040
  #define PROP_WEBCRAWL_PSWD      0x00000080
  #define PROP_WEBCRAWL_UNAME     0x00000100
  #define PROP_WEBCRAWL_DESKTOP   0x00000200
  #define PROP_WEBCRAWL_RESCH     0x00000400
  #define PROP_WEBCRAWL_COOKIE    0x00000800
  #define PROP_WEBCRAWL_LAST      0x00001000
  #define PROP_WEBCRAWL_STATUS    0x00002000
  #define PROP_WEBCRAWL_CHANNEL   0x00004000
  #define PROP_WEBCRAWL_PRIORITY  0x00008000
  #define PROP_WEBCRAWL_GLEAM     0x00010000
  #define PROP_WEBCRAWL_CHANGESONLY   0x00020000
  #define PROP_WEBCRAWL_CHANNELFLAGS  0x00040000
  #define PROP_WEBCRAWL_ALL       0x0007FFFF
  #define PROP_WEBCRAWL_EXTERNAL  PROP_WEBCRAWL_ACTUALSIZE | PROP_WEBCRAWL_URL | \
                                  PROP_WEBCRAWL_NAME | PROP_WEBCRAWL_EMAILNOTF | \
                                  PROP_WEBCRAWL_RESCH | PROP_WEBCRAWL_LAST | \
                                  PROP_WEBCRAWL_DESKTOP | PROP_WEBCRAWL_CHANNEL |\
                                  PROP_WEBCRAWL_STATUS | PROP_WEBCRAWL_PRIORITY
  
  #define PROP_GENERAL_MASK       PROP_WEBCRAWL_PSWD | PROP_WEBCRAWL_UNAME
  #define PROP_RECEIVING_MASK     PROP_WEBCRAWL_SIZE | PROP_WEBCRAWL_FLAGS | \
                                  PROP_WEBCRAWL_CHANGESONLY | PROP_WEBCRAWL_EMAILNOTF \
                                  PROP_WEBCRAWL_PRIORITY | PROP_WEBCRAWL_LEVEL | \
                                  PROP_WEBCRAWL_CHANNELFLAGS
  #define PROP_SCHEDULE_MASK      PROP_WEBCRAWL_CHANNELFLAGS | PROP_WEBCRAWL_RESCH
  
  // Forwawd declarations for create instance functions 
  HRESULT COfflineObjectItem_CreateInstance(COfflineFolder *pOOFolder, UINT cidl, LPCITEMIDLIST *ppidl, REFIID riid, void **ppvOut);
  HRESULT DoDeleteSubscription(POOEntry);
  HRESULT FindURLProps(LPCTSTR, PROPVARIANT *);
  
  SUBSCRIPTIONSCHEDULE GetGroup(BOOL bDesktop, const CLSID& clsidDest, 
                                DWORD fChannelFlags, const NOTIFICATIONCOOKIE& groupCookie);
  inline SUBSCRIPTIONSCHEDULE GetGroup(POOEBuf pBuf)
  {
      ASSERT(pBuf);
      return GetGroup(pBuf->bDesktop, pBuf->clsidDest, pBuf->fChannelFlags, pBuf->groupCookie);
  }
  inline SUBSCRIPTIONSCHEDULE GetGroup(POOEntry pooe)
  {
      ASSERT(pooe);
      return GetGroup(pooe->bDesktop, pooe->clsidDest, pooe->fChannelFlags, pooe->groupCookie);
  }
  
  SUBSCRIPTIONTYPE GetItemCategory(BOOL bDesktop, const CLSID& clsidDest);
  inline SUBSCRIPTIONTYPE GetItemCategory(POOEBuf pBuf)
  {
      ASSERT(pBuf);
      return GetItemCategory(pBuf->bDesktop, pBuf->clsidDest);
  }
  
  inline SUBSCRIPTIONTYPE GetItemCategory(POOEntry pEntry)
  {
      ASSERT(pEntry);
      return GetItemCategory(pEntry->bDesktop, pEntry->clsidDest);
  }
  
  //////////////////////////////////////////////////////////////////////////////
  //
  // COfflineFolderEnum Object
  //
  //////////////////////////////////////////////////////////////////////////////
  
  class COfflineFolderEnum : public IEnumIDList
  {
  public:
      COfflineFolderEnum(DWORD grfFlags);
      
      // IUnknown Methods
      STDMETHODIMP QueryInterface(REFIID,void **);
      STDMETHODIMP_(ULONG) AddRef(void);
      STDMETHODIMP_(ULONG) Release(void);
  
      // IEnumIDList Methods 
      STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched);
      STDMETHODIMP Skip(ULONG celt);
      STDMETHODIMP Reset();
      STDMETHODIMP Clone(LPENUMIDLIST *ppenum);
  
      // Helper functions
  
      static LPMYPIDL NewPidl(DWORD);
      static void FreePidl(LPMYPIDL);
      static void EnsureMalloc();
      static IMalloc *s_pMalloc;
  
      HRESULT Initialize(COfflineFolder *pFolder);
  
  protected:
      ~COfflineFolderEnum();
  
      UINT                m_cRef;      // ref count
      UINT                m_grfFlags;  // enumeration flags 
  
  private:
      ULONG               m_nCount;
      ULONG               m_nCurrent;
      SUBSCRIPTIONCOOKIE  *m_pCookies;
      COfflineFolder      *m_pFolder;
  };
  
  //////////////////////////////////////////////////////////////////////////////
  //
  // COfflineFolder Object
  //
  //////////////////////////////////////////////////////////////////////////////
  
  class COfflineFolder : public IShellFolder, 
                         public IPersistFolder2,
                         public IContextMenu
  {
      // COfflineFolder interfaces
      friend COfflineObjectItem;
      friend COfflineDropTarget;
      friend COfflineFolderEnum;
      friend HRESULT OfflineFolderView_CreateInstance(COfflineFolder *pOOFolder, LPCITEMIDLIST pidl, void **ppvOut);
      friend HRESULT OfflineFolderView_DidDragDrop(HWND, IDataObject *pdo, DWORD dwEffect);
      friend LPMYPIDL ScheduleDefault(LPCTSTR, LPCTSTR, COfflineFolder *);
          
  public:
      COfflineFolder(void);
  
      // IUnknown Methods
      STDMETHODIMP QueryInterface(REFIID,void **);
      STDMETHODIMP_(ULONG) AddRef(void);
      STDMETHODIMP_(ULONG) Release(void);
     
      // IShellFolder methods
      STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbcReserved,
              LPOLESTR lpszDisplayName, ULONG *pchEaten,
              LPITEMIDLIST *ppidl, ULONG *pdwAttributes);
      STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD grfFlags,
              LPENUMIDLIST *ppenumIDList);
      STDMETHODIMP BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved,
              REFIID riid, void **ppvOut);
      STDMETHODIMP BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved,
              REFIID riid, void **ppvObj);
      STDMETHODIMP CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
      STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, void **ppvOut);
      STDMETHODIMP GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl,
              ULONG * rgfInOut);
      STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl,
              REFIID riid, UINT * prgfInOut, void **ppvOut);
      STDMETHODIMP GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD uFlags, LPSTRRET lpName);
      STDMETHODIMP SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl,
              LPCOLESTR lpszName, DWORD uFlags, LPITEMIDLIST * ppidlOut);
  
      // IPersist Methods 
      STDMETHODIMP GetClassID(LPCLSID lpClassID);
  
      // IPersistFolder
      STDMETHODIMP Initialize(LPCITEMIDLIST pidl);
  
      // IPersistFolder2
      STDMETHODIMP GetCurFolder(LPITEMIDLIST *ppidl);
  
      // IContextMenu Methods -- This handles the background context menus
      STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst,
                                    UINT idCmdLast, UINT uFlags);
  
      STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
  
      STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType,UINT *pwReserved,
                                    LPSTR pszName, UINT cchMax);
  
  protected:
      ~COfflineFolder();
  
      UINT            _cRef;
      LPITEMIDLIST    _pidl;      //  Clone;
  #define VIEWMODE_WEBCRAWLONLY   1
      UINT            viewMode;
  
  };
  
  
  class COfflineDetails : public IShellDetails
  {
  public:
      COfflineDetails(HWND hwndOwner);
  
      // IUnknown members
      STDMETHODIMP         QueryInterface(REFIID riid, void **ppv);
      STDMETHODIMP_(ULONG) AddRef();
      STDMETHODIMP_(ULONG) Release();
  
      // IShellDetails Methods
      STDMETHODIMP GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, LPSHELLDETAILS pDetails);
      STDMETHODIMP ColumnClick(UINT iColumn);
  
  private:
      ~COfflineDetails() {}
  
      HWND    m_hwndOwner;
      ULONG   m_cRef;
  };
  
  ////////////////////////////////////////////////////////////////////////////
  //
  // COfflineObjectItem Object
  //
  ////////////////////////////////////////////////////////////////////////////
  
  class COfflineObjectItem : public IContextMenu, 
                      #ifdef UNICODE
                             public IExtractIconA,
                      #endif
                             public IExtractIcon,
                             public IDataObject,
                             public IQueryInfo
  {
      // COfflineObjectItem interfaces
      friend HRESULT OfflineFolderView_DidDragDrop(HWND, IDataObject *pdo, DWORD dwEffect);
  
  public:
      COfflineObjectItem();
      HRESULT Initialize(COfflineFolder *pOOFolder, UINT cidl, LPCITEMIDLIST *ppidl);
  
      // IUnknown Methods
      STDMETHODIMP_(ULONG) AddRef(void);
      STDMETHODIMP_(ULONG) Release(void);
      STDMETHODIMP QueryInterface(REFIID,void **);
      
      // IContextMenu Methods
      STDMETHODIMP QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst,
                                    UINT idCmdLast, UINT uFlags);
  
      STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
  
      STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uType,UINT *pwReserved,
                                    LPSTR pszName, UINT cchMax);
  
      // IDataObject Methods...
      STDMETHODIMP GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM);
      STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
      STDMETHODIMP QueryGetData(LPFORMATETC pFE);
      STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut);
      STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL fRelease);
      STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum);
      STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD grfAdv, LPADVISESINK pAdvSink,
                              LPDWORD pdwConnection);
      STDMETHODIMP DUnadvise(DWORD dwConnection);
      STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *ppEnum);
      
      // IDataObject helper functions
      HRESULT _CreateHDROP(STGMEDIUM *pmedium);
      HRESULT _CreateNameMap(STGMEDIUM *pmedium);
      HRESULT _CreateFileDescriptor(STGMEDIUM *pSTM);
      HRESULT _CreateFileContents(STGMEDIUM *pSTM, LONG lindex);
      HRESULT _CreateURL(STGMEDIUM *pSTM);
      HRESULT _CreatePrefDropEffect(STGMEDIUM *pSTM);
  
  #ifdef UNICODE
      //  IExtractIconA
      STDMETHODIMP    GetIconLocation(UINT uFlags, LPSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags);
      STDMETHODIMP    Extract(LPCSTR pszFile, UINT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize);
  #endif
  
      // IExtractIconT Methods
      STDMETHODIMP GetIconLocation(UINT, LPTSTR, UINT, int *, UINT *);
      STDMETHODIMP Extract(LPCTSTR, UINT, HICON *, HICON *, UINT);
     
      // IQueryInfo Methods
      STDMETHODIMP GetInfoTip(DWORD dwFlags, WCHAR ** ppwszTip);
      STDMETHODIMP GetInfoFlags(DWORD *pdwFlags);
  
  protected:
  
      ~COfflineObjectItem();
  
      UINT	                _cRef;       // reference count
      COfflineFolder*         _pOOFolder;   // back pointer to our shell folder
      
      UINT                    _cItems;     // number of items we represent
      LPMYPIDL*               _ppooi;      // variable size array of items
      IUnknown                *m_pUIHelper;  // UI helper. For 1 item only.
      
          
  };
  
  class COfflineDropTarget : public IDropTarget
  {
  private:
  
      LPDATAOBJECT        m_pDataObj;
      ULONG               m_cRefs;
      DWORD               m_grfKeyStateLast;
      BOOL                m_fHasHDROP;
      BOOL                m_fHasSHELLURL;
      BOOL                m_fHasTEXT;
      DWORD               m_dwEffectLastReturned;
      HWND                m_hwndParent;
  
  public:
      
      COfflineDropTarget(HWND hwndParent);
      ~COfflineDropTarget();
  
      STDMETHODIMP            QueryInterface      (REFIID riid,LPVOID FAR *ppv);
      STDMETHODIMP_(ULONG)    AddRef              ();
      STDMETHODIMP_(ULONG)    Release             ();
      STDMETHODIMP            DragEnter           (LPDATAOBJECT pDataObj, 
                                                   DWORD        grfKeyState,
                                                   POINTL       pt, 
                                                   LPDWORD      pdwEffect);
      STDMETHODIMP            DragOver            (DWORD        grfKeyState, 
                                                   POINTL       pt, 
                                                   LPDWORD      pdwEffect);
      STDMETHODIMP            DragLeave           ();
      STDMETHODIMP            Drop                (LPDATAOBJECT pDataObj,
                                                   DWORD        grfKeyState, 
                                                   POINTL       pt, 
                                                   LPDWORD      pdwEffect);
      DWORD                   GetDropEffect       (LPDWORD      pdwEffect);
  
  };
  
  #endif  // __cplusplus
  
  #endif  // OFFLINE_CPP_H
  
  