/***************************************************************************
 *             __________               __   ___.
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 * $Id$
 *
 * Copyright (C) 2017 by Michael Sevakis
 *
 * This program 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
 * of the License, or (at your option) any later version.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/
#ifndef FS_DEFINES_H
#define FS_DEFINES_H

/** Tuneable parameters **/

#if 0
/* Define this just in case you're doing something that may crash a lot and
   want less write caching */
#define FS_MIN_WRITECACHING
#endif

#ifndef MAX_PATH
#define MAX_PATH        260
#endif

#define MAX_COMPNAME    260

/* still experimental? */
/* increasing this will increase the total memory used by the cache; the
   cache, as noted in disk_cache.h, has other minimum requirements that may
   prevent reducing its number of entries in order to compensate */
#ifndef SECTOR_SIZE
#define SECTOR_SIZE     512
#endif

/* limits for number of open descriptors - if you increase these values, make
   certain that the disk cache has enough available buffers */
#define MAX_OPEN_FILES  11
#define MAX_OPEN_DIRS   12

/* internal functions open streams as well; make sure they don't fail if all
   user descs are busy; this needs to be at least the greatest quantity needed
   at once by all internal functions */
#ifdef HAVE_DIRCACHE
#define AUX_FILEOBJS 3
#else
#define AUX_FILEOBJS 2
#endif

/* number of components statically allocated to handle the vast majority
   of path depths; should maybe be tuned for >= 90th percentile but for now,
   imma just guessing based on something like:
        root + 'Music' + 'Artist' + 'Album' + 'Disc N' + filename */
#define STATIC_PATHCOMP_NUM 6

/* unsigned value that will also hold the off_t range we need without
   overflow */
#define file_size_t uint32_t

#ifdef __USE_FILE_OFFSET64
/* if we want, we can deal with files up to 2^32-1 bytes-- the full FAT16/32
   range */
#define FILE_SIZE_MAX   (0xffffffffu)
#else
/* file contents and size will be preserved by the APIs so long as ftruncate()
   isn't used; bytes passed 2^31-1 will not accessible nor will writes succeed
   that would extend the file beyond the max for a 32-bit off_t */
#define FILE_SIZE_MAX   (0x7fffffffu)
#endif

/* if file is "large(ish)", then get rid of the contents now rather than
   lazily when the file is synced or closed in order to free-up space */
#define O_TRUNC_THRESH 65536

/* This needs enough for all file handles to have a buffer in the worst case
 * plus at least one reserved exclusively for the cache client and a couple
 * for other file system code. The buffers are put to use by the cache if not
 * taken for another purpose (meaning nothing is wasted sitting fallow).
 *
 * One map per volume is maintained in order to avoid collisions between
 * volumes that would slow cache probing. IOC_MAP_NUM_ENTRIES is the number
 * for each map per volume. The buffers themselves are shared.
 */
#if MEMORYSIZE < 8
#define DC_NUM_ENTRIES      32
#define DC_MAP_NUM_ENTRIES  128
#elif MEMORYSIZE <= 32
#define DC_NUM_ENTRIES      48
#define DC_MAP_NUM_ENTRIES  128
#else /* MEMORYSIZE > 32 */
#define DC_NUM_ENTRIES      64
#define DC_MAP_NUM_ENTRIES  256
#endif /* MEMORYSIZE */

/* this _could_ be larger than a sector if that would ever be useful */
#define DC_CACHE_BUFSIZE    SECTOR_SIZE

#endif /* FS_DEFINES_H */
