/*
 * DO NOT EDIT.  THIS FILE IS GENERATED FROM e:/builds/tinderbox/XR-Trunk/WINNT_5.2_Depend/mozilla/docshell/base/nsIGlobalHistory3.idl
 */

#ifndef __gen_nsIGlobalHistory3_h__
#define __gen_nsIGlobalHistory3_h__


#ifndef __gen_nsISupports_h__
#include "nsISupports.h"
#endif

#ifndef __gen_nsIGlobalHistory2_h__
#include "nsIGlobalHistory2.h"
#endif

/* For IDL files that don't want to include root IDL files. */
#ifndef NS_NO_VTABLE
#define NS_NO_VTABLE
#endif
class nsIChannel; /* forward declaration */

// This is NOT part of the interface! It could change.
#define NS_GECKO_FLAG_NEEDS_VERTICAL_SCROLLBAR (1 << 0)

/* starting interface:    nsIGlobalHistory3 */
#define NS_IGLOBALHISTORY3_IID_STR "24306852-c60e-49c3-a455-90f6747118ba"

#define NS_IGLOBALHISTORY3_IID \
  {0x24306852, 0xc60e, 0x49c3, \
    { 0xa4, 0x55, 0x90, 0xf6, 0x74, 0x71, 0x18, 0xba }}

/**
 * Provides information about global history to gecko, extending GlobalHistory2
 */
class NS_NO_VTABLE NS_SCRIPTABLE nsIGlobalHistory3 : public nsIGlobalHistory2 {
 public: 

  NS_DECLARE_STATIC_IID_ACCESSOR(NS_IGLOBALHISTORY3_IID)

  /**
   * Notifies the history system that the page loading via aOldChannel
   * redirected to aNewChannel. Implementations should generally add the URI for
   * aOldChannel to history for link coloring, but are advised not to expose it
   * in the history user interface. This function is preferred if
   * nsIGlobalHistory3 is available. Otherwise, nsIGlobalHistory2.addURI should
   * be called with redirect=true.
   *
   * This function is preferred to nsIGlobalHistory2.addURI because it provides
   * more information (including the redirect destination, channels involved,
   * and redirect flags) to the history implementation.
   *
   * For implementors of nsIGlobalHistory3: The history implementation is
   * responsible for sending NS_LINK_VISITED_EVENT_TOPIC to observers for
   * redirect pages. This notification must be sent for history consumers for
   * all non-redirect pages.
   *
   * @param aToplevel whether the URI is loaded in a top-level window.  If
   *        false, the load is in a subframe.
   *
   * The other params to this function are the same as those for
   * nsIChannelEventSink::OnChannelRedirect.
   *
   * Note: Implementors who wish to implement this interface but rely on
   * nsIGlobalHistory2.addURI for redirect processing may throw
   * NS_ERROR_NOT_IMPLEMENTED from this method.  If they do so, then callers
   * must call nsIGlobalHistory2.addURI upon getting the
   * NS_ERROR_NOT_IMPLEMENTED result.
   */
  /* void addDocumentRedirect (in nsIChannel aOldChannel, in nsIChannel aNewChannel, in PRInt32 aFlags, in boolean aTopLevel); */
  NS_SCRIPTABLE NS_IMETHOD AddDocumentRedirect(nsIChannel *aOldChannel, nsIChannel *aNewChannel, PRInt32 aFlags, PRBool aTopLevel) = 0;

  /**
   * Get the Gecko flags for this URI. These flags are used by Gecko as hints
   * to optimize page loading. Not all histories have them; this need not be
   * supported (just return NS_ERROR_NOT_IMPLEMENTED. These flags are opaque
   * and should not be interpreted by the history engine.
   */
  /* unsigned long getURIGeckoFlags (in nsIURI aURI); */
  NS_SCRIPTABLE NS_IMETHOD GetURIGeckoFlags(nsIURI *aURI, PRUint32 *_retval) = 0;

  /**
   * Set the Gecko flags for this URI. May fail if the history entry
   * doesn't have any flags or if there is no entry for the URI.
   */
  /* void setURIGeckoFlags (in nsIURI aURI, in unsigned long aFlags); */
  NS_SCRIPTABLE NS_IMETHOD SetURIGeckoFlags(nsIURI *aURI, PRUint32 aFlags) = 0;

};

  NS_DEFINE_STATIC_IID_ACCESSOR(nsIGlobalHistory3, NS_IGLOBALHISTORY3_IID)

/* Use this macro when declaring classes that implement this interface. */
#define NS_DECL_NSIGLOBALHISTORY3 \
  NS_SCRIPTABLE NS_IMETHOD AddDocumentRedirect(nsIChannel *aOldChannel, nsIChannel *aNewChannel, PRInt32 aFlags, PRBool aTopLevel); \
  NS_SCRIPTABLE NS_IMETHOD GetURIGeckoFlags(nsIURI *aURI, PRUint32 *_retval); \
  NS_SCRIPTABLE NS_IMETHOD SetURIGeckoFlags(nsIURI *aURI, PRUint32 aFlags); 

/* Use this macro to declare functions that forward the behavior of this interface to another object. */
#define NS_FORWARD_NSIGLOBALHISTORY3(_to) \
  NS_SCRIPTABLE NS_IMETHOD AddDocumentRedirect(nsIChannel *aOldChannel, nsIChannel *aNewChannel, PRInt32 aFlags, PRBool aTopLevel) { return _to AddDocumentRedirect(aOldChannel, aNewChannel, aFlags, aTopLevel); } \
  NS_SCRIPTABLE NS_IMETHOD GetURIGeckoFlags(nsIURI *aURI, PRUint32 *_retval) { return _to GetURIGeckoFlags(aURI, _retval); } \
  NS_SCRIPTABLE NS_IMETHOD SetURIGeckoFlags(nsIURI *aURI, PRUint32 aFlags) { return _to SetURIGeckoFlags(aURI, aFlags); } 

/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */
#define NS_FORWARD_SAFE_NSIGLOBALHISTORY3(_to) \
  NS_SCRIPTABLE NS_IMETHOD AddDocumentRedirect(nsIChannel *aOldChannel, nsIChannel *aNewChannel, PRInt32 aFlags, PRBool aTopLevel) { return !_to ? NS_ERROR_NULL_POINTER : _to->AddDocumentRedirect(aOldChannel, aNewChannel, aFlags, aTopLevel); } \
  NS_SCRIPTABLE NS_IMETHOD GetURIGeckoFlags(nsIURI *aURI, PRUint32 *_retval) { return !_to ? NS_ERROR_NULL_POINTER : _to->GetURIGeckoFlags(aURI, _retval); } \
  NS_SCRIPTABLE NS_IMETHOD SetURIGeckoFlags(nsIURI *aURI, PRUint32 aFlags) { return !_to ? NS_ERROR_NULL_POINTER : _to->SetURIGeckoFlags(aURI, aFlags); } 

#if 0
/* Use the code below as a template for the implementation class for this interface. */

/* Header file */
class nsGlobalHistory3 : public nsIGlobalHistory3
{
public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSIGLOBALHISTORY3

  nsGlobalHistory3();

private:
  ~nsGlobalHistory3();

protected:
  /* additional members */
};

/* Implementation file */
NS_IMPL_ISUPPORTS1(nsGlobalHistory3, nsIGlobalHistory3)

nsGlobalHistory3::nsGlobalHistory3()
{
  /* member initializers and constructor code */
}

nsGlobalHistory3::~nsGlobalHistory3()
{
  /* destructor code */
}

/* void addDocumentRedirect (in nsIChannel aOldChannel, in nsIChannel aNewChannel, in PRInt32 aFlags, in boolean aTopLevel); */
NS_IMETHODIMP nsGlobalHistory3::AddDocumentRedirect(nsIChannel *aOldChannel, nsIChannel *aNewChannel, PRInt32 aFlags, PRBool aTopLevel)
{
    return NS_ERROR_NOT_IMPLEMENTED;
}

/* unsigned long getURIGeckoFlags (in nsIURI aURI); */
NS_IMETHODIMP nsGlobalHistory3::GetURIGeckoFlags(nsIURI *aURI, PRUint32 *_retval)
{
    return NS_ERROR_NOT_IMPLEMENTED;
}

/* void setURIGeckoFlags (in nsIURI aURI, in unsigned long aFlags); */
NS_IMETHODIMP nsGlobalHistory3::SetURIGeckoFlags(nsIURI *aURI, PRUint32 aFlags)
{
    return NS_ERROR_NOT_IMPLEMENTED;
}

/* End of implementation class template. */
#endif


#endif /* __gen_nsIGlobalHistory3_h__ */
