/*
   Directory caching code for Netdrive plugins.
   Copyright (C) netlabs.org 2010-2016
*/

#ifndef __DIRCACHE_H__
#define __DIRCACHE_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <limits.h>

#define NDPL_LARGEFILES
#define INCL_LONGLONG
#include <ndextpl2.h>


/* callback for fsphAddFile32L */
typedef void FNADDDIRENTRY(void *plist, void *finfo);
typedef FNADDDIRENTRY *PFNADDDIRENTRY;

/* callback for releasing memory */
typedef void FNFREEDIRENTRY(void *finfo);
typedef FNFREEDIRENTRY *PFNFREEDIRENTRY;

/* forward declarations */
typedef struct DirectoryCache DirectoryCache;

/* Directory cache helpers. */
int dircache_create(DirectoryCache **ppdc, void* pRes, int cachetimeout, int cachedepth,
                    PFNFREEDIRENTRY fn, PLUGINHELPERTABLE2L *ph);
void dircache_delete(DirectoryCache *pdc);

/* directory cache scanning */
int dircache_list_files(DirectoryCache *pdc, PFNADDDIRENTRY fn,
                        void *plist,
                        char* dir_mask, char* fullpath,
                        int *ptotal_received);
int dircache_find_path(DirectoryCache *pdc,
                       const char *path,
                       void **finfo,
                       unsigned long *pulAge);

/* directory cache creation */
void *dircache_write_begin(DirectoryCache *pdc,
                           char* dir_mask, char* fullpath,
                           int cFiles);
void dircache_write_entry(DirectoryCache *pdc, void *dircachectx,
                          const char *fname, const void *finfo);
void dircache_write_end(DirectoryCache *pdc, void *dircachectx);

/* directory cache invalidation */
void dircache_invalidate(DirectoryCache *pdc,
                         const char *path,
                         int fParent);

#ifdef __cplusplus
}
#endif

#endif // __DIRCACHE_H__
