if (!nsCRT::strcasecmp(cset, "us-ascii")) SetMailCharacterSetToMsgWindow(obj, NS_LITERAL_STRING("ISO-8859-1").get()); else SetMailCharacterSetToMsgWindow(obj, NS_ConvertASCIItoUCS2(cset).get()); }
SetMailCharacterSetToMsgWindow(obj, cset);
MimeMultipart_parse_line (char *line, PRInt32 length, MimeObject *obj){  MimeMultipart *mult = (MimeMultipart *) obj;  int status = 0;  MimeMultipartBoundaryType boundary;  PR_ASSERT(line && *line);  if (!line || !*line) return -1;  PR_ASSERT(!obj->closed_p);  if (obj->closed_p) return -1;  /* If we're supposed to write this object, but aren't supposed to convert	 it to HTML, simply pass it through unaltered. */  if (obj->output_p &&	  obj->options &&	  !obj->options->write_html_p &&	  obj->options->output_fn)	return MimeObject_write(obj, line, length, PR_TRUE);  if (mult->state == MimeMultipartEpilogue)  /* already done */	boundary = MimeMultipartBoundaryTypeNone;  else	boundary = ((MimeMultipartClass *)obj->clazz)->check_boundary(obj, line,																  length);  if (boundary == MimeMultipartBoundaryTypeTerminator ||	  boundary == MimeMultipartBoundaryTypeSeparator)	{	  /* Match!  Close the currently-open part, move on to the next		 state, and discard this line.	   */	  if (mult->state != MimeMultipartPreamble)		status = ((MimeMultipartClass *)obj->clazz)->close_child(obj);	  if (status < 0) return status;	  if (boundary == MimeMultipartBoundaryTypeTerminator)		mult->state = MimeMultipartEpilogue;	  else		{		  mult->state = MimeMultipartHeaders;		  /* Reset the header parser for this upcoming part. */		  PR_ASSERT(!mult->hdrs);		  if (mult->hdrs)			MimeHeaders_free(mult->hdrs);		  mult->hdrs = MimeHeaders_new();		  if (!mult->hdrs)			return MIME_OUT_OF_MEMORY;		}	  /* Now return, to ignore the boundary line itself. */	  return 0;	}  /* Otherwise, this isn't a boundary string.  So do whatever it is we	 should do with this line (parse it as a header, feed it to the	 child part, ignore it, etc.) */  switch (mult->state)	{	case MimeMultipartPreamble:	case MimeMultipartEpilogue:	  /* Ignore this line. */	  break;	case MimeMultipartHeaders:    /* Parse this line as a header for the sub-part. */    {      status = MimeHeaders_parse_line(line, length, mult->hdrs);      if (status < 0) return status;            // If this line is blank, we're now done parsing headers, and should      // now examine the content-type to create this "body" part.      //      if (*line == nsCRT::CR || *line == nsCRT::LF)      {        status = ((MimeMultipartClass *) obj->clazz)->create_child(obj);        if (status < 0) return status;        PR_ASSERT(mult->state != MimeMultipartHeaders);        // Ok, at this point, we need to examine the headers and see if there        // is a special charset (i.e. non US-ASCII) for this message. If so,         // we need to tell the emitter that this is the case for use in in any        // possible reply or forward operation.        //        PRBool isBody = PR_FALSE;        PRBool isAlternative = PR_FALSE;        MimeContainer *container = (MimeContainer*) obj;         if (container->children && container->nchildren == 1)        {          PRBool isAlternativeOrRelated = PR_FALSE;          isBody = MimeObjectChildIsMessageBody(obj, &isAlternativeOrRelated);          // MimeObjectChildIsMessageBody returns false for "multipart/related"          // but we want to use the first part charset if that's a body.          // I don't want to change the behavior of MimeObjectChildIsMessageBody          // which is used by other places, so do the body check here.          if (!isBody &&               isAlternativeOrRelated &&              mime_subclass_p(obj->clazz, (MimeObjectClass*) &mimeMultipartRelatedClass))          {            MimeObject *firstChild = container->children[0];            char *disposition = MimeHeaders_get (firstChild->headers,                                                 HEADER_CONTENT_DISPOSITION,                                                  PR_TRUE,                                                 PR_FALSE);            if (!disposition)            {              if (!nsCRT::strcasecmp (firstChild->content_type, TEXT_PLAIN) ||                  !nsCRT::strcasecmp (firstChild->content_type, TEXT_HTML) ||                  !nsCRT::strcasecmp (firstChild->content_type, TEXT_MDL) ||                  !nsCRT::strcasecmp (firstChild->content_type, MULTIPART_ALTERNATIVE) ||                  !nsCRT::strcasecmp (firstChild->content_type, MULTIPART_RELATED) ||                  !nsCRT::strcasecmp (firstChild->content_type, MESSAGE_NEWS) ||                  !nsCRT::strcasecmp (firstChild->content_type, MESSAGE_RFC822))                isBody = PR_TRUE;            }          }        }        else           isAlternative = mime_subclass_p(obj->clazz, (MimeObjectClass*) &mimeMultipartAlternativeClass);        // If "multipart/alternative" or the first part is a message body        // then we should check for a charset and notify the emitter          // if one exists.                                                             if (obj->options && ((isAlternative && mult->state != MimeMultipartSkipPartLine) || isBody))        {          {           char *ct = MimeHeaders_get(mult->hdrs, HEADER_CONTENT_TYPE, PR_FALSE, PR_FALSE);           if (ct)           {             char *cset = MimeHeaders_get_parameter (ct, "charset", NULL, NULL);             if (cset)             {                mimeEmitterUpdateCharacterSet(obj->options, cset);                if (!(obj->options->override_charset))                {                  // Also set this charset to msgWindow                  if (!nsCRT::strcasecmp(cset, "us-ascii"))                    SetMailCharacterSetToMsgWindow(obj, NS_LITERAL_STRING("ISO-8859-1").get());                  else                    SetMailCharacterSetToMsgWindow(obj, NS_ConvertASCIItoUCS2(cset).get());                }              }              PR_FREEIF(ct);              PR_FREEIF(cset);            }          }        }      }      break;    }	case MimeMultipartPartFirstLine:	  /* Hand this line off to the sub-part. */	  status = (((MimeMultipartClass *) obj->clazz)->parse_child_line(obj,																	  line,																	  length,																	  PR_TRUE));	  if (status < 0) return status;	  mult->state = MimeMultipartPartLine;	  break;	case MimeMultipartPartLine:	  /* Hand this line off to the sub-part. */	  status = (((MimeMultipartClass *) obj->clazz)->parse_child_line(obj,																	  line,																	  length,																	  PR_FALSE));	  if (status < 0) return status;	  break;  case MimeMultipartSkipPartLine:    /* we are skipping that part, therefore just ignore the line */    break;	default:	  PR_ASSERT(0);	  return -1;	}  return 0;}