Changeset 1654
- Timestamp:
- 02/18/07 15:27:42
- Files:
-
- trunk/ChangeLog (modified) (1 diff)
- trunk/libtinymail-camel/tny-camel-folder.c (modified) (4 diffs)
- trunk/libtinymail-camel/tny-camel-store-account.c (modified) (5 diffs)
- trunk/libtinymail/tny-folder-store.c (modified) (2 diffs)
- trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c (modified) (13 diffs)
- trunk/tests/c-demo/tny-demoui-summary-view.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ChangeLog
r1649 r1654 1 2007-02-18 Philip Van Hoof <pvanhoof@gnome.org> 2 3 * Various fixes for the folder create, rename and delete functionality 4 1 5 2007-02-16 Philip Van Hoof <pvanhoof@gnome.org> 2 6 trunk/libtinymail-camel/tny-camel-folder.c
r1650 r1654 2073 2073 if ((*ccfoln == '/') && (strrchr (ccfoln, '/') == ccfoln)) 2074 2074 { 2075 CamelException subex = CAMEL_EXCEPTION_INITIALISER; 2076 2077 if (camel_store_supports_subscriptions (store)) 2078 camel_store_subscribe_folder (store, cfolname, &subex); 2079 2075 2080 camel_store_delete_folder (store, cfolname, &ex); 2076 2081 … … 2083 2088 } else 2084 2089 { 2090 if (camel_store_supports_subscriptions (store)) 2091 camel_store_unsubscribe_folder (store, cfolname, &subex); 2092 2085 2093 changed = TRUE; 2086 2094 g_free (cpriv->folder_name); … … 2145 2153 TnyFolder *folder; CamelFolderInfo *info; 2146 2154 TnyFolderStoreChange *change; 2155 CamelException subex = CAMEL_EXCEPTION_INITIALISER; 2147 2156 2148 2157 if (!_tny_session_check_operation (TNY_FOLDER_PRIV_GET_SESSION(priv), err, … … 2194 2203 return NULL; 2195 2204 } 2205 2206 g_assert (info != NULL); 2207 2208 if (camel_store_supports_subscriptions (store)) 2209 camel_store_subscribe_folder (store, info->full_name, &subex); 2196 2210 2197 2211 folder = _tny_camel_folder_new (); trunk/libtinymail-camel/tny-camel-store-account.c
r1650 r1654 389 389 TnyCamelFolderPriv *cpriv = TNY_CAMEL_FOLDER_GET_PRIVATE (cfol); 390 390 CamelStore *store; 391 391 CamelException subex = CAMEL_EXCEPTION_INITIALISER; 392 392 393 g_assert (TNY_IS_CAMEL_FOLDER (folder)); 393 394 … … 425 426 g_assert (cpriv->folder_name != NULL); 426 427 427 /* Unsubscribe : camel should do it by itself but it does not do it */ 428 429 if (camel_store_supports_subscriptions (store) && 430 camel_store_folder_subscribed (store, cpriv->folder_name)) 431 camel_store_unsubscribe_folder (store, cpriv->folder_name, NULL); 428 if (camel_store_supports_subscriptions (store)) 429 camel_store_subscribe_folder (store, cpriv->folder_name, &subex); 432 430 433 431 camel_store_delete_folder (store, cpriv->folder_name, &ex); 434 432 435 433 if (camel_exception_is_set (&ex)) 436 434 { … … 441 439 } else 442 440 { 443 TnyFolderStoreChange *change; 441 if (camel_store_supports_subscriptions (store)) 442 camel_store_unsubscribe_folder (store, cpriv->folder_name, &subex); 443 444 TnyFolderStoreChange *change; 444 445 change = tny_folder_store_change_new (self); 445 446 tny_folder_store_change_add_removed_folder (change, folder); 446 447 notify_folder_store_observers_about (self, change); 447 g_object_unref (G_OBJECT (change)); 448 g_object_unref (G_OBJECT (change)); 448 449 } 449 450 … … 472 473 TnyFolder *folder; CamelFolderInfo *info; CamelStore *store; 473 474 TnyFolderStoreChange *change; 475 CamelException subex = CAMEL_EXCEPTION_INITIALISER; 474 476 475 477 if (!_tny_session_check_operation (apriv->session, err, … … 535 537 536 538 g_assert (info != NULL); 539 540 if (camel_store_supports_subscriptions (store)) 541 camel_store_subscribe_folder (store, info->full_name, &subex); 537 542 538 543 folder = _tny_camel_folder_new (); trunk/libtinymail/tny-folder-store.c
r1636 r1654 107 107 * @err: a #GError object or NULL 108 108 * 109 * Creates a new folder in @self. The value returned is the newly created folder110 * instance and must be unreferenced after use.109 * Creates a new folder in @self. If not NULL, the value returned is the newly 110 * created folder instance and must be unreferenced after use. 111 111 * 112 112 * Example: … … 115 115 * TnyFolder *createfol; 116 116 * createfol = tny_folder_store_create_folder (store, "Test", NULL); 117 * g_object_unref (G_OBJECT (createfol));117 * if (createfol) g_object_unref (G_OBJECT (createfol)); 118 118 * </programlisting></informalexample> 119 119 * 120 * Return value: A new folder instance representing the folder that was created 120 * Return value: A new folder instance representing the folder that was created or NULL in case of failure 121 121 * 122 122 **/ trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c
r1651 r1654 70 70 gtk_tree_store_append (model, tree_iter, hlrp->parent_tree_iter); 71 71 72 /* This adds a reference count to folder too. When it gets removed, that 73 reference count is decreased automatically by the gtktreestore infra- 74 structure. */ 75 72 76 gtk_tree_store_set (model, tree_iter, 73 77 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, … … 134 138 me->store_observables = g_list_prepend (me->store_observables, folder); 135 139 140 /* This adds a reference count to folder too. When it gets removed, that 141 reference count is decreased automatically by the gtktreestore infra- 142 structure. */ 143 136 144 gtk_tree_store_set (model, &tree_iter, 137 145 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, … … 210 218 func (model, name_iter, NULL); 211 219 220 /* This adds a reference count to folder_store too. When it gets removed, 221 that reference count is decreased automatically by the gtktreestore 222 infrastructure. */ 223 212 224 gtk_tree_store_set (model, name_iter, 213 225 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, root_name, … … 484 496 if (citem == item) 485 497 { 498 /* This removes a reference count */ 486 499 gtk_tree_store_remove (GTK_TREE_STORE (me), &iter); 487 500 g_object_unref (G_OBJECT (item)); … … 501 514 TnyGtkFolderStoreTreeModel *copy = g_object_new (TNY_TYPE_GTK_FOLDER_STORE_TREE_MODEL, NULL); 502 515 503 /* This only copies the TnyList pieces. The result is not a 504 correct or good TnyHeaderListModel. But it will be a correct 505 TnyList instance. It is the only thing the user of this 506 method expects. 507 508 The new list will point to the same instances, of course. It's 509 only a copy of the list-nodes of course. */ 516 /* This only copies the TnyList pieces. The result is not a correct or good 517 TnyHeaderListModel. But it will be a correct TnyList instance. It's the 518 only thing the user of this method expects (that is the contract of it). 519 520 The new list will point to the same instances, of course. It's only a 521 copy of the list-nodes of course. */ 510 522 511 523 g_mutex_lock (me->iterator_lock); … … 533 545 534 546 535 typedef void (*pernodeexec) (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data1, gpointer user_data2); 536 537 static void 538 foreach_node_execute (GtkTreeModel *model, GtkTreeIter *iter, pernodeexec func, gpointer user_data1, gpointer user_data2) 539 { 540 do 541 { 542 GtkTreeIter kids; 543 if (gtk_tree_model_iter_children (model, &kids, iter)) 544 foreach_node_execute (model, &kids, func, user_data1, user_data2); 545 546 func (model, iter, user_data1, user_data2); 547 } while (gtk_tree_model_iter_next (model, iter)); 548 } 549 550 static void 551 updater (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data1, gpointer user_data2) 547 static gboolean 548 updater (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data1) 552 549 { 553 550 gint type; … … 583 580 584 581 g_object_unref (G_OBJECT (changed_folder)); 585 } 586 587 588 static void 589 creater (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data1, gpointer user_data2) 582 583 return FALSE; 584 } 585 586 587 static gboolean 588 creater (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data1) 590 589 { 591 590 gint type; … … 619 618 620 619 gtk_tree_store_append (GTK_TREE_STORE (model), &newiter, iter); 620 621 /* This adds a reference count to folder_store too. When it gets 622 removed, that reference count is decreased automatically by 623 the gtktreestore infrastructure. */ 621 624 622 625 gtk_tree_store_set (GTK_TREE_STORE (model), &newiter, … … 646 649 647 650 g_object_unref (G_OBJECT (parentstore)); 648 } 649 650 651 652 static void 653 deleter (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data1, gpointer user_data2) 651 652 return FALSE; 653 } 654 655 656 static gboolean 657 deleter (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data1) 654 658 { 655 659 gint type; 656 TnyFolderStoreChange *change = user_data1; 657 TnyFolderStore *parentstore = tny_folder_store_change_get_folder_store (change); 660 GObject *folder = user_data1; 658 661 659 662 gtk_tree_model_get (model, iter, … … 663 666 if (type != TNY_FOLDER_TYPE_ROOT) 664 667 { 665 TnyFolderStore*fol;668 GObject *fol; 666 669 667 670 gtk_tree_model_get (model, iter, … … 669 672 &fol, -1); 670 673 671 if (fol == parentstore) 672 { 673 TnyList *removed = tny_simple_list_new (); 674 TnyIterator *miter; 675 676 tny_folder_store_change_get_removed_folders (change, removed); 677 miter = tny_list_create_iterator (removed); 678 679 while (!tny_iterator_is_done (miter)) 680 { 681 GtkTreeIter kids; 682 TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (miter)); 683 684 if (gtk_tree_model_iter_children (model, &kids, iter)) 685 while (gtk_tree_model_iter_next (model, &kids)) 686 { 687 gint ntype; 688 gtk_tree_model_get (model, &kids, 689 TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, 690 &ntype, -1); 691 692 if (ntype != TNY_FOLDER_TYPE_ROOT) 693 { 694 TnyFolder *nfol; 695 gtk_tree_model_get (model, &kids, 696 TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 697 &nfol, -1); 698 699 if (nfol == folder) 700 gtk_tree_store_remove (GTK_TREE_STORE (model), &kids); 701 702 g_object_unref (G_OBJECT (nfol)); 703 } 704 } 705 g_object_unref (G_OBJECT (folder)); 706 707 tny_iterator_next (miter); 708 } 709 710 g_object_unref (G_OBJECT (miter)); 711 g_object_unref (G_OBJECT (removed)); 712 713 } 674 if (fol == folder) 675 gtk_tree_store_remove (GTK_TREE_STORE (model), iter); 714 676 715 677 g_object_unref (G_OBJECT (fol)); 716 678 } 717 679 718 g_object_unref (G_OBJECT (parentstore));680 return FALSE; 719 681 } 720 682 … … 729 691 changed & TNY_FOLDER_CHANGE_CHANGED_UNREAD_COUNT) 730 692 { 731 GtkTreeIter iter; 732 if (gtk_tree_model_get_iter_first (model, &iter)) 733 foreach_node_execute (model, &iter, updater, change, NULL); 734 } 735 } 736 693 gtk_tree_model_foreach (model, updater, change); 694 } 695 } 696 697 698 static gboolean 699 find_store_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *f, gpointer user_data) 700 { 701 do 702 { 703 GtkTreeIter child; 704 gint type; 705 706 gtk_tree_model_get (model, iter, 707 TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, 708 &type, -1); 709 710 if (type != TNY_FOLDER_TYPE_ROOT) 711 { 712 TnyFolderStore *fol; 713 gboolean found = FALSE; 714 715 gtk_tree_model_get (model, iter, 716 TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 717 &fol, -1); 718 719 if (fol == user_data) 720 found = TRUE; 721 722 g_object_unref (G_OBJECT (fol)); 723 724 if (found) { 725 *f = *iter; 726 return TRUE; 727 } 728 } 729 730 if (gtk_tree_model_iter_children (model, &child, iter)) 731 { 732 if (find_store_iter (model, &child, f, user_data)) 733 return TRUE; 734 } 735 736 } while (gtk_tree_model_iter_next (model, iter)); 737 738 return FALSE; 739 } 737 740 738 741 static void … … 744 747 if (changed & TNY_FOLDER_STORE_CHANGE_CHANGED_CREATED_FOLDERS) 745 748 { 746 GtkTreeIter iter; 747 if (gtk_tree_model_get_iter_first (model, &iter)) 748 foreach_node_execute (model, &iter, creater, change, NULL); 749 TnyFolderStore *parentstore = tny_folder_store_change_get_folder_store (change); 750 GtkTreeIter first, iter; 751 752 if (gtk_tree_model_get_iter_first (model, &first) && 753 find_store_iter (model, &first, &iter, parentstore)) 754 { 755 TnyList *created = tny_simple_list_new (); 756 TnyIterator *miter; 757 758 tny_folder_store_change_get_created_folders (change, created); 759 miter = tny_list_create_iterator (created); 760 761 while (!tny_iterator_is_done (miter)) 762 { 763 GtkTreeIter newiter; 764 TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (miter)); 765 766 gtk_tree_store_append (GTK_TREE_STORE (model), &newiter, &iter); 767 768 /* This adds a reference count to folder_store too. When it gets 769 removed, that reference count is decreased automatically by 770 the gtktreestore infrastructure. */ 771 772 gtk_tree_store_set (GTK_TREE_STORE (model), &newiter, 773 TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, 774 tny_folder_get_name (TNY_FOLDER (folder)), 775 TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, 776 tny_folder_get_unread_count (TNY_FOLDER (folder)), 777 TNY_GTK_FOLDER_STORE_TREE_MODEL_ALL_COLUMN, 778 tny_folder_get_all_count (TNY_FOLDER (folder)), 779 TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, 780 tny_folder_get_folder_type (TNY_FOLDER (folder)), 781 TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, 782 folder, -1); 783 784 g_object_unref (G_OBJECT (folder)); 785 tny_iterator_next (miter); 786 } 787 g_object_unref (G_OBJECT (miter)); 788 g_object_unref (G_OBJECT (created)); 789 } 790 g_object_unref (G_OBJECT (parentstore)); 749 791 } 750 792 751 793 if (changed & TNY_FOLDER_STORE_CHANGE_CHANGED_REMOVED_FOLDERS) 752 794 { 753 GtkTreeIter iter; 754 if (gtk_tree_model_get_iter_first (model, &iter)) 755 foreach_node_execute (model, &iter, deleter, change, NULL); 795 TnyList *removed = tny_simple_list_new (); 796 TnyIterator *miter; 797 798 tny_folder_store_change_get_removed_folders (change, removed); 799 miter = tny_list_create_iterator (removed); 800 801 while (!tny_iterator_is_done (miter)) 802 { 803 TnyFolder *folder = TNY_FOLDER (tny_iterator_get_current (miter)); 804 gtk_tree_model_foreach (model, deleter, folder); 805 g_object_unref (G_OBJECT (folder)); 806 tny_iterator_next (miter); 807 } 808 g_object_unref (G_OBJECT (miter)); 809 g_object_unref (G_OBJECT (removed)); 756 810 } 757 811 } trunk/tests/c-demo/tny-demoui-summary-view.c
r1653 r1654 869 869 const gchar *newname = gtk_entry_get_text (GTK_ENTRY (entry)); 870 870 871 tny_folder_store_create_folder (folderstore, newname, &err); 871 TnyFolder *created = tny_folder_store_create_folder (folderstore, newname, &err); 872 873 if (created) /* Can be NULL on failure */ 874 g_object_unref (G_OBJECT (created)); 872 875 873 876 if (err != NULL)
