/* -*- Mode: IDL; tab-width: 4; 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 "nsIFileSpec.idl"

interface nsIFolder;
interface nsIMsgFolderCache;
interface nsIMsgWindow;
interface nsIMsgFilterList;
interface nsIMsgRetentionSettings;
interface nsIMsgDownloadSettings;

/*
 * Interface for incoming mail/news host
 * this is the base interface for all mail server types (imap, pop, nntp, etc)
 * often you will want to add extra interfaces that give you server-specific
 * attributes and methods.
 */

[scriptable, uuid(60dcb100-e3f2-11d2-b7fc-00805f05ffa5)]
interface nsIMsgIncomingServer : nsISupports {

  /**
   * internal pref key - guaranteed to be unique across all servers
   */
  attribute string key;

  /**
   * pretty name - should be "userid on hostname"
   * if the pref is not set
   */
  attribute wstring prettyName;

  /**
  * helper function to construct the pretty name in a server type
  * specific way - e.g., mail for foo@test.com, news on news.mozilla.org
  */
  readonly attribute wstring constructedPrettyName;

  /**
   * hostname of the server
   */
  attribute string hostName;
  
  /* port of the server */
  attribute long port;

  /**
   * userid to log into the server
   */
  attribute string username;

  /**
   * protocol type, i.e. "pop3", "imap", "nntp", "none", etc
   * used to construct URLs
   */
  attribute string type;

  /**
   * the schema for the local mail store, such
   * as "mailbox", "imap", or "news"
   * used to construct URIs
   */
  readonly attribute string localStoreType;
  
  /* should we remember the password? */
  attribute boolean rememberPassword;

  /* cleartext version of the password */
  attribute string password;

  /* prompt the user for a password */
  string getPasswordWithUI(in wstring aPromptString, in wstring aPromptTitle, in nsIMsgWindow aMsgWindow, out boolean okayValue);

  /* forget the password in memory and in single signon database */
  void forgetPassword();

  /* should we download whole messages when biff goes off? */
  /* in 4.x, this was "mail.pop3_gets_new_mail" for pop */
  /* "mail.imap.new_mail_get_headers" for imap, and it was global.  in 5.x, it is per server */
  attribute boolean downloadOnBiff;

  /* should we biff the server? */
  attribute boolean doBiff;

  /* how often to biff */
  attribute long biffMinutes;

  /* the on-disk path to message storage for this server */
  attribute nsIFileSpec localPath;

  
  /* the RDF URI for the root mail folder */
  readonly attribute string serverURI;

  /* the root folder for this server */
  attribute nsIFolder RootFolder;

  /* are we already getting new Messages on the current server..
     This is used to help us prevent multiple get new msg commands from
	 going off at the same time. */
  attribute boolean serverBusy;

  /* should we use a secure channel? */
  attribute boolean isSecure;

  /* what kind of logon redirector to use for this server, if any */
  attribute string redirectorType;

  /* empty trash on exit */
  attribute boolean emptyTrashOnExit;

  readonly attribute nsIMsgFilterList filterList;

  /* we use this to set the default local path.  we use this when migrating prefs */
  void SetDefaultLocalPath(in nsIFileSpec aDefaultLocalPath);

  /* do a biff */
  void PerformBiff();
  
  /* this checks if a server needs a password to do biff */
  readonly attribute boolean serverRequiresPasswordForBiff;
  
  /* this gets called when the server is expanded in the folder pane */
  void PerformExpand(in nsIMsgWindow aMsgWindow);

  /* Write out all known folder data to panacea.dat */
  void WriteToFolderCache(in nsIMsgFolderCache folderCache);

  /* close any server connections */
  void CloseCachedConnections();

  /* access to generic attributes */
  boolean getBoolValue(in string attr);
  void setBoolValue(in string attr, in boolean value);

  string getCharValue(in string attr);
  void setCharValue(in string attr, in string value);

  wstring getUnicharValue(in string attr);
  void setUnicharValue(in string attr, in wstring value);
  
  long getIntValue(in string attr);
  void setIntValue(in string attr, in long value);

  nsIFileSpec getFileValue(in string attr);
  void setFileValue(in string attr, in nsIFileSpec value);

  /**
   * this is really dangerous. this destroys all pref values
   * do not call this unless you know what you're doing!
   */
  void clearAllValues();

  /** 
   * this is also very dangerous.  this will remove the files
   * associated with this server on disk.
   */
  void removeFiles();
  
  attribute boolean valid;
  
  wstring toString();

  void displayOfflineMsg(in nsIMsgWindow aWindow);

  /* used for comparing nsIMsgIncomingServers */
  boolean equals(in nsIMsgIncomingServer server);

  /* Get Messages at startup */
  readonly attribute boolean downloadMessagesAtStartup; 

  /* check to this if the server supports filters */
  attribute boolean canHaveFilters;

  /**
   * can this server be removed from the account manager?  for
   * instance, local mail is not removable, but an imported folder is 
   */
  attribute boolean canDelete;

  attribute boolean loginAtStartUp;

  attribute boolean limitMessageSize;
  attribute boolean limitOfflineMessageSize;
  attribute long maxMessageSize;

  attribute nsIMsgRetentionSettings retentionSettings;

  /* check if this server can be a default server */
  readonly attribute boolean canBeDefaultServer;

  /* check if this server allows search operations */
  readonly attribute boolean canSearchMessages;

  /* display startup page once per account per session */
  attribute boolean displayStartupPage;
  attribute nsIMsgDownloadSettings downloadSettings;

  /*
   * Offline support level. Support level can vary based on abilities 
   * and features each server can offer wrt to offline service.
   * Here is the legend to determine the each support level details
   *
   * supportLevel == 0  --> no offline support (default) 
   * supportLevel == 10 --> regular offline feature support
   * supportLevel == 20 --> extended offline feature support 
   *
   * Each server can initialize itself to the support level if needed
   * to override the default choice i.e., no offline support.
   * IMAP and POP3 servers are set with level 10 and NEWS with level 20. 
   * None and Movemail will default to 0. 
   */
  attribute long offlineSupportLevel;
};

%{C++
/* some useful macros to implement nsIMsgIncomingServer accessors */
#define NS_IMPL_SERVERPREF_STR(_class, _postfix, _prefname)	\
NS_IMETHODIMP								   	\
_class::Get##_postfix(char **retval)   			\
{											   	\
  return GetCharValue(_prefname, retval);		\
}												\
NS_IMETHODIMP	   								\
_class::Set##_postfix(const char *chvalue)			\
{												\
  return SetCharValue(_prefname, chvalue);		\
}

#define NS_IMPL_SERVERPREF_BOOL(_class, _postfix, _prefname)\
NS_IMETHODIMP								   	\
_class::Get##_postfix(PRBool *retval)   		\
{											   	\
  return GetBoolValue(_prefname, retval);		\
}												\
NS_IMETHODIMP	   								\
_class::Set##_postfix(PRBool bvalue)			\
{												\
  return SetBoolValue(_prefname, bvalue);		\
}

#define NS_IMPL_SERVERPREF_INT(_class, _postfix, _prefname)\
NS_IMETHODIMP								   	\
_class::Get##_postfix(PRInt32 *retval)   		\
{											   	\
  return GetIntValue(_prefname, retval);			\
}												\
NS_IMETHODIMP	   								\
_class::Set##_postfix(PRInt32 ivalue)			\
{												\
  return SetIntValue(_prefname, ivalue);			\
}

#define NS_IMPL_SERVERPREF_FILE(_class, _postfix, _prefname)\
NS_IMETHODIMP								   	\
_class::Get##_postfix(nsIFileSpec **retval)   		\
{											   	\
  return GetFileValue(_prefname, retval);			\
}												\
NS_IMETHODIMP	   								\
_class::Set##_postfix(nsIFileSpec* ivalue)			\
{												\
  return SetFileValue(_prefname, ivalue);			\
}


%}
