/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */

#ifndef _nsMsgCompUtils_H_
#define _nsMsgCompUtils_H_

#include "nscore.h"
#include "nsMsgSend.h"
#include "nsMsgCompFields.h"
#include "nsIMsgSend.h"
#include "nsIMsgCompUtils.h"

class nsIPrompt; 

#define ANY_SERVER "anyfolder://"

// these are msg hdr property names for storing the original
// msg uri's and disposition(replied/forwarded) when queuing
// messages to send later.
#define ORIG_URI_PROPERTY "origURIs"
#define QUEUED_DISPOSITION_PROPERTY "queuedDisposition"

class nsMsgCompUtils : public nsIMsgCompUtils
{
public:
  NS_DECL_ISUPPORTS
  NS_DECL_NSIMSGCOMPUTILS

  nsMsgCompUtils();

private:
  virtual ~nsMsgCompUtils();
};

PR_BEGIN_EXTERN_C

//
// Create a file spec or file name using the name passed
// in as a template
//
nsresult    nsMsgCreateTempFile(const char *tFileName, nsIFile **tFile);
char        *nsMsgCreateTempFileName(const char *tFileName);


//
// Various utilities for building parts of MIME encoded 
// messages during message composition
//

nsresult    mime_sanity_check_fields_recipients (
                            const char *to,
                            const char *cc,
                            const char *bcc,
                            const char *newsgroups);

nsresult    mime_sanity_check_fields (
                            const char *from,
                            const char *reply_to,
                            const char *to,
                            const char *cc,
                            const char *bcc,
                            const char *fcc,
                            const char *newsgroups,
                            const char *followup_to,
                            const char * /*subject*/,
                            const char * /*references*/,
                            const char * /*organization*/,
                            const char * /*other_random_headers*/);

nsresult mime_generate_headers(nsIMsgCompFields *fields,
                               nsMsgDeliverMode deliver_mode,
                               msgIWritableStructuredHeaders *headers);

char        *mime_make_separator(const char *prefix);
char        *mime_gen_content_id(uint32_t aPartNum, const char *aEmailAddress);

char        *mime_generate_attachment_headers (
                           const char *type,
                           const char *type_param,
                           const char *encoding,
                           const char *description,
                           const char *x_mac_type,
                           const char *x_mac_creator,
                           const char *real_name,
                           const char *base_url,
                           bool digest_p,
                           nsMsgAttachmentHandler *ma,
                           const char *attachmentCharset, // charset of the attachment (can be null)
                           const char *bodyCharset,       // charset of the main body
                           bool bodyIsAsciiOnly,
                           const char *content_id,
                           bool       aBodyDocument);

char        *msg_generate_message_id (nsIMsgIdentity*);

bool        mime_7bit_data_p (const char *string, uint32_t size);

char        *mime_fix_header_1 (const char *string, bool addr_p, bool news_p);
char        *mime_fix_header (const char *string);
char        *mime_fix_addr_header (const char *string);
char        *mime_fix_news_header (const char *string);

bool        mime_type_requires_b64_p (const char *type);
bool        mime_type_needs_charset (const char *type);

char        *msg_make_filename_qtext(const char *srcText, bool stripCRLFs);

// Rip apart the URL and extract a reasonable value for the `real_name' slot.
void        msg_pick_real_name (nsMsgAttachmentHandler *attachment, const char16_t *proposedName, const char *charset);

//
// Informational calls...
//
void        nsMsgMIMESetConformToStandard (bool conform_p);
bool        nsMsgMIMEGetConformToStandard (void);

//
// network service type calls...
//
nsresult    nsMsgNewURL(nsIURI** aInstancePtrResult, const char * aSpec);
bool        nsMsgIsLocalFile(const char *url);
char        *nsMsgGetLocalFileFromURL(const char *url);

char        *nsMsgParseURLHost(const char *url);

char        *GenerateFileNameFromURI(nsIURI *aURL);

//
// Folder calls...
//
void GetFolderURIFromUserPrefs(nsMsgDeliverMode   aMode, nsIMsgIdentity *identity, nsCString& uri);

// Check if we should use format=flowed
void GetSerialiserFlags(const char *charset, bool *flowed, bool *delsp, bool *formatted, bool *disallowBreaks);


PR_END_EXTERN_C


#endif /* _nsMsgCompUtils_H_ */