/****************************************************************************
 *
 * ftrfork.h
 *
 *   Embedded resource forks accessor (specification).
 *
 * Copyright 2004-2018 by
 * Masatake YAMATO and Redhat K.K.
 *
 * This file is part of the FreeType project, and may only be used,
 * modified, and distributed under the terms of the FreeType project
 * license, LICENSE.TXT.  By continuing to use, modify, or distribute
 * this file you indicate that you have read the license and
 * understand and accept it fully.
 *
 */

/****************************************************************************
 * Development of the code in this file is support of
 * Information-technology Promotion Agency, Japan.
 */


#ifndef FTRFORK_H_
#define FTRFORK_H_


#include <ft2build.h>
#include FT_INTERNAL_OBJECTS_H


FT_BEGIN_HEADER


  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */
  /* Don't forget to increment the number if you add a new guessing rule. */
#define FT_RACCESS_N_RULES  9


  /* A structure to describe a reference in a resource by its resource ID */
  /* and internal offset.  The `POST' resource expects to be concatenated */
  /* by the order of resource IDs instead of its appearance in the file.  */

  typedef struct  FT_RFork_Ref_
  {
    FT_Short  res_id;
    FT_Long   offset;

  } FT_RFork_Ref;


#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
  typedef FT_Error
  (*ft_raccess_guess_func)( FT_Library  library,
                            FT_Stream   stream,
                            char       *base_file_name,
                            char      **result_file_name,
                            FT_Long    *result_offset );

  typedef enum  FT_RFork_Rule_ {
    FT_RFork_Rule_invalid = -2,
    FT_RFork_Rule_uknown, /* -1 */
    FT_RFork_Rule_apple_double,
    FT_RFork_Rule_apple_single,
    FT_RFork_Rule_darwin_ufs_export,
    FT_RFork_Rule_darwin_newvfs,
    FT_RFork_Rule_darwin_hfsplus,
    FT_RFork_Rule_vfat,
    FT_RFork_Rule_linux_cap,
    FT_RFork_Rule_linux_double,
    FT_RFork_Rule_linux_netatalk
  } FT_RFork_Rule;

  /* For fast translation between rule index and rule type,
   * the macros FT_RFORK_xxx should be kept consistent with
   * the raccess_guess_funcs table
   */
  typedef struct ft_raccess_guess_rec_ {
    ft_raccess_guess_func  func;
    FT_RFork_Rule          type;
  } ft_raccess_guess_rec;


#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \
          static const type name[] = {
#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \
          { raccess_guess_ ## func_suffix,                           \
            FT_RFork_Rule_ ## type_suffix },
  /* this array is a storage, thus a final `;' is needed */
#define CONST_FT_RFORK_RULE_ARRAY_END  };

#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */


  /**************************************************************************
   *
   * @function:
   *   FT_Raccess_Guess
   *
   * @description:
   *   Guess a file name and offset where the actual resource fork is
   *   stored.  The macro FT_RACCESS_N_RULES holds the number of
   *   guessing rules;  the guessed result for the Nth rule is
   *   represented as a triplet: a new file name (new_names[N]), a file
   *   offset (offsets[N]), and an error code (errors[N]).
   *
   * @input:
   *   library ::
   *     A FreeType library instance.
   *
   *   stream ::
   *     A file stream containing the resource fork.
   *
   *   base_name ::
   *     The (base) file name of the resource fork used for some
   *     guessing rules.
   *
   * @output:
   *   new_names ::
   *     An array of guessed file names in which the resource forks may
   *     exist.  If `new_names[N]' is NULL, the guessed file name is
   *     equal to `base_name'.
   *
   *   offsets ::
   *     An array of guessed file offsets.  `offsets[N]' holds the file
   *     offset of the possible start of the resource fork in file
   *     `new_names[N]'.
   *
   *   errors ::
   *     An array of FreeType error codes.  `errors[N]' is the error
   *     code of Nth guessing rule function.  If `errors[N]' is not
   *     FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.
   */
  FT_BASE( void )
  FT_Raccess_Guess( FT_Library  library,
                    FT_Stream   stream,
                    char*       base_name,
                    char**      new_names,
                    FT_Long*    offsets,
                    FT_Error*   errors );


  /**************************************************************************
   *
   * @function:
   *   FT_Raccess_Get_HeaderInfo
   *
   * @description:
   *   Get the information from the header of resource fork.  The
   *   information includes the file offset where the resource map
   *   starts, and the file offset where the resource data starts.
   *   `FT_Raccess_Get_DataOffsets' requires these two data.
   *
   * @input:
   *   library ::
   *     A FreeType library instance.
   *
   *   stream ::
   *     A file stream containing the resource fork.
   *
   *   rfork_offset ::
   *     The file offset where the resource fork starts.
   *
   * @output:
   *   map_offset ::
   *     The file offset where the resource map starts.
   *
   *   rdata_pos ::
   *     The file offset where the resource data starts.
   *
   * @return:
   *   FreeType error code.  FT_Err_Ok means success.
   */
  FT_BASE( FT_Error )
  FT_Raccess_Get_HeaderInfo( FT_Library  library,
                             FT_Stream   stream,
                             FT_Long     rfork_offset,
                             FT_Long    *map_offset,
                             FT_Long    *rdata_pos );


  /**************************************************************************
   *
   * @function:
   *   FT_Raccess_Get_DataOffsets
   *
   * @description:
   *   Get the data offsets for a tag in a resource fork.  Offsets are
   *   stored in an array because, in some cases, resources in a resource
   *   fork have the same tag.
   *
   * @input:
   *   library ::
   *     A FreeType library instance.
   *
   *   stream ::
   *     A file stream containing the resource fork.
   *
   *   map_offset ::
   *     The file offset where the resource map starts.
   *
   *   rdata_pos ::
   *     The file offset where the resource data starts.
   *
   *   tag ::
   *     The resource tag.
   *
   *   sort_by_res_id ::
   *     A Boolean to sort the fragmented resource by their ids.
   *     The fragmented resources for `POST' resource should be sorted
   *     to restore Type1 font properly.  For `sfnt' resources, sorting
   *     may induce a different order of the faces in comparison to that
   *     by QuickDraw API.
   *
   * @output:
   *   offsets ::
   *     The stream offsets for the resource data specified by `tag'.
   *     This array is allocated by the function, so you have to call
   *     @ft_mem_free after use.
   *
   *   count ::
   *     The length of offsets array.
   *
   * @return:
   *   FreeType error code.  FT_Err_Ok means success.
   *
   * @note:
   *   Normally you should use `FT_Raccess_Get_HeaderInfo' to get the
   *   value for `map_offset' and `rdata_pos'.
   */
  FT_BASE( FT_Error )
  FT_Raccess_Get_DataOffsets( FT_Library  library,
                              FT_Stream   stream,
                              FT_Long     map_offset,
                              FT_Long     rdata_pos,
                              FT_Long     tag,
                              FT_Bool     sort_by_res_id,
                              FT_Long   **offsets,
                              FT_Long    *count );


FT_END_HEADER

#endif /* FTRFORK_H_ */


/* END */
