X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ffs%2Ffs_tree.h;h=f11f66c58b676f558421bda16a320a7176a14d26;hb=4e2504a967ba09643c6dd7e3b9ce400e30adcb3d;hp=82b897bd3e43016ca6829993695f6e31c3ccbe7c;hpb=eb5c56279680c2337bb4a752a7d1f269c7d13888;p=oweals%2Fgnunet.git diff --git a/src/fs/fs_tree.h b/src/fs/fs_tree.h index 82b897bd3..f11f66c58 100644 --- a/src/fs/fs_tree.h +++ b/src/fs/fs_tree.h @@ -1,27 +1,25 @@ /* This file is part of GNUnet. - (C) 2009 Christian Grothoff (and other contributing authors) + Copyright (C) 2009 GNUnet e.V. - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 2, or (at your - option) any later version. + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. GNUnet is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ /** * @file fs/fs_tree.h * @brief Merkle-tree-ish-CHK file encoding for GNUnet - * @see http://gnunet.org/encoding.php3 + * @see https://gnunet.org/encoding * @author Krista Bennett * @author Christian Grothoff * @@ -32,18 +30,47 @@ #ifndef GNUNET_FS_TREE_H #define GNUNET_FS_TREE_H -#include "fs.h" +#include "fs_api.h" /** * Compute the depth of the CHK tree. * * @param flen file length for which to compute the depth - * @return depth of the tree + * @return depth of the tree, always > 0. A depth of 1 means only a DBLOCK. */ unsigned int GNUNET_FS_compute_depth (uint64_t flen); +/** + * Calculate how many bytes of payload a block tree of the given + * depth MAY correspond to at most (this function ignores the fact that + * some blocks will only be present partially due to the total file + * size cutting some blocks off at the end). + * + * @param depth depth of the block. depth==0 is a DBLOCK. + * @return number of bytes of payload a subtree of this depth may correspond to + */ +uint64_t +GNUNET_FS_tree_compute_tree_size (unsigned int depth); + + +/** + * Compute how many bytes of data should be stored in + * the specified block. + * + * @param fsize overall file size, must be > 0. + * @param offset offset in the original data corresponding + * to the beginning of the tree induced by the block; + * must be < fsize + * @param depth depth of the node in the tree, 0 for DBLOCK + * @return number of bytes stored in this node + */ +size_t +GNUNET_FS_tree_calculate_block_size (uint64_t fsize, uint64_t offset, + unsigned int depth); + + /** * Context for an ECRS-based file encoder that computes * the Merkle-ish-CHK tree. @@ -58,19 +85,21 @@ struct GNUNET_FS_TreeEncoder; * or (on error) "GNUNET_FS_tree_encode_finish". * * @param cls closure - * @param query the query for the block (key for lookup in the datastore) + * @param chk content hash key for the block * @param offset offset of the block + * @param depth depth of the block, 0 for DBLOCKs * @param type type of the block (IBLOCK or DBLOCK) * @param block the (encrypted) block * @param block_size size of block (in bytes) */ -typedef void (*GNUNET_FS_TreeBlockProcessor)(void *cls, - const GNUNET_HashCode *query, - uint64_t offset, - uint32_t type, - const void *block, - uint16_t block_size); - +typedef void (*GNUNET_FS_TreeBlockProcessor) (void *cls, + const struct ContentHashKey * chk, + uint64_t offset, + unsigned int depth, + enum GNUNET_BLOCK_Type type, + const void *block, + uint16_t block_size); + /** * Function called with information about our @@ -80,14 +109,13 @@ typedef void (*GNUNET_FS_TreeBlockProcessor)(void *cls, * @param offset where are we in the file * @param pt_block plaintext of the currently processed block * @param pt_size size of pt_block - * @param depth depth of the block in the tree + * @param depth depth of the block in the tree, 0 for DBLOCKS */ -typedef void (*GNUNET_FS_TreeProgressCallback)(void *cls, - uint64_t offset, - const void *pt_block, - size_t pt_size, - unsigned int depth); - +typedef void (*GNUNET_FS_TreeProgressCallback) (void *cls, uint64_t offset, + const void *pt_block, + size_t pt_size, + unsigned int depth); + /** * Initialize a tree encoder. This function will call "proc" and @@ -103,75 +131,53 @@ typedef void (*GNUNET_FS_TreeProgressCallback)(void *cls, * @param cls closure for reader, proc, progress and cont * @param reader function to call to read plaintext data * @param proc function to call on each encrypted block - * @param progress function to call with progress information + * @param progress function to call with progress information * @param cont function to call when done * @return tree encoder context */ struct GNUNET_FS_TreeEncoder * -GNUNET_FS_tree_encoder_create (struct GNUNET_FS_Handle *h, - uint64_t size, - void *cls, - GNUNET_FS_DataReader reader, - GNUNET_FS_TreeBlockProcessor proc, - GNUNET_FS_TreeProgressCallback progress, - GNUNET_SCHEDULER_Task cont); +GNUNET_FS_tree_encoder_create (struct GNUNET_FS_Handle *h, uint64_t size, + void *cls, GNUNET_FS_DataReader reader, + GNUNET_FS_TreeBlockProcessor proc, + GNUNET_FS_TreeProgressCallback progress, + GNUNET_SCHEDULER_TaskCallback cont); /** - * Encrypt the next block of the file (and - * call proc and progress accordingly; or + * Encrypt the next block of the file (and + * call proc and progress accordingly; or * of course "cont" if we have already completed * encoding of the entire file). * * @param te tree encoder to use */ -void GNUNET_FS_tree_encoder_next (struct GNUNET_FS_TreeEncoder * te); +void +GNUNET_FS_tree_encoder_next (struct GNUNET_FS_TreeEncoder *te); /** - * Clean up a tree encoder and return information - * about the resulting URI or an error message. - * - * @param te the tree encoder to clean up - * @param uri set to the resulting URI (if encoding finished) - * @param emsg set to an error message (if an error occured - * within the tree encoder; if this function is called - * prior to completion and prior to an internal error, - * both "*uri" and "*emsg" will be set to NULL). - */ -void GNUNET_FS_tree_encoder_finish (struct GNUNET_FS_TreeEncoder * te, - struct GNUNET_FS_Uri **uri, - char **emsg); - - -/** - * Compute the size of the current IBlock. + * Get the resulting URI from the encoding. * - * @param height height of the IBlock in the tree (aka overall - * number of tree levels minus depth); 0 == DBlock - * @param offset current offset in the overall file - * @return size of the corresponding IBlock + * @param te the tree encoder to clean up + * @return uri set to the resulting URI (if encoding finished), NULL otherwise */ -uint16_t -GNUNET_FS_tree_compute_iblock_size (unsigned int height, - uint64_t offset); +struct GNUNET_FS_Uri * +GNUNET_FS_tree_encoder_get_uri (struct GNUNET_FS_TreeEncoder *te); /** - * Compute how many bytes of data should be stored in - * the specified node. + * Clean up a tree encoder and return information + * about possible errors. * - * @param fsize overall file size - * @param totaldepth depth of the entire tree - * @param offset offset of the node - * @param depth depth of the node - * @return number of bytes stored in this node + * @param te the tree encoder to clean up + * @param emsg set to an error message (if an error occured + * within the tree encoder; if this function is called + * prior to completion and prior to an internal error, + * both "*emsg" will be set to NULL). */ -size_t -GNUNET_FS_tree_calculate_block_size (uint64_t fsize, - unsigned int totaldepth, - uint64_t offset, - unsigned int depth); +void +GNUNET_FS_tree_encoder_finish (struct GNUNET_FS_TreeEncoder *te, + char **emsg); #if 0 @@ -180,27 +186,28 @@ GNUNET_FS_tree_calculate_block_size (uint64_t fsize, /** * Get data that would be needed to resume * the encoding later. - * + * * @param te encoding to resume * @param data set to the resume data * @param size set to the size of the resume data */ -void GNUNET_FS_tree_encoder_resume_get_data (const struct GNUNET_FS_TreeEncoder * te, - void **data, - size_t *size); +void +GNUNET_FS_tree_encoder_resume_get_data (const struct GNUNET_FS_TreeEncoder *te, + void **data, size_t * size); /** * Reset tree encoder to point previously * obtained for resuming. - * + * * @param te encoding to resume * @param data the resume data * @param size the size of the resume data */ -void GNUNET_FS_tree_encoder_resume (struct GNUNET_FS_TreeEncoder * te, - const void *data, - size_t size); +void +GNUNET_FS_tree_encoder_resume (struct GNUNET_FS_TreeEncoder *te, + const void *data, size_t size); + #endif #endif