diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-02-04 22:27:13 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-02-04 22:27:13 +0000 |
commit | 425b352bcbba53bded68c10d1f07c12c7f8e68c5 (patch) | |
tree | 852f4791a4cf540a71a754bcf1df602132f3b3ec | |
parent | 0795dd6cae6afd57ebd73b12888ebc5a7ead41cc (diff) | |
download | gnunet-gtk-425b352bcbba53bded68c10d1f07c12c7f8e68c5.tar.gz gnunet-gtk-425b352bcbba53bded68c10d1f07c12c7f8e68c5.zip |
-partial fix for #2080
-rw-r--r-- | src/fs/gnunet-fs-gtk_event-handler.c | 155 |
1 files changed, 104 insertions, 51 deletions
diff --git a/src/fs/gnunet-fs-gtk_event-handler.c b/src/fs/gnunet-fs-gtk_event-handler.c index 61373011..ced65438 100644 --- a/src/fs/gnunet-fs-gtk_event-handler.c +++ b/src/fs/gnunet-fs-gtk_event-handler.c | |||
@@ -1649,7 +1649,6 @@ add_directory_entry (void *cls, const char *filename, | |||
1649 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 1649 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
1650 | "Adding directory entry `%s'\n", | 1650 | "Adding directory entry `%s'\n", |
1651 | filename); | 1651 | filename); |
1652 | |||
1653 | if (NULL == uri) | 1652 | if (NULL == uri) |
1654 | { | 1653 | { |
1655 | /* directory meta data itself */ | 1654 | /* directory meta data itself */ |
@@ -1690,6 +1689,7 @@ add_directory_entry (void *cls, const char *filename, | |||
1690 | * the contents. | 1689 | * the contents. |
1691 | * | 1690 | * |
1692 | * @param de download entry that is progressing | 1691 | * @param de download entry that is progressing |
1692 | * @param filename name of the downloaded file on disk (possibly a temporary file) | ||
1693 | * @param size overall size of the download | 1693 | * @param size overall size of the download |
1694 | * @param completed number of bytes we have completed | 1694 | * @param completed number of bytes we have completed |
1695 | * @param block_data current block we've downloaded | 1695 | * @param block_data current block we've downloaded |
@@ -1698,7 +1698,9 @@ add_directory_entry (void *cls, const char *filename, | |||
1698 | * @param depth depth of the block in the ECRS tree | 1698 | * @param depth depth of the block in the ECRS tree |
1699 | */ | 1699 | */ |
1700 | static void | 1700 | static void |
1701 | mark_download_progress (struct DownloadEntry *de, uint64_t size, | 1701 | mark_download_progress (struct DownloadEntry *de, |
1702 | const char *filename, | ||
1703 | uint64_t size, | ||
1702 | uint64_t completed, const void *block_data, | 1704 | uint64_t completed, const void *block_data, |
1703 | uint64_t offset, uint64_t block_size, | 1705 | uint64_t offset, uint64_t block_size, |
1704 | unsigned int depth) | 1706 | unsigned int depth) |
@@ -1731,24 +1733,46 @@ mark_download_progress (struct DownloadEntry *de, uint64_t size, | |||
1731 | size) : 100) /* availability == progress */, | 1733 | size) : 100) /* availability == progress */, |
1732 | 14, completed, | 1734 | 14, completed, |
1733 | -1); | 1735 | -1); |
1734 | if ( (depth == 0) && | 1736 | if (completed < size) |
1735 | (block_size > 0) && | 1737 | { |
1736 | (GNUNET_YES == de->is_directory) ) | 1738 | /* partial completion, consider looking at the block */ |
1737 | { | 1739 | if ( (depth == 0) && |
1738 | /* got a data block of a directory, list its contents */ | 1740 | (block_size > 0) && |
1739 | struct AddDirectoryEntryContext ade; | 1741 | (GNUNET_YES == de->is_directory) ) |
1740 | |||
1741 | ade.tab = de->sr->tab; | ||
1742 | ade.prr = de->sr->rr; | ||
1743 | ade.check_duplicates = GNUNET_NO; | ||
1744 | if (GNUNET_SYSERR == | ||
1745 | GNUNET_FS_directory_list_contents ((size_t) block_size, block_data, | ||
1746 | offset, &add_directory_entry, &ade)) | ||
1747 | { | 1742 | { |
1748 | /* Mime type was wrong, this is not a directory, update model! */ | 1743 | /* got a data block of a directory, list its contents */ |
1749 | de->is_directory = GNUNET_SYSERR; | 1744 | struct AddDirectoryEntryContext ade; |
1750 | gtk_tree_store_set (de->sr->tab->ts, &iter, | 1745 | |
1751 | 10, "" /* unknown mime type */, -1); | 1746 | ade.tab = de->sr->tab; |
1747 | ade.prr = de->sr->rr; | ||
1748 | ade.check_duplicates = GNUNET_NO; | ||
1749 | if (GNUNET_SYSERR == | ||
1750 | GNUNET_FS_directory_list_contents ((size_t) block_size, block_data, | ||
1751 | offset, &add_directory_entry, &ade)) | ||
1752 | { | ||
1753 | /* Mime type was wrong, this is not a directory, update model! */ | ||
1754 | de->is_directory = GNUNET_SYSERR; | ||
1755 | gtk_tree_store_set (de->sr->tab->ts, &iter, | ||
1756 | 10, "" /* unknown mime type */, -1); | ||
1757 | } | ||
1758 | } | ||
1759 | } | ||
1760 | else | ||
1761 | { | ||
1762 | /* full completion, look at the entire file */ | ||
1763 | if ( (GNUNET_NO != de->is_directory) && | ||
1764 | (filename != NULL) ) | ||
1765 | { | ||
1766 | struct AddDirectoryEntryContext ade; | ||
1767 | |||
1768 | /* download was for a directory (and we have a temp file for scanning); | ||
1769 | add contents of the directory to the view */ | ||
1770 | ade.tab = de->sr->tab; | ||
1771 | ade.prr = de->sr->rr; | ||
1772 | ade.check_duplicates = GNUNET_YES; | ||
1773 | if (GNUNET_OK != | ||
1774 | GNUNET_FS_GTK_mmap_and_scan (filename, &add_directory_entry, &ade)) | ||
1775 | de->is_directory = GNUNET_NO; | ||
1752 | } | 1776 | } |
1753 | } | 1777 | } |
1754 | } | 1778 | } |
@@ -1784,37 +1808,15 @@ mark_download_error (struct DownloadEntry *de, | |||
1784 | 1808 | ||
1785 | /** | 1809 | /** |
1786 | * FS-API notified us that we're done with a download. Update the | 1810 | * FS-API notified us that we're done with a download. Update the |
1787 | * view accordingly. If the download is a directory, try to display | 1811 | * view accordingly. |
1788 | * the contents. | ||
1789 | * | 1812 | * |
1790 | * @param de download that has finished | 1813 | * @param de download that has finished |
1791 | * @param size overall size of the file | 1814 | * @param size overall size of the file |
1792 | * @param filename name of the downloaded file on disk (possibly a temporary file) | ||
1793 | */ | 1815 | */ |
1794 | static void | 1816 | static void |
1795 | mark_download_completed (struct DownloadEntry *de, uint64_t size, | 1817 | mark_download_completed (struct DownloadEntry *de, uint64_t size) |
1796 | const char *filename) | ||
1797 | { | 1818 | { |
1798 | struct AddDirectoryEntryContext ade; | ||
1799 | |||
1800 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
1801 | "Marking download completed for DE=%p, %llu-byte `%s'\n", | ||
1802 | de, size, filename); | ||
1803 | |||
1804 | de->is_done = GNUNET_YES; | 1819 | de->is_done = GNUNET_YES; |
1805 | mark_download_progress (de, size, size, NULL, 0, 0, 0); | ||
1806 | if ( (GNUNET_NO != de->is_directory) && | ||
1807 | (filename != NULL) ) | ||
1808 | { | ||
1809 | /* download was for a directory (and we have a temp file for scanning); | ||
1810 | add contents of the directory to the view */ | ||
1811 | ade.tab = de->sr->tab; | ||
1812 | ade.prr = de->sr->rr; | ||
1813 | ade.check_duplicates = GNUNET_YES; | ||
1814 | if (GNUNET_OK != | ||
1815 | GNUNET_FS_GTK_mmap_and_scan (filename, &add_directory_entry, &ade)) | ||
1816 | de->is_directory = GNUNET_NO; | ||
1817 | } | ||
1818 | change_download_color (de, "green"); | 1820 | change_download_color (de, "green"); |
1819 | } | 1821 | } |
1820 | 1822 | ||
@@ -1924,7 +1926,7 @@ copy_children (GtkTreeModel * src_model, GtkTreeIter * src_iter, | |||
1924 | 1926 | ||
1925 | copy_children (src_model, &src_child, dst_tab, &dst_child); | 1927 | copy_children (src_model, &src_child, dst_tab, &dst_child); |
1926 | } | 1928 | } |
1927 | while (TRUE == gtk_tree_model_iter_next (src_model, &src_child)); | 1929 | while (gtk_tree_model_iter_next (src_model, &src_child)); |
1928 | } | 1930 | } |
1929 | 1931 | ||
1930 | 1932 | ||
@@ -2073,6 +2075,40 @@ setup_download (struct DownloadEntry *de, struct DownloadEntry *pde, | |||
2073 | GNUNET_assert (sr == de->sr); | 2075 | GNUNET_assert (sr == de->sr); |
2074 | } | 2076 | } |
2075 | } | 2077 | } |
2078 | if ( (NULL == de->sr) && | ||
2079 | (NULL != pde) ) | ||
2080 | { | ||
2081 | /* child download, find appropriate search result from parent! */ | ||
2082 | GtkTreePath *path; | ||
2083 | GtkTreeModel *tm; | ||
2084 | GtkTreeIter iter; | ||
2085 | GtkTreeIter child; | ||
2086 | struct GNUNET_FS_Uri *uri; | ||
2087 | |||
2088 | tm = GTK_TREE_MODEL (pde->sr->tab->ts); | ||
2089 | path = gtk_tree_row_reference_get_path (pde->sr->rr); | ||
2090 | if ( (! gtk_tree_model_get_iter (tm, &iter, path)) || | ||
2091 | (! gtk_tree_model_iter_children (tm, &child, &iter)) ) | ||
2092 | { | ||
2093 | GNUNET_break (0); | ||
2094 | } | ||
2095 | else | ||
2096 | { | ||
2097 | do | ||
2098 | { | ||
2099 | gtk_tree_model_get (tm, &child, 1, &uri, | ||
2100 | 9, &de->sr, | ||
2101 | -1); | ||
2102 | if (GNUNET_YES == GNUNET_FS_uri_test_equal (de->uri, | ||
2103 | uri)) | ||
2104 | break; | ||
2105 | de->sr = NULL; | ||
2106 | } | ||
2107 | while (gtk_tree_model_iter_next (tm, &child)); | ||
2108 | GNUNET_break (NULL != de->sr); | ||
2109 | } | ||
2110 | gtk_tree_path_free (path); | ||
2111 | } | ||
2076 | if (NULL == de->sr) | 2112 | if (NULL == de->sr) |
2077 | { | 2113 | { |
2078 | /* Stand-alone download with no 'row'/search result affiliated | 2114 | /* Stand-alone download with no 'row'/search result affiliated |
@@ -2080,13 +2116,30 @@ setup_download (struct DownloadEntry *de, struct DownloadEntry *pde, | |||
2080 | download in the URI tab */ | 2116 | download in the URI tab */ |
2081 | de->sr = GNUNET_GTK_add_to_uri_tab (meta, uri); | 2117 | de->sr = GNUNET_GTK_add_to_uri_tab (meta, uri); |
2082 | de->sr->download = de; | 2118 | de->sr->download = de; |
2119 | path = gtk_tree_row_reference_get_path (de->sr->rr); | ||
2120 | if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->sr->tab->ts), &iter, path)) | ||
2121 | { | ||
2122 | GNUNET_break (0); | ||
2123 | gtk_tree_path_free (path); | ||
2124 | return de; | ||
2125 | } | ||
2083 | } | 2126 | } |
2084 | path = gtk_tree_row_reference_get_path (de->sr->rr); | 2127 | else |
2085 | if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->sr->tab->ts), &iter, path)) | ||
2086 | { | 2128 | { |
2087 | GNUNET_break (0); | 2129 | struct GNUNET_CONTAINER_MetaData *meta; |
2088 | gtk_tree_path_free (path); | 2130 | |
2089 | return de; | 2131 | /* get metadata from existing tab, might have a mime type */ |
2132 | path = gtk_tree_row_reference_get_path (de->sr->rr); | ||
2133 | if (! gtk_tree_model_get_iter (GTK_TREE_MODEL (de->sr->tab->ts), &iter, path)) | ||
2134 | { | ||
2135 | GNUNET_break (0); | ||
2136 | gtk_tree_path_free (path); | ||
2137 | return de; | ||
2138 | } | ||
2139 | gtk_tree_model_get (GTK_TREE_MODEL (de->sr->tab->ts), &iter, | ||
2140 | 0, &meta, | ||
2141 | -1); | ||
2142 | de->is_directory = GNUNET_FS_meta_data_test_for_directory (meta); | ||
2090 | } | 2143 | } |
2091 | gtk_tree_path_free (path); | 2144 | gtk_tree_path_free (path); |
2092 | gtk_tree_store_set (de->sr->tab->ts, &iter, | 2145 | gtk_tree_store_set (de->sr->tab->ts, &iter, |
@@ -2500,6 +2553,7 @@ GNUNET_GTK_fs_event_handler (void *cls, | |||
2500 | return NULL; | 2553 | return NULL; |
2501 | case GNUNET_FS_STATUS_DOWNLOAD_PROGRESS: | 2554 | case GNUNET_FS_STATUS_DOWNLOAD_PROGRESS: |
2502 | mark_download_progress (info->value.download.cctx, | 2555 | mark_download_progress (info->value.download.cctx, |
2556 | info->value.download.filename, | ||
2503 | info->value.download.size, | 2557 | info->value.download.size, |
2504 | info->value.download.completed, | 2558 | info->value.download.completed, |
2505 | info->value.download.specifics.progress.data, | 2559 | info->value.download.specifics.progress.data, |
@@ -2516,8 +2570,7 @@ GNUNET_GTK_fs_event_handler (void *cls, | |||
2516 | return info->value.download.cctx; | 2570 | return info->value.download.cctx; |
2517 | case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED: | 2571 | case GNUNET_FS_STATUS_DOWNLOAD_COMPLETED: |
2518 | mark_download_completed (info->value.download.cctx, | 2572 | mark_download_completed (info->value.download.cctx, |
2519 | info->value.download.size, | 2573 | info->value.download.size); |
2520 | info->value.download.filename); | ||
2521 | return info->value.download.cctx; | 2574 | return info->value.download.cctx; |
2522 | case GNUNET_FS_STATUS_DOWNLOAD_STOPPED: | 2575 | case GNUNET_FS_STATUS_DOWNLOAD_STOPPED: |
2523 | stop_download (info->value.download.cctx); | 2576 | stop_download (info->value.download.cctx); |