/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "ocidl.idl";
import "IWebHistoryItem.idl";
#endif

interface IWebHistoryItem;

[
    object,
    oleautomation,
    uuid(E9D5DC2C-192F-4795-B0EC-4E770E539D97),
    pointer_default(unique)
]
interface IWebHistoryItemPrivate : IUnknown
{
    [local] HRESULT initFromDictionaryRepresentation([in] void* dictionary);
    [local] HRESULT dictionaryRepresentation([out, retval] void** dictionary);
    HRESULT visitCount([out, retval] int *count);
    HRESULT setVisitCount([in] int count);
    HRESULT hasURLString([out, retval] BOOL* hasURL);
    HRESULT mergeAutoCompleteHints([in] IWebHistoryItem* otherItem);
    HRESULT setLastVisitedTimeInterval([in] DATE time);
    HRESULT setTitle([in] BSTR title);
    HRESULT RSSFeedReferrer([out, retval] BSTR* url);
    HRESULT setRSSFeedReferrer([in] BSTR url);
    HRESULT hasPageCache([out, retval] BOOL* hasCache);
    HRESULT setHasPageCache([in] BOOL hasCache);

    HRESULT target([out, retval] BSTR* target);
    HRESULT isTargetItem([out, retval] BOOL* result);
    [local] HRESULT children([out] unsigned* childCount, [out, retval] SAFEARRAY** children);
    HRESULT lastVisitWasFailure([out, retval] BOOL* wasFailure);
    HRESULT setLastVisitWasFailure([in] BOOL wasFailure);
    HRESULT lastVisitWasHTTPNonGet([out, retval] BOOL* HTTPNonGet);
    HRESULT setLastVisitWasHTTPNonGet([in] BOOL wasHTTPNonGet);

    HRESULT redirectURLs([out, retval] IEnumVARIANT** result);
    HRESULT visitedWithTitle([in] BSTR title, [in] BOOL increaseVisitCount);

    HRESULT getDailyVisitCounts([out] int* number, [out, retval] int** counts);
    HRESULT getWeeklyVisitCounts([out] int* number, [out, retval] int** counts);
    HRESULT recordInitialVisit();
}
