gnunet_fs_service.h   gnunet_fs_service.h 
skipping to change at line 29 skipping to change at line 29
*/ */
/** /**
* @file include/gnunet_fs_service.h * @file include/gnunet_fs_service.h
* @brief API for file-sharing via GNUnet * @brief API for file-sharing via GNUnet
* @author Christian Grothoff * @author Christian Grothoff
*/ */
#ifndef GNUNET_FS_LIB_H #ifndef GNUNET_FS_LIB_H
#define GNUNET_FS_LIB_H #define GNUNET_FS_LIB_H
#include "gnunet_util_lib.h" #include "gnunet_util_lib.h"
#include "gnunet_scheduler_lib.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#if 0 /* keep Emacsens' auto-indent happy */ #if 0 /* keep Emacsens' auto-indent happy */
} }
#endif #endif
#endif #endif
/** /**
skipping to change at line 55 skipping to change at line 56
* 2.2.x: with directories * 2.2.x: with directories
* 3.0.x: with namespaces * 3.0.x: with namespaces
* 3.1.x: with namespace meta-data * 3.1.x: with namespace meta-data
* 3.2.x: with collections * 3.2.x: with collections
* 4.0.x: with expiration, variable meta-data, kblocks * 4.0.x: with expiration, variable meta-data, kblocks
* 4.1.x: with new error and configuration handling * 4.1.x: with new error and configuration handling
* 5.0.x: with location URIs * 5.0.x: with location URIs
* 6.0.0: with support for OR in KSKs * 6.0.0: with support for OR in KSKs
* 6.1.x: with simplified namespace support * 6.1.x: with simplified namespace support
* 9.0.0: CPS-style integrated API * 9.0.0: CPS-style integrated API
* 9.1.1: asynchronous directory scanning
*/ */
#define GNUNET_FS_VERSION 0x00090001 #define GNUNET_FS_VERSION 0x00090102
/* ******************** URI API *********************** */ /* ******************** URI API *********************** */
#define GNUNET_FS_URI_PREFIX "gnunet://fs/" #define GNUNET_FS_URI_PREFIX "gnunet://fs/"
#define GNUNET_FS_URI_KSK_INFIX "ksk/" #define GNUNET_FS_URI_KSK_INFIX "ksk/"
#define GNUNET_FS_URI_SKS_INFIX "sks/" #define GNUNET_FS_URI_SKS_INFIX "sks/"
#define GNUNET_FS_URI_CHK_INFIX "chk/" #define GNUNET_FS_URI_CHK_INFIX "chk/"
#define GNUNET_FS_URI_LOC_INFIX "loc/" #define GNUNET_FS_URI_LOC_INFIX "loc/"
/** /**
skipping to change at line 988 skipping to change at line 990
* Depth of the given block in the tree; * Depth of the given block in the tree;
* 0 would be the lowest level (DBLOCKS). * 0 would be the lowest level (DBLOCKS).
*/ */
unsigned int depth; unsigned int depth;
/** /**
* How much trust did we offer for downloading this block? * How much trust did we offer for downloading this block?
*/ */
unsigned int trust_offered; unsigned int trust_offered;
/**
* How much time passed between us asking for this block and
* actually getting it? GNUNET_TIME_UNIT_FOREVER_REL if unknown.
*/
struct GNUNET_TIME_Relative block_download_duration;
} progress; } progress;
/** /**
* These values are only valid for * These values are only valid for
* GNUNET_FS_STATUS_DOWNLOAD_START events. * GNUNET_FS_STATUS_DOWNLOAD_START events.
*/ */
struct struct
{ {
/** /**
skipping to change at line 1638 skipping to change at line 1646
* Close our connection with the file-sharing service. * Close our connection with the file-sharing service.
* The callback given to GNUNET_FS_start will no longer be * The callback given to GNUNET_FS_start will no longer be
* called after this function returns. * called after this function returns.
* *
* @param h handle that was returned from GNUNET_FS_start * @param h handle that was returned from GNUNET_FS_start
*/ */
void void
GNUNET_FS_stop (struct GNUNET_FS_Handle *h); GNUNET_FS_stop (struct GNUNET_FS_Handle *h);
/** /**
* Extract meta-data from a file.
*
* @param md metadata to set
* @param filename name of file to inspect
* @param extractors plugins to use
* @return GNUNET_SYSERR on error, otherwise the number
* of meta-data items obtained
*/
int
GNUNET_FS_meta_data_extract_from_file (struct GNUNET_CONTAINER_MetaData *md
,
const char *filename,
struct EXTRACTOR_PluginList *extract
ors);
/**
* Function called on entries in a GNUNET_FS_FileInformation publish-struct ure. * Function called on entries in a GNUNET_FS_FileInformation publish-struct ure.
* *
* @param cls closure * @param cls closure
* @param fi the entry in the publish-structure * @param fi the entry in the publish-structure
* @param length length of the file or directory * @param length length of the file or directory
* @param meta metadata for the file or directory (can be modified) * @param meta metadata for the file or directory (can be modified)
* @param uri pointer to the keywords that will be used for this entry (can be modified) * @param uri pointer to the keywords that will be used for this entry (can be modified)
* @param bo block options (can be modified) * @param bo block options (can be modified)
* @param do_index should we index (can be modified) * @param do_index should we index (can be modified)
* @param client_info pointer to client context set upon creation (can be m odified) * @param client_info pointer to client context set upon creation (can be m odified)
skipping to change at line 1692 skipping to change at line 1686
* *
* @param s structure to get the filename for * @param s structure to get the filename for
* @return NULL on error, otherwise filename that * @return NULL on error, otherwise filename that
* can be passed to "GNUNET_FS_file_information_recover" * can be passed to "GNUNET_FS_file_information_recover"
* to read this fi-struct from disk. * to read this fi-struct from disk.
*/ */
const char * const char *
GNUNET_FS_file_information_get_id (struct GNUNET_FS_FileInformation *s); GNUNET_FS_file_information_get_id (struct GNUNET_FS_FileInformation *s);
/** /**
* Obtain the filename from the file information structure.
*
* @param s structure to get the filename for
* @return "filename" field of the structure (can be NULL)
*/
const char *
GNUNET_FS_file_information_get_filename (struct GNUNET_FS_FileInformation *
s);
/**
* Set the filename in the file information structure.
* If filename was already set, frees it before setting the new one.
* Makes a copy of the argument.
*
* @param s structure to get the filename for
* @param filename filename to set
*/
void
GNUNET_FS_file_information_set_filename (struct GNUNET_FS_FileInformation *
s,
const char *filename);
/**
* Create an entry for a file in a publish-structure. * Create an entry for a file in a publish-structure.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param client_info initial client-info value for this entry * @param client_info initial client-info value for this entry
* @param filename name of the file or directory to publish * @param filename name of the file or directory to publish
* @param keywords under which keywords should this file be available * @param keywords under which keywords should this file be available
* directly; can be NULL * directly; can be NULL
* @param meta metadata for the file * @param meta metadata for the file
* @param do_index GNUNET_YES for index, GNUNET_NO for insertion, * @param do_index GNUNET_YES for index, GNUNET_NO for insertion,
* GNUNET_SYSERR for simulation * GNUNET_SYSERR for simulation
skipping to change at line 1795 skipping to change at line 1810
void *reader_cls, void *reader_cls,
const struct GNUNET_FS_Uri const struct GNUNET_FS_Uri
*keywords, *keywords,
const struct const struct
GNUNET_CONTAINER_MetaData *m eta, GNUNET_CONTAINER_MetaData *m eta,
int do_index, int do_index,
const struct const struct
GNUNET_FS_BlockOptions *bo); GNUNET_FS_BlockOptions *bo);
/** /**
* Function that a "GNUNET_FS_DirectoryScanner" should call
* for each entry in the directory.
*
* @param cls closure
* @param filename name of the file (including path); must end
* in a "/" (even on W32) if this is a directory
* @param fi information about the file (should not be
* used henceforth by the caller)
*/
typedef void (*GNUNET_FS_FileProcessor) (void *cls, const char *filename,
struct GNUNET_FS_FileInformation *
fi);
/**
* Type of a function that will be used to scan a directory.
*
* @param cls closure
* @param h handle to the file sharing subsystem
* @param dirname name of the directory to scan
* @param do_index should files be indexed or inserted
* @param bo block options
* @param proc function to call on each entry
* @param proc_cls closure for proc
* @param emsg where to store an error message (on errors)
* @return GNUNET_OK on success
*/
typedef int (*GNUNET_FS_DirectoryScanner) (void *cls,
struct GNUNET_FS_Handle * h,
const char *dirname, int do_inde
x,
const struct GNUNET_FS_BlockOpti
ons *
bo, GNUNET_FS_FileProcessor proc
,
void *proc_cls, char **emsg);
/**
* Simple, useful default implementation of a directory scanner
* (GNUNET_FS_DirectoryScanner). This implementation expects to get a
* UNIX filename, will publish all files in the directory except hidden
* files (those starting with a "."). Metadata will be extracted
* using GNU libextractor; the specific list of plugins should be
* specified in "cls", passing NULL will disable (!) metadata
* extraction. Keywords will be derived from the metadata and
* associated with directories as appropriate. This is strictly a
* convenience function (however, if all tools use it, there will
* be less of a chance of distinguishing users by the specific
* user-interface they were using).
*
* @param cls must be of type "struct EXTRACTOR_Extractor*"
* @param h handle to the file sharing subsystem
* @param dirname name of the directory to scan
* @param do_index should files be indexed or inserted
* @param bo block options
* @param proc function called on each entry
* @param proc_cls closure for proc
* @param emsg where to store an error message (on errors)
* @return GNUNET_OK on success
*/
int
GNUNET_FS_directory_scanner_default (void *cls, struct GNUNET_FS_Handle *h,
const char *dirname, int do_index,
const struct GNUNET_FS_BlockOptions *b
o,
GNUNET_FS_FileProcessor proc,
void *proc_cls, char **emsg);
/**
* Create a publish-structure from an existing file hierarchy, inferring
* and organizing keywords and metadata as much as possible. This
* function primarily performs the recursive build and re-organizes
* keywords and metadata; for automatically getting metadata
* extraction, scanning of directories and creation of the respective
* GNUNET_FS_FileInformation entries the default scanner should be
* passed (GNUNET_FS_directory_scanner_default). This is strictly a
* convenience function.
*
* @param h handle to the file sharing subsystem
* @param client_info initial client-info value for this entry
* @param filename name of the top-level file or directory
* @param scanner function used to get a list of files in a directory
* @param scanner_cls closure for scanner
* @param do_index should files in the hierarchy be indexed?
* @param bo block options
* @param emsg where to store an error message
* @return publish structure entry for the directory, NULL on error
*/
struct GNUNET_FS_FileInformation *
GNUNET_FS_file_information_create_from_directory (struct GNUNET_FS_Handle *
h,
void *client_info,
const char *filename,
GNUNET_FS_DirectoryScanne
r
scanner, void *scanner_cl
s,
int do_index,
const struct
GNUNET_FS_BlockOptions *b
o,
char **emsg);
/**
* Create an entry for an empty directory in a publish-structure. * Create an entry for an empty directory in a publish-structure.
* This function should be used by applications for which the * This function should be used by applications for which the
* use of "GNUNET_FS_file_information_create_from_directory" * use of "GNUNET_FS_file_information_create_from_directory"
* is not appropriate. * is not appropriate.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param client_info initial client-info value for this entry * @param client_info initial client-info value for this entry
* @param keywords under which keywords should this directory be available * @param keywords under which keywords should this directory be available
* directly; can be NULL * directly; can be NULL
* @param meta metadata for the directory * @param meta metadata for the directory
* @param bo block options * @param bo block options
* @param filename name of the directory; can be NULL
* @return publish structure entry for the directory , NULL on error * @return publish structure entry for the directory , NULL on error
*/ */
struct GNUNET_FS_FileInformation * struct GNUNET_FS_FileInformation *
GNUNET_FS_file_information_create_empty_directory (struct GNUNET_FS_Handle *h, GNUNET_FS_file_information_create_empty_directory (struct GNUNET_FS_Handle *h,
void *client_info, void *client_info,
const struct GNUNET_FS_U ri const struct GNUNET_FS_U ri
*keywords, *keywords,
const struct const struct
GNUNET_CONTAINER_MetaDat a GNUNET_CONTAINER_MetaDat a
*meta, *meta,
const struct const struct
GNUNET_FS_BlockOptions * GNUNET_FS_BlockOptions *
bo); bo,
const char *filename);
/** /**
* Test if a given entry represents a directory. * Test if a given entry represents a directory.
* *
* @param ent check if this FI represents a directory * @param ent check if this FI represents a directory
* @return GNUNET_YES if so, GNUNET_NO if not * @return GNUNET_YES if so, GNUNET_NO if not
*/ */
int int
GNUNET_FS_file_information_is_directory (const struct GNUNET_FS_FileInforma tion GNUNET_FS_file_information_is_directory (const struct GNUNET_FS_FileInforma tion
*ent); *ent);
skipping to change at line 2034 skipping to change at line 1957
* *
* @param cls closure * @param cls closure
* @param uri URI under which the block is now available, NULL on error * @param uri URI under which the block is now available, NULL on error
* @param emsg error message, NULL on success * @param emsg error message, NULL on success
*/ */
typedef void (*GNUNET_FS_PublishContinuation) (void *cls, typedef void (*GNUNET_FS_PublishContinuation) (void *cls,
const struct GNUNET_FS_Uri * uri, const struct GNUNET_FS_Uri * uri,
const char *emsg); const char *emsg);
/** /**
* Handle to cancel publish KSK operation.
*/
struct GNUNET_FS_PublishKskContext;
/**
* Publish a KBlock on GNUnet. * Publish a KBlock on GNUnet.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param ksk_uri keywords to use * @param ksk_uri keywords to use
* @param meta metadata to use * @param meta metadata to use
* @param uri URI to refer to in the KBlock * @param uri URI to refer to in the KBlock
* @param bo block options * @param bo block options
* @param options publication options * @param options publication options
* @param cont continuation * @param cont continuation
* @param cont_cls closure for cont * @param cont_cls closure for cont
* @return NULL on error ('cont' will still be called)
*/ */
void struct GNUNET_FS_PublishKskContext *
GNUNET_FS_publish_ksk (struct GNUNET_FS_Handle *h, GNUNET_FS_publish_ksk (struct GNUNET_FS_Handle *h,
const struct GNUNET_FS_Uri *ksk_uri, const struct GNUNET_FS_Uri *ksk_uri,
const struct GNUNET_CONTAINER_MetaData *meta, const struct GNUNET_CONTAINER_MetaData *meta,
const struct GNUNET_FS_Uri *uri, const struct GNUNET_FS_Uri *uri,
const struct GNUNET_FS_BlockOptions *bo, const struct GNUNET_FS_BlockOptions *bo,
enum GNUNET_FS_PublishOptions options, enum GNUNET_FS_PublishOptions options,
GNUNET_FS_PublishContinuation cont, void *cont_cls); GNUNET_FS_PublishContinuation cont, void *cont_cls);
/** /**
* Abort the KSK publishing operation.
*
* @param pkc context of the operation to abort.
*/
void
GNUNET_FS_publish_ksk_cancel (struct GNUNET_FS_PublishKskContext *pkc);
/**
* Handle to cancel publish SKS operation.
*/
struct GNUNET_FS_PublishSksContext;
/**
* Publish an SBlock on GNUnet. * Publish an SBlock on GNUnet.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param namespace namespace to publish in * @param namespace namespace to publish in
* @param identifier identifier to use * @param identifier identifier to use
* @param update update identifier to use * @param update update identifier to use
* @param meta metadata to use * @param meta metadata to use
* @param uri URI to refer to in the SBlock * @param uri URI to refer to in the SBlock
* @param bo block options * @param bo block options
* @param options publication options * @param options publication options
* @param cont continuation * @param cont continuation
* @param cont_cls closure for cont * @param cont_cls closure for cont
* @return NULL on error ('cont' will still be called)
*/ */
void struct GNUNET_FS_PublishSksContext *
GNUNET_FS_publish_sks (struct GNUNET_FS_Handle *h, GNUNET_FS_publish_sks (struct GNUNET_FS_Handle *h,
struct GNUNET_FS_Namespace *namespace, struct GNUNET_FS_Namespace *namespace,
const char *identifier, const char *update, const char *identifier, const char *update,
const struct GNUNET_CONTAINER_MetaData *meta, const struct GNUNET_CONTAINER_MetaData *meta,
const struct GNUNET_FS_Uri *uri, const struct GNUNET_FS_Uri *uri,
const struct GNUNET_FS_BlockOptions *bo, const struct GNUNET_FS_BlockOptions *bo,
enum GNUNET_FS_PublishOptions options, enum GNUNET_FS_PublishOptions options,
GNUNET_FS_PublishContinuation cont, void *cont_cls); GNUNET_FS_PublishContinuation cont, void *cont_cls);
/** /**
* Abort the SKS publishing operation.
*
* @param psc context of the operation to abort.
*/
void
GNUNET_FS_publish_sks_cancel (struct GNUNET_FS_PublishSksContext *psc);
/**
* Type of a function called by "GNUNET_FS_get_indexed_files". * Type of a function called by "GNUNET_FS_get_indexed_files".
* *
* @param cls closure * @param cls closure
* @param filename the name of the file * @param filename the name of the file, NULL for end of list
* @param file_id hash of the contents of the indexed file * @param file_id hash of the contents of the indexed file
* @return GNUNET_OK to continue iteration, GNUNET_SYSERR to abort * @return GNUNET_OK to continue iteration, GNUNET_SYSERR to abort
*/ */
typedef int (*GNUNET_FS_IndexedFileProcessor) (void *cls, const char *filen ame, typedef int (*GNUNET_FS_IndexedFileProcessor) (void *cls, const char *filen ame,
const GNUNET_HashCode * file _id); const GNUNET_HashCode * file _id);
/** /**
* Handle to cancel 'GNUNET_FS_get_indexed_files'.
*/
struct GNUNET_FS_GetIndexedContext;
/**
* Iterate over all indexed files. * Iterate over all indexed files.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param iterator function to call on each indexed file * @param iterator function to call on each indexed file
* @param iterator_cls closure for iterator * @param iterator_cls closure for iterator
* @param cont continuation to call when done; * @return NULL on error ('iter' is not called)
* reason should be "TIMEOUT" (on
* error) or "PREREQ_DONE" (on success)
* @param cont_cls closure for cont
*/ */
void struct GNUNET_FS_GetIndexedContext *
GNUNET_FS_get_indexed_files (struct GNUNET_FS_Handle *h, GNUNET_FS_get_indexed_files (struct GNUNET_FS_Handle *h,
GNUNET_FS_IndexedFileProcessor iterator, GNUNET_FS_IndexedFileProcessor iterator,
void *iterator_cls, GNUNET_SCHEDULER_Task cont void *iterator_cls);
,
void *cont_cls); /**
* Cancel iteration over all indexed files.
*
* @param gic operation to cancel
*/
void
GNUNET_FS_get_indexed_files_cancel (struct GNUNET_FS_GetIndexedContext *gic
);
/** /**
* Unindex a file. * Unindex a file.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param filename file to unindex * @param filename file to unindex
* @param cctx initial value for the client context * @param cctx initial value for the client context
* @return NULL on error, otherwise handle * @return NULL on error, otherwise handle
*/ */
struct GNUNET_FS_UnindexContext * struct GNUNET_FS_UnindexContext *
skipping to change at line 2127 skipping to change at line 2087
/** /**
* Clean up after completion of an unindex operation. * Clean up after completion of an unindex operation.
* *
* @param uc handle * @param uc handle
*/ */
void void
GNUNET_FS_unindex_stop (struct GNUNET_FS_UnindexContext *uc); GNUNET_FS_unindex_stop (struct GNUNET_FS_UnindexContext *uc);
/** /**
* Context for advertising a namespace.
*/
struct GNUNET_FS_AdvertisementContext;
/**
* Publish an advertismement for a namespace. * Publish an advertismement for a namespace.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param ksk_uri keywords to use for advertisment * @param ksk_uri keywords to use for advertisment
* @param namespace handle for the namespace that should be advertised * @param namespace handle for the namespace that should be advertised
* @param meta meta-data for the namespace advertisement * @param meta meta-data for the namespace advertisement
* @param bo block options * @param bo block options
* @param rootEntry name of the root of the namespace * @param rootEntry name of the root of the namespace
* @param cont continuation * @param cont continuation
* @param cont_cls closure for cont * @param cont_cls closure for cont
* @return NULL on error ('cont' will still be called)
*/ */
void struct GNUNET_FS_AdvertisementContext *
GNUNET_FS_namespace_advertise (struct GNUNET_FS_Handle *h, GNUNET_FS_namespace_advertise (struct GNUNET_FS_Handle *h,
struct GNUNET_FS_Uri *ksk_uri, struct GNUNET_FS_Uri *ksk_uri,
struct GNUNET_FS_Namespace *namespace, struct GNUNET_FS_Namespace *namespace,
const struct GNUNET_CONTAINER_MetaData *meta , const struct GNUNET_CONTAINER_MetaData *meta ,
const struct GNUNET_FS_BlockOptions *bo, const struct GNUNET_FS_BlockOptions *bo,
const char *rootEntry, const char *rootEntry,
GNUNET_FS_PublishContinuation cont, GNUNET_FS_PublishContinuation cont,
void *cont_cls); void *cont_cls);
/** /**
* Abort the namespace advertisement operation.
*
* @param ac context of the operation to abort.
*/
void
GNUNET_FS_namespace_advertise_cancel (struct GNUNET_FS_AdvertisementContext
*ac);
/**
* Create a namespace with the given name; if one already * Create a namespace with the given name; if one already
* exists, return a handle to the existing namespace. * exists, return a handle to the existing namespace.
* *
* @param h handle to the file sharing subsystem * @param h handle to the file sharing subsystem
* @param name name to use for the namespace * @param name name to use for the namespace
* @return handle to the namespace, NULL on error * @return handle to the namespace, NULL on error
*/ */
struct GNUNET_FS_Namespace * struct GNUNET_FS_Namespace *
GNUNET_FS_namespace_create (struct GNUNET_FS_Handle *h, const char *name); GNUNET_FS_namespace_create (struct GNUNET_FS_Handle *h, const char *name);
/** /**
* Duplicate a namespace handle.
*
* @param ns namespace handle
* @return duplicated handle to the namespace
*/
struct GNUNET_FS_Namespace *
GNUNET_FS_namespace_dup (struct GNUNET_FS_Namespace *ns);
/**
* Delete a namespace handle. Can be used for a clean shutdown (free * Delete a namespace handle. Can be used for a clean shutdown (free
* memory) or also to freeze the namespace to prevent further * memory) or also to freeze the namespace to prevent further
* insertions by anyone. * insertions by anyone.
* *
* @param namespace handle to the namespace that should be deleted / freed * @param namespace handle to the namespace that should be deleted / freed
* @param freeze prevents future insertions; creating a namespace * @param freeze prevents future insertions; creating a namespace
* with the same name again will create a fresh namespace instead * with the same name again will create a fresh namespace instead
* *
* @return GNUNET_OK on success, GNUNET_SYSERR on error * @return GNUNET_OK on success, GNUNET_SYSERR on error
*/ */
skipping to change at line 2555 skipping to change at line 2538
* *
* @param bld directory to finish * @param bld directory to finish
* @param rsize set to the number of bytes needed * @param rsize set to the number of bytes needed
* @param rdata set to the encoded directory * @param rdata set to the encoded directory
* @return GNUNET_OK on success * @return GNUNET_OK on success
*/ */
int int
GNUNET_FS_directory_builder_finish (struct GNUNET_FS_DirectoryBuilder *bld, GNUNET_FS_directory_builder_finish (struct GNUNET_FS_DirectoryBuilder *bld,
size_t * rsize, void **rdata); size_t * rsize, void **rdata);
/* ******************** DirScanner API *********************** */
/**
* Progress reasons of the directory scanner.
*/
enum GNUNET_FS_DirScannerProgressUpdateReason
{
/**
* We've started processing a file or directory.
*/
GNUNET_FS_DIRSCANNER_FILE_START = 0,
/**
* We're having trouble accessing a file (soft-error); it will
* be ignored.
*/
GNUNET_FS_DIRSCANNER_FILE_IGNORED,
/**
* We've found all files (in the pre-pass).
*/
GNUNET_FS_DIRSCANNER_ALL_COUNTED,
/**
* We've finished extracting meta data from a file.
*/
GNUNET_FS_DIRSCANNER_EXTRACT_FINISHED,
/**
* Last call to the progress function: we have finished scanning
* the directory.
*/
GNUNET_FS_DIRSCANNER_FINISHED,
/**
* There was an internal error. Application should abort the scan.
*/
GNUNET_FS_DIRSCANNER_INTERNAL_ERROR
};
/**
* Function called over time as the directory scanner makes
* progress on the job at hand.
*
* @param cls closure
* @param filename which file we are making progress on
* @param is_directory GNUNET_YES if this is a directory,
* GNUNET_NO if this is a file
* GNUNET_SYSERR if it is neither (or unknown)
* @param reason kind of progress we are making
*/
typedef void (*GNUNET_FS_DirScannerProgressCallback) (void *cls,
const char *filename,
int is_directory,
enum GNUNET_FS_DirScan
nerProgressUpdateReason reason);
/**
* A node of a directory tree (produced by dirscanner)
*/
struct GNUNET_FS_ShareTreeItem
{
/**
* This is a doubly-linked list
*/
struct GNUNET_FS_ShareTreeItem *prev;
/**
* This is a doubly-linked list
*/
struct GNUNET_FS_ShareTreeItem *next;
/**
* This is a doubly-linked tree
* NULL for top-level entries.
*/
struct GNUNET_FS_ShareTreeItem *parent;
/**
* This is a doubly-linked tree
* NULL for files and empty directories
*/
struct GNUNET_FS_ShareTreeItem *children_head;
/**
* This is a doubly-linked tree
* NULL for files and empty directories
*/
struct GNUNET_FS_ShareTreeItem *children_tail;
/**
* Metadata for this file or directory
*/
struct GNUNET_CONTAINER_MetaData *meta;
/**
* Keywords for this file or directory (derived from metadata).
*/
struct GNUNET_FS_Uri *ksk_uri;
/**
* Name of the file/directory
*/
char *filename;
/**
* Base name of the file/directory.
*/
char *short_filename;
/**
* GNUNET_YES if this is a directory
*/
int is_directory;
};
/**
* Opaqe handle to an asynchronous directory scanning activity.
*/
struct GNUNET_FS_DirScanner;
/**
* Start a directory scanner.
*
* @param filename name of the directory to scan
* @param disable_extractor GNUNET_YES to not to run libextractor on files
(only build a tree)
* @param ex if not NULL, must be a list of extra plugins for extractor
* @param cb the callback to call when there are scanning progress messages
* @param cb_cls closure for 'cb'
* @return directory scanner object to be used for controlling the scanner
*/
struct GNUNET_FS_DirScanner *
GNUNET_FS_directory_scan_start (const char *filename,
int disable_extractor,
const char *ex,
GNUNET_FS_DirScannerProgressCallback cb,
void *cb_cls);
/**
* Abort the scan. Must not be called from within the progress_callback
* function.
*
* @param ds directory scanner structure
*/
void
GNUNET_FS_directory_scan_abort (struct GNUNET_FS_DirScanner *ds);
/**
* Obtain the result of the scan after the scan has signalled
* completion. Must not be called prior to completion. The 'ds' is
* freed as part of this call.
*
* @param ds directory scanner structure
* @return the results of the scan (a directory tree)
*/
struct GNUNET_FS_ShareTreeItem *
GNUNET_FS_directory_scan_get_result (struct GNUNET_FS_DirScanner *ds);
/**
* Process a share item tree, moving frequent keywords up and
* copying frequent metadata up.
*
* @param toplevel toplevel directory in the tree, returned by the scanner
*/
void
GNUNET_FS_share_tree_trim (struct GNUNET_FS_ShareTreeItem *toplevel);
/**
* Release memory of a share item tree.
*
* @param toplevel toplevel of the tree to be freed
*/
void
GNUNET_FS_share_tree_free (struct GNUNET_FS_ShareTreeItem *toplevel);
#if 0 /* keep Emacsens' auto-indent happy */ #if 0 /* keep Emacsens' auto-indent happy */
{ {
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif
 End of changes. 27 change blocks. 
134 lines changed or deleted 288 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/