/*
 * Copyright 2006 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "objidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "docobj.idl";

typedef enum _ADDURL_FLAG
{
    ADDURL_FIRST                = 0,
    ADDURL_ADDTOHISTORYANDCACHE = 0,
    ADDURL_ADDTOCACHE           = 1,
    ADDURL_Max                  = 0x7fffffff
} ADDURL_FLAG;

/*****************************************************************************
 *    IEnumSTATURL interface
 */
[
    object,
    uuid(3c374a42-bae4-11cf-bf7d-00aa006946ee),
    pointer_default(unique)
]
interface IEnumSTATURL : IUnknown
{
    typedef [unique] IEnumSTATURL *LPENUMSTATURL;
	
    typedef struct _STATURL
    {
        DWORD cbSize;
        LPWSTR pwcsUrl;
        LPWSTR pwcsTitle;
        FILETIME ftLastVisited;
        FILETIME ftLastUpdated;
        FILETIME ftExpires;
        DWORD dwFlags;
    } STATURL, *LPSTATURL;

    HRESULT Next(
        [in] ULONG celt,
        [in, out] LPSTATURL rgelt,
        [in, out] ULONG *pceltFetched);

    HRESULT Skip([in] ULONG celt);
    HRESULT Reset();
    HRESULT Clone([out] IEnumSTATURL **ppenum);

    HRESULT SetFilter(
        [in] LPCOLESTR poszFilter,
        [in] DWORD dwFlags);
}

/*****************************************************************************
 *    IUrlHistoryStg interface
 */
[
    object,
    uuid(3c374a41-bae4-11cf-bf7d-00aa006946ee),
    pointer_default(unique)
]
interface IUrlHistoryStg : IUnknown
{
    typedef [unique] IUrlHistoryStg *LPURLHISTORYSTG;
	
    HRESULT AddUrl(
        [in] LPCOLESTR pocsUrl,
        [in, unique] LPCOLESTR pocsTitle,
        [in] DWORD dwFlags);

    HRESULT DeleteUrl(
        [in] LPCOLESTR pocsUrl,
        [in] DWORD dwFlags);

    HRESULT QueryUrl(
        [in] LPCOLESTR pocsUrl,
        [in] DWORD dwFlags,
        [in, out, unique] LPSTATURL lpSTATURL);
	
    HRESULT BindToObject(
        [in] LPCOLESTR pocsUrl,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppvOut);

    HRESULT EnumUrls(
        [out] IEnumSTATURL **ppEnum);	
}

/*****************************************************************************
 *    IUrlHistoryStg2 interface
 */
[
    object,
    uuid(afa0dc11-c313-11d0-831a-00c04fd5ae38),
    pointer_default(unique)
]
interface IUrlHistoryStg2 : IUrlHistoryStg
{
    typedef [unique] IUrlHistoryStg2 *LPURLHISTORYSTG2;

    HRESULT AddUrlAndNotify(
        [in] LPCOLESTR pocsUrl,
        [in,unique] LPCOLESTR pocsTitle,
        [in] DWORD dwFlags,
        [in] BOOL fWriteHistory,
        [in] IOleCommandTarget *poctNotify,
        [in, unique] IUnknown *punkISFolder);

    HRESULT ClearHistory();
}

/*****************************************************************************
 *    IUrlHistoryNotify interface
 */
[
    object,
    uuid(bc40bec1-c493-11d0-831b-00C04fd5ae38),
    pointer_default(unique)
]
interface IUrlHistoryNotify : IOleCommandTarget
{
    typedef [unique] IUrlHistoryNotify *LPURLHISTORYNOTIFY;
}
