gecko-dev/lib/libmisc/mime.c

213 строки
4.9 KiB
C

/* -*- Mode: C; 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 "xp.h"
#include "mime.h"
#include "prefapi.h"
#include "msgcom.h"
#include "libi18n.h"
#include "xpgetstr.h"
extern int MK_MSG_NO_RETURN_ADDRESS;
extern int MK_MSG_NO_RETURN_ADDRESS_AT;
extern int MK_MSG_NO_RETURN_ADDRESS_DOT;
extern int MK_OUT_OF_MEMORY;
extern int MK_SIGNATURE_TOO_LONG;
extern int MK_SIGNATURE_TOO_WIDE;
const int16 default_csid = 0;
const int address_max_length = 42;
#define mime_enc_7bit 0
#define mime_enc_8bit 1
#define mime_enc_qp 2
#define mime_enc_b64 3
/* build a mailto: url address given a to field
*
* returns a malloc'd string
*/
PUBLIC char *
MIME_BuildMailtoURLAddress(const char * to)
{
char * rv=0;
StrAllocCopy(rv,"mailto:");
StrAllocCat(rv, to);
return(rv);
}
/* build a news: url address given a partial news post
* URL and the newsgroups line
*
* returns a malloc'd string
*/
PUBLIC char *
MIME_BuildNewspostURLAddress(const char *partial_newspost_url,
const char *newsgroups)
{
char * rv=0;
if (!partial_newspost_url)
partial_newspost_url = "news:";
StrAllocCopy(rv, partial_newspost_url);
StrAllocCat(rv, newsgroups);
return(rv);
}
/*
Returns the appropriate contents of a From: field of a mail message
originating from the current user. This calls FE_UsersFullName()
and FE_UsersMailAddress() and correctly munges the values.
A new string is returned, which you must free when you're done with it.
An email address must be provided but a user name is optional. If no
address has been entered or other errors are encountered return NULL.
*/
PUBLIC char *
MIME_MakeFromField (void)
{
return MSG_MakeFullAddress(FE_UsersFullName(), FE_UsersMailAddress());
}
/* Ok, this doesn't really belong here... */
void
MISC_ValidateSignature (MWContext *context, const char *signature)
{
int max_columns = 0;
int column = 0;
int newlines = 0;
const char *sig = signature;
/* ensure that sig is valid */
if (!sig) return;
for (; *sig; sig++)
{
if (*sig == '\n' || *sig == '\r')
{
/* Treat CR, LF, CRLF, and LFCR as a single line-break. */
if ((sig[0] == '\n' && sig[1] == '\r') ||
(sig[0] == '\r' && sig[1] == '\n'))
sig++;
if (column > max_columns)
max_columns = column;
newlines++;
column = 0;
}
else
{
column++;
}
}
/* If the last line doesn't end in a newline, pretend it does. */
if (column != 0)
newlines++;
if (column > max_columns)
max_columns = column;
/* If the signature begins with "--" followed by whitespace or a newline,
that means that the pseudo-standard sig delimiter "-- \n" is actually
in the file, so don't count that as a "line". */
if (signature [0] == '-' &&
signature [1] == '-' &&
(signature [2] == ' ' ||
(signature [2] == '\012' ||
signature [2] == '\015')))
newlines--;
if (newlines > 4)
{
FE_Alert (context, XP_GetString (MK_SIGNATURE_TOO_LONG));
}
else if (max_columns > 79)
{
FE_Alert (context, XP_GetString (MK_SIGNATURE_TOO_WIDE));
}
}
int
MISC_ValidateReturnAddress (MWContext *context, const char *addr)
{
char *at;
char *dot;
char *fmt = 0;
XP_Bool validate;
PREF_GetBoolPref("mail.identity.validate_addr", &validate);
if ( !validate ) return 0;
#if defined(XP_WIN) || defined(XP_OS2)
if(FE_IsAltMailUsed(context))
return 0;
#endif
if (addr)
while (XP_IS_SPACE (*addr))
addr++;
if (!addr || !*addr)
{
FE_Alert (context, XP_GetString (MK_MSG_NO_RETURN_ADDRESS));
#ifdef XP_MAC
FE_EditPreference(PREF_EmailAddress);
#endif
return -1;
}
at = XP_STRRCHR (addr, '@');
if (!at)
{
fmt = XP_GetString (MK_MSG_NO_RETURN_ADDRESS_AT);
goto FAIL;
}
dot = XP_STRCHR (at, '.');
if (!dot)
{
fmt = XP_GetString (MK_MSG_NO_RETURN_ADDRESS_DOT);
goto FAIL;
}
return 0;
FAIL:
{
char *buf = (char *)XP_ALLOC (XP_STRLEN (addr) + XP_STRLEN (fmt) + 20);
if (!buf) return MK_OUT_OF_MEMORY;
if ( ( XP_STRLEN (addr) > address_max_length ) && ( context != NULL ) )
INTL_MidTruncateString( default_csid, addr, addr, address_max_length );
XP_SPRINTF (buf, fmt, addr);
FE_Alert (context, buf);
return -1;
}
}