From: Christian Grothoff Date: Wed, 2 Sep 2009 19:49:23 +0000 (+0000) Subject: more X-Git-Tag: initial-import-from-subversion-38251~23538 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=bec64fd32ad5f930ee60634103222c4575904728;p=oweals%2Fgnunet.git more --- diff --git a/src/fs/fs_unindex.c b/src/fs/fs_unindex.c index 1416667f3..a6d414f09 100644 --- a/src/fs/fs_unindex.c +++ b/src/fs/fs_unindex.c @@ -78,6 +78,26 @@ unindex_reader (void *cls, } +/** + * Continuation called to notify client about result of the + * datastore removal operation. + * + * @param cls closure + * @param success GNUNET_SYSERR on failure + * @param msg NULL on success, otherwise an error message + */ +static void +process_cont (void *cls, + int success, + const char *msg) +{ + struct GNUNET_FS_UnindexContext *uc = cls; + // FIXME: may want to check for errors + // OTHER than content-not-present! + GNUNET_FS_tree_encoder_next (uc->tc); +} + + /** * Function called asking for the current (encoded) * block to be processed. After processing the @@ -99,6 +119,30 @@ unindex_process (void *cls, const void *block, uint16_t block_size) { + struct GNUNET_FS_UnindexContext *uc = cls; + uint32_t size; + const void *data; + struct OnDemandBlock odb; + + if (type != GNUNET_DATASTORE_BLOCKTYPE_DBLOCK) + { + size = block_size; + data = block; + } + else /* on-demand encoded DBLOCK */ + { + size = sizeof(struct OnDemandBlock); + odb.offset = offset; + odb.file_id = uc->file_id; + data = &odb; + } + GNUNET_DATASTORE_remove (uc->dsh, + query, + block_size, + block, + &process_cont, + uc, + GNUNET_CONSTANTS_SERVICE_TIMEOUT); } @@ -119,7 +163,8 @@ unindex_progress (void *cls, size_t pt_size, unsigned int depth) { - // FIXME + struct GNUNET_FS_UnindexContext *uc = cls; + // FIXME: call callback! } @@ -172,10 +217,45 @@ signal_unindex_error (struct GNUNET_FS_UnindexContext *uc, } +/** + * Function called when the tree encoder has + * processed all blocks. Clean up. + * + * @param cls our unindexing context + * @param tc not used + */ static void unindex_finish (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { + struct GNUNET_FS_UnindexContext *uc = cls; + char *emsg; + struct GNUNET_FS_Uri *uri; + struct GNUNET_FS_ProgressInfo pi; + + GNUNET_FS_tree_encoder_finish (uc->tc, + &uri, + &emsg); + if (uri != NULL) + GNUNET_FS_uri_destroy (uri); + GNUNET_DISK_file_close (uc->fh); + uc->fh = NULL; + GNUNET_DATASTORE_disconnect (uc->dsh, GNUNET_NO); + uc->dsh = NULL; + if (emsg != NULL) + { + signal_unindex_error (uc, emsg); + GNUNET_free (emsg); + } + else + { + pi.status = GNUNET_FS_STATUS_UNINDEX_COMPLETED; + make_unindex_status (&pi, uc, uc->file_size); + pi.value.unindex.eta = GNUNET_TIME_UNIT_ZERO; + uc->client_info + = uc->h->upcb (uc->h->upcb_cls, + &pi); + } } diff --git a/src/include/gnunet_fs_service.h b/src/include/gnunet_fs_service.h index 994c6eb15..8f7c67407 100644 --- a/src/include/gnunet_fs_service.h +++ b/src/include/gnunet_fs_service.h @@ -626,6 +626,12 @@ enum GNUNET_FS_Status */ GNUNET_FS_STATUS_UNINDEX_ERROR, + /** + * Notification that the unindexing of this file + * was completed. + */ + GNUNET_FS_STATUS_UNINDEX_COMPLETED, + /** * Notification that the unindexing of this file * was stopped (final event for this action). @@ -770,6 +776,14 @@ struct GNUNET_FS_ProgressInfo */ uint64_t data_len; + /** + * Depth of the given block in the tree; + * 0 would be the highest level (the first + * call is guaranteed to be for the lowest + * level). + */ + unsigned int depth; + } progress; /**