Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

740 lines
24 KiB

/* compose.c - handle the compose window and associated commands
*
* HISTORY:
* 12-Mar-87 danl DoExit, use DISPLAYSTR
* 11-Mar-87 danl Call to MakeAbortFile takes 3rd string
* 11-Mar-87 danl CreateRetain, us MakeAbortFile, not MakeSendFile
* 09-Mar-87 danl Added DoRetain, CreateRetain
* 04-Mar-87 danl FileFixTab, output leading \n iff dest has content
* 04-Mar-87 danl Add fEdit to EnterComposer
* 04-Feb-87 danl separate files a blank lines when appending
* 09-Apr-1987 mz Use whiteskip/whitescan
* 11-Apr-1987 mz Use PASCAL/INTERNAL
* 05-May-87 danl Remove fNewmailOnExit
* 15-May-87 danl GOTOIDOC -> GOTOIDOCALL
* 20-May-87 danl CreateRetain: do not make new msg current one
* 28-May-87 danl Add index to FileFixTab param list
* 11-Jun-87 danl Add F_SENDER option to AppendMsgs
* 18-Jun-87 danl Add fConfirmComposeAbort
* 20-Jun-87 danl F_SENDER: pass strEMPTY to GetSender
* 01-Jul-87 danl test idoc, inote against -1 not ERROR
* 20-Jul-87 danl Use ReadKey instead of getc
* 22-Jul-87 danl Added pRFAIndent
* 24-Jul-87 danl DoAppend: add n to -mn -Mn -fn -Fn, meaning no tab
* 13-Aug-87 danl ExitComposer: _unlink *.bak too
* 19-Aug-87 danl FileFixTab: use fgetl on input
* 21-Aug-87 danl CreateRetain: don't exit composer unless msg saved
* 21-Aug-1987 mz Change references from MAXARG to MAXLINELEN
* 27-Aug-87 danl FileFixTab: don't use fputl
* 16-Sep-87 danl Added F_NUMFROM
* 17-Mar-1988 mz Test for mailability
* 29-Apr-1988 mz Add WndPrintf
* 29-Apr-1988 mz Add PrintMsgList
* 12-Oct-1989 leefi v1.10.73, Update AppendBinary() to use uuencoding
* 12-Oct-1989 leefi v1.10.73, clarified tmpfile error messages
* 13-Mar-1990 davidby fixed filename extension for uuencoded messages
*
*/
#define INCL_DOSINFOSEG
#include <stdio.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <assert.h>
#include <ctype.h>
#include <fcntl.h>
#include <io.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include "wzport.h"
#include <tools.h>
#include <process.h>
#include "dh.h"
#include "zm.h"
/* declaration of help routine (found in command.c) */
extern PSTR pCmd;
extern CHAR commandLine [ ];
extern HW hCurReadWind;
CHAR composedatastart = '\0';
/* EnterComposer - start up the compose window, set up hooks, etc. then spawn
* MAILEDIT editor via DoEditComp, draw compose window.
*
* arguments:
* pFileName name of file to invoke compose on.
* pStuffApnd pointer to string to pass to DoAppend.
* fEdit nonzero => invoke editor
*
* return value:
* none.
*
*/
VOID PASCAL INTERNAL EnterComposer ( PSTR pFileName, PSTR pStuffApnd, FLAG fEdit )
{
*commandLine = '\0';
hCompose = NULL;
pCompFile = ZMMakeStr ( pFileName );
/* Make sure file name ends with . because some editors will tack on
* their own default extensions if file name doesn't contain a .
*/
if ( !*strbscan ( pCompFile, strPERIOD ) )
pCompFile = AppendStr ( pCompFile, strPERIOD, NULL, TRUE );
DoAppend ( hCommand, (pStuffApnd ? pStuffApnd : strEMPTY), FALSE );
if ( fEdit )
DoEditComp ( hCommand, NULL, 0 );
hFocus = hCompose = ZmReadFile ( pCompFile, "The Composer", TRUE, 0, 0, -xSize,
-HdrHeight, readProc, StdSKey );
BringToTop ( hCommand, FALSE );
SetScrnSt ( BIGCOMPOSE );
}
/* ExitComposer - clean up after the compose window. If DirectComp flag is set
* set QuitFlag = TRUE;
*
* arguments:
* none.
*
* return value:
* none.
*/
VOID PASCAL INTERNAL ExitComposer (VOID)
{
CloseWindow ( hCompose );
BringToTop ( hCommand, FALSE );
hCompose = NULL;
hFocus = hHeaders;
_unlink ( pCompFile );
/* in case the user's editor created a *.bak file
*/
pCompFile = AppendStr ( pCompFile, "bak", NULL, TRUE );
_unlink ( pCompFile );
ZMfree ( pCompFile );
if ( fDirectComp )
fQuit = TRUE;
SetScrnSt ( BHDRNOCOMP );
}
/* FileFixTab - appends pSrcName to pDestName, adds a '\t' to the beginning of each
* line if asked, replaces "From" at start of line with ">From"
*
* arguments:
* hWnd window for error messages.
* pSrcName pointer to the name of the source file
* pDestName pointer to the name of the destination file
* options F_TABMSG set => adds tab (4 spaces) to beginning of line
* F_INDENTMSG set => use RFAIndent at beginning of line
* F_FIXFROM set => replace "From" with ">From"
* F_BRKLN set => print separating line after each file
* i index to be printed on break line iff > 0
*
* return value:
* FALSE (0) no problemos
* TRUE (-1) error occured
*
* IMPORTANT:
* FileFixTab ( ) assumes pSrcNAme and pDestName are not currently open
*/
FLAG PASCAL INTERNAL FileFixTab ( HW hWnd, PSTR pSrcName, PSTR pDestName, UINT options, INT i )
{
FLAG fWhitespaceIndent = FALSE;
FILE *fpSrc = NULL;
FILE *fpDest = NULL;
INT cchIndent = 0;
PSTR pIndent = NULL;
PSTR pBuf = ZMalloc ( 256 + 5 + strlen(pRFAIndent) );
fpSrc = fopen ( pSrcName, "r" );
fpDest = fopen ( pDestName, "a" );
if (fpSrc == NULL)
{
SendMessage ( hWnd, DISPLAY, "Unable to open temp file." );
SendMessage ( hWnd, DISPLAY, "(Check TMP environment variable and disk space.)");
}
else
if ( fpDest == NULL )
SendMessage ( hWnd, DISPLAY, "Unable to open compose file." );
else {
if ( options & F_BRKPAGE )
fprintf ( fpDest, "\n%c", CTRL_L );
if ( filelength ( _fileno ( fpDest ) ) != 0L )
fprintf ( fpDest, "\n" );
if ( options & F_BRKLN ) {
fprintf ( fpDest, "#######################################################" );
if ( i )
fprintf ( fpDest, " %d", i );
fprintf ( fpDest, "\n" );
}
if ( options & ( F_TABMSG | F_INDENTMSG ) ) {
pIndent = ( options & F_TABMSG ? " " : pRFAIndent );
cchIndent = strlen ( pIndent );
fWhitespaceIndent = * whiteskip ( pIndent ) == 0;
}
while ( !( feof ( fpSrc ) ) && ( fgetl ( pBuf, 256, fpSrc ) ) ) {
if ( ( options & F_FIXFROM ) && ( strpre ( "From", pBuf ) ) ) {
memmove ( pBuf + 1, pBuf, strlen ( pBuf ) + 1 );
*pBuf = '>';
}
if ( cchIndent ) {
memmove (pBuf + cchIndent, pBuf, strlen ( pBuf ) + 1 );
memmove (pBuf, pIndent, cchIndent );
}
/* if pIndent is all whitespace and the only thing on the line is
* pIndent, then output a line of crlf only
*/
if ( fWhitespaceIndent && strlen ( pBuf ) == (size_t)cchIndent )
*pBuf = '\0';
fprintf ( fpDest, "%s\n", pBuf );
}
}
ZMfree (pBuf);
if (fpSrc != NULL)
fclose (fpSrc);
if (fpDest != NULL)
fclose (fpDest);
return fpSrc == NULL || fpDest == NULL;
}
/* AppendMsgs - append the passed message list to the passed file stream.
*
* arguments:
* hWnd window for error messages.
* pMsgList pointer to a message list.
* pDestName pointer to destination file name.
* options F_TABMSG set => adds tab (4 spaces) to beginning of line
* F_INDENTMSG set => use RFAIndent at beginning of line
* F_FIXFROM set => replace "From" with ">From"
* F_BRKLN set => print seperating line after each file
* F_HEADERS set => print only headers
*
* return value:
* FALSE (0) append worked fine.
* TRUE (-1) error during append.
*/
FLAG PASCAL INTERNAL AppendMsgs ( HW hWnd, PSTR pMsgList, PSTR pDestName, UINT options )
{
struct vectorType *pVec = NULL;
INT i = -1;
IDOC idoc;
FLAG fTemp;
FILE *fp = NULL;
PSTR pTmpFN = NULL;
PSTR p = NULL;
if ( !( MsgList ( &pVec, &pMsgList, TRUE ) ) )
SendMessage ( hWnd, DISPLAY, "There is an error in the message list." );
else
if ( ( pVec == NULL ) || ( pVec->count == 0 ) )
SendMessage ( hWnd, DISPLAY, "No matching message set found" );
else {
if (TESTFLAG (options, F_HEADERS | F_SENDER | F_NUMFROM))
fp = fopen ( pDestName, "a" );
for ( i = 0; i < pVec->count; i++) {
idoc = (INT) pVec->elem[i];
if ( TESTFLAG (options, F_HEADERS)) {
p = hdrLine ( NULL, idoc );
fprintf ( fp, "%s\n", p );
ZMfree ( p );
}
else
if ( TESTFLAG (options, F_SENDER | F_NUMFROM)) {
GenerateFlags ( idoc );
p = GetSender (rgDoc[idoc].hdr, strEMPTY);
fprintf ( fp, "%-15s", p );
ZMfree ( p );
if ( TESTFLAG (options, F_NUMFROM))
fprintf ( fp, " %4ld", (LONG)idoc+1 );
fprintf ( fp, "\n" );
}
else {
pTmpFN = mktmpnam ( );
if ( IdocToFile ( idoc, pTmpFN, 0 ) != ERROR ) {
fTemp = FileFixTab ( hWnd, pTmpFN, pDestName, options,
idoc + 1 );
_unlink ( pTmpFN );
ZMfree ( pTmpFN );
if ( fTemp ) {
SendMessage ( hWnd, DISPLAY, "I couldn't 'fix' a message." );
pVec->count = i;
break;
}
}
else {
ZMfree ( pTmpFN );
pVec->count = i;
break;
}
}
}
PrintMsgList (hWnd, pVec);
WndPrintf (hWnd, "\r\n");
}
if ( pVec != PARSEERROR )
ZMfree ( ( PSTR ) pVec );
if (fp != NULL)
fclose ( fp );
return i == -1 || i < pVec->count;
}
/* AppendBinary - append the passed source file to the passed dest file
*
* arguments:
* pSrcName pointer to name of the source file
* pDestName pointer to name of the destination file
* pNonTempDestName pointer to filename to use as uuencoded name
*
* return value:
* FALSE (0) no errors occured during append
* TRUE (-1) error during append
*
* IMPORTANT:
* AppendBinary ( ) assumes the files pSrcName and pDestName are not
* currently open.
*
* INFORMATION:
*
* If UUCODE is defined, AppendBinary() will produce
* an encoded output file that has the format:
*
* #<begin uuencode>
* begin OCTAL_ATTR FILE_NAME
* UUENCODED_DATA
* end
* #<end uuencode>
*
* where OCTAL is the file attribute, FILE_NAME is the file
* name (the basename of the source file, since the target file
* is a temporary file), and UUENCODED_DATA is the actual file
* data, uuencoded. If UUCODE is NOT defined, the older method
* of encoding the output file will produce:
*
* #<binary data>
* BENCODED_DATA
* #<end>
*
* where BENCODED_DATA is the actual file data, encoded.
*
*/
FLAG PASCAL INTERNAL AppendBinary ( PSTR pSrcName, PSTR pDestName )
{
#if defined(UUCODE)
/* NOTE: This is the post-1.10-73 version, which uses UUCODE.C
* rather than BENCODE.C to do the binary encoding. */
FLAG retVal = FALSE; /* optimistic default (no errors) */
INT fhSrc; /* source file name */
INT fhDest; /* destination binary file name */
CHAR szT[80]; /* buffer for binary header/footer */
CHAR szBasename[_MAX_FNAME]; /* component of pSrcName's filename */
CHAR szDrive[_MAX_DRIVE]; /* component of pSrcName's filename: UNUSED */
CHAR szDir[_MAX_DIR]; /* component of pSrcName's filename: UNUSED */
CHAR szExtension[_MAX_EXT]; /* component of pSrcName's filename */
static CHAR szErrCloseSrc[] = "can't close binary source file %s\n";
static CHAR szErrCloseDest[] = "can't close binary target file %s\n";
static CHAR szErrHeader[] = "can't write header to binary target file %s\n";
/* a few reality-checking assertions... */
assert(("AppendBinary(): NULL source file", pSrcName != (PSTR )NULL));
assert(("AppendBinary(): NULL target file", pDestName != (PSTR )NULL));
/* attempt to open the source file handle */
if ((fhSrc = open(pSrcName, O_RDONLY | O_BINARY, S_IREAD)) == -1)
{
perror(pSrcName);
return (TRUE); /* return indication of failure */
}
/* open the destination file */
if ((fhDest = open(pDestName, O_WRONLY | O_APPEND, S_IREAD)) == -1)
{
perror(pDestName);
if (close(fhSrc) != 0) /* close the source file */
{
(VOID)fprintf(stderr, szErrCloseSrc, pSrcName);
}
return (TRUE); /* return indication of failure */
}
/* write encoded "header" (wzmail+uuencode) information */
_splitpath(pSrcName, szDrive, szDir, szBasename, szExtension);
sprintf(szT, "%s\nbegin %o %s%s\n",
strBEGINBINARY, 0666, szBasename, szExtension);
if ((size_t)(write(fhDest, szT, strlen(szT))) != strlen(szT))
{
fprintf(stderr, szErrHeader, pDestName);
if (close(fhSrc) != 0) /* close the source file */
{
fprintf(stderr, szErrCloseSrc, pSrcName);
}
if (close(fhDest) != 0) /* close the target file */
{
fprintf(stderr, szErrCloseDest, pDestName);
}
return (TRUE); /* return indication of failure */
}
/* uuencode the target file */
Encode(fhSrc, fhDest); /* (see uucode.c) */
/* write encoded "footer" (wzmail+uuencode) information */
sprintf(szT, "end\n%s\n", strENDBINARY);
if ((size_t)(write(fhDest, szT, strlen(szT))) != strlen(szT))
{
fprintf(stderr, szErrHeader, pDestName);
retVal = TRUE; /* set failure indication */
/* fall through to normal source/target fclosing code... */
}
/* close the source file */
if (close(fhSrc) != 0)
{
fprintf(stderr, szErrCloseSrc, pSrcName);
retVal = TRUE; /* set failure indication */
/* fall through to normal target fclosing code... */
}
/* close the destination file */
if (close(fhDest) != 0)
{
fprintf(stderr, szErrCloseDest, pDestName);
retVal = TRUE; /* set failure indication */
/* fall through to normal function return... */
}
return (retVal); /* return status code to calling function */
#else /* UUCODE */
/* NOTE: This is the pre-1.10-73 version, which uses BENCODE.C
* rather than UUCODE.C to do the binary encoding. */
FLAG retVal = TRUE;
FILE * fpDest = NULL;
CHAR line [ ENCBFSIZE + 1], encode [ ( 4 * ENCBFSIZE / 3 ) + 2 ];
INT hSrc;
INT cnt;
hSrc = open ( pSrcName, O_RDONLY | O_BINARY, S_IREAD );
fpDest = fopen ( pDestName, "a" );
if ( ( hSrc != -1 ) && ( fpDest ) ) {
fprintf ( fpDest, "\n%s\n", strBEGINBINARY );
while ( !( eof ( hSrc ) ) ) {
cnt = bencode ( line, encode, read ( hSrc, line, ENCBFSIZE ) );
encode [ cnt++ ] = '\n';
encode [ cnt ] = '\0';
fputs ( encode, fpDest );
}
fprintf ( fpDest, "%s\n", strENDBINARY );
retVal = FALSE;
}
if ( hSrc != -1 )
close ( hSrc );
if ( fpDest )
fclose ( fpDest );
return retVal;
#endif /* UUCODE */
}
/* AppendFile - append the passed source file to the passed dest file
*
* arguments:
* hWnd window for error messages.
* pSrcName pointer to name of the source file
* pDestName pointer to name of the destination file
* options F_TABMSG set => adds tab (4 spaces) to beginning of line
* F_INDENTMSG set => use RFAIndent at beginning of line
* F_FIXFROM set => replace "From" with ">From"
* F_BRKLN set => print seperating line after each file
*
* return value:
* FALSE (0) no errors occured during append
* TRUE (-1) error during append
*
* IMPORTANT:
* AppendFile ( ) assumes the file pDestName is not currently open.
*/
FLAG PASCAL INTERNAL AppendFile ( HW hWnd, PSTR pSrcName, PSTR pDestName, UINT options )
{
if ( FileFixTab ( hWnd, pSrcName, pDestName, options, 0 ) ) {
SendMessage ( hWnd, DISPLAY, "Unable to open compose file." );
return TRUE;
}
return FALSE;
}
/* DoAppend - append the passed messages and files to the message being composed
*
* usage:
* Append <-m msg list> <-f[b] file name #1>...<-f file name #n>
*
* arguments:
* hWnd window for commands
* p character pointer to beginning of arguments
* operation TRUE => the Append command
* FALSE => internal call, e.g. EnterComposer
*
* return value:
* none.
*/
VOID PASCAL INTERNAL DoAppend ( HW hWnd, PSTR p, INT operation )
{
FLAG msgListApp = FALSE;
FLAG binaryApp = FALSE;
FLAG error = FALSE;
UINT flags;
UCHAR buffer [ MAXLINELEN ];
UCHAR optChar, modChar;
if ( hCompose != NULL )
SendMessage ( hCompose, CLOSEFILE, 0 );
if ( operation && !*p )
p = strPERIOD;
while ( *( p = whiteskip (p)) != '\0' ) {
error = TRUE;
flags = F_FIXFROM;
if ( *p == '-' || *p == '/' ) {
optChar = *++p;
modChar = *++p; /* either a blank or 'b' */
p++;
p = whiteskip (p);
}
else
optChar = 'M';
switch ( tolower ( optChar ) ) {
case 'm' :
if ( msgListApp )
SendMessage ( hWnd, DISPLAY, "Only 1 message list allowed, extra ignored." );
else if ( *p != '\0' ) {
msgListApp = TRUE;
strcpy ( buffer, p );
*( whitescan ( buffer ) ) = '\0';
if ( modChar != 'n' )
flags |= ( optChar == 'm' ) ? F_TABMSG : F_INDENTMSG;
error = AppendMsgs ( hWnd, buffer, pCompFile, flags );
}
break;
case 'f' :
if ( *p != '\0' ) {
strcpy ( buffer, p );
*( whitescan ( buffer ) ) = '\0';
if ( modChar != 'n' )
flags |= ( optChar == 'f' ) ? F_TABMSG : F_INDENTMSG;
if ( modChar == ' ' || modChar == 'n' )
error = AppendFile ( hWnd, buffer, pCompFile, flags );
else if ( tolower ( modChar ) == 'b' && !binaryApp ) {
error = AppendBinary ( buffer, pCompFile );
SendMessage(hWnd, DISPLAY, buffer); // BUGBUG: debug code
SendMessage(hWnd, DISPLAY, pCompFile); // BUGBUG: debug code
binaryApp = TRUE;
}
}
break;
default :
break;
}
p = whitescan ( p );
if ( error ) {
SendMessage ( hWnd, DISPLAY, "Error in append list, not all were appended." );
break;
}
}
if ( hCompose != NULL )
SendMessage ( hCompose, REOPNFILE, 1 );
}
/* DoEditComp - spawn the EDITOR editor and edit the current compose message
*
* usage:
* edit
*
* arguments:
* hWnd window for commands
* p character pointer to beginning of arguments (ignored)
* operation opertaion to perform (ignored)
*
* return value:
* none.
*/
VOID PASCAL INTERNAL DoEditComp ( HW hWnd, PSTR p, INT operation )
{
CHAR buf [ MAXLINELEN ];
PSTR pArgs = NULL;
/* remove unused parm */
p; operation;
if ( hCompose != NULL )
SendMessage ( hCompose, CLOSEFILE, 0 );
strcpy ( buf, DefMailEdit );
strcat ( buf, strBLANK );
strcat ( buf, pCompFile );
if ( !*strbscan ( pCompFile, strPERIOD ) )
strcat ( buf, strPERIOD );
pArgs = whitescan ( buf );
*pArgs++ = '\0';
pArgs = whiteskip ( pArgs );
ZMSpawner ( hWnd, buf, pArgs, FALSE );
if ( hCompose != NULL )
SendMessage ( hCompose, REOPNFILE, 1 );
}
/* DoExit - leave the compose mode in 1 of three ways, send message, abort or
* save prior to exit.
*
* usage:
* abort - aborts compose mode
* send - sends current compose message
* save <file name> - save current compose message to <file name>
*
* arguments:
* hWnd window for commands
* p character pointer to beginning of arguments
* operation COMPABORT aborts the current message then exits
* COMPMAIL mails the current message then exits
* COMPSAVE saves the current message then exits
*
* return value:
* none.
*
* IMPORTANT:
* DoExit will only kill the compose mode on a send or save command if
* they are successful, otherwise DoExit returns to the compose mode
*/
VOID PASCAL INTERNAL DoExit ( HW hWnd, PSTR p, INT operation )
{
CHAR buf [ 2 ];
PSTR pErrMsg = NULL;
switch ( operation ) {
case COMPSAVE :
p = whiteskip ( p );
pErrMsg = fcopy ( pCompFile, p );
if ( pErrMsg != NULL ) {
SendMessage ( hWnd, DISPLAY, pErrMsg );
return;
}
else
SendMessage ( hWnd, DISPLAY, "Message saved." );
break;
case COMPMAIL :
if (!fMailAllowed) {
SendMessage (hWnd, DISPLAY, "Cannot send mail");
return;
}
SendMessage ( hCompose, CLOSEFILE, 0 );
if ( MailFile ( pCompFile, TRUE ) ) {
SendMessage ( hWnd, DISPLAY, "Error during send, send was aborted." );
SendMessage ( hCompose, REOPNFILE, 1 );
return;
}
else {
SendMessage ( hWnd, DISPLAY, "Message sent successfully." );
if ( (fNewmailOnSend) && (fCurFldIsDefFld) )
DoNewMail(hWnd, p, TRUE);
}
break;
default :
if ( fConfirmComposeAbort ) {
SendMessage ( hWnd, DISPLAYSTR, "Type y to confirm abort composed msg ");
buf[0] = (CHAR)ReadKey();
buf[1] = '\0';
SendMessage ( hWnd, DISPLAY, buf );
if ( *buf != 'y' )
return;
}
break;
}
ExitComposer ( );
}
/* DoRetain - retain the current content of the compose window in a folder
*
* usage:
* retain [mailfolder]
*
* arguments:
* hWnd window for commands
* p character pointer to beginning of arguments
* operation opertaion to perform (ignored)
*
* return value:
* none.
*/
VOID PASCAL INTERNAL DoRetain ( HW hWnd, PSTR p, INT operation )
{
/* remove unused parm */
hWnd; operation;
CreateRetain ( ( *p ? p : mboxName ), FALSE );
}
/* Common code for the Create Retain
*/
VOID PASCAL INTERNAL CreateRetain ( PSTR pFldNm, FLAG fAddFrom )
{
HDRINFO hdrInfo;
PSTR pTmpFN = NULL;
FLAG fError = TRUE;
if ( hFocus == hCompose ) {
SendMessage ( hCompose, CLOSEFILE, 0 );
GetHdrInfo ( &hdrInfo, pCompFile, NULL );
}
else {
InitHdrInfo ( &hdrInfo );
hdrInfo.pstrRcd = ZMMakeStr ( RecordFolder );
}
if ( (hdrInfo.pstrTo == NULL) || !*hdrInfo.pstrTo )
hdrInfo.pstrTo = ZMMakeStr ( "-------" );
pTmpFN = MakeAbortFile ( &hdrInfo, (hFocus == hCompose ? pCompFile : NULL ),
strEMPTY );
FreeHdrInfo ( &hdrInfo, HDRALL );
if ( pTmpFN != NULL ) {
/* if add worked && pFldNm is the current folder then
* show the created/retained msg
*/
fError = AddMsgToFld ( pTmpFN, pFldNm, fAddFrom ) == ERROR;
if ( !fError && !strcmpis ( pFldNm, mboxName ) ) {
if ( MapIdocInote ( idocLast ) == -1 )
SendMessage ( hCommand, DISPLAY,
"Do a \"headers all\" to see created message" );
}
_unlink ( pTmpFN );
ZMfree ( pTmpFN );
}
/* don't exit composer if retained msg not successfully put into a folder
*/
if ( hFocus == hCompose && !fError )
ExitComposer ( );
}