| 530 | | if (message && CAMEL_IS_MIME_MESSAGE (message)) { |
|---|
| 531 | | camel_folder_append_message (priv->folder, message, NULL, &new_uid, &ex); |
|---|
| | 528 | if (message && CAMEL_IS_MIME_MESSAGE (message)) |
|---|
| | 529 | { |
|---|
| | 530 | TnyFolderChange *change = tny_folder_change_new (self); |
|---|
| | 531 | gboolean first = TRUE; |
|---|
| | 532 | GPtrArray *dst_orig_uids = NULL; |
|---|
| | 533 | gint a = 0, len = 0, nlen = 0; |
|---|
| | 534 | CamelException ex2 = CAMEL_EXCEPTION_INITIALISER; |
|---|
| | 535 | len = priv->folder->summary->messages->len; |
|---|
| | 536 | dst_orig_uids = g_ptr_array_sized_new (len); |
|---|
| | 537 | for (a = 0; a < len; a++) { |
|---|
| | 538 | CamelMessageInfo *om = camel_folder_summary_index (priv->folder->summary, a); |
|---|
| | 539 | if (om && om->uid) |
|---|
| | 540 | g_ptr_array_add (dst_orig_uids, g_strdup (om->uid)); |
|---|
| | 541 | if (om) |
|---|
| | 542 | camel_message_info_free (om); |
|---|
| | 543 | } |
|---|
| | 544 | |
|---|
| | 545 | camel_folder_append_message (priv->folder, message, NULL, NULL, &ex); |
|---|
| 535 | | if (new_uid) |
|---|
| 536 | | minfo = camel_folder_summary_uid (priv->folder->summary, new_uid); |
|---|
| | 549 | camel_folder_refresh_info (priv->folder, &ex2); |
|---|
| | 550 | nlen = priv->folder->summary->messages->len; |
|---|
| | 551 | |
|---|
| | 552 | for (a = 0; a < nlen; a++) |
|---|
| | 553 | { |
|---|
| | 554 | CamelMessageInfo *om = camel_folder_summary_index (priv->folder->summary, a); |
|---|
| | 555 | if (om && om->uid) { |
|---|
| | 556 | gint b = 0; |
|---|
| | 557 | gboolean found = FALSE; |
|---|
| | 558 | |
|---|
| | 559 | for (b = 0; b < dst_orig_uids->len; b++) { |
|---|
| | 560 | /* Finding the needle ... */ |
|---|
| | 561 | if (!strcmp (dst_orig_uids->pdata[b], om->uid)) { |
|---|
| | 562 | found = TRUE; |
|---|
| | 563 | break; |
|---|
| | 564 | } |
|---|
| | 565 | } |
|---|
| | 566 | |
|---|
| | 567 | if (!found) { |
|---|
| | 568 | /* Jeej! a new one! */ |
|---|
| | 569 | TnyHeader *hdr = _tny_camel_header_new (); |
|---|
| | 570 | |
|---|
| | 571 | if (first && msg) |
|---|
| | 572 | { |
|---|
| | 573 | TnyHeader *header = NULL; |
|---|
| | 574 | _tny_camel_msg_set_folder (TNY_CAMEL_MSG (msg), self); |
|---|
| | 575 | header = tny_msg_get_header (msg); |
|---|
| | 576 | ((TnyCamelMsgHeader *)header)->old_uid = g_strdup (om->uid); |
|---|
| | 577 | g_object_unref (header); |
|---|
| | 578 | first = FALSE; |
|---|
| | 579 | } |
|---|
| | 580 | |
|---|
| | 581 | /* This adds a reason to live for folder_dst */ |
|---|
| | 582 | _tny_camel_header_set_folder (TNY_CAMEL_HEADER (hdr), |
|---|
| | 583 | TNY_CAMEL_FOLDER (self), priv); |
|---|
| | 584 | /* hdr will take care of the freeup */ |
|---|
| | 585 | _tny_camel_header_set_as_memory (TNY_CAMEL_HEADER (hdr), om); |
|---|
| | 586 | tny_folder_change_add_added_header (change, hdr); |
|---|
| | 587 | g_object_unref (hdr); |
|---|
| | 588 | } else /* Not-new message, freeup */ |
|---|
| | 589 | camel_message_info_free (om); |
|---|
| | 590 | } else if (om) /* arg? */ |
|---|
| | 591 | camel_message_info_free (om); |
|---|
| | 592 | } |
|---|
| | 595 | |
|---|
| | 596 | tny_folder_change_set_new_all_count (change, priv->cached_length); |
|---|
| | 597 | tny_folder_change_set_new_unread_count (change, priv->unread_length); |
|---|
| | 598 | |
|---|
| | 599 | notify_folder_observers_about (self, change); |
|---|
| | 600 | |
|---|
| | 601 | g_object_unref (G_OBJECT (change)); |
|---|
| | 602 | |
|---|
| | 603 | if (dst_orig_uids) { |
|---|
| | 604 | g_ptr_array_foreach (dst_orig_uids, (GFunc) g_free, NULL); |
|---|
| | 605 | g_ptr_array_free (dst_orig_uids, TRUE); |
|---|
| | 606 | } |
|---|
| 554 | | } else if (!haderr) |
|---|
| 555 | | { |
|---|
| 556 | | TnyHeader *header = NULL; |
|---|
| 557 | | |
|---|
| 558 | | _tny_camel_msg_set_folder (TNY_CAMEL_MSG (msg), self); |
|---|
| 559 | | header = tny_msg_get_header (msg); |
|---|
| 560 | | |
|---|
| 561 | | if (header && TNY_IS_HEADER (header)) |
|---|
| 562 | | { |
|---|
| 563 | | TnyHeader *hdr = NULL; |
|---|
| 564 | | TnyFolderChange *change = tny_folder_change_new (self); |
|---|
| 565 | | |
|---|
| 566 | | if (new_uid) |
|---|
| 567 | | ((TnyCamelMsgHeader *)header)->old_uid = g_strdup (new_uid); |
|---|
| 568 | | |
|---|
| 569 | | if (minfo) |
|---|
| 570 | | { |
|---|
| 571 | | TnyHeader *hdr = _tny_camel_header_new (); |
|---|
| 572 | | /* This adds a reason to live to self */ |
|---|
| 573 | | _tny_camel_header_set_folder (TNY_CAMEL_HEADER (hdr), |
|---|
| 574 | | TNY_CAMEL_FOLDER (self), priv); |
|---|
| 575 | | /* hdr will take care of the freeup */ |
|---|
| 576 | | _tny_camel_header_set_as_memory (TNY_CAMEL_HEADER (hdr), minfo); |
|---|
| 577 | | } else |
|---|
| 578 | | hdr = TNY_HEADER (g_object_ref (header)); |
|---|
| 579 | | |
|---|
| 580 | | tny_folder_change_add_added_header (change, hdr); |
|---|
| 581 | | tny_folder_change_set_new_all_count (change, priv->cached_length); |
|---|
| 582 | | tny_folder_change_set_new_unread_count (change, priv->unread_length); |
|---|
| 583 | | notify_folder_observers_about (self, change); |
|---|
| 584 | | |
|---|
| 585 | | g_object_unref (G_OBJECT (change)); |
|---|
| 586 | | } |
|---|
| 587 | | |
|---|
| 588 | | if (header && G_IS_OBJECT (header)) |
|---|
| 589 | | g_object_unref (G_OBJECT (header)); |
|---|
| 590 | | } |
|---|
| 591 | | |
|---|
| 592 | | if (new_uid) |
|---|
| 593 | | g_free (new_uid); |
|---|
| | 622 | } |
|---|