Beispiel #1
0
void
DmxMsg::display (
		DmxPrintHeadersEnum header_format,
		DmxPrintOutputProc print_proc,
		XtPointer stream)
{
    DtMailEnv		env;
    DtMailBoolean	FirstIsText = DTM_FALSE;
    DtMail::BodyPart	*firstPart = NULL, *nextpart = NULL;
    char		*buf = NULL,
    			*description = NULL,
    			*name = NULL,
    			*newline = NULL,
    			*sunDataDescription = NULL,
			*type = NULL;

    void		*contents = NULL;
    unsigned long	length = 0;
    int			mode = 0;

    // For CHARSET
    char		v3_cs[64],
			*mime_cs = NULL,
			*from_cs = NULL,
			*to_cs = NULL;

	
    // read in body part info
    if (cachedValues != DTM_TRUE)
      parse ();

    firstPart = bodyParts [0];

    firstPart->getContents(env,
		(const void **) &contents, 
		&length,
		NULL,	//type
		NULL,	//name
		NULL,	//mode
		NULL);	//description

    if (handleError(env, "getContents") == DTM_TRUE)
      exit (1);

    // For CHARSET
    DtMailValueSeq	value;
    DtMailBoolean	err = DTM_FALSE;

    // Get the bodypart's charset - Try MIME first then V3
    firstPart->getHeader(env, DtMailMessageContentType, DTM_TRUE, value);
    if (env.isNotSet()) {
	mime_cs = firstPart->csFromContentType(value);
    } else {
	env.clear();
	value.clear();
	firstPart->getHeader(env, DtMailMessageV3charset, DTM_TRUE, value);
	if (env.isNotSet()) {
	    strcpy(v3_cs, *(value[0]));
	} else {
	     err = DTM_TRUE;
	     env.clear();
	     value.clear();
	}
    }

    // If cannot obtain bodypart's charset header, then maybe this message
    // has only one bodypart, then in this case the charset header maybe
    // among the message's envelope (main message headers).
    // Get the envelope of the message (in order to access the headers)
    DtMail::Envelope	*envelope = NULL;
    if (err == DTM_TRUE) {
	envelope = message->getEnvelope(env);
	err = DTM_FALSE;
#ifdef DEBUG
        env.logError(
		DTM_FALSE,
		"DEBUG dtmailpr: Looking at main message header\n");
#endif
    }

    //   Check for MIME charset header and then for V3 charset header
    if (envelope != NULL) {
        envelope->getHeader(env, DtMailMessageContentType, DTM_TRUE, value);
        if (env.isNotSet()) {
            mime_cs = firstPart->csFromContentType(value);
        } else {
	    err = DTM_TRUE;
	    env.clear();
        }
        if (mime_cs == NULL || err == DTM_TRUE) {
            value.clear();
            envelope->getHeader(env, DtMailMessageV3charset, DTM_TRUE, value);
            if (env.isNotSet()) {
                strcpy(v3_cs, *(value[0]));
            } else {
	  	err = DTM_TRUE;
                env.clear();
            }
        }
    } else {
#ifdef DEBUG
	env.logError(DTM_FALSE, "DEBUG dtmailpr: envelope is null\n");
#endif
	env.clear();
    }

    // Default codeset in case mime_cs and v3_cs are both null.
    if ((mime_cs == NULL) && (strlen(v3_cs) == 0)) {
	char *ret = NULL;
	firstPart->DtXlateOpToStdLocale(DtLCX_OPER_SETLOCALE,
					setlocale(LC_CTYPE, NULL),
		 			NULL,
		 			NULL,
		 			&ret);
	strcpy(v3_cs, "DEFAULT");
	strcat(v3_cs, ".");
	strcat(v3_cs, ret);
	if (ret)
	  free(ret);
    }

    // Get iconv from and to codeset and do conversion.
    int	converted = 0;
    if (mime_cs) {
        from_cs = firstPart->csToConvName(mime_cs);
#ifdef DEBUG
        env.logError(DTM_FALSE, "DEBUG dtmailpr: mime_cs = %s\n", mime_cs);
#endif
    } else {
       from_cs = firstPart->csToConvName(v3_cs);
#ifdef DEBUG
       env.logError(DTM_FALSE, "DEBUG dtmailpr: v3_cs = %s\n", v3_cs);
#endif
    }
    to_cs = firstPart->locToConvName();

#ifdef DEBUG
    if ( from_cs == NULL )
      env.logError(DTM_FALSE, "DEBUG dtmailpr: from_cs is NULL\n");
    else
      env.logError(DTM_FALSE, "DEBUG dtmailpr: from_cs = %s\n", from_cs);

    if ( to_cs == NULL )
      env.logError(DTM_FALSE, "DEBUG dtmailpr: to_cs is NULL\n");
    else
      env.logError(DTM_FALSE, "DEBUG dtmailpr: to_cs = %s\n", to_cs);
#endif

    if ( from_cs && to_cs ) {
        if ( strcasecmp(from_cs, to_cs) != 0 ) {
            converted = firstPart->csConvert(
					(char **)&contents,
					length,
					0,
					from_cs,
					to_cs);
#ifdef DEBUG
	    env.logError(DTM_FALSE,
			 "DEBUG dtmailpr: converted = %d\n", converted);
#endif
        }
    }
    if ( mime_cs )
      free ( mime_cs );
    if ( from_cs )
      free( from_cs );
    if ( to_cs )
      free ( to_cs );
 
    // End of For CHARSET

    newline = new char [2];
    newline[0] = '\n';
    newline[1] = '\0';

    //
    // Print out the message headers.
    //
    buf = getPrintedHeaders(header_format);
    print_proc(stream, buf);
    print_proc(stream, newline);
    delete buf;

    //
    // Print out the message body.
    //
    buf = new char [length + 1];
    memset (buf, 0, (unsigned int) length + 1);
    memmove (buf, contents, (unsigned int) length);
    buf [length] = '\0';	// null-terminate that puppy
    print_proc(stream, buf);
    print_proc(stream, newline);
    delete [] buf;

    // For CHARSET
    if (converted && contents)
      free(contents);

    // No attachments?  We're done.
    if (numBPs < 2)
	return;

    int		i = 0, attbuflen = 0;
    char	*attbuf = NULL;
    char	*sunbuf = NULL;

    print_proc(stream, newline);
    for (i = 1; i < numBPs ; i++)
    {
	nextpart = bodyParts [i];

	if (nextpart == NULL)
	  fprintf (stderr, "Error getting part!\n");

	length = 0;
	type = "";
	sunDataDescription = "";
	description = "";
	name = "";
	mode = -1;
		
	nextpart->getContents(env,
			NULL,
			&length,
			&type,
			&name,
			&mode,
			&sunDataDescription);
	if (handleError (env, "getContents") == DTM_TRUE)
	  exit (1);

	if (type == NULL)
	  type = "(type unknown)";

	if (name == NULL)
	  name = "(name unknown)";

	if (sunDataDescription == NULL)
	{
	    description = "";
	} else {
	    // should add bracket or something
	    sunbuf = new char [strlen (sunDataDescription) + 10];
	    sprintf(sunbuf, " (%s)", sunDataDescription);
	    description = sunbuf;
	}

	attbuflen = strlen(name) + strlen(type) + strlen(description);
	attbuf = new char [attbuflen + 64];
	sprintf(attbuf,
		"[%d] \"%s\"%s, %s, %ld bytes",
		i,
		name,
		description,
		type,
		length);
	print_proc(stream, attbuf);
	print_proc(stream, newline);
	delete [] attbuf;

	if (sunbuf != NULL)
	  delete [] sunbuf;
    }

    return;
}
Beispiel #2
0
char *
DmxMsg::getHeaders (DtMailBoolean abbreviated_only)
{
    DtMailEnv		error;
    DtMail::Session	*m_session = theRoamApp.session()->session(); 
    DtMail::MailRc	*mail_rc = m_session->mailRc(error);
    DtMail::Envelope	*env = message->getEnvelope(error);

    DtMailHeaderHandle	hdr_hnd;
    char		*name;
    DtMailValueSeq	value;

    // Code from MsgScrollingList - display_message().
    // We're trying to reduce heap size by not allocating and 
    // deleting space in every loop iteration.  So just have a 
    // fixed size buffer initially.
    // 

    // Initial line size.  When not enough, allocate more.
    int			buffer_size = 2048;   
    char		*buffer = new char [buffer_size];
    int			count = 0;
    int			hdr_num = 0;
    char		*newline = "\n";
    char		*separator = ": ";
    int			val = 0;

    //
    // Iterate through each header in the message and add it
    // to the buffer.
    //
    for (hdr_hnd = env->getFirstHeader(error, &name, value), *buffer = '\0';
	 hdr_hnd && !error.isSet();
	 hdr_hnd = env->getNextHeader(error, hdr_hnd, &name, value), hdr_num++)
    {
        if (abbreviated_only == DTM_TRUE &&
	    (hdr_num != 0 || strcmp(name, "From") != 0))
	{
	    DtMailEnv ierror;
	    if (mail_rc->ignore(ierror, name))
	    {
		free(name);
		value.clear();
		continue;
	    }
	}
	    
	for (val=0;  val<value.length();  val++)
	  count += strlen(name) +
		   strlen(*(value[val])) +
		   strlen(separator) +
		   strlen(newline) + 1;

	if (count > buffer_size)
	{
	    // Need to increase buffer size.
	    char	*new_buffer;
	    
	    buffer_size *= 2;
	    new_buffer = new char [buffer_size];
	    memset(new_buffer, 0, buffer_size);

	    strcpy(new_buffer, buffer);
	    delete [] buffer;
	    buffer = new_buffer;
	}

	for (val=0;  val<value.length();  val++)
	{
	    strcat(buffer, name);
		
	    if (hdr_num != 0 || strcmp(name, "From") != 0)
	      strcat(buffer, separator);
	    else
	      strcat(buffer, " ");
		
	    strcat(buffer, *(value[val]));
	    strcat(buffer, newline);
	}
	value.clear();
	free(name);
    }

    //
    // Need to free this after using;
    //
    return buffer;
}
Beispiel #3
0
Boolean
FindDialog::compareMessage(DtMailMessageHandle	  handle)
{
  Boolean				found = False;
  register unsigned int		offset;

  //
  // Check for something to do.
  //
  for (offset = 0; offset < _num_text_fields; offset++) {
    if (_text_values[offset] != NULL) {
      break;
    }
  }

  // If all fields are empty then we match anything
  if (offset >= _num_text_fields) {
	return TRUE;
  }

  if (offset < _num_text_fields && handle != NULL) {

    // TODO - CHECK ERROR!!!
    DtMailEnv		error;

    //
    // Get the mail box.
    //
    DtMail::MailBox	* mbox = _roamWindow->mailbox();

    //
    // Get the DtMail::Message and Envelope for this handle.
    //
    DtMail::Message	* message = mbox->getMessage(error, handle);
    DtMail::Envelope	* envelope = message->getEnvelope(error);

    //
    // Get the meassage header.
    //
    DtMailValueSeq	  header;

    for (offset = 0; offset < _num_text_fields; offset++) {
      if (_text_values[offset] != NULL) {
	if (_text_abstract_name[offset] != NULL) {
	  envelope->getHeader(error, _text_abstract_name[offset],
			      DTM_TRUE, header);
	  found = TRUE;
	} else {
	  envelope->getHeader(error, _text_names[offset],
			      DTM_FALSE, header);
	  found = TRUE;
	}
	if (!compareHeader(error, header, _text_values[offset])) {
	  found = False;
	  break;
	}
        else {
          // Problem: if we have multiple search fields ... and use
          // the same "header" array ... "compareHeader" looks for
          // each "find" field in each (available) header field.
          // So, make sure only one is available for searching.
          // Really "offset" should be passed to "compareHeader" ...
          // That way, correct comparison can be done and the
          // memory for this array can be released correctly via the
          // destructor .... since "remove" fails to do so.
          header.remove(0);
        }
      }
    }
    if (offset > _num_text_fields) {
      found = TRUE;
    }
  }
  return(found);
}
Beispiel #4
0
void
RFCFormat::writeHeaders(DtMailEnv & error,
			DtMail::Message & msg,
			DtMailBoolean include_unix_from,
			const char * extra_headers,
			const char ** suppress_headers,
			Buffer & buf)
{
    error.clear();

    // First we copy each header from the message to the
    // buffer. The headers may need encoding to put them away, so
    // we will apply RFC1522 if necessary.
    //
    DtMailHeaderHandle hnd;
    DtMail::Envelope * env = msg.getEnvelope(error);
    if (error.isSet()) {
	return;
    }

    char * name = NULL;
    DtMailValueSeq value;

    hnd = env->getFirstHeader(error, &name, value);
    if (!hnd || error.isSet()) {
	return;
    }

    if (include_unix_from &&
	(error.isSet() || strcmp(name, "From") != 0)) {
	// We require a Unix from line, and we don't have one.
	// we will make one up using the sender, and the current
	// date.
	//
	char *unix_from = new char[100];
	strcpy(unix_from, "From ");
	
	DtMailValueSeq sender;
	env->getHeader(error, DtMailMessageSender, DTM_TRUE, sender);
	if (error.isSet()) {
	    // We no longer know who this is really from.
	    //
	    strcat(unix_from, "nobody@nowhere");
	}
	else {
	    DtMailAddressSeq * addrSeq = sender[0]->toAddress();
	    
	    strcat(unix_from, (*addrSeq)[0]->dtm_address);
	    delete addrSeq;
	}
	error.clear();

	time_t now = time(NULL);
	char time_format[30];
	
	SafeCtime(&now, time_format, sizeof(time_format));
	
	strcat(unix_from, " ");
	strcat(unix_from, time_format);
	buf.appendData(unix_from, strlen(unix_from));
	delete [] unix_from;
    }
    else {
	// Put out any header, except Unix From line
	//
	if (strcmp(name, "From") == 0) {
	    value.clear();
	    free(name);
	    hnd = env->getNextHeader(error, hnd, &name, value);
	}
    }

    for (; // First time is determined above.
	 hnd && !error.isSet();
	 value.clear(), hnd = env->getNextHeader(error, hnd, &name, value)) {

	const char **hdr;
	for (hdr = suppress_headers; *hdr; hdr++) {
	    if (strcasecmp(name, *hdr) == 0)
	      break;
	}

        //add _is_write_bcc for fixing aix defect 177096
	if (*hdr || strcasecmp(name, "bcc") == 0 && !_is_write_bcc ) {
	    free(name);
	    continue; // We will generate these headers.
	}

	int name_len = strlen(name);

	for (int val = 0; val < value.length(); val++) {
	    //
	    // If the value is null or empty do not emit this field
	    const char *valPtr;
	    for (valPtr = *(value[val]);
		 *valPtr && (isspace((unsigned char)*valPtr));
		 valPtr++)
	    {}
	    if (!*valPtr)
	      continue;
	    
	    buf.appendData(name, name_len);
	    buf.appendData(": ", 2);
	    rfc1522cpy(buf, *(value[val]));
	}

	free(name);
    }
    error.clear();

    buf.appendData(extra_headers, strlen(extra_headers));

    // Add new line that terminates the headers.
    //
    crlf(buf);
}
Beispiel #5
0
void
DmxMsg::display (void)
{
    DtMailEnv			env;
    boolean_t		FirstIsText = B_FALSE;
    DtMail::BodyPart	*firstPart = NULL, *nextpart = NULL;
    char			*type;
    char			*description = NULL;
    char			*sunDataDescription = NULL;
    char			*name = NULL;
    void * contents = NULL;
    unsigned long length = 0;
    int mode = 0;
    char *buf = NULL;
// For CHARSET
    char *mime_cs = NULL, *from_cs = NULL, *to_cs = NULL;
    char *v3_cs = new char [64];

    if (cachedValues != B_TRUE)
        parse ();	// read in body part info

    firstPart = bodyParts [0];

    firstPart->getContents(env,
                           (const void **) &contents,
                           &length,
                           NULL,	//type
                           NULL,	//name
                           NULL,	//mode
                           NULL);	//description

    if (handleError (env, "getContents") == B_TRUE)
        exit (1);

// For CHARSET

    DtMailValueSeq value;
    boolean_t err = B_FALSE;

// Get the bodypart's charset - Try MIME first then V3
    firstPart->getHeader(env, DtMailMessageContentType, DTM_TRUE, value);
    if (env.isNotSet()) {
        mime_cs = firstPart->csFromContentType(value);
    } else {
        env.clear();
        value.clear();
        firstPart->getHeader(env, DtMailMessageV3charset, DTM_TRUE, value);
        if (env.isNotSet()) {
            strcpy(v3_cs, *(value[0]));
        } else {
            err = B_TRUE;
            env.clear();
            value.clear();
        }
    }
// If cannot obtain bodypart's charset header, then maybe this message
// has only one bodypart, then in this case the charset header maybe
// among the message's envelope (main message headers).
// Get the envelope of the message (in order to access the headers)
    DtMail::Envelope *envelope = NULL;
    if (err == B_TRUE) {
        envelope = message->getEnvelope(env);
        err = B_FALSE;
#ifdef DEBUG
        env.logError(DTM_FALSE, "DEBUG dtmailpr: Looking at main message header\n");
#endif
    }
    if (envelope != NULL) {
//   Check for MIME charset header and then for V3 charset header
        envelope->getHeader(env, DtMailMessageContentType, DTM_TRUE, value);
        if (env.isNotSet()) {
            mime_cs = firstPart->csFromContentType(value);
        } else {
            err = B_TRUE;
            env.clear();
        }
        if (mime_cs == NULL || err == B_TRUE) {
            value.clear();
            envelope->getHeader(env, DtMailMessageV3charset, DTM_TRUE, value);
            if (env.isNotSet()) {
                strcpy(v3_cs, *(value[0]));
            } else {
                err = B_TRUE;
                env.clear();
            }
        }
    } else {
#ifdef DEBUG
        env.logError(DTM_FALSE, "DEBUG dtmailpr: envelope is null\n");
#endif
        env.clear();
    }

// Default codeset in case mime_cs and v3_cs are both null.
    if ((mime_cs == NULL) && (strlen(v3_cs) == 0)) {
        char *ret = NULL;
        firstPart->DtXlateOpToStdLocale(DtLCX_OPER_SETLOCALE,
                                        setlocale(LC_CTYPE, NULL),
                                        NULL,
                                        NULL,
                                        &ret);
        strcpy(v3_cs, "DEFAULT");
        strcat(v3_cs, ".");
        strcat(v3_cs, ret);
        if (ret)
            free(ret);
    }

// Get iconv from and to codeset and do conversion.
    int converted = 0;
    if (mime_cs) {
        from_cs = firstPart->csToConvName(mime_cs);
#ifdef DEBUG
        env.logError(DTM_FALSE, "DEBUG dtmailpr: mime_cs = %s\n", mime_cs);
#endif
    } else {
        from_cs = firstPart->csToConvName(v3_cs);
#ifdef DEBUG
        env.logError(DTM_FALSE, "DEBUG dtmailpr: v3_cs = %s\n", v3_cs);
#endif
    }
    to_cs = firstPart->locToConvName();

#ifdef DEBUG
    if ( from_cs == NULL )
        env.logError(DTM_FALSE, "DEBUG dtmailpr: from_cs is NULL\n");
    else
        env.logError(DTM_FALSE, "DEBUG dtmailpr: from_cs = %s\n", from_cs);

    if ( to_cs == NULL )
        env.logError(DTM_FALSE, "DEBUG dtmailpr: to_cs is NULL\n");
    else
        env.logError(DTM_FALSE, "DEBUG dtmailpr: to_cs = %s\n", to_cs);
#endif

    if ( from_cs && to_cs ) {
        if ( strcasecmp(from_cs, to_cs) != 0 ) {
            converted = firstPart->csConvert((char **)&contents, length, 0, from_cs, to_cs);
#ifdef DEBUG
            env.logError(DTM_FALSE, "DEBUG dtmailpr: converted = %d\n", converted);
#endif
        }
    }
    if ( mime_cs )
        free ( mime_cs );
    if ( from_cs )
        free( from_cs );
    if ( to_cs )
        free ( to_cs );

// End of For CHARSET


    buf = new char [length + 1];
    memset (buf, 0, (size_t) length + 1);

    // have to "seek" length bytes into the
    // contents buffer
    memmove (buf, contents, (size_t) length);
    buf [length] = '\0';	// null-terminate
    // that puppy

// For CHARSET
    if (converted && contents)
        free(contents);

    char	*numbuf = new char [10241];
    memset (numbuf, 0, 1024);

#ifdef NEVER
    // Don't want "Message 1:" appearing in print output
    sprintf (numbuf, "Messsage %s:\n%s\n",
             addlInfo, printHeader (MSGHEADER));
#endif
    puts(printHeader(MSGHEADER));
    puts(buf);

    fflush(stdout);

    // No attachments?  We're done.
    if (numBPs < 2)
        return;

    int	i = 0;

    char	*attbuf = NULL;

    printf ("\n");
    for (i = 1; i < numBPs ; i++)
    {
        nextpart = bodyParts [i];

        if (nextpart == NULL)
            fprintf (stderr, "Error getting part!\n");

        length = 0;
        type = "";
        sunDataDescription = "";
        description = "";
        name = "";
        mode = -1;

        nextpart->getContents(env, NULL, &length, &type,
                              &name, &mode, &sunDataDescription);
        if (handleError (env, "getContents") == B_TRUE)
            exit (1);

        if (type == NULL)
            type = "(unknown)";

        if (sunDataDescription == NULL)
        {
            description = "";
        } else {
            // should add bracket or something
            attbuf = new char [strlen (sunDataDescription) +10];
            sprintf (attbuf, " (%s)", sunDataDescription);
            description = attbuf;
        }

        if (name == NULL)
            name = "(name)";

        printf ("[%d] \"%s\"%s, ", i, name, description);
        printf ("%s, %d bytes\n", type, length);

        if (attbuf != NULL)
            delete [] attbuf;

    }

    delete [] v3_cs;
    return;
}