/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is
 * Netscape Communications Corporation.
 * Portions created by the Initial Developer are Copyright (C) 1998
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of the GNU General Public License Version 2 or later (the "GPL"),
 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "nsISupports.idl"

interface nsIURI;
interface nsIUrlListener;
interface nsIStreamListener;
interface nsIMsgWindow;
interface nsIFileSpec;
interface nsIMsgFolder;
interface nsIMsgSearchSession;
interface nsIMsgDBHdr;
interface nsIStreamConverter;

%{C++
#include "nsMsgKeyArray.h"
%}

[ptr] native nsMsgKeyArrayPtr(nsMsgKeyArray);


[scriptable, uuid(F11009C1-F697-11d2-807F-006008128C4E)]
interface nsIMsgMessageService : nsISupports {
     
     /////////////////////////////////////////////////////////////////
     // If you want a handle on the running task, pass in a valid nsIURI 
     // ptr. You can later interrupt this action by asking the netlib 
     // service manager to interrupt the url you are given back. 
     // Remember to release aURL when you are done with it. Pass nsnull
     // in for aURL if you don't  care about the returned URL.
     /////////////////////////////////////////////////////////////////


     /////////////////////////////////////////////////////////////////
     // CopyMessage: Pass in the URI for the message you want to have 
     // copied.
     // aCopyListener already knows about the destination folder. 
     // Set aMoveMessage to PR_TRUE if you want the message to be moved.
     // PR_FALSE leaves it as just a copy.
     ///////////////////////////////////////////////////////////////
  
	void CopyMessage(in string aSrcURI, in nsIStreamListener aCopyListener, in boolean aMoveMessage,
						   in nsIUrlListener aUrlListener, in nsIMsgWindow aMsgWindow, out nsIURI aURL);

    /* copy multiple messages at a time */
	[noscript] void CopyMessages(in nsMsgKeyArrayPtr keys, in nsIMsgFolder srcFolder, in nsIStreamListener aCopyListener, in boolean aMoveMessage,
						   in nsIUrlListener aUrlListener, in nsIMsgWindow aMsgWindow, out nsIURI aURL);

    /////////////////////////////////////////////////////////////////////
    //  DisplayMessage: When you want a message displayed....
    //  aMessageURI	  is a uri representing the message to display.
    //  aDisplayConsumer is (for now) an nsIDocShell which we'll use to load 
    //  the message into.
    //  XXXbz Should it be an nsIWebNavigation or something?
	  //	aCharsetOverride  (optional) character set over ride to force the message to
	  //  use.
	  //
    ///////////////////////////////////////////////////////////////////

	void DisplayMessage(in string aMessageURI, 
						in nsISupports aDisplayConsumer, 
						in nsIMsgWindow aMsgWindow,
						in nsIUrlListener aUrlListener, 
						in string aCharsetOverride, 
						out nsIURI aURL);

     /////////////////////////////////////////////////////////////////////
     //  OpenAttachment: When you want an attachment downloaded
     //  aContentType --> we need to know the content type of the attachment
	 //	 aFileName --> the name of the attachment.
	 //	 aUrl --> string representation of the original url associated with the msg.
	 //  aMessageUri --> RDF resource that describes the message
	 //	 aMsgWindow --> message window
     ///////////////////////////////////////////////////////////////////

	void openAttachment(in string aContentType, 
						in string aFileName, 
						in string aUrl,
						in string aMessageUri, 
						in nsISupports aDisplayConsumer, 
						in nsIMsgWindow aMsgWindow,
						in nsIUrlListener aUrlListener);

     /////////////////////////////////////////////////////////////////////
     // SaveMessageToDisk: When you want to spool a message out to a file
	 // on disk. This is an asynch operation of course. You must pass in a
	 // url listener in order to figure out when the operation is done.
	 // aMessageURI--> uri representing the message to spool out to disk.
	 // aFile - the file you want the message saved to
	 // aGenerateDummyEnvelope --> usually FALSE. Set to TRUE if you want the msg
	 //					  appended at the end of the file. 
     ///////////////////////////////////////////////////////////////////

  void SaveMessageToDisk(in string aMessageURI, in nsIFileSpec aFile,
                         in boolean aGenerateDummyEnvelope, 
                         in nsIUrlListener aUrlListener, out nsIURI aURL,
                         in boolean canonicalLineEnding, in nsIMsgWindow aMsgWindow);

    /////////////////////////////////////////////////////////////////////
	// GetUrlForUri: when you have a uri and you would like to convert that
	// to a url which can be run through necko, you can use this method.
	// the Uri MUST refer to a message and not a folder! 
    /////////////////////////////////////////////////////////////////////
    
	void GetUrlForUri(in string aMessageURI, out nsIURI aURL, in nsIMsgWindow aMsgWindow);

     /////////////////////////////////////////////////////////////////////
     //  DisplayMessageForPrinting: When you want a message displayed in a
     //  format that is suitable for printing....
     //  aMessageURI is a uri representing the message to display.
     //  aDisplayConsumer is (for now) a nsIDocShell which we'll use to load 
     //  the message into.
     //  XXXbz should it be an nsIWebNavigation?
     ///////////////////////////////////////////////////////////////////

	void DisplayMessageForPrinting(in string aMessageURI, in nsISupports aDisplayConsumer, 
						in nsIMsgWindow aMsgWindow,
						in nsIUrlListener aUrlListener, 
						out nsIURI aURL);

	void Search(in nsIMsgSearchSession aSearchSession, in nsIMsgWindow aMsgWindow, in nsIMsgFolder aMsgFolder, in string aSearchUri);

  // this method streams a message to the passed in consumer. If aConvertData is true, it
  // will create a stream converter from message rfc822 to star/star. It will also tack
  // aAdditionalHeader onto the url (e.g., "header=filter").
  // @param aMessageURI  uri of message to stream
  // @param aConsumer    generally, a stream listener listening to the message
  // @param aMsgWindow   msgWindow for give progress and status feedback
  // @param aUrlListener gets notified when url starts and stops
  // @param aConvertData should we create a stream converter?
  // @param aAdditionalHeader added to URI, e.g., "header=filter"
  // @return the URL that gets run
  nsIURI streamMessage(in string aMessageURI, in nsISupports aConsumer, 
                    in nsIMsgWindow aMsgWindow,
                    in nsIUrlListener aUrlListener, 
                    in boolean aConvertData,
                    in string aAdditionalHeader);
    /**
     * now the the message datasource is going away
     * we need away to go from message uri to go nsIMsgDBHdr
     */
    nsIMsgDBHdr messageURIToMsgHdr(in string uri);
};

// Some mail protocols (like imap) allow you to fetch individual mime parts. We use this interface
// to represent message services whose protocols support this. To use this interface, you should get
// the message service then QI for this interface. If it's present, then can fetch a mime part.
[scriptable, uuid(3728C255-480C-11d4-98D0-001083010E9B)]
interface nsIMsgMessageFetchPartService : nsISupports 
{
	// FetchMimePart --> used to fetch an individual mime part
	// aURI --> url representing the message
	// aMessageURI --> RDF URI including the part to fetch
	nsIURI fetchMimePart(in nsIURI aURI, in string aMessageUri, in nsISupports aDisplayConsumer, 
						in nsIMsgWindow aMsgWindow,
						in nsIUrlListener aUrlListener);	
};
