home *** CD-ROM | disk | FTP | other *** search
- head 1.9;
- branch ;
- access ;
- symbols ;
- locks ; strict;
- comment @ * @;
-
-
- 1.9
- date 94.09.16.00.57.09; author jcooper; state Exp;
- branches ;
- next 1.8;
-
- 1.8
- date 94.08.24.17.59.26; author jcooper; state Exp;
- branches ;
- next 1.7;
-
- 1.7
- date 94.08.11.00.09.17; author jcooper; state Exp;
- branches ;
- next 1.6;
-
- 1.6
- date 94.06.09.18.51.30; author rushing; state Exp;
- branches ;
- next 1.5;
-
- 1.5
- date 94.05.23.18.37.00; author jcooper; state Exp;
- branches ;
- next 1.4;
-
- 1.4
- date 94.05.19.02.02.10; author rushing; state Exp;
- branches ;
- next 1.3;
-
- 1.3
- date 94.02.24.21.27.10; author jcoop; state Exp;
- branches ;
- next 1.2;
-
- 1.2
- date 94.01.22.01.30.03; author jcoop; state Exp;
- branches ;
- next 1.1;
-
- 1.1
- date 94.01.16.12.10.08; author jcoop; state Exp;
- branches ;
- next ;
-
-
- desc
- @jcoop's MIME and attachment routines
- @
-
-
- 1.9
- log
- @zero-padding in subject template, cleanup for 92.6
- @
- text
- @/********************************************************************
- * *
- * MODULE : WVATTACH.C *
- * *
- * PURPOSE : This file contains functions for attachments to *
- * mail or news posting *
- * *
- * ENTRY POINTS: Attach () *
- * *
- * Author: John S. Cooper (jcooper@@netcom.com) *
- * Date: Nov 28, 1993 *
- ********************************************************************/
- /*
- * $Id: wvattach.c 1.8 1994/08/24 17:59:26 jcooper Exp $
- * $Log: wvattach.c $
- * Revision 1.8 1994/08/24 17:59:26 jcooper
- * misc encoding/decoding changes
- *
- * Revision 1.7 1994/08/11 00:09:17 jcooper
- * Enhancements to Mime and article encoding/encoding
- *
- * Revision 1.6 1994/06/09 18:51:30 rushing
- * problem with symbol 'header' on AXP/NT
- *
- * Revision 1.5 1994/05/23 18:37:00 jcooper
- * new attach code, session [dis]connect
- *
- * Revision 1.3 1994/02/24 21:27:10 jcoop
- * jcoop changes
- *
- * Revision 1.2 1994/01/22 01:30:03 jcoop
- * 90.2 changes
- *
- * Revision 1.1 1994/01/16 12:10:08 jcoop
- * Initial revision
- *
- */
- #include <windows.h>
- #include <windowsx.h>
- #include "wvglob.h"
- #include "winvn.h"
- #pragma hdrstop
- #include <string.h>
- #include <ctype.h> /* for isspace, isalnum, etc */
- #include <stdlib.h> /* for itoa */
-
- extern void UpdateBlockStatus (); // in wvcoding.c
- /*
- * Forward Declarations
- */
- void AppendPlainFileToPost (char *fileName);
- BOOL SplitCurrentHeader (TypTextBlock *header, TypTextBlock *body, TypTextBlock *tail, char *origSubject);
- BOOL AddMIMEVersion (TypTextBlock *header);
- BOOL InitiateAttach (int useWnd, int DocType);
- void EndAttach ();
- void PostTextBlock (TypTextBlock *block);
- unsigned long PostPartialTextBlock (TypTextBlock *block, unsigned long start, unsigned long maxBytes);
- int PostOneLine (char *str, unsigned long *byteCount, unsigned long maxBytes);
- void GenerateSubject (TypTextBlock *header, char *origSubject, unsigned int part, unsigned int numParts);
- HWND CreateGlobalPostingWnd (HWND hWnd);
- void FlushCommSpool ();
-
- /*
- * Globals
- */
- // NUM_ENCODING_TYPES should be set in wvglob.h to the # items here
- char *EncodingTypes[] = { "Base-64", "UU", "XX", "Custom", "None" };
-
- // NUM_CONTENT_TYPES should be set in wvglob.h to the # items here
- char *ContentTypes[] =
- { "Text/Plain",
- "Text/Richtext",
- "Video/MPEG",
- "Video/AVI",
- "Image/JPEG",
- "Image/GIF",
- "Audio/Basic",
- "Application/Zip",
- "Application/PostScript",
- "Other" };
-
- #define CURRENT_WND 1
- #define NEW_WND 2
- #define EDIT_SIZE_INC 512
-
- #define ATTACH_NONE 0
- #define ATTACH_START 1 // state constants for ProcessAttachment
- #define ATTACH_FIRST_IN_THIS_WND 2
- #define ATTACH_FIRST_IN_NEXT_WND 3
- #define ATTACH_WAIT 4
- #define ATTACH_MAIN 5
- #define ATTACH_DONE 6
-
- HWND hThisEditWnd;
- HWND hParentWnd;
- TypTextBlock *headerBlock, *body, *attachment, *tail;
- unsigned int thisPart, numParts;
- int AttachmentState;
- char attachmentID[MAXINTERNALLINE], origSubject[MAXINTERNALLINE];
- WndEdit *thisPostWnd;
- int thisDocType;
-
- unsigned int editSize; // cannot exceed 64k in an edit window
- unsigned int editMaxSize;
- char *editMem;
- int aMode; // attachment mode for ended line chars
- int saveReviewAttach;
-
- #define MAX_COMM_SPOOL 1000
- unsigned int commSpoolLen;
- char *commSpool;
-
- /* ---------------------------------------------------------------------------
- * EncodingTypeToNum converts a string describing a coding type into the
- * internal numeric representation
- */
- int
- EncodingTypeToNum (char *str)
- {
- if (!stricmp (str, "Base-64"))
- return CODE_BASE64;
- else if (!stricmp (str, "UU"))
- return CODE_UU;
- else if (!stricmp (str, "XX"))
- return CODE_XX;
- else if (!stricmp (str, "Custom"))
- return CODE_CUSTOM;
- else if (!stricmp (str, "None"))
- return CODE_NONE;
- else
- return CODE_UNKNOWN;
- }
-
- /* ---------------------------------------------------------------------------
- * hParentWnd is handle to multi-line edit posting window
- * Called by wvpost.c after file selected and attachment dialog completed
- * Based on globals set in attachment dialog, creates attachment
- * possibly encoded, with MIME headers, and posts it
- *
- * If ReviewAttach is set, add attachment to post/mail windows (creating
- * new windows as necessary for message/partial)
- */
- void
- Attach (WndEdit *WndPost, char *fileName, int DocType)
- {
- time_t theTime;
- unsigned long offset, mimeUsage;
-
- hParentWnd = WndPost->hWnd;
- hThisEditWnd = WndPost->hWndEdit;
- WndPost->dirty = DT_DIRTY;
- thisDocType = DocType;
- thisPostWnd = WndPost;
- // Initialize text blocks
- if ((headerBlock= InitTextBlock (hCodedBlockWnd)) == NULL)
- return;
- if ((body = InitTextBlock (hCodedBlockWnd)) == NULL)
- return;
- if ((tail = InitTextBlock (hCodedBlockWnd)) == NULL)
- return;
- if ((attachment = InitTextBlock (hCodedBlockWnd)) == NULL)
- return;
-
- aMode = ADD_TO_EDIT; // end all lines in \r\n
-
- if (!ReviewAttach)
- {
- if ((commSpool = (char *)GlobalAllocPtr (GMEM_MOVEABLE, MAX_COMM_SPOOL*sizeof (char))) == NULL)
- {
- MessageBox (hParentWnd, "Memory allocation failure", "Comm Spool Init Failed", MB_OK);
- return;
- }
- commSpool[0] = '\0';
- commSpoolLen = 0;
- }
-
- saveReviewAttach = ReviewAttach;
- if (DocType == DOCTYPE_MAIL)
- ReviewAttach = TRUE; // must review when mailing
-
- CreateStatusArea (hParentWnd); // init hCodedBlockWnd and currentCoded
- strcpy (currentCoded->ident, fileName); // status info
-
- if (EncodingTypeNum == CODE_NONE)
- {
- if (ReadFileToTextBlock (hParentWnd, attachment, fileName, aMode) == FAIL)
- { FinishAttachment (ABORT); return; }
- }
- else if (Encode (attachment, fileName, aMode) == FAIL)
- { FinishAttachment (ABORT); return; }
-
- CodingState = ATTACH_POSTING;
- InvalidateRect (hCodedBlockWnd, NULL, TRUE); // clear background
-
- time (&theTime);
- sprintf (attachmentID, "\"%ld@@%s\"", theTime, UserName);
-
- if (SplitCurrentHeader (headerBlock, body, tail, origSubject))
- { FinishAttachment (ABORT); return; }
-
- if (!GenerateMIME || BlankBeforeMIME)
- if (AddEndedLineToTextBlock (headerBlock, "", aMode))
- { FinishAttachment (ABORT); return; }
-
- if (GenerateMIME && AddMIMEVersion (headerBlock))
- { FinishAttachment (ABORT); return; }
-
- // if header+tail won't fit in ArticleSplitLength bytes, can't do it
- if (headerBlock->numBytes + tail->numBytes + 200 > ArticleSplitLength)
- {
- MessageBox (hCodedBlockWnd, "Article split length too short to contain headers", "Article Split Length Too Small", MB_OK);
- FinishAttachment (ABORT); return;
- }
-
- // if the attachment won't fit in this article, force start in next
- if (!AttachInNewArt &&
- (body->numBytes + headerBlock->numBytes + tail->numBytes + 200 > ArticleSplitLength))
- {
- MessageBox (hCodedBlockWnd, "Beginning attachment in next article", "Edit Window Space Shortage", MB_OK);
- AttachInNewArt == TRUE;
- }
-
- if (ArticleSplitLength > 0)
- {
- offset = (AttachInNewArt) ? 0 : body->numBytes;
- // calc encodelength/splitlength rounded up
- numParts = (int)((attachment->numBytes + offset +
- ArticleSplitLength) / ArticleSplitLength);
- // now add in the length of header+sig for each part
- // the extra 200 bytes is rough avg for the MIME headers
- // on each part. Round up to next articlesplitlen
- mimeUsage = GenerateMIME ? 200L : 0L;
- numParts = (int)((attachment->numBytes + offset +
- (long)numParts*(headerBlock->numBytes + tail->numBytes + mimeUsage) +
- ArticleSplitLength) / ArticleSplitLength);
- } else
- numParts = 1;
-
- AttachmentState = ATTACH_START;
- ProcessAttach (CONTINUE);
- }
-
- /* ---------------------------------------------------------------------------
- * ProcessAttach
- * this is written as a state machine to allow interruption in !ReviewMode
- * to wait for News Server comm responses.
- * Thus in !ReviewMode, after an Initiate/EndAttach, we give up control
- * and wvutil calls ProcessAttach when ready to continue
- */
- void
- ProcessAttach (int action)
- {
- static unsigned long attachLine, byteCount, saveHeaderLines, saveHeaderBytes, dummyLong;
- static BOOL MultipartMixed;
- char temp[MAXINTERNALLINE];
- static int abort;
- int i, found;
-
- if (action == ABORT)
- {
- MessageBox (hCodedBlockWnd, "Posting with attachment aborted", "Attachment", MB_OK|MB_ICONHAND);
- AttachmentState = ATTACH_DONE;
- }
-
- while (AttachmentState != ATTACH_NONE) {
- switch (AttachmentState) {
-
- case ATTACH_START:
- abort = ABORT;
- byteCount = 0;
- MultipartMixed = FALSE;
- attachLine = 0;
- saveHeaderLines = headerBlock->numLines;
- saveHeaderBytes = headerBlock->numBytes;
- currentCoded->numLines = 0;
- currentCoded->numBytes = 0;
-
- if (AttachInNewArt)
- {
- thisPart = 0;
- AttachmentState = ATTACH_FIRST_IN_NEXT_WND;
- }
- else
- {
- thisPart = 1;
- AttachmentState = ATTACH_FIRST_IN_THIS_WND;
- }
- currentCoded->sequence = thisPart; // status window info
-
- if (InitiateAttach (CURRENT_WND, thisDocType))
- { AttachmentState = ATTACH_DONE; break; }
- if (!ReviewAttach)
- return;
-
- break;
-
- case ATTACH_FIRST_IN_THIS_WND:
- if (!ReviewAttach)
- CommState = ST_POST_WAIT_END;
-
- if (body->numLines != 0) // if have body, then mixed
- {
- GenerateSubject (headerBlock, origSubject, thisPart, numParts);
- saveHeaderBytes = headerBlock->numBytes;
-
- if (GenerateMIME)
- {
- if (AddEndedLineToTextBlock (headerBlock, "Content-Type: multipart/mixed;",aMode))
- { AttachmentState = ATTACH_DONE; break; }
-
- sprintf (temp, " Boundary=\"%s\"", MIMEBoundary);
- if (AddEndedLineToTextBlock (headerBlock, temp, aMode))
- { AttachmentState = ATTACH_DONE; break; }
-
- // blank preamble here
- // each boundary must be preceded by a CRLF (add "")
- if (AddEndedLineToTextBlock (headerBlock, "", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- sprintf (temp, "--%s", MIMEBoundary);
- if (AddEndedLineToTextBlock (headerBlock, temp, aMode))
- { AttachmentState = ATTACH_DONE; break; }
-
- // explicitly type the encapsulated section
- if (AddEndedLineToTextBlock (headerBlock, "Content-Type: text/plain", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- if (AddEndedLineToTextBlock (headerBlock, "", aMode))
- { AttachmentState = ATTACH_DONE; break; }
-
- if (AddEndedLineToTextBlock (body, "", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- sprintf (temp, "--%s", MIMEBoundary);
- if (AddEndedLineToTextBlock (body, temp, aMode))
- { AttachmentState = ATTACH_DONE; break; }
- }
- else // no MIME
- {
- if (AddEndedLineToTextBlock (body, "", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- if (AddEndedLineToTextBlock (body, "BEGIN --- CUT HERE --- Cut Here --- cut here ---", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- }
- PostTextBlock (headerBlock);
- PostTextBlock (body);
- MultipartMixed = TRUE;
- byteCount = headerBlock->numBytes + body->numBytes;
- }
- AttachmentState = ATTACH_MAIN;
- break;
-
- case ATTACH_FIRST_IN_NEXT_WND:
- // post current stuff, begin attachment in NEXT article
- if (!ReviewAttach)
- CommState = ST_POST_WAIT_END;
-
- GenerateSubject (headerBlock, origSubject, thisPart, numParts);
- saveHeaderBytes = headerBlock->numBytes;
-
- if (GenerateMIME)
- {
- if (AddEndedLineToTextBlock (headerBlock, "Content-Type: text/plain", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- }
- if (AddEndedLineToTextBlock (headerBlock, "", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- PostTextBlock (headerBlock);
- PostTextBlock (body);
- PostTextBlock (tail);
-
- thisPart = 1;
- currentCoded->sequence = thisPart; // status window info
- AttachmentState = ATTACH_WAIT;
-
- EndAttach ();
- if (!ReviewAttach)
- return;
-
- break;
-
- case ATTACH_WAIT:
- if (InitiateAttach (NEW_WND, thisDocType))
- { AttachmentState = ATTACH_DONE; break; }
- AttachmentState = ATTACH_MAIN;
- if (!ReviewAttach)
- return;
-
- break;
-
- case ATTACH_MAIN:
- if (!ReviewAttach)
- CommState = ST_POST_WAIT_END;
-
- headerBlock->numLines = saveHeaderLines; // reset to orig header
- headerBlock->numBytes = saveHeaderBytes;
-
- GenerateSubject (headerBlock, origSubject, thisPart, numParts);
- saveHeaderBytes = headerBlock->numBytes;
- if (GenerateMIME)
- {
- if (numParts > 1)
- {
- if (AddEndedLineToTextBlock (headerBlock, "Content-Type: message/partial;", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- sprintf (temp, " id=%s;", attachmentID);
- if (AddEndedLineToTextBlock (headerBlock, temp, aMode))
- { AttachmentState = ATTACH_DONE; break; }
- sprintf (temp, " number=%d; total=%d", thisPart, numParts);
- if (AddEndedLineToTextBlock (headerBlock, temp, aMode))
- { AttachmentState = ATTACH_DONE; break; }
-
- if (AddEndedLineToTextBlock (headerBlock, "", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- }
- if (thisPart == 1)
- {
- for (i = 0, found = FALSE; i < NUM_CONTENT_TYPES && !found; i++)
- if (!_stricmp (ContentType, ContentTypes[i]))
- found = TRUE;
-
- if (!_stricmp (ContentType, "Other") || !found)
- sprintf (temp, "Content-Type: Application/octet-stream");
- else
- sprintf (temp, "Content-Type: %s", ContentType);
-
- if (AddEndedLineToTextBlock (headerBlock, temp, aMode))
- { AttachmentState = ATTACH_DONE; break; }
-
- switch (EncodingTypeNum)
- {
- case CODE_UU:
- sprintf (temp, "Content-Transfer-Encoding: %s", MIMEUUType);
- break;
- case CODE_XX:
- sprintf (temp, "Content-Transfer-Encoding: %s", MIMEXXType);
- break;
- case CODE_CUSTOM:
- sprintf (temp, "Content-Transfer-Encoding: %s", MIMECustomType);
- break;
- case CODE_BASE64:
- strcpy (temp, "Content-Transfer-Encoding: Base64");
- break;
- case CODE_NONE:
- temp[0] = '\0';
- }
- if (temp[0] != '\0' &&
- (AddEndedLineToTextBlock (headerBlock, temp, aMode)))
- { AttachmentState = ATTACH_DONE; break; }
-
- if (AddEndedLineToTextBlock (headerBlock, "",aMode))
- { AttachmentState = ATTACH_DONE; break; }
- }
- }
-
- // if multipart/mixed and first part, then the main header
- // was already displayed, so we now want to post from the end
- // of that header on (byteCount already set above)
- if (MultipartMixed && thisPart == 1)
- {
- if (GenerateMIME)
- PostPartialTextBlock (headerBlock, saveHeaderLines, byteCount-saveHeaderBytes);
- }
- else
- {
- PostTextBlock (headerBlock);
- byteCount = headerBlock->numBytes;
- }
-
- if (numParts > 1)
- {
- if (attachLine == attachment->numLines)
- {
- sprintf (temp, "[WinVn: Humble apologies: the # of attachment blocks was estimated incorrectly]\r");
- if (aMode == ADD_TO_EDIT)
- strcat (temp, "\n");
- PostOneLine (temp, &dummyLong, 0);
- thisPart = numParts;
- }
- else
- {
- // calculate number of bytes from attachment to use
- // in this part: we've already used byteCount bytes
- // in headers, and we need to leave room for the tail
- byteCount = ArticleSplitLength - byteCount - tail->numBytes;
- if ((attachLine = PostPartialTextBlock (attachment, attachLine, byteCount)) == 0)
- { AttachmentState = ATTACH_DONE; break; }
- }
- }
- else
- PostTextBlock (attachment);
-
- // if this is the last section, don't end it since we may
- // still have a boundary and a tail to add
- if (thisPart + 1 <= numParts)
- {
- thisPart++;
- AttachmentState = ATTACH_WAIT;
-
- currentCoded->sequence = thisPart; // status window info
- currentCoded->numLines = 0;
-
- EndAttach ();
- if (!ReviewAttach)
- return;
- }
- else // Done with attachment
- {
- // if multi-part/mixed then need to attach the final boundary
- if (GenerateMIME && MultipartMixed)
- {
- ResetTextBlock (body);
- if (AddEndedLineToTextBlock (body, "", aMode))
- { AttachmentState = ATTACH_DONE; break; }
- sprintf (temp, "--%s--", MIMEBoundary);
- if (AddEndedLineToTextBlock (body, temp, aMode))
- { AttachmentState = ATTACH_DONE; break; }
- PostTextBlock (body);
- }
-
- // Signature/tail ends up after last boundary, in epilogue
- PostTextBlock (tail);
- AttachmentState = ATTACH_DONE;
- abort = CONTINUE; // successful
-
- EndAttach ();
- if (!ReviewAttach)
- return;
- }
- break;
-
- case ATTACH_DONE:
- FinishAttachment (abort);
- AttachmentState = ATTACH_NONE;
- break;
-
- } // end of switch (AttachmentState)
-
- } // end of while (AttachmentState != ATTACH_NONE)
- return;
- }
-
- void
- FinishAttachment (int action)
- {
- char temp[255];
-
- FreeTextBlock (headerBlock);
- FreeTextBlock (body);
- FreeTextBlock (attachment);
-
- CodingState = INACTIVE;
- DestroyStatusArea();
-
- // if we are managing the post (not reviewing), then we must close the
- // one post window when we're through (don't close if aborted)
- if (!ReviewAttach)
- {
- if (action == CONTINUE)
- {
- sprintf (temp, "Posting completed in %d part", numParts);
- if (numParts > 1)
- strcat (temp, "s");
-
- MessageBox (thisPostWnd->hWnd, temp, "Posting done", MB_OK|MB_ICONINFORMATION);
- DestroyWindow (thisPostWnd->hWnd);
- }
- GlobalFreePtr (commSpool);
- }
- ReviewAttach = saveReviewAttach;
- }
-
- /* ------------------------------------------------------------------------
- * Reads current text from the posting edit buffer,
- * splits all RFC822 header stuff into header block,
- * save off subject line from header during copy
- * and body up to any signature into the body block.
- * from signature on goes into tail block
- * This is so we can insert our MIME stuff right in between
- * Assumes there is a null (blank) line between RFC822 header and body
- * Tailing signature
- */
- #define READING_HEADER 1
- #define READING_BODY 2
- #define READING_TAIL 3
- BOOL
- SplitCurrentHeader (TypTextBlock *header, TypTextBlock *body, TypTextBlock *tail, char *origSubject)
- {
- char *editBuf, *ptr, *end;
- int state;
- char temp[MAXINTERNALLINE];
-
- origSubject[0] = '\0';
- if ((editBuf = GetEditText (hThisEditWnd)) == NULL)
- return (FAIL);
-
- for (state = READING_HEADER, ptr = editBuf; *ptr != '\0';)
- {
- end = strstr (ptr, "\r\n"); // all edit buf lines end in \r\n
- if (end == NULL)
- {
- strcpy (temp, ptr); // last line - no \r\n
- *ptr = '\0'; // finish loop, then stop
- }
- else
- {
- *end = '\0'; // strip \r\n
- strcpy (temp, ptr);
- ptr = end + 2; // skip \r\n for next line
- }
- switch (state)
- {
- case READING_HEADER:
- if (!IsBlankStr(temp))
- {
- if (AddEndedLineToTextBlock (header, temp, aMode))
- return (FAIL);;
- if (!_strnicmp (temp, "subject:", 8))
- strcpy (origSubject, temp);
- }
- else // switch to reading body
- {
- state = READING_BODY;
- continue;
- }
- break;
-
- case READING_BODY:
- if (body->numLines == 0 && IsBlankStr (temp))
- continue; // skip leading blank lines
-
- if (EnableSig && Signature->numLines > 0 &&
- !strcmp (temp, TextBlockLine (Signature, 0)))
- {
- if (AddEndedLineToTextBlock (tail, temp, aMode))
- return (FAIL);
- state = READING_TAIL;
- continue;
- }
- if (AddEndedLineToTextBlock (body, temp, aMode))
- return (FAIL);
- break;
-
- case READING_TAIL:
- if (AddEndedLineToTextBlock (tail, temp, aMode))
- return (FAIL);
- }
-
- }
- GlobalFreePtr (editBuf);
- return (SUCCESS);
- }
-
- /* ------------------------------------------------------------------------
- * Start/end posting
- */
- BOOL
- InitiateAttach (int useWnd, int DocType)
- {
- WndEdit *NewWndPost;
-
- if (ReviewAttach)
- {
- /* create new window for each posted section
- * if attach-now or thisPart==0 use existing window for 1st section
- */
- if (useWnd == NEW_WND)
- {
- if ((hParentWnd = CreatePostingWnd (hParentWnd, NULL, DocType)) == NULL)
- {
- MessageBox (hParentWnd, "Failed to create new attachment window", "Posting Window Creation", MB_OK);
- return (FAIL);
- }
-
- if (DocType == DOCTYPE_POSTING)
- NewWndPost = getWndEdit(WndPosts, hParentWnd, MAXPOSTWNDS);
- else
- NewWndPost = getWndEdit(WndMails, hParentWnd, MAXMAILWNDS);
-
- NewWndPost->dirty = DT_DIRTY;
- hThisEditWnd = NewWndPost->hWndEdit;
- }
- sprintf (str, "Review Attachment Part %d of %d", thisPart, numParts);
- SetWindowText (hParentWnd, str);
- if ((editMem = (char *) GlobalAllocPtr (GMEM_MOVEABLE|GMEM_ZEROINIT, EDIT_SIZE_INC*sizeof(char))) == NULL)
- {
- MessageBox (hParentWnd, "Memory allocation failure", "Attachment", MB_OK);
- return (FAIL);
- }
- editMaxSize = EDIT_SIZE_INC;
- editSize = 0;
- }
- else
- if (!StartPost (thisPostWnd))
- return (FAIL);
-
- return (SUCCESS);
- }
-
- void
- EndAttach (HWND hParentWnd)
- {
- unsigned long dummyLong;
-
- if (ReviewAttach)
- {
- SetEditText (hThisEditWnd, editMem);
- GlobalFreePtr (editMem);
- }
- else
- {
- PostOneLine (".\r\n", &dummyLong, 0);
- FlushCommSpool ();
- }
- }
-
- void
- FlushCommSpool ()
- {
- if (commSpoolLen > 0)
- {
- PutCommData (commSpool, commSpoolLen);
- commSpoolLen = 0;
- commSpool[0] = '\0';
- }
- }
-
- /* ------------------------------------------------------------------------
- * Post the contents of a text block
- * Assumes posting already initiated, and does not end the posting
- * Lines must end in \r\n
- */
-
- int
- PostOneLine (char *str, unsigned long *byteCount, unsigned long maxBytes)
- {
- unsigned int len;
-
- len = strlen (str);
-
- *byteCount += (long)len;
- if (maxBytes > 0 && *byteCount >= maxBytes)
- return (SUCCESS);
-
- if (ReviewAttach)
- {
- editSize += len;
- if (editSize >= editMaxSize)
- {
- editMaxSize += max(EDIT_SIZE_INC, len);
- if ((editMem = GlobalReAllocPtr (editMem, editMaxSize*sizeof(char), GMEM_MOVEABLE)) == NULL)
- {
- MessageBox (hThisEditWnd, "Memory allocation failure", "Build Attachment", MB_OK);
- return (FAIL);
- }
- }
- strcat (editMem, str);
- currentCoded->numBytes = (long)editSize;
- }
- else
- {
- if (commSpoolLen + len >= MAX_COMM_SPOOL)
- FlushCommSpool ();
-
- strcat (commSpool, str);
- commSpoolLen += len;
- currentCoded->numBytes += len;
- }
-
- return (SUCCESS);
- }
-
- void
- PostTextBlock (TypTextBlock *block)
- {
- PostPartialTextBlock (block, 0L, 0L);
- }
-
- unsigned long
- PostPartialTextBlock (TypTextBlock *block, unsigned long start, unsigned long maxBytes)
- {
- register unsigned long i;
- unsigned long byteCount;
-
- byteCount = 0;
-
- for (i = start; i < block->numLines; i++)
- {
- if (PostOneLine (TextBlockLine (block, i), &byteCount, maxBytes) == FAIL)
- return (0);
-
- if (maxBytes > 0 && byteCount >= maxBytes)
- break;
-
- currentCoded->numLines++;
- if (currentCoded->numLines % STATUS_UPDATE_FREQ == 0)
- UpdateBlockStatus();
- }
- UpdateBlockStatus(); // show final size
- return (i);
- }
- /* ------------------------------------------------------------------------
- * Add a line to the given header block which contains the MIME-Version
- */
- BOOL
- AddMIMEVersion (TypTextBlock *header)
- {
- char temp[MAXINTERNALLINE];
-
- sprintf (temp, "MIME-Version: %s", MIME_VERSION);
- if (AddEndedLineToTextBlock (header, temp, aMode))
- return (FAIL);;
-
- return (SUCCESS);
- }
-
- /* ------------------------------------------------------------------------
- * Generate a subject line based on orig subject line, and the
- * subject template
- * Replace %f with AttachFileName
- * Replace %p with part #
- * Replace %0p with part # 0 padded to length of total # parts
- * Replace %t with total # parts
- * Replace %s with orig subject content
- *
- */
- void
- GenerateSubject (TypTextBlock *header, char *origSubject,
- unsigned int part, unsigned int numParts)
- {
- register char *src, *dest, *ptr;
- register unsigned long num;
- char newSubject[MAXINTERNALLINE];
- char endLine[3], numStr[10];
- int numZeros;
- extern char *NameWithoutPath ();
-
- for (num = 0; num < header->numLines; num++)
- if (!_strnicmp (TextBlockLine (header, num), "subject:", 8))
- break;
-
- ptr = strpbrk (TextBlockLine (header, num), "\n\r");
- strcpy (endLine, ptr);
-
- for (src = SubjectTemplate, dest = newSubject; *src != NULL;)
- {
- if (*src == '%')
- {
- src++;
- switch (*src)
- {
- case '%': // literal percent is %%
- *dest++ = '%';
- break;
- case 's':
- for (ptr = origSubject; *ptr; *dest++ = *ptr++);
- break;
- case 'f':
- NameWithoutPath (str, AttachFileName);
- for (ptr = str; *ptr; *dest++ = *ptr++);
- break;
-
- case '0':
- if (*(src+1) == 'p')
- {
- src++; // skip zero
- // zero-pad number to length of numParts string
- itoa (numParts, numStr, 10); // longer or equal in length to part
- itoa (part, str, 10);
-
- for (numZeros = strlen(numStr) - strlen(str); numZeros; numZeros--)
- *dest++ = '0';
-
- for (ptr = str; *ptr; *dest++ = *ptr++);
- }
- break;
-
- case 'p':
- itoa (part, numStr, 10);
- for (ptr = numStr; *ptr; *dest++ = *ptr++);
- break;
-
- case 't':
- itoa (numParts, numStr, 10);
- for (ptr = numStr; *ptr; *dest++ = *ptr++);
- break;
-
- default:
- *dest++ = '%';
- *dest++ = *src;
- break;
-
- }
- src++; // skip control char after %
- continue;
- }
- *dest++ = *src++;
- }
- *dest = '\0';
- strcat (dest, endLine); // replace end of line
-
- ReplaceLineInTextBlock (header, num, newSubject);
- }
-
-
- #if OLD_PLAIN_FILE
- /* ------------------------------------------------------------------------
- * Directly modifies the Edit buffer of the parent multi-line edit wnd
- * Appends contents of fileName to buffer
- */
- void
- AppendPlainFileToPost (char *fileName)
- {
- HFILE hFile;
- register unsigned int i;
- char *editBuf, *inBuf;
- unsigned int endPtr, size, numRead;
-
- inBuf = (char *) GlobalAllocPtr(GMEM_FIXED, 2048*sizeof(char));
- editBuf = GetEditText (hThisEditWnd);
-
- size = strlen (editBuf);
- if ((hFile = _lopen (fileName, READ)) == HFILE_ERROR)
- {
- sprintf(str, "Could not open file %s for read", fileName);
- MessageBox (hParentWnd, str, "Attachment Open File Error", MB_OK);
- return;
- }
-
- while (1)
- {
- if ((numRead = _lread(hFile, inBuf, 2048)) == 0)
- break;
- for (i = 0; i < numRead; i++)
- if (!__isascii (inBuf[i]))
- {
- sprintf(str, "File %s appears to contain non-ASCII data.\nBinary files must be encoded for attachment", fileName);
- MessageBox (hParentWnd, str, "Non-ASCII File Error", MB_OK);
- goto endAppend;
- }
-
- endPtr = size;
- size += numRead;
- editBuf = GlobalReAllocPtr (editBuf, size, GMEM_MOVEABLE);
- memmove (editBuf + endPtr, inBuf, numRead);
- }
-
- endAppend:;
- _lclose(hFile);
-
- SetEditText (hThisEditWnd, editBuf);
- GlobalFreePtr (editBuf);
- GlobalFreePtr (inBuf);
- }
- #endif
-
- #if OLD_HEADER
- /* ------------------------------------------------------------------------
- * Returns true for lines which look like standard header lines
- * Returns non-zero if should skip this line, else zero
- * A binary search through a list of words would be really smart
- * Lazy approach
- */
- int
- TestRfc822HeaderLine (char *line)
- {
- switch (tolower(line[0]))
- {
- case 'd':
- return (!_strnicmp(line, "date", 4));
- case 'f':
- return (!_strnicmp(line, "follow", 6) ||
- !_strnicmp(line, "from", 4));
- case 'k':
- return (!_strnicmp(line, "keywords", 8));
-
- case 'l':
- return (!_strnicmp(line, "lines", 5));
- case 'm':
- return (!_strnicmp(line, "message", 7));
- case 'n':
- return (!_strnicmp(line, "newsgrou", 8) ||
- !_strnicmp(line, "nntp", 4));
- case 'o':
- return (!_strnicmp(line, "organiza", 8) ||
- !_strnicmp(line, "originat", 8));
- case 'p':
- return (!_strnicmp(line, "path", 4));
- case 'r':
- return (!_strnicmp(line, "referenc", 8) ||
- !_strnicmp(line, "reply", 5));
- case 's':
- return (!_strnicmp(line, "sender", 6) ||
- !_strnicmp(line, "subject:", 8) ||
- !_strnicmp(line, "summary", 7));
- case 'x':
- return (!_strnicmp(line, "xref:", 5) ||
- !_strnicmp(line, "x-news", 6));
- default:
- return (0);
- }
- }
-
- #endif
- @
-
-
- 1.8
- log
- @misc encoding/decoding changes
- @
- text
- @d14 1
- a14 1
- * $Id: wvattach.c 1.7 1994/08/11 00:09:17 jcooper Exp $
- d16 3
- d40 3
- a45 2
- #include "wvglob.h"
- #include "winvn.h"
- a163 1
- Attaching = TRUE;
- d251 1
- a251 1
- ProcessAttach (int cancel)
- d259 1
- a259 1
- if (cancel)
- d541 1
- a541 1
- FinishAttachment (int abort)
- a547 1
- Attaching = FALSE;
- d556 1
- a556 1
- if (abort == CONTINUE)
- d819 1
- d830 3
- a832 2
- char numStr[MAXINTERNALLINE], newSubject[MAXINTERNALLINE];
- char endLine[3];
- d859 16
- d879 1
- d884 1
- @
-
-
- 1.7
- log
- @Enhancements to Mime and article encoding/encoding
- @
- text
- @d14 1
- a14 1
- * $Id: wvattach.c 1.6 1994/06/09 18:51:30 rushing Exp $
- d16 3
- d737 3
- a741 3
- if (maxBytes > 0 && *byteCount >= maxBytes)
- return (SUCCESS);
-
- @
-
-
- 1.6
- log
- @problem with symbol 'header' on AXP/NT
- @
- text
- @d6 1
- a6 1
- * mail or posting *
- d10 1
- a10 1
- * Author: John S. Cooper (jcoop@@apl.com) *
- d14 1
- a14 1
- * $Id: wvattach.c 1.5 1994/05/23 18:37:00 jcooper Exp $
- d16 3
- d140 1
- a140 1
- unsigned long offset;
- d181 1
- a181 1
- { FinishAttachment (TRUE); return; }
- d184 1
- a184 1
- { FinishAttachment (TRUE); return; }
- d193 1
- a193 1
- { FinishAttachment (TRUE); return; }
- d195 1
- a195 1
- if (BlankBeforeMIME)
- d197 1
- a197 1
- { FinishAttachment (TRUE); return; }
- d199 2
- a200 2
- if (AddMIMEVersion (headerBlock))
- { FinishAttachment (TRUE); return; }
- d206 1
- a206 1
- FinishAttachment (TRUE); return;
- d215 2
- a216 1
- }
- d226 1
- d228 1
- a228 1
- (long)numParts*(headerBlock->numBytes + tail->numBytes + 200) +
- d234 1
- a234 1
- ProcessAttach (0);
- d259 1
- a259 1
- while (AttachmentState != ATTACH_NONE) {
- d263 1
- a263 1
- abort = TRUE;
- d300 3
- a302 1
- if (AddEndedLineToTextBlock (headerBlock, "Content-Type: multipart/mixed;",aMode))
- d305 2
- a306 2
- sprintf (temp, " Boundary=\"%s\"", MIMEBoundary);
- if (AddEndedLineToTextBlock (headerBlock, temp, aMode))
- d309 3
- a311 3
- // blank preamble here
- // each boundary must be preceded by a CRLF (add "")
- if (AddEndedLineToTextBlock (headerBlock, "", aMode))
- d313 2
- a314 2
- sprintf (temp, "--%s", MIMEBoundary);
- if (AddEndedLineToTextBlock (headerBlock, temp, aMode))
- d317 2
- a318 2
- // explicitly type the encapsulated section
- if (AddEndedLineToTextBlock (headerBlock, "Content-Type: text/plain", aMode))
- d320 1
- a320 1
- if (AddEndedLineToTextBlock (headerBlock, "", aMode))
- d323 1
- a323 1
- if (AddEndedLineToTextBlock (body, "", aMode))
- d325 2
- a326 2
- sprintf (temp, "--%s", MIMEBoundary);
- if (AddEndedLineToTextBlock (body, temp, aMode))
- d328 8
- d338 1
- a339 1
- MultipartMixed = TRUE;
- d351 4
- a354 1
- if (AddEndedLineToTextBlock (headerBlock, "Content-Type: text/plain", aMode))
- d356 1
- d391 4
- a394 3
-
- if (numParts > 1)
- {
- d406 4
- a409 4
- }
- if (thisPart == 1)
- {
- for (i = 0, found = FALSE; i < NUM_CONTENT_TYPES && !found; i++)
- d414 1
- a414 1
- sprintf (temp, "Content-Type: X-%s", ContentType);
- d420 1
- a420 1
-
- d424 1
- a424 1
- strcpy (temp, "Content-Transfer-Encoding: X-uue");
- d427 1
- a427 1
- strcpy (temp, "Content-Transfer-Encoding: X-xxe");
- d430 1
- a430 1
- strcpy (temp, "Content-Transfer-Encoding: X-User-Defined");
- d441 1
- d444 1
- d451 2
- d454 1
- d465 1
- a465 1
- sprintf (temp, "Most humble apologies: the # of attachment blocks was estimated incorrectly\r");
- d480 2
- a481 1
- } else
- d501 1
- a501 1
- if (MultipartMixed)
- d515 1
- a515 1
- abort = FALSE; // successful
- d527 5
- a531 3
- }
- }
- return;
- d551 1
- a551 1
- if (!abort)
- @
-
-
- 1.5
- log
- @new attach code, session [dis]connect
- @
- text
- @d14 1
- a14 1
- * $Id: wvattach.c 1.3 1994/02/24 21:27:10 jcoop Exp $
- d16 3
- d86 1
- a86 1
- TypTextBlock *header, *body, *attachment, *tail;
- d145 1
- a145 1
- if ((header = InitTextBlock (hCodedBlockWnd)) == NULL)
- d189 1
- a189 1
- if (SplitCurrentHeader (header, body, tail, origSubject))
- d193 1
- a193 1
- if (AddEndedLineToTextBlock (header, "", aMode))
- d196 1
- a196 1
- if (AddMIMEVersion (header))
- d200 1
- a200 1
- if (header->numBytes + tail->numBytes + 200 > ArticleSplitLength)
- d208 1
- a208 1
- (body->numBytes + header->numBytes + tail->numBytes + 200 > ArticleSplitLength))
- d223 1
- a223 1
- (long)numParts*(header->numBytes + tail->numBytes + 200) +
- d262 2
- a263 2
- saveHeaderLines = header->numLines;
- saveHeaderBytes = header->numBytes;
- d292 2
- a293 2
- GenerateSubject (header, origSubject, thisPart, numParts);
- saveHeaderBytes = header->numBytes;
- d295 1
- a295 1
- if (AddEndedLineToTextBlock (header, "Content-Type: multipart/mixed;",aMode))
- d299 1
- a299 1
- if (AddEndedLineToTextBlock (header, temp, aMode))
- d304 1
- a304 1
- if (AddEndedLineToTextBlock (header, "", aMode))
- d307 1
- a307 1
- if (AddEndedLineToTextBlock (header, temp, aMode))
- d311 1
- a311 1
- if (AddEndedLineToTextBlock (header, "Content-Type: text/plain", aMode))
- d313 1
- a313 1
- if (AddEndedLineToTextBlock (header, "", aMode))
- d321 1
- a321 1
- PostTextBlock (header);
- d323 1
- a323 1
- byteCount = header->numBytes + body->numBytes;
- d334 3
- a336 3
- GenerateSubject (header, origSubject, thisPart, numParts);
- saveHeaderBytes = header->numBytes;
- if (AddEndedLineToTextBlock (header, "Content-Type: text/plain", aMode))
- d338 1
- a338 1
- if (AddEndedLineToTextBlock (header, "", aMode))
- d340 1
- a340 1
- PostTextBlock (header);
- d367 2
- a368 2
- header->numLines = saveHeaderLines; // reset to orig header
- header->numBytes = saveHeaderBytes;
- d370 2
- a371 2
- GenerateSubject (header, origSubject, thisPart, numParts);
- saveHeaderBytes = header->numBytes;
- d375 1
- a375 1
- if (AddEndedLineToTextBlock (header, "Content-Type: message/partial;", aMode))
- d378 1
- a378 1
- if (AddEndedLineToTextBlock (header, temp, aMode))
- d381 1
- a381 1
- if (AddEndedLineToTextBlock (header, temp, aMode))
- d384 1
- a384 1
- if (AddEndedLineToTextBlock (header, "", aMode))
- d398 1
- a398 1
- if (AddEndedLineToTextBlock (header, temp, aMode))
- d419 1
- a419 1
- (AddEndedLineToTextBlock (header, temp, aMode)))
- d421 1
- a421 1
- if (AddEndedLineToTextBlock (header, "",aMode))
- d429 1
- a429 1
- PostPartialTextBlock (header, saveHeaderLines, byteCount-saveHeaderBytes);
- d432 2
- a433 2
- PostTextBlock (header);
- byteCount = header->numBytes;
- d511 1
- a511 1
- FreeTextBlock (header);
- d948 1
- a948 1
- #endif @
-
-
- 1.4
- log
- @changes for gensock & version 0.91
- @
- text
- @d14 1
- a14 1
- * $Id: wvattach.c 1.3 1994/02/24 21:27:10 jcoop Exp rushing $
- d45 1
- d48 1
- d53 2
- d56 13
- d73 8
- d83 7
- d93 27
- a119 3
- int aMode; // attachment mode for ended line chars
- unsigned int thisPart, numParts;
- TypTextBlock *thisPostText;
- d122 1
- a122 1
- * hParentWnd is handle to multi-line edit posting window
- a132 3
- register unsigned long byteCount;
- TypTextBlock *header, *body, *attachment, *tail;
- char attachmentID[MAXINTERNALLINE], origSubject[MAXINTERNALLINE];
- d134 1
- a134 3
- unsigned long line, saveHeaderLines, saveHeaderBytes, offset;
- char temp[MAXINTERNALLINE];
- BOOL MultipartMixed;
- d139 2
- a140 8
-
- Attaching = TRUE;
- MultipartMixed = FALSE;
- if (ReviewAttach)
- aMode = ADD_TO_EDIT;
- else
- aMode = ADD_TO_POST;
-
- d151 18
- d170 1
- a170 1
- strcpy (currentCoded->ident, fileName); // status info
- d172 1
- a172 1
- if (EncodingType == CODE_NONE)
- d175 1
- a175 1
- goto endAttach;
- d177 2
- a178 1
- else Encode (attachment, fileName, aMode);
- a185 2
- byteCount = 0;
-
- d187 1
- a187 1
- goto endAttach;
- d191 1
- a191 1
- goto endAttach;
- d194 1
- a194 2
- goto endAttach;
-
- d200 1
- a200 1
- goto endAttach;
- d204 1
- a204 1
- if (WhenToAttach == IDD_ATTACH_NOW &&
- d208 1
- a208 1
- WhenToAttach == IDD_ATTACH_NEXT;
- a209 2
- saveHeaderLines = header->numLines;
- saveHeaderBytes = header->numBytes;
- d212 1
- a212 1
- offset = (WhenToAttach == IDD_ATTACH_NOW) ? body->numBytes : 0;
- d225 21
- a245 1
- if (WhenToAttach == IDD_ATTACH_NOW)
- d247 13
- a259 4
- thisPart = 1;
- if (InitiateAttach (CURRENT_WND, DocType))
- goto endAttach;
- GenerateSubject (header, origSubject, thisPart, numParts);
- d261 26
- d289 3
- d293 1
- a293 1
- goto endAttach;
- d297 1
- a297 1
- goto endAttach;
- d302 1
- a302 1
- goto endAttach;
- d305 1
- a305 1
- goto endAttach;
- d309 1
- a309 1
- goto endAttach;
- d311 1
- a311 1
- goto endAttach;
- d314 1
- a314 1
- goto endAttach;
- d317 1
- a317 1
- goto endAttach;
- d323 8
- a330 8
- }
- else
- { // post current stuff, begin attachment in NEXT article
- if (body->numLines == 0) // if have body, then mixed
- ;// Mention to the user that there's no body...
- thisPart = 0;
- if (InitiateAttach (CURRENT_WND, DocType))
- goto endAttach;
- d332 1
- d334 1
- a334 1
- goto endAttach;
- d336 1
- a336 1
- goto endAttach;
- d340 5
- d346 20
- a366 3
- thisPart = 1;
- if (InitiateAttach (NEW_WND, DocType))
- goto endAttach;
- a368 12
- }
- for (line = 0; thisPart <= numParts; thisPart++)
- {
- if (line == attachment->numLines)
- {
- MessageBox (hCodedBlockWnd, "Ok, Ok, I calculated the number of parts wrong. Sorry.", "So Kill Me", MB_OK);
- break;
- }
- header->numLines = saveHeaderLines; // reset to orig header
- header->numBytes = saveHeaderBytes;
- // for (i = saveHeaderLines; i < header->numLines; i++)
- // GlobalFreePtr (header->text[i]);
- a369 7
- if (thisPart > 1) // 1st handled above
- {
- if (InitiateAttach (NEW_WND, DocType))
- goto endAttach;
- GenerateSubject (header, origSubject, thisPart, numParts);
- saveHeaderBytes = header->numBytes;
- }
- d373 1
- a373 1
- goto endAttach;
- d376 1
- a376 1
- goto endAttach;
- d379 1
- a379 1
- goto endAttach;
- d382 1
- a382 1
- goto endAttach;
- d386 6
- a391 2
- if (!_stricmp (ContentType, "Other"))
- strcpy (temp, "Content-Type: X-Other");
- d394 1
- d396 1
- a396 1
- goto endAttach;
- d398 1
- a398 1
- switch (EncodingType)
- d417 1
- a417 1
- goto endAttach;
- d419 1
- a419 1
- goto endAttach;
- d426 1
- a426 1
- PostPartialTextBlock (header, saveHeaderLines, byteCount-saveHeaderBytes);
- d435 17
- a451 6
- // calculate number of bytes from attachment to use
- // in this part: we've already used byteCount bytes
- // in headers, and we need to leave room for the tail
- byteCount = ArticleSplitLength - byteCount - tail->numBytes;
- if ((line = PostPartialTextBlock (attachment, line, byteCount)) == 0)
- goto endAttach;
- a454 3
- currentCoded->sequence++; // status window info
- currentCoded->numLines = 0;
-
- d457 31
- a487 1
- if (thisPart + 1 <= numParts)
- d489 9
- d499 3
- a501 15
- // if multi-part/mixed then need to attach the final boundary
- if (MultipartMixed)
- {
- ResetTextBlock (body);
- if (AddEndedLineToTextBlock (body, "", aMode))
- goto endAttach;
- sprintf (temp, "--%s--", MIMEBoundary);
- if (AddEndedLineToTextBlock (body, temp, aMode))
- goto endAttach;
- PostTextBlock (body);
- }
-
- // Signature/tail ends up after last boundary, in epilogue
- PostTextBlock (tail);
- EndAttach ();
- d503 5
- a507 1
- endAttach:;
- d515 17
- d533 1
- d622 1
- a622 1
-
- a653 1
- /*
- d655 1
- a655 1
- if (!StartPost(WndPost)) //!!!! FIX THIS!
- d657 1
- a657 1
- */
- d660 1
- d664 2
- d672 15
- a686 1
- PutCommLine (".");
- d688 1
- d690 1
- a690 1
- * Post the contents of a text block
- d692 1
- a692 2
- * Lines in an edit buffer must end in \r\n
- * Posted lines have no end chars (PutCommLine adds a \n)
- d694 40
- a743 1
- register unsigned int len;
- d750 2
- a751 1
- len = strlen (TextBlockLine (block, i));
- d753 3
- a755 22
- if (ReviewAttach)
- {
- byteCount += (long)len;
- if (maxBytes > 0 && byteCount >= maxBytes)
- break;
-
- editSize += len;
- if (editSize >= editMaxSize)
- {
- editMaxSize += max(EDIT_SIZE_INC, len);
- if ((editMem = GlobalReAllocPtr (editMem, editMaxSize*sizeof(char), GMEM_MOVEABLE)) == NULL)
- {
- MessageBox (hThisEditWnd, "Memory allocation failure", "Build Attachment", MB_OK);
- return 0;
- }
- }
- strcat (editMem, TextBlockLine (block, i));
- len = strlen (editMem);
- }
- else
- PutCommLine (TextBlockLine (block, i));
-
- a756 1
- currentCoded->numBytes = (long)editSize;
- d943 1
- a943 3
- }
-
- #endif
- d945 1
- @
-
-
- 1.3
- log
- @jcoop changes
- @
- text
- @d14 1
- a14 1
- * $Id: wvattach.c 1.2 1994/01/22 01:30:03 jcoop Exp $
- d16 3
- d487 1
- a487 1
- PutCommLine (".\r", 2);
- d534 1
- a534 1
- PutCommLine (TextBlockLine (block, i), len);
- d724 3
- a726 1
- }
- a727 1
- #endif @
-
-
- 1.2
- log
- @90.2 changes
- @
- text
- @d14 1
- a14 1
- * $Id: wvattach.c 1.1 1994/01/16 12:10:08 jcoop Exp $
- d16 3
- d106 1
- a106 1
- if (EncodingType == ENCODE_NONE)
- d271 1
- a271 1
- case ENCODE_UU:
- d274 1
- a274 1
- case ENCODE_XX:
- d277 1
- a277 1
- case ENCODE_CUSTOM:
- d280 1
- a280 1
- case ENCODE_BASE64:
- d283 1
- a283 1
- case ENCODE_NONE:
- a477 1
- LRESULT x;
- d480 1
- a480 1
- x=SetEditText (hThisEditWnd, editMem);
- @
-
-
- 1.1
- log
- @Initial revision
- @
- text
- @d14 5
- a18 2
- * $Id: $
- * $Log: $
- d465 1
- d467 1
- a467 1
- if (!StartPost(hParentWnd)) // !!!! FIX THIS!
- d469 1
- a469 1
-
- @
-