/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   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 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#ifndef _DBE_FILE_H
#define _DBE_FILE_H

#include <fcntl.h>

class DbeJarFile;
class Experiment;
template <class ITEM> class Vector;

class DbeFile
{
public:

  enum
  {
    F_NOT_FOUND     = 0,
    F_FICTION       = 1,
    F_LOADOBJ       = 2,
    F_SOURCE        = 4,
    F_JAVACLASS     = 8,
    F_JAVA_SOURCE   = 16,
    F_DOT_O         = 32,
    F_DEBUG_FILE    = 64,
    F_DOT_A_LIB     = 128,
    F_DIR_OR_JAR    = 256,
    F_DIRECTORY     = 512,
    F_FILE          = 1024,
    F_JAR_FILE      = 2048,
    F_UNKNOWN       = 65536
  };

  DbeFile (const char *filename);
  ~DbeFile ();

  char *
  get_name ()
  {
    return name;
  };

  bool
  get_need_refind ()
  {
    return need_refind;
  };

  char *get_location (bool find_needed = true);
  char *getResolvedPath ();
  char *get_location_info ();
  dbe_stat_t *get_stat ();
  bool compare (DbeFile *df);
  void set_need_refind (bool val);
  void set_location (const char *filename);
  int check_access (const char *filename);
  char *find_file (const char *filename);
  DbeFile *getJarDbeFile (char *fnm, int sym);
  char *find_in_jar_file (const char *filename, DbeJarFile *jfile);
  DbeJarFile *get_jar_file ();

  bool inArchive;
  int filetype;
  dbe_stat_t sbuf;
  DbeFile *container;
  char *orig_location;
  Experiment *experiment;

protected:
  static bool isJarOrZip (const char *fnm);
  char *find_package_name (const char *filename, const char *dirname);
  char *find_in_directory (const char *filename, const char *dirname);
  bool find_in_pathmap (char *filename);
  void find_in_archives (char *filename);
  void find_in_setpath (char *filename, Vector<char*> *searchPath);
  void find_in_classpath (char *filename, Vector<DbeFile*> *classPath);

  char *name;
  char *location;
  char *location_info;
  bool need_refind;
  DbeJarFile *jarFile;
};

#endif /* _DBE_FILE_H */
