/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape 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/NPL/
 *
 * 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 Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 */
 
#include "nsISupports.idl"
#include "nsIFolder.idl"
#include "nsIMsgThread.idl"
#include "nsIMsgIncomingServer.idl"
#include "nsIFileSpec.idl"
#include "nsISupportsArray.idl"
#include "nsIMsgCopyServiceListener.idl"

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

interface nsIMessage;
interface nsIMsgWindow;
interface nsIMsgDatabase;
interface nsMsgKeyArray;

interface nsIMsgFolderCacheElement;

[scriptable, uuid(85e39ff0-b248-11d2-b7ef-00805f05ffa5)]
interface nsIMsgFolder : nsIFolder {

  /* already exists in nsIFolder */
  /*	readonly attribute string name;   */
  /*	void SetName(in string name); */


  /* XXX should these 2 go on nsIFolder or nsICollection? */
  void AddUnique(in nsISupports element);
  void ReplaceElement(in nsISupports element, in nsISupports newElement);
  
  nsISimpleEnumerator getMessages();
	nsISimpleEnumerator getThreads();
  
	void startFolderLoading();
	void endFolderLoading();
  
	/* get new headers for db */
	void updateFolder(in nsIMsgWindow aWindow);
  
	nsIMsgThread getThreadForMessage(in nsIMessage message);
	boolean hasMessage(in nsIMessage message);
  
  nsIEnumerator getVisibleSubFolders();
	readonly attribute wstring prettiestName;

  readonly attribute string folderURL;

	readonly attribute boolean deleteIsMoveToTrash;
	readonly attribute boolean showDeletedMessages;

  readonly attribute nsIMsgIncomingServer server;
  readonly attribute boolean isServer;
  
	void OnCloseFolder ();
	void Delete ();

	void deleteSubFolders(in nsISupportsArray folders);
	void propagateDelete(in nsIMsgFolder folder, in boolean deleteStorage);
	void recursiveDelete(in boolean deleteStorage);

	void createSubfolder(in string folderName);

  void compact();
  void emptyTrash();

	void rename(in string name);
	void adopt(in nsIMsgFolder srcFolder, out unsigned long outPos);

	boolean containsChildNamed(in string name);
	boolean isAncestorOf(in nsIMsgFolder folder);

	string generateUniqueSubfolderName(in string prefix,
                                     in nsIMsgFolder otherFolder);

	void updateSummaryTotals(in boolean force);
	void summaryChanged();
	long getNumUnread(in boolean deep);
	long getTotalMessages(in boolean deep);

	readonly attribute unsigned long expungedBytesCount;
	readonly attribute boolean deletable;
	readonly attribute boolean canCreateChildren;
	readonly attribute boolean canBeRenamed;
	readonly attribute boolean requiresCleanup;

	void clearRequiresCleanup();

	boolean manyHeadersToDownload();

	readonly attribute boolean knowsSearchNntpExtension;
	readonly attribute boolean allowsPosting;

	readonly attribute boolean displayRecipients;

	readonly attribute string relativePathName;
	readonly attribute unsigned long sizeOnDisk;

	void rememberPassword(in string password);
	readonly attribute string rememberedPassword;
	boolean userNeedsToAuthenticateForFolder(in boolean displayOnly);
  readonly attribute string username;
  readonly attribute string hostname;
  
	void setFlag(in unsigned long flag);
	void clearFlag(in unsigned long flag);
	boolean getFlag(in unsigned long flag);

	void toggleFlag (in unsigned long flag);
	void onFlagChange (in unsigned long flag);
  
	readonly attribute unsigned long flags;

	void getFoldersWithFlag(in unsigned long flags, out nsIMsgFolder result,
                         in unsigned long resultsize, out unsigned long numFolders);

	void getExpansionArray(in nsISupportsArray expansionArray);

	void deleteMessages(in nsISupportsArray message,
                      in nsIMsgWindow msgWindow,
                      in boolean deleteStorage);

  void copyMessages(in nsIMsgFolder srcFolder, in nsISupportsArray messages,
                    in boolean isMove, in nsIMsgWindow msgWindow,
                    in nsIMsgCopyServiceListener listener);

  void copyFileMessage(in nsIFileSpec fileSpec, in nsIMessage msgToReplace,
                       in boolean isDraft, in nsIMsgWindow msgWindow,
                       in nsIMsgCopyServiceListener listener);

  void acquireSemaphore (in nsISupports semHolder);
  void releaseSemaphore (in nsISupports semHolder);
  boolean testSemaphore (in nsISupports semHolder);
  readonly attribute boolean locked;

	nsIMessage createMessageFromMsgDBHdr(in nsIMsgDBHdr msgDBHdr);
	void getNewMessages(in nsIMsgWindow aWindow);

	void writeToFolderCache(in nsIMsgFolderCache folderCache);
	attribute wstring charset;
	attribute unsigned long biffState;
	attribute long numNewMessages;

	readonly attribute wstring newMessagesNotificationDescription;
	readonly attribute nsIMsgFolder rootFolder;
  readonly attribute nsIMsgDatabase msgDatabase;

	readonly attribute nsIFileSpec path;

	void markMessagesRead(in nsISupportsArray messages, in boolean markRead);
	void markAllMessagesRead();
	void markMessagesFlagged(in nsISupportsArray messages, in boolean markFlagged);

	nsIMsgFolder getChildWithURI(in string uri, in boolean deep);
};


[scriptable, uuid(27D2DE40-BAF1-11d2-9578-00805F8AC615)]
interface nsIMsgLocalMailFolder : nsISupports {

};

[scriptable, uuid(3716abe4-f6d4-11d2-86d5-004005263078)]
interface nsIMsgNewsFolder : nsISupports {
  attribute string unreadSetStr;
};

[scriptable, uuid(FBFEBE79-C1DD-11d2-8A40-0060B0FC04D2)]
interface nsIMsgImapMailFolder : nsISupports {

  void RemoveSubFolder(in nsIMsgFolder folder);
  void CreateClientSubfolderInfo(in string folderName);
  attribute boolean verifiedAsOnlineFolder;
  attribute boolean explicitlyVerify;
};


