예제 #1
0
static int add_filename(notmuch_database_t *db, const char *path, HEADER *h)
{
	int rc = -1;
	notmuch_status_t st;
	notmuch_message_t *msg;

	dprint(2, (debugfile, "nm: adding filename '%s'\n", path));

	st = notmuch_database_begin_atomic(db);
	if (st)
		return -1;

	st = notmuch_database_add_message(db, path, &msg);
	switch (st) {
	case NOTMUCH_STATUS_SUCCESS:
		if (h)
			update_tags(msg, nm_header_get_tags(h));
		break;
	case NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID:
		notmuch_message_maildir_flags_to_tags(msg);
		break;
	default:
		dprint(1, (debugfile, "nm: failed to add '%s' [st=%d]\n",
					path, (int) st));
		goto done;
	}

	st = notmuch_database_end_atomic(db);
	if (st)
	    goto done;

	rc = 0;
done:
	if (msg)
	    notmuch_message_destroy(msg);
	return rc;
}
예제 #2
0
파일: copy.c 프로젝트: 0xAX/mutt
int
mutt_copy_header (FILE *in, HEADER *h, FILE *out, int flags, const char *prefix)
{
  char buffer[SHORT_STRING];

  if (h->env)
    flags |= (h->env->irt_changed ? CH_UPDATE_IRT : 0)
      | (h->env->refs_changed ? CH_UPDATE_REFS : 0);

  if (mutt_copy_hdr (in, out, h->offset, h->content->offset, flags, prefix) == -1)
    return -1;

  if (flags & CH_TXTPLAIN)
  {
    char chsbuf[SHORT_STRING];
    fputs ("MIME-Version: 1.0\n", out);
    fputs ("Content-Transfer-Encoding: 8bit\n", out);
    fputs ("Content-Type: text/plain; charset=", out);
    mutt_canonical_charset (chsbuf, sizeof (chsbuf), Charset ? Charset : "us-ascii");
    rfc822_cat(buffer, sizeof(buffer), chsbuf, MimeSpecials);
    fputs(buffer, out);
    fputc('\n', out);
  }

  if ((flags & CH_UPDATE_IRT) && h->env->in_reply_to)
  {
    LIST *listp = h->env->in_reply_to;
    fputs ("In-Reply-To:", out);
    for (; listp; listp = listp->next)
    {
      fputc (' ', out);
      fputs (listp->data, out);
    }
    fputc ('\n', out);
  }

  if ((flags & CH_UPDATE_REFS) && h->env->references)
  {
    fputs ("References:", out);
    mutt_write_references (h->env->references, out, 0);
    fputc ('\n', out);
  }

  if ((flags & CH_UPDATE) && (flags & CH_NOSTATUS) == 0)
  {
    if (h->old || h->read)
    {
      fputs ("Status: ", out);
      if (h->read)
	fputs ("RO", out);
      else if (h->old)
	fputc ('O', out);
      fputc ('\n', out);
    }

    if (h->flagged || h->replied)
    {
      fputs ("X-Status: ", out);
      if (h->replied)
	fputc ('A', out);
      if (h->flagged)
	fputc ('F', out);
      fputc ('\n', out);
    }
  }

  if (flags & CH_UPDATE_LEN &&
      (flags & CH_NOLEN) == 0)
  {
    fprintf (out, "Content-Length: " OFF_T_FMT "\n", h->content->length);
    if (h->lines != 0 || h->content->length == 0)
      fprintf (out, "Lines: %d\n", h->lines);
  }

#ifdef USE_NOTMUCH
  if ((flags & CH_VIRTUAL) && nm_header_get_tags(h))
  {
    fputs ("Tags: ", out);
    fputs (nm_header_get_tags(h), out);
    fputc ('\n', out);
  }
#endif

  if ((flags & CH_NONEWLINE) == 0)
  {
    if (flags & CH_PREFIX)
      fputs(prefix, out);
    fputc ('\n', out); /* add header terminator */
  }

  if (ferror (out) || feof (out))
    return -1;
  
  return 0;
}