/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsISupports.idl"
#include "nsrootidl.idl"

interface nsIOutputStream;
interface nsIInputStream;
interface nsIURI;
interface nsIStreamListener;
interface nsIChannel;
interface nsIMsgMailNewsUrl;
interface nsIUTF8StringEnumerator;
interface nsIMsgDBHdr;
interface nsIWritablePropertyBag2;

[scriptable, uuid(4644FB25-5255-11d3-82B8-444553540002)] 
interface nsIMimeMiscStatus : nsISupports{

    string  GetWindowXULandJS();
    string  GetGlobalXULandJS();
    string  GetIndividualXUL(in string aName, in string aHeader, in string aEmail);

    long    GetMiscStatus(in string aName, in string aEmail);
    string  GetImageURL(in long aStatus);
};

// this is a simple interface which allows someone to listen to all the headers 
// that are discovered by mime. We can use this when displaying a message to update
// the msg header in JS. 
[scriptable, uuid(2a709e6f-48ec-4273-9d4c-7b1115a2e756)]
interface nsIMsgHeaderSink : nsISupports 
{
  // You must finish consuming the iterators before returning from processHeaders. aHeaderNames and aHeaderValues will ALWAYS have the same
  // number of elements in them
  void processHeaders(in nsIUTF8StringEnumerator aHeaderNames, in nsIUTF8StringEnumerator aHeaderValues, in boolean dontCollectAddress);

  void handleAttachment(in string contentType, in string url, in wstring displayName, in string uri,
                        in boolean aNotDownloaded);

  /**
   * Add a metadata field to the current attachment, e.g. "X-Mozilla-PartSize".
   *
   * @param field The field to add
   * @param value The value of the field
   */
  void addAttachmentField(in string field, in string value);
  void onEndAllAttachments();
    
  // onEndMsgHeaders is called after libmime is done processing a message. At this point it is safe for
  // elements like the UI to update junk status, process return receipts, etc.
  void onEndMsgHeaders(in nsIMsgMailNewsUrl url);

  // onEndMsgDownload is triggered when layout says it is actually done rendering 
  // the message body in the UI. 
  void onEndMsgDownload(in nsIMsgMailNewsUrl url);

  attribute nsISupports securityInfo;

  void onMsgHasRemoteContent(in nsIMsgDBHdr aMsgHdr);
  readonly attribute nsIMsgDBHdr dummyMsgHeader;
  
  // used as a hook for extension mime content handlers to store data that can later
  // be accessed by other parts of the code, e.g., UI code.
  // TODO - Should replace securityInfo
  readonly attribute nsIWritablePropertyBag2 properties;
  // When streaming a new message, properties should be reset, so that there are
  // not previous values lurking around.
  void resetProperties();
};
