/* -*- Mode: C++; tab-width: 2; 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):
 *   Olivier Parniere BT Global Services / Etat francais Ministere de la Defense
 *
 * 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 ***** */

#ifndef _MsgCompFields_H_
#define _MsgCompFields_H_

#include "nsIMsgCompFields.h"
#include "msgCore.h"
#include "nsIAbCard.h"
#include "nsTArray.h"
#include "nsCOMArray.h"

struct nsMsgRecipient
{
  nsMsgRecipient() : mPreferFormat(nsIAbPreferMailFormat::unknown),
                     mProcessed(PR_FALSE) {}

  nsMsgRecipient(const nsMsgRecipient &other)
  {
    mAddress = other.mAddress;
    mEmail = other.mEmail;
    mPreferFormat = other.mPreferFormat;
    mProcessed = other.mProcessed;
  }

  ~nsMsgRecipient() {}

  nsString mAddress;
  nsString mEmail;
  PRUint32 mPreferFormat;
  PRUint32 mProcessed;
};

/* Note that all the "Get" methods never return NULL (except in case of serious
   error, like an illegal parameter); rather, they return "" if things were set
   to NULL.  This makes it real handy for the callers. */

class nsMsgCompFields : public nsIMsgCompFields {
public:
  nsMsgCompFields();
  virtual ~nsMsgCompFields();

  /* this macro defines QueryInterface, AddRef and Release for this class */
  NS_DECL_ISUPPORTS
  NS_DECL_NSIMSGCOMPFIELDS

  typedef enum MsgHeaderID
  {
    MSG_FROM_HEADER_ID        = 0,
    MSG_REPLY_TO_HEADER_ID,
    MSG_TO_HEADER_ID,
    MSG_CC_HEADER_ID,
    MSG_BCC_HEADER_ID,
    MSG_FCC_HEADER_ID,
    MSG_FCC2_HEADER_ID,
    MSG_NEWSGROUPS_HEADER_ID,
    MSG_FOLLOWUP_TO_HEADER_ID,
    MSG_SUBJECT_HEADER_ID,
    MSG_ATTACHMENTS_HEADER_ID,
    MSG_ORGANIZATION_HEADER_ID,
    MSG_REFERENCES_HEADER_ID,
    MSG_OTHERRANDOMHEADERS_HEADER_ID,
    MSG_NEWSPOSTURL_HEADER_ID,
    MSG_PRIORITY_HEADER_ID,
    MSG_CHARACTER_SET_HEADER_ID,
    MSG_MESSAGE_ID_HEADER_ID,
    MSG_X_TEMPLATE_HEADER_ID,
    MSG_DRAFT_ID_HEADER_ID,
  MSG_TEMPORARY_FILES_HEADER_ID,
    
    MSG_MAX_HEADERS   //Must be the last one.
  } MsgHeaderID;

  nsresult SetAsciiHeader(MsgHeaderID header, const char *value);
  const char* GetAsciiHeader(MsgHeaderID header); //just return the address of the internal header variable, don't dispose it

  nsresult SetUnicodeHeader(MsgHeaderID header, const nsAString &value);
  nsresult GetUnicodeHeader(MsgHeaderID header, nsAString &_retval); 

  /* Convenience routines to get and set header's value...
  
    IMPORTANT:
    all routines const char* GetXxx(void) will return a pointer to the header, please don't free it.
  */

  nsresult SetFrom(const char *value) {return SetAsciiHeader(MSG_FROM_HEADER_ID, value);}
  const char* GetFrom(void) {return GetAsciiHeader(MSG_FROM_HEADER_ID);}

  nsresult SetReplyTo(const char *value) {return SetAsciiHeader(MSG_REPLY_TO_HEADER_ID, value);}
  const char* GetReplyTo() {return GetAsciiHeader(MSG_REPLY_TO_HEADER_ID);}

  nsresult SetTo(const char *value) {return SetAsciiHeader(MSG_TO_HEADER_ID, value);}
  const char* GetTo() {return GetAsciiHeader(MSG_TO_HEADER_ID);}

  nsresult SetCc(const char *value) {return SetAsciiHeader(MSG_CC_HEADER_ID, value);}
  const char* GetCc() {return GetAsciiHeader(MSG_CC_HEADER_ID);}

  nsresult SetBcc(const char *value) {return SetAsciiHeader(MSG_BCC_HEADER_ID, value);}
  const char* GetBcc() {return GetAsciiHeader(MSG_BCC_HEADER_ID);}

  nsresult SetFcc(const char *value) {return SetAsciiHeader(MSG_FCC_HEADER_ID, value);}
  const char* GetFcc() {return GetAsciiHeader(MSG_FCC_HEADER_ID);}

  nsresult SetFcc2(const char *value) {return SetAsciiHeader(MSG_FCC2_HEADER_ID, value);}
  const char* GetFcc2() {return GetAsciiHeader(MSG_FCC2_HEADER_ID);}

  nsresult SetNewsgroups(const char *aValue) {return SetAsciiHeader(MSG_NEWSGROUPS_HEADER_ID, aValue);}
  const char* GetNewsgroups() {return GetAsciiHeader(MSG_NEWSGROUPS_HEADER_ID);}

  const char* GetNewshost() {return GetAsciiHeader(MSG_NEWSPOSTURL_HEADER_ID);}

  nsresult SetFollowupTo(const char *aValue) {return SetAsciiHeader(MSG_FOLLOWUP_TO_HEADER_ID, aValue);}
  const char* GetFollowupTo() {return GetAsciiHeader(MSG_FOLLOWUP_TO_HEADER_ID);}

  nsresult SetSubject(const char *value) {return SetAsciiHeader(MSG_SUBJECT_HEADER_ID, value);}
  const char* GetSubject() {return GetAsciiHeader(MSG_SUBJECT_HEADER_ID);}

  const char* GetAttachments() {
    NS_ASSERTION(0, "nsMsgCompFields::GetAttachments is not supported anymore, please use nsMsgCompFields::GetAttachmentsArray");
    return GetAsciiHeader(MSG_ATTACHMENTS_HEADER_ID);
    }

  const char* GetTemporaryFiles() {
    NS_ASSERTION(0, "nsMsgCompFields::GetTemporaryFiles is not supported anymore, please use nsMsgCompFields::GetAttachmentsArray");
    return GetAsciiHeader(MSG_TEMPORARY_FILES_HEADER_ID);
    }

  nsresult SetOrganization(const char *value) {return SetAsciiHeader(MSG_ORGANIZATION_HEADER_ID, value);}
  const char* GetOrganization() {return GetAsciiHeader(MSG_ORGANIZATION_HEADER_ID);}

  const char* GetReferences() {return GetAsciiHeader(MSG_REFERENCES_HEADER_ID);}

  nsresult SetOtherRandomHeaders(const char *value) {return SetAsciiHeader(MSG_OTHERRANDOMHEADERS_HEADER_ID, value);}
  const char* GetOtherRandomHeaders() {return GetAsciiHeader(MSG_OTHERRANDOMHEADERS_HEADER_ID);}

  const char* GetNewspostUrl() {return GetAsciiHeader(MSG_NEWSPOSTURL_HEADER_ID);}

  const char* GetPriority() {return GetAsciiHeader(MSG_PRIORITY_HEADER_ID);}

  const char* GetCharacterSet() {return GetAsciiHeader(MSG_CHARACTER_SET_HEADER_ID);}

  const char* GetMessageId() {return GetAsciiHeader(MSG_MESSAGE_ID_HEADER_ID);}

  nsresult SetTemplateName(const char *value) {return SetAsciiHeader(MSG_X_TEMPLATE_HEADER_ID, value);}
  const char* GetTemplateName() {return GetAsciiHeader(MSG_X_TEMPLATE_HEADER_ID);}

  const char* GetDraftId() {return GetAsciiHeader(MSG_DRAFT_ID_HEADER_ID);}

  PRBool GetReturnReceipt() {return m_returnReceipt;}
  PRBool GetDSN() {return m_DSN;}
  PRBool GetAttachVCard() {return m_attachVCard;}
  PRBool GetForcePlainText() {return m_forcePlainText;}
  PRBool GetUseMultipartAlternative() {return m_useMultipartAlternative;}
  PRBool GetBodyIsAsciiOnly() {return m_bodyIsAsciiOnly;}
  PRBool GetForceMsgEncoding() {return m_forceMsgEncoding;}

  nsresult SetBody(const char *value);
  const char* GetBody();

  nsresult SplitRecipientsEx(const nsAString &recipients,
                             nsTArray<nsMsgRecipient> &aResult); 

protected:
  char*       m_headers[MSG_MAX_HEADERS];
  nsCString   m_body;
  nsCOMArray<nsIMsgAttachment> m_attachments;
  PRBool      m_attachVCard;
  PRBool      m_forcePlainText;
  PRBool      m_useMultipartAlternative;
  PRBool      m_returnReceipt;
  PRBool      m_DSN;
  PRBool      m_bodyIsAsciiOnly;
  PRBool      m_forceMsgEncoding;
  PRInt32     m_receiptHeaderType;        /* receipt header type */
  nsCString   m_DefaultCharacterSet;
  PRBool      m_needToCheckCharset;

  nsCOMPtr<nsISupports> mSecureCompFields;
};


#endif /* _MsgCompFields_H_ */
